FFOS 1.3 settings usb tethering 流程

RNDIS的百度解释

Remote Network Driver Interface Specification,既是RemoteNDIS,既是远程网络驱动接口规范。基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。[1] 

USB的通常配置为,设置为RNDIS后就表示是做为电脑的网络分享;

 

界面上的显示在Gaia层的代码

Hotspot.html (gaia\apps\settings\elements)      1910         2014/12/1

<input type="checkbox" name="tethering.usb.enabled" class="uninit">

当checkbox状态改变的时候,在Settings.js (gaia\apps\settings\js)中处理

handleEvent: function settings_handleEvent(event)

==》

value = input.checked; // boolean

==》

    var cset = {}; cset[key] = value;

    settings.createLock().set(cset);

此处的改变会走到gecko层NetworkManager.js (gecko\dom\system\gonk)




 

      case TOPIC_MOZSETTINGS_CHANGED:

        let setting = JSON.parse(data);

        this.handle(setting.key, setting.value);

        break;

 

this.handle的处理



This. handleUSBTetheringToggle:


gNetworkService对应的定义

XPCOMUtils.defineLazyServiceGetter(this, "gNetworkService",

                                   "@mozilla.org/network/service;1",

                                   "nsINetworkService");

在omni\components\ components.manifest中查找定义

component {c14cabaf-bb8e-470d-a2f1-2cb6de6c5e5c} NetworkService.js

contract @mozilla.org/network/service;1 {c14cabaf-bb8e-470d-a2f1-2cb6de6c5e5c}

对应的enableUsbRndis实现:

  // Switch usb function by modifying property of persist.sys.usb.config.

  enableUsbRndis: function(enable, callback) {

    if(DEBUG) debug("enableUsbRndis: " + enable);

 

    let params = {

      cmd: "enableUsbRndis",

      enable: enable

    };

    // Ask net work to report the result when this value is set to true.

    if (callback) {

      params.report = true;

    } else {

      params.report = false;

    }

 

    // The callback function in controlMessage may not be fired immediately.

    params.isAsync = true;

    //this._usbTetheringAction = TETHERING_STATE_ONGOING;

    this.controlMessage(params, function(data) {

      callback.enableUsbRndisResult(data.result, data.enable);

    });

  },

调用controlMessage将USB的RNDIS设置打开/关闭,然后在enableUsbRndisResult设置IP

  controlMessage: function(params, callback) {

    if (this.shutdown) {

      return;

    }

 

    if (callback) {

      let id = this.idgen++;

      params.id = id;

      this.controlCallbacks[id] = callback;

    }

    if (gNetworkWorker) {

      gNetworkWorker.postMessage(params);

    }

  },

enableUsbRndisResult实现,红色代码为设置IP。

  enableUsbRndisResult: function(success, enable) {

    if (success) {

      // If enable is false, don't find usb interface cause it is already down,

      // just use the internal interface in settings.

      if (enable) {

        this._tetheringInterface[TETHERING_TYPE_USB].internalInterface = this.getUsbInterface();

      }

      this.setUSBTethering(enable,

                           this._tetheringInterface[TETHERING_TYPE_USB],

                           this.usbTetheringResultReport.bind(this));

    } else {

      this.usbTetheringResultReport("Failed to set usb function");

      throw new Error("failed to set USB Function to adb");

    }

  },

其中gNetworkWorker的定义如下:

XPCOMUtils.defineLazyServiceGetter(this, "gNetworkWorker",

                                   "@mozilla.org/network/worker;1",

                                   "nsINetworkWorker");

其定义在NetworkWorker.cpp(gecko\dom\system\gonk)     

static const mozilla::Module::ContractIDEntry kNetworkWorkerContracts[] = {

  { "@mozilla.org/network/worker;1", &kNS_NETWORKWORKER_CID },

  { nullptr }

};

所以最终会走到NetworkUtils.cpp(gecko\dom\system\gonk)     

bool NetworkUtils::enableUsbRndis(NetworkParams&aOptions)

  char newConfig[PROPERTY_VALUE_MAX] = "";
  property_get(SYS_USB_CONFIG_PROPERTY, currentConfig, nullptr);
  join(configFuncs, USB_CONFIG_DELIMIT, PROPERTY_VALUE_MAX, newConfig);
  if (strcmp(currentConfig, newConfig)) {
    property_set(SYS_USB_CONFIG_PROPERTY, newConfig);
  }

设置系统属性。至此,gaia 到gecko 部分的rndis 部分走完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值