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。
本文深入探讨了Android系统中的网络管理组件,包括libnetutils、toolbox/route、netd以及相关命令的实现原理。libnetutils是对ifc、dhcp和packet的封装,而toolbox/route中的Route处理网络路由。netd服务通过NetlinkManager监听Kernel事件,管理网络接口、IP转发、DNS解析等。此外,文章还详细介绍了如ipfwd、tether、nat等网络命令的使用和工作方式,揭示了Android网络管理的内部工作机制。
2695

被折叠的 条评论
为什么被折叠?



