libnetutils
源代码位置:system/core/libnetutils。
对ifc、dhcp(client)、packet(raw socket)的封装。
toolbox/route
Route是android工具集中的一员。
源代码码位于:system/core/toolbox。
netd
源代码位置:system/netd。
NetlinkManager接收并处理来自Kernel的UEvent消息。解析后通过mBroadcaster(CommandListener)发送到Framework层的NetworkManagementService。注册三个UEvent事件接收套接字NetlinkHandler,处理NETLINK_KOBJECT_UEVENT、NETLINK_ROUTE、NETLINK_NFLOG类型事件。
CommandListener、DnsProxyListner、MDnsSdListener分别创建名为“netd”、“dnsproxyd”、“mdns”的监听UNIX套接字,处理客户端命令。都继承FrameworkListener,将受到的请求转发给注册的FrameworkCommand处理。
CommandListener注册了若干NetdCommand(继承FrameworkCommand)派生类对象,Command收到的命令交给对应的Controller处理。如NatCmd与NatController。
DnsProxyListner缓存域名解析结果,命令通过GetAddrInfoCmd和GetHostByAddrCmd处理。在Bionic C库中,修改了getaddrinfo方法,当进程没有配置自己特殊的DNS服务器(系统属性net.dns1.<pid>)时,会通过Netd获取域名解析结果。
Bionic C库重写了getaddrinfo方法,将域名解析请求转发到Netd。实现源文件为bionic/libc/dns/net/getaddrinfo.c
MDnsSdListener是msdn功能代理的总管,具体功能有嵌套类Handler和Monitor完成。Handler继承NetdCommand,间接继承FrameworkCommand(libsysutils),处理UNIX套接字客户端的连接和请求,转发给mdnsd处理,并在回调方法中把结果广播给所有客户端连接(为什么不是单播?)。Monitor通过线程循环调用poll处理mdnsd服务的应答,期间会间接调用Handler注册的回调。
CommandListener的命令:
命令 | 模块 | 说明 |
interface | 网络接口 | InterfaceController、SecondaryTableController |
ipfwd | IP转发 | TetherController |
tether | 手机Modem | TetherController |
nat | 内网转发 | BandwidthController |
list_ttys | 终端设备 | PppController |
pppd | 点对点协议 | PppController |
softap | 软件基站 | SoftapController |
bandwidth | 带宽控制 | BandwidthController |
idletimer | IdletimerController | |
resolver | 域名解析 | NetworkController、ResolverController |
firewall | 防火墙 | FirewallController |
- interface命令详细:
子命令 | 说明 | 原理 |
list | 列举网络设备 | /sys/class/net/* |
driver | 控制Kernel中的Driver | libnetcmdiface.so |
fwmark | 子项目:rule route uid exempt get | iptables,SecondaryTable |
route | 增删、修改路由表 | ifc_utils,SIOCADDRT ip route |
getcfg/setcfg | 控制设备、获取设备信息 | ifc_utils |
clearaddrs | 删除设备绑定地址 | ifc_utils |
ipv6privacyextensions | 使用、禁用privacy地址 | /proc/sys/net/ipv6/conf/<if>/use_tempaddr |
ipv6 | 启动、禁用无卡IPv6支持 | /proc/sys/net/ipv6/conf/<if>/disable_ipv6 |
getmtu/setmtu | 获取、设置MTU | /sys/class/net/*/mt |
- ipfwd命令详细:
子命令 | 说明 | 原理 |
status | ipforward功能状态 | /proc/sys/net/ipv4/ip_forward |
enable/disable | 启动、禁用ipforward功能 |
- tether命令详细:
子命令 | 说明 | 原理 |
start | 启动网络配置服务 | 启动、杀死dnsmasq进程 |
stop | 停止网络配置服务 | |
status | 网络配置服务状态 | 判断dnsmasq进程ID |
interface | 增删侦听网络 | 与dnsmasq管道通信update_ifaces、update_dns |
dns | 设置dns服务器 |
- nat命令详细:
子命令 | 说明 | 原理 |
enable/disable | 启动、停止NAT功能 | iptables |
- list_ttys命令详细:
子命令 | 说明 | 原理 |
启动pppd进程 | /sys/class/tty/* |
- pppd命令详细:
子命令 | 说明 | 原理 |
attach | tty终端绑定pppd | 启动、杀死pppd进程 |
detach | tty终端解除pppd |
- softap命令详细:
子命令 | 说明 | 原理 |
startap | 启动软件AP | 启动、杀死softap进程 |
stopap | 停止软件AP | |
fwreload | 重新加载wifi固件 | 调用WIFI HAL接口 |
status | 软件AP状态 | 判断softap进程ID |
set | 配置softap | 写入配置文件hostapd.conf |
- bandwidth命令详细:
子命令 | 说明 | 原理 |
enable/disable | iptables | |
removequota | 删除、查询、添加带宽配额 s:可多个IF i:针对一个或多个IF | |
getquota | ||
getiquota | ||
setquota | ||
setquotas | ||
removequotas | ||
removeiquota | ||
addnaughtyapps | 以uid为目标,开启、关闭单个进程的带宽控制 | |
removenaughtyapps | ||
happybox | ||
addniceapps | ||
removeniceapps | ||
setglobalalert | ||
debugsettetherglobalalert | ||
removeglobalalert | ||
debugremovetetherglobalalert | ||
setsharedalert | ||
removesharedalert | ||
setinterfacealert | ||
removeinterfacealert | ||
getetherstats |
- idletimer命令详细:
子命令 | 说明 | 原理 |
enable/disable | iptables | |
add | ||
remove |
- resolver命令详细:
子命令 | 说明 | 原理 |
setdefaultif | 设置默认网络接口 | |
setifdns | 设置网络的DNS服务器 | Bionic C库resolv_netid.h提供的私有接口 |
flushdefaultif | 清空DNS缓存 | |
flushif | ||
setifaceforpid | 设置、清除pid范围到netid的映射 | 管理Uid、Pid->NetId的映射 DnsProxyListener: 通过NetworkController根据Uid、Pid获取NetId |
clearifaceforpid | ||
setifaceforuidrange | 设置、清除uid范围到netid的映射 | |
clearifaceforuidrange | ||
clearifacemapping | 清空全部映射 |
- firewall命令详细:
子命令 | 说明 | 原理 |
enable/disable | 启动、停止防火墙 | iptables |
is_enable | ||
set_interface_rule | 针对单个或多个NIC设置防火墙规则 | |
set_egress_source_rule | 针对源IP和目标IP设置防火墙规则 | |
set_egress_dest_rule | ||
set_uid_rule | 针对uid设置防火墙规则 |
ndc
源代码位置:system/netd/ndc.c。