wifi详解-2(netd)

来源:互联网 发布:淘宝客服售前做什么 编辑:程序博客网 时间:2024/04/30 13:34

引用:http://blog.csdn.net/xiaokeweng/article/details/8130218
所谓 Netd 就是Network Daemon 的缩写,表示Network守护进程,类似的命名还有很多,例如 Vold(Volumn Deamon)—磁盘管理,Rild(Radio Interface Layer Deamon)— 电话的基本数据功能……类似的还有好多,遍及Android各类服务,各个层次~
Netd负责跟一些涉及物理端口的网络操作相关的功能实现,例如带宽控制(Bandwidth),网络地址转换(NAT),个人局域网(pan),PPP链接,soft-ap,共享上网(Tether)等等……都是按照模块(.cpp+.h)组织在netd文件目录下的~

Android Netd相关的基本框架的四大部分:
(1)Linux Kernel 用于检测 network相关的所有 event 事件。
(2)Netd 作为 Kernel 与 Framework之间通信的桥梁。
(3)Framework 层操作 Netd,向 Netd发送操作命令。
(4)UI 与 Framework交互,用于用户进行网络的操控。

涉及主要源码位置:
Netd:
/System/netd
/system/core/libsysutils/src
/system/core/include/sysutils
Framework:
/frameworks/base/services/java/com/android/server

先统领一下~整体的框架图~ 很不规范,会意即可,之后还会详细介绍:
这里写图片描述
从init.rc文件中可以看到,是系统级的守护进程,手动kill后还会从新启动。
这里写图片描述
三.基本实例
就拿手机的soft-ap功能来举例吧,以使用 softap(Soft Access Point)为例。softap可以为wlan接入设备共享手机使用的移动网络,笔记本接入softap,可以通过手机的 3g 上网。
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//NetworkManagementService.java      @Override      public void startAccessPoint(              WifiConfiguration wifiConfig, String wlanIface, String softapIface) {          mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);          try {              wifiFirmwareReload(wlanIface, "AP");              if (wifiConfig == null) {                  mConnector.execute("softap", "set", wlanIface, softapIface);              } else {                  mConnector.execute("softap", "set", wlanIface, softapIface, wifiConfig.SSID,                          getSecurityType(wifiConfig), wifiConfig.preSharedKey);              }              mConnector.execute("softap", "startap");          } catch (NativeDaemonConnectorException e) {              throw e.rethrowAsParcelableException();          }      }  

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//CommandListener.cpp  int CommandListener::SoftapCmd::runCommand(SocketClient *cli,                                          int argc, char **argv) {      int rc = 0, flag = 0;      char *retbuf = NULL;      if (argc < 2) {          cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false);          return 0;      }      if (!strcmp(argv[1], "start")) {          rc = sSoftapCtrl->startDriver(argv[2]);      } else if (!strcmp(argv[1], "stop")) {          rc = sSoftapCtrl->stopDriver(argv[2]);      } else if (!strcmp(argv[1], "startap")) {          rc = sSoftapCtrl->startSoftap();      } else if (!strcmp(argv[1], "stopap")) {          rc = sSoftapCtrl->stopSoftap();      } else if (!strcmp(argv[1], "fwreload")) {          rc = sSoftapCtrl->fwReloadSoftap(argc, argv);      } else if (!strcmp(argv[1], "clients")) {          rc = sSoftapCtrl->clientsSoftap(&retbuf);          if (!rc) {              cli->sendMsg(ResponseCode::CommandOkay, retbuf, false);              free(retbuf);              return 0;          }      } else if (!strcmp(argv[1], "status")) {  ……  ……  

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

0 0
原创粉丝点击