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 部分走完。
FFOS 1.3 settings usb tethering 流程相关推荐
- Android Q USB Tethering 端口切换分析
需求:在开启 USB Tethering 后,同时需要开启 diag 端口供 QXDM 调试使用.于是 trace code 大概分析了一下设置 USB Tethering 过程,比较毛糙,如有不正之 ...
- WiFi Tethering Usb Tethering
10. Wifi TetheringWiFi Tethering 在Settings程序里看不到关于Wifi Tethering的任何代码, 着实让我迷惑了一下. 原来开启soft ap功能后就会 ...
- OpenWrt支持usb tethering
OpenWrt支持usb tethering 一.概述 OpenWrt支持usb tethering的应用场景主要是,手机打开usb网络共享(Android)或个人热点(iOS),经过USB的连接,使 ...
- Openwrt 18.06 iPhone XR usb tethering导致内核崩溃问题解决方案
环境描述: openwrt 18.06 (Linux-4.9.120) 问题描述: iPhone XR usb tethering出现内核崩溃 root@GL-MIFI:/# [ 253.1302 ...
- android wifi tethering,新增Wi-Fi/USB Tethering功能
新增Wi-Fi/USB Tethering功能 对于常常需要在外用电脑上网的人来说,智能手机具备Modem功能,通常都是他们选择手机的一大因素,之前HTC的机种,像是Hero/Legend/Desir ...
- Android USB Tethering的实现以及代码流程
分析还不是很全,kernel层的代码还在看,同步更新吧 直接略过界面层,界面一系列处理后调用Tethering.java的setUsbTethering函数. public int setUsbTet ...
- Android USB tethering相关代码
1. 代码位置 packages/apps/Settings/src/com/android/settings/TetherSettings.java frameworks/base/services ...
- MSM USB插入流程代码分析
点击打开链接 代码路径:kernel\msm-3.18\drivers\power\qpnp-smbcharger.c src_detect_handler -->update_usb_stat ...
- android usb adb流程
android adb 概述 android adb的代码分为两部分: kernel层的代码在如下路径: drivers/usb/gadget/f_adb.c drivers/usb/gadget/a ...
最新文章
- 远程拷贝代码 指定端口
- 【算法】旋转数组【LeetCode】
- html渐变编织背景,【报Bug】uniapp设置了css渐变背景色编译时会报错
- 21位美国名校学生领袖在湖北了解中国媒体情况
- canvas 封装一个自己的 icon 库
- Python脚本控制的WebDriver 常用操作 十八 获取测试对象的css属性
- Android插件化开发指南——实践之ViewPager+Fragment优化(预加载和懒加载)
- 精练战略云 VS “华丽“战术云
- mysql导出数据库1146_MySQL复制出错 Last_SQL_Errno:1146的解决方法
- python编写程序解方程_第2章 Python初步 课后题
- EasyPoi 导出表格并设置表头
- 【数据库】结构化数据、非结构化数据、半结构化数据的区别
- 从1到N,第十二届中国IDC产业年度大典在京启幕
- 27岁,今年研究生上岸,有什么忠告可以给我的?
- 【读书笔记】《中庸(国学大书院)》
- kubesphere离线安装从入门到放弃
- CPU 缓存一致性 MESI 协议
- JMockit学习之mock接口和抽象类
- maven国内镜像--开源中国
- 图论:无向网(UDN)的定义及相关操作
热门文章
- 数据库加密sqlite3
- html+监听+页面滚动到底部,JS监听页面滚动到底部事件
- js常用的正则匹配(一般不用修改)
- excel调用python编程-超简单:用Python让Excel飞起
- android 监听多个广播,同一个广播接收器监听多个广播及多个广播接收器监听同一个广播...
- grails Domian对象转JSON去class以及自己定义字段的最佳方式
- 使用 Promise 时的5个常见错误
- 常见的知识图谱(Wikidata、YAGO、ConceptNet、DBpedia)
- Python-猫耳MF
- 手工皮具的大坑之路-封边感悟与工具