netd的分析

该分析参考了http://blog.csdn.net/xiaokeweng/article/details/8130218,

我这里有很多细节都没写出来,画图真费时间

Netd简介

所谓 Netd就是Network Daemon的缩写,表示Network守护进程,类似的命名还有很多,例如 VoldVolumn Deamon),RildRadio 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主类关系Netd主类关系

Netd内容图

netd内容图

Netd整体框架图

netd整体框架图

Netd获取kernel事件流程

netd获取kernel事件流程

Netd下发cmd流程

netd下发cmd流程

CommandListener里面各个功能介绍

CommandListener里面各个功能介绍



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值