该分析参考了http://blog.csdn.net/xiaokeweng/article/details/8130218,
我这里有很多细节都没写出来,画图真费时间
Netd简介
所谓 Netd就是Network Daemon的缩写,表示Network守护进程,类似的命名还有很多,例如 Vold(Volumn Deamon),Rild(Radio Interface Layer Deamon)
Netd负责跟一些涉及网络的配置,操作,管理,查询等相关的功能实现,比如,例如带宽控制(Bandwidth),流量统计,网络地址转换(NAT),PPP链接,soft-ap,共享上网(Tether),配置路由表,interface配置管理,等等……
通过socket,虚拟文件系统,等linux内核提供的用户接口,通信内核,或者直接执行系统模块,管理网络相关部分。
文件结构介绍
涉及主要源码位置:
Netd:
/system/netd/*
lib:
/system/core/libsysutils/src
Framework:
/frameworks/base/services/java/com/android/server/NetworkManagementService.java
/frameworks/base/services/java/com/android/server/NativeDaemonConnector.java
各个文件的功能:
======================================================================
main.cpp
主函数入口
======================================================================
CommandListener.cpp
通过名称为netd的socket 利用tcp形式,监听 frameworek 层命令,这个类里面持有十多个cmd类,分别处理各种不同的事件,并将结果利用socket发回给framework
CommandListener.h
======================================================================
NetlinkManager.cpp
监听kernel 的 event,通过无连接socket 可以理解为udp在 setsocketopt 中实现与 kernel 的关联监听事件类型
NetlinkManager.h
======================================================================
NetdCommand.cpp
继承frameworkcommand
NetdCommand.h
NetlinkHandler.cpp
继承自 NetlinkListener,onEvent函数的实现,根据 onEvent 函数命令的解析调用不同的处理函数并调用 nm->sendBroadcast 广播 ResponseCode
NetlinkHandler.h
NetdConstants.cpp
里面全是static函数,操作一些可执行程序,如iptable
NetdConstants.h
======================================================================
ndc.c
adb shell ndc
oem_iptables_hook.cpp
iptable 系统调用 hook
oem_iptables_hook.h
======================================================================
DnsProxyListener.cpp
DNS 解析相关独立部分
DnsProxyListener.h
MdnsSdListener.cpp
Multi-DNS 解析独立部分
MdnsSdListener.h
======================================================================
具体的要注册给 Framework 的 cmd 的处理部分
IdletimerController.cpp
IdletimerController.h
\接口闲置时间监控
BandwidthController.cpp
BandwidthController.h
\带宽控制
NatController.cpp
NatController.h
\IP地址转换
PppController.cpp
PppController.h
\PPP连接,点对点协议控制
ResolverController.cpp
ResolverController.h
\dns解析
ResponseCode.h
SecondaryTableController.cpp
SecondaryTableController.h
\路由策略
SoftapController.cpp
SoftapController.h
\WIFI热点控制
TetherController.cpp
TetherController.h
\网络共享控制
ClatdController.cpp
ClatdController.h
\Ipv4àIpv6 dns转换
FirewallController.cpp
FirewallController.h
\防火墙设置
InterfaceController.cpp
InterfaceController.h
\接口控制
NatController.cpp
NatController.h
\IP地址转换
Netd的初始化
netd服务的启动:
Init.rc文件中有如下字段
servicenetd /system/bin/netd
class main
socket netd stream 0660 root system
socket dnsproxyd stream 0660 root inet
socket mdns stream 0660 root system
上面创建了3个socket这在将来都会用到
Netd主函数入口在main.cpp中,在这个函数里面构造了netd中的4大主类,特别的一点是将CommandListener通过NetlinkManager的setBroadcaster函数保存到了netlinkManager中,这在以后kernel上报event后,也会通过socket netd上传给framework。
从下面框架图中看,SocketListener是处理socket通信的主类,从其他模块收取信息后通过onDataAvailable这个虚函数调用实现了改函数的类方法。有2个类继承SocketListener,分别是NetlinkListener与FrameworkListener,NetlinkListener被回调后,同样利用虚函数回调onEvent()函数,这样就回调到了NetlinkHandler,根据收取event前面字段区分消息是什么类型的比如interface、xt_idletimer等。而在FrameworkListener会根据注册给FrameworkCommand的名称来辨别改cmd是发给谁。
Netd主类关系