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 部分走完。