wifi详解-2(netd)

引用: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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值