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

FFOS 1.3 settings usb tethering 流程相关推荐

  1. Android Q USB Tethering 端口切换分析

    需求:在开启 USB Tethering 后,同时需要开启 diag 端口供 QXDM 调试使用.于是 trace code 大概分析了一下设置 USB Tethering 过程,比较毛糙,如有不正之 ...

  2. WiFi Tethering Usb Tethering

    10.   Wifi TetheringWiFi Tethering 在Settings程序里看不到关于Wifi Tethering的任何代码, 着实让我迷惑了一下. 原来开启soft ap功能后就会 ...

  3. OpenWrt支持usb tethering

    OpenWrt支持usb tethering 一.概述 OpenWrt支持usb tethering的应用场景主要是,手机打开usb网络共享(Android)或个人热点(iOS),经过USB的连接,使 ...

  4. Openwrt 18.06 iPhone XR usb tethering导致内核崩溃问题解决方案

    环境描述: openwrt 18.06  (Linux-4.9.120) 问题描述: iPhone XR usb tethering出现内核崩溃 root@GL-MIFI:/# [  253.1302 ...

  5. android wifi tethering,新增Wi-Fi/USB Tethering功能

    新增Wi-Fi/USB Tethering功能 对于常常需要在外用电脑上网的人来说,智能手机具备Modem功能,通常都是他们选择手机的一大因素,之前HTC的机种,像是Hero/Legend/Desir ...

  6. Android USB Tethering的实现以及代码流程

    分析还不是很全,kernel层的代码还在看,同步更新吧 直接略过界面层,界面一系列处理后调用Tethering.java的setUsbTethering函数. public int setUsbTet ...

  7. Android USB tethering相关代码

    1. 代码位置 packages/apps/Settings/src/com/android/settings/TetherSettings.java frameworks/base/services ...

  8. MSM USB插入流程代码分析

    点击打开链接 代码路径:kernel\msm-3.18\drivers\power\qpnp-smbcharger.c src_detect_handler -->update_usb_stat ...

  9. android usb adb流程

    android adb 概述 android adb的代码分为两部分: kernel层的代码在如下路径: drivers/usb/gadget/f_adb.c drivers/usb/gadget/a ...

最新文章

  1. 远程拷贝代码 指定端口
  2. 【算法】旋转数组【LeetCode】
  3. html渐变编织背景,【报Bug】uniapp设置了css渐变背景色编译时会报错
  4. 21位美国名校学生领袖在湖北了解中国媒体情况
  5. canvas 封装一个自己的 icon 库
  6. Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性
  7. Android插件化开发指南——实践之ViewPager+Fragment优化(预加载和懒加载)
  8. 精练战略云 VS “华丽“战术云
  9. mysql导出数据库1146_MySQL复制出错 Last_SQL_Errno:1146的解决方法
  10. python编写程序解方程_第2章 Python初步 课后题
  11. EasyPoi 导出表格并设置表头
  12. 【数据库】结构化数据、非结构化数据、半结构化数据的区别
  13. 从1到N,第十二届中国IDC产业年度大典在京启幕
  14. 27岁,今年研究生上岸,有什么忠告可以给我的?
  15. 【读书笔记】《中庸(国学大书院)》
  16. kubesphere离线安装从入门到放弃
  17. CPU 缓存一致性 MESI 协议
  18. JMockit学习之mock接口和抽象类
  19. maven国内镜像--开源中国
  20. 图论:无向网(UDN)的定义及相关操作

热门文章

  1. 数据库加密sqlite3
  2. html+监听+页面滚动到底部,JS监听页面滚动到底部事件
  3. js常用的正则匹配(一般不用修改)
  4. excel调用python编程-超简单:用Python让Excel飞起
  5. android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...
  6. grails Domian对象转JSON去class以及自己定义字段的最佳方式
  7. 使用 Promise 时的5个常见错误
  8. 常见的知识图谱(Wikidata、YAGO、ConceptNet、DBpedia)
  9. Python-猫耳MF
  10. 手工皮具的大坑之路-封边感悟与工具