Android的网络管理核心是ConnectivityService和NetworkPolicyManagerService服务。ConnectivityService主要提供网络链接管理服务,NetworkManagementService主要提供物理管理服务。
管理各种网络设备---Netd守护进程.
<span style="font-size:12px;">#service netd /system/bin/netd
# class main
# socket netd stream 0660 root system
# socket dnsproxyd stream 0660 root inet
# socket mdns stream 0660 root system
# socket fwmarkd stream 0660 root inet</span>
Netd 是一个守护进程,它是在init.rc中启动的。
Netd模块的源代码主要位于目录system/netd中 ,我们来看看它的入口函数。代码如下
int main() {
CommandListener *cl;
NetlinkManager *nm;
DnsProxyListener *dpl;
MDnsSdListener *mdnsl;
FwmarkServer* fwmarkServer;
ALOGI("Netd 1.0 starting");
remove_pid_file();
blockSigpipe();
if (!(nm = NetlinkManager::Instance())) {
ALOGE("Unable to create NetlinkManager");
exit(1);
};
cl = new CommandListener();
nm->setBroadcaster((SocketListener *) cl);
if (nm->start()) {
ALOGE("Unable to start NetlinkManager (%s)", strerror(errno));
exit(1);
}
// Set local DNS mode, to prevent bionic from proxying
// back to this service, recursively.
//注意,这里设置了一个环境变量
setenv("ANDROID_DNS_MODE", "local", 1);
dpl = new DnsProxyListener(CommandListener::sNetCtrl);
if (dpl->startListener()) {
ALOGE("Unable to start DnsProxyListener (%s)", strerror(errno));
exit(1);
}
mdnsl = new MDnsSdListener();
if (mdnsl->startListener()) {
ALOGE("Unable to start MDnsSdListener (%s)", strerror(errno));
exit(1);
}
fwmarkServer = new FwmarkServer(CommandListener::sNetCtrl);
if (fwmarkServer->startListener()) {
ALOGE("Unable to start FwmarkServer (%s)", strerror(errno));