一.概述

所谓 Netd 就是Network Daemon 的缩写,表示Network守护进程,类似的命名还有很多,例如 Vold(Volumn Deamon),Rild(Radio Interface Layer Deamon)
      Netd负责跟一些涉及网络的配置,操作,管理,查询等相关的功能实现,比如,例如带宽控制(Bandwidth),流量统计,带宽控制,网络地址转换(NAT),个人局域网(pan),PPP链接,soft-ap,共享上网(Tether),配置路由表,interface配置管理,等等……
      通过netlink,虚拟文件系统,等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

框架图~

很不规范,会意即可:

二.ndc

理解一个模块最好方法就是实际应用。netd最为一个deamon,为开发者提供了一个用于管理的接口。就是ndc (nativedeamonconnector),通过adb可以直接使用CommandListener中定义的各类命令。相似的framework层的NativeDeamonConnector是为上层提供的接口。下面是4.2中ndc可用的命令集合:

可用命令表:

例如:  leo@leo-weng:~$ adb shell ndc interface list

interface list
readrxcounter| readtxcounter
getthrottle<iface><”rx|tx”>
setthrottle<iface><rx_kbps|tx_kbps>
driver<iface><cmd><args>
route<add|remove> <iface> <”default|secondary”><dst> <prefix> <gateway>
list_ttys  
ipfwd status
enable|disable
tether status
start-reverse|stop-reverse
stop<
start<addr_1 addr_2 addr_3 addr_4 [addr_2n]>
interface<add|remove|list>
dnslist
dnsset <addr_1> < addr_2>
nat <enable|disable><iface><extface><addrcnt><nated-ipaddr/prelength>
pppd attach<tty> <addr_local> <add_remote> <dns_1><dns_2>
detach<tty>
softap startap|stopap
fwreload<iface> <AP|P2P>
clients
status
set<iface> <SSID> <wpa-psk|wpa2-psk|open> [<key><channel> <preamble><max SCB>]
resolver setdefaultif<iface>
setifdns<iface><dns_1><dns_2>
flushdefaultif
flushif<iface>
bandwith enable|disable
removequota|rq
getquota|gq
getiquota|giq<iface>
setquota|sq<bytes> <iface>
removequota|rqs<iface>
removeiiquota|riq<iface>
setiquota|sq<interface><bytes>
addnaughtyapps|ana<appUid>
removenaughtyapps|rna<appUid>
setgolbalalert|sga<bytes>
debugsettetherglobalalert|dstga<iface0><iface1>
setsharedalert|ssa<bytes>
removesharedalert|rsa
setinterfacealert|sia<iface><bytes>
removeinterfacealert|ria<iface>
gettetherstats|gts<iface0><iface1>
idletimer enable|disable
add|remove<iface><timeout><classLabel>
firewall enable|disable|is_enabled
set_interface_rule<rmnet0><allow|deny>
set_egress_source_rule<ip_addr><allow|deny>
set_egress_dest_rule<ip_addr><port><allow|deny>
set_uid_rule<uid><allow|deny>
clatd stop|status|start<iface>

从init.rc文件中可以看到,是系统级的守护进程,手动kill后还会从新启动。

三.基本实例

就拿手机的soft-ap功能来举例吧,以使用 softap(Soft Access Point)为例。softap可以为wlan接入设备共享手机使用的移动网络,笔记本接入softap,可以通过手机的 3g 上网。以htc 中的 WLAN 热点的 app,如下图所示。

1)设置并开启 softap(便携式 WLAN 热点)

在 Setting 选项中进行设置,该设置功能的开启将涉及相关的UI 路径下相关的文件,packages /apps/Settings/src/com/android/settings/wifi 路径下,程序中的 WifiApEnabler. OnPreferenceChange 里, 设置 soft ap 在 wifiApDialog.onClick 里。

2)调用相应的处理函数,通过 socket 向 netd 下发命令

应用层通过ConnectivityManager接口,最终走到 Framework 层的 NetworkManagementService.startAccessPoint 函数。

[java] view plain copy
  1. //NetworkManagementService.java
  2. @Override
  3. public void startAccessPoint(
  4. WifiConfiguration wifiConfig, String wlanIface, String softapIface) {
  5. mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
  6. try {
  7. wifiFirmwareReload(wlanIface, "AP");
  8. if (wifiConfig == null) {
  9. mConnector.execute("softap", "set", wlanIface, softapIface);
  10. } else {
  11. mConnector.execute("softap", "set", wlanIface, softapIface, wifiConfig.SSID,
  12. getSecurityType(wifiConfig), wifiConfig.preSharedKey);
  13. }
  14. mConnector.execute("softap", "startap");
  15. } catch (NativeDaemonConnectorException e) {
  16. throw e.rethrowAsParcelableException();
  17. }
  18. }

NetworkManagementService 通过NativeDaemonConnector, 这里用来和系统的 netd 守护进程通过 socket 进行通信,发送命令。

3) netd 接受命令并进行处理,并将处理结果反馈给 Framework 层。

Netd 中 softap 控制的功能在/system/netd/SoftapController.{h,cpp}里, 具体的执行是通过调用网卡驱动的 ap 功能。NetworkManagementService 通过 NativeDaemonConnector 向下通过 socket 向下 softap 相关的字符串命令,NativeDaemonConnector 中维护着与 Netd 中 CommandListener 相关联的内部socket 线程。两者可以通过它相互通信。

[cpp] view plain copy
  1. //CommandListener.cpp
  2. int CommandListener::SoftapCmd::runCommand(SocketClient *cli,
  3. int argc, char **argv) {
  4. int rc = 0, flag = 0;
  5. char *retbuf = NULL;
  6. if (argc < 2) {
  7. cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false);
  8. return 0;
  9. }
  10. if (!strcmp(argv[1], "start")) {
  11. rc = sSoftapCtrl->startDriver(argv[2]);
  12. } else if (!strcmp(argv[1], "stop")) {
  13. rc = sSoftapCtrl->stopDriver(argv[2]);
  14. } else if (!strcmp(argv[1], "startap")) {
  15. rc = sSoftapCtrl->startSoftap();
  16. } else if (!strcmp(argv[1], "stopap")) {
  17. rc = sSoftapCtrl->stopSoftap();
  18. } else if (!strcmp(argv[1], "fwreload")) {
  19. rc = sSoftapCtrl->fwReloadSoftap(argc, argv);
  20. } else if (!strcmp(argv[1], "clients")) {
  21. rc = sSoftapCtrl->clientsSoftap(&retbuf);
  22. if (!rc) {
  23. cli->sendMsg(ResponseCode::CommandOkay, retbuf, false);
  24. free(retbuf);
  25. return 0;
  26. }
  27. } else if (!strcmp(argv[1], "status")) {
  28. ……
  29. ……

4) Framework 受到回馈的信息,并通知 UI 处理结果,呈现给用户。

相关的 Log 实例:

D/NetworkManagementService( 1760): ===================startAccessPoint
commandLine=softap set wlan0 wlan0 "HTC Portable Hotspot E2D4" "wpa2-psk" *** 0 0 5 0
D/NetdConnector( 1760): SND -> {softap set wlan0 wlan0 "HTC Portable Hotspot E2D4""wpa2-psk" "3FF8F7531FBB9" 0 0 5 0} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {200 Softap operation succeeded}
D/NetdConnector( 1760): RSP <- {200 Softap operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetdConnector( 1760): SND -> {softap startap} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate wlan0 down}
D/NetdConnector( 1760): listenToSocket read--: (24,0)
D/NetdConnector( 1760): RCV <- {600 Iface added m.wlan0}
D/NetdConnector( 1760): listenToSocket read--: (33,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate m.wlan0 down}
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate m.wlan0 up}
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {200 Softap operation succeeded}
D/NetdConnector( 1760): RSP <- {200 Softap operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetdConnector( 1760): SND -> {softap setMaxConns 5} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {200 Softap operation succeeded}
D/NetdConnector( 1760): RSP <- {200 Softap operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetdConnector( 1760): listenToSocket read--: (29,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate wlan0 up}
D/NetdConnector( 1760): listenToSocket read--: (29,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate wlan0 up}
D/NetdConnector( 1760): listenToSocket read--: (29,0)
D/NetdConnector( 1760): RCV <- {600 Iface linkstate wlan0 up}
D/NetdConnector( 1760): SND -> {interface getcfg wlan0} {null}
D/NetdConnector( 1760): listenToSocket read--: (65,0)
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): RCV <- {213 1c:b0:94:36:bf:cb 0.0.0.0 0 [up broadcast running multicast]}
D/NetdConnector( 1760): RSP <- {213 1c:b0:94:36:bf:cb 0.0.0.0 0 [up broadcast runningmulticast]}

D/NetworkManagementService( 1760): rsp <213 1c:b0:94:36:bf:cb 0.0.0.0 0 [up broadcast running multicast]>
D/NetworkManagementService( 1760): flags <[up broadcast running multicast]>
D/NetdConnector( 1760): SND -> {interface setcfg wlan0 192.168.1.1 24 [up]} {null}
D/NetdConnector( 1760): listenToSocket read--: (32,0)
D/NetdConnector( 1760): RCV <- {200 Interface configuration set}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): RSP <- {200 Interface configuration set}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
E/NetworkManagementService( 1760): DEBUG softap setmaclist: softap setmaclist 0 "" ""
D/NetdConnector( 1760): SND -> {softap setmaclist 0 "" ""} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {200 Softap operation succeeded}
D/NetdConnector( 1760): RSP <- {200 Softap operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetdConnector( 1760): SND -> {tether interface add wlan0} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (31,0)
D/NetdConnector( 1760): RCV <- {200 Tether operation succeeded}
D/NetdConnector( 1760): RSP <- {200 Tether operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetdConnector( 1760): SND -> {softap getassoclist} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (7,0)
D/NetdConnector( 1760): RCV <- {222 0|}
D/NetdConnector( 1760): RSP <- {222 0|}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
E/NetworkManagementService( 1760): DEBUG softap getassoclist: 0|
D/NetdConnector( 1760): SND -> {ipfwd enable} {null}
D/NetdConnector( 1760): already send Command (Wait Response)
D/NetdConnector( 1760): listenToSocket read--: (30,0)
D/NetdConnector( 1760): RCV <- {200 ipfwd operation succeeded}
D/NetdConnector( 1760): RSP <- {200 ipfwd operation succeeded}
D/NetdConnector( 1760): No Resp times=0
D/NetdConnector( 1760): finish send Command (complete)
D/NetworkManagementService( 1760): stopTethering
D/NetdConnector( 1760): SND -> {tether status} {null}
D/NetdConnector( 1760): listenToSocket read--: (31,0)
……

Android 4.1 Netd详细分析(一)概述与应用实例相关推荐

  1. Android 4.1 Netd详细分析(二)源文件/模块/基础类统领

    这篇粗略介绍-Netd文件夹下面的源文件/模块的基本功能,和主要类的组织关系. 一.文件构成 Netd文件下的源文件模块~组织以及基本实现功能: =========================== ...

  2. android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...

    01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...

  3. android view 源码分析,Android ViewPager源码详细分析

    1.问题 由于Android Framework源码很庞大,所以读源码必须带着问题来读!没有问题,创造问题再来读!否则很容易迷失在无数的方法与属性之中,最后无功而返. 那么,关于ViewPager有什 ...

  4. Android关于AndroidManifest.xml详细分析

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  5. Android签名与认证详细分析之二(CERT.RSA剖析)

    一.Android证书的格式 Android签名中证书的格式采用X.509标准的版本三,不过省略了一些内容. X.509证书格式如下图所示: 二.证书的格式示例 从Chrome浏览器中导出一个证书,打 ...

  6. Android自定义View使用详细分析与绘制流程全解

    目录 目录.png 1. 自定义View基础 1.1 分类 自定义View的实现方式有以下几种 类型 定义 自定义组合控件 多个控件组合成为一个新的控件,方便多处复用 继承系统View控件 继承自Te ...

  7. Android Scroller类的详细分析

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/7321910 Scroller这个类理解起来有一定的困难,刚开始接触Scrol ...

  8. Android Treble详细分析

    1 Android Treble Android 8.0 版本的一项新元素是 Project Treble.这是 Android 操作系统框架在架构方面的一项重大改变,旨在让制造商以更低的成本更轻松. ...

  9. [原] Android中Scroller类的分析

    今天看了一下项目中用到的ViewFlow控件,想弄明白其工作原理.从头开始分析,卡在"滚动"这儿了. 做android也快两年了,连最基本的滚动都不熟悉,真是惭愧...遂网上找资料 ...

  10. android jni fork()子进程不运行_安卓系统最重要的进程之一:system_server详细分析...

    1 概述 SystemServer是android系统的系统服务进程.属于系统级别,其它服务进程都是应用级别.它也是android系统的唯一一个系统服务进程. SystemServer进程的名字是sy ...

最新文章

  1. MySQL 批量插入:如何不插入重复数据?
  2. yum挂载ftp上无法安装问题
  3. 动态规划 | 对输入进行hash处理的LIS 1045
  4. 如何将记事本转换.php,记事本怎么变成表格?电脑便签如何将记事内容转化成Excel表格...
  5. 所有计算机的字数都是8位,计算机(全部笔记).doc
  6. 插入模板_现场组装楼梯踏步模板施工支设细节
  7. MySQL中述职类型的长度问题
  8. 网络编程(part7)--网络主机/IP地址/域名/端口号
  9. C#多线程窗体控件安全访问实现方法
  10. JDBC的第一个版本,不使用配置文件。使用jar文件一个
  11. 开始使用Pyhton
  12. sublime3 配置go的开发环境
  13. DC域【软件分发】失败的处理手段
  14. 向日葵控制端怎么传输文件给服务器,传送文件步骤有哪些?如何用向日葵实现远程传送文件?...
  15. 云计算基础架构实施要经历三个阶段
  16. 重装win10专业版系统
  17. 三角形内切圆和外接圆半径及其面积计算
  18. 江苏省高校,中专校职称计算机信息技术应用能力考核,江苏省高校中专校专业技术人员职称信息技术应用能力考核资料.doc...
  19. Oracle——根据拼音首字母模糊查询某个字段
  20. Java数组:一维数组的定义和赋值

热门文章

  1. excel科学计数法还原成字符串方法
  2. mongodb4.0事务特性(解读)
  3. python清除历史记录_只需python两行代码,就能获取你的浏览器历史浏览记录
  4. 记一个阿里巴巴 平台型产品经理 面试
  5. 【刷题】清橙 A1339 JZPLCM(顾昱洲)
  6. 数学基础类:如何求矩阵的特征值和特征向量
  7. 达梦数据库技术分享索引贴
  8. STM32CubeIDE Audio播放音频 WM8978 + I2S + DMA双缓存模式
  9. 发短信属于长连接还是短连接_通过链接发送短信
  10. idea java配色方案_IDEA 主题配色方案+字体