1. 代码位置

packages/apps/Settings/src/com/android/settings/TetherSettings.java
frameworks/base/services/java/com/android/server/connectivity/Tethering.java
frameworks/base/core/java/android/net/ConnectivityManager.java
frameworks/base/services/core/java/com/android/server/ConnectivityService.java
frameworks/base/services/java/com/android/server/NetworkManagementService.java
system/netd/CommandListener.cpp,TetherController.cpp,NatController.cpp

2. 调用流程
packages/apps/Settings/src/com/android/settings/TetherSettings.java
private void setUsbTethering(boolean enabled) {
       ConnectivityManager cm =
           (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
       mUsbTether.setChecked(false);
       if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
           mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
           return;
       }
       mUsbTether.setSummary("");
}
调用关系
   setUsbTethering(true);
        cm.setUsbTethering(enabled)
           mService.setUsbTethering(enable);   frameworks/base/core/java/android/net/ConnectivityManager.java
                mTethering.setUsbTethering(enable);   frameworks/base/services/core/java/com/android/server/ConnectivityService.java

frameworks/base/services/core/java/com/android/server/connectivity/Tethering.java
setUsbTethering()
    mUsbTetherRequested = true;
    usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false);
   
 onReceive()   
    if (action.equals(UsbManager.ACTION_USB_STATE)) {
       if (usbConnected && mRndisEnabled && mUsbTetherRequested)
           tetherUsb(true);
               tether(iface)       "Tethering rndis0"
                  sm.sendMessage(TetherInterfaceSM.CMD_TETHER_REQUESTED)
TetherInterfaceSM(InitialState):  CMD_TETHER_REQUESTED (2)                
                     sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED 1)
                     transitionTo(mStartingState);
TetherInterfaceSM(mStartingState)
                     Tethering.this.configureUsbIface
                        ifcg.setInterfaceUp();
                        mNMService.setInterfaceConfig(iface, ifcg);  INetworkManagementService:networkManagerService.java
                            CommandListener::setcfg()            "CommandListener: Setting iface cfg"    "CommandListener: Trying to bring up rndis0"
                     sendTetherStateChangedBroadcast();
                           "Tethering: sendTetherStateChangedBroadcast 0, 1, 0"
                     transitionTo(mTetheredState);
TetherInterfaceSM(mTetheredState)
                     mNMService.tetherInterface(mIfaceName);
                         tetherInterface()   networkManagerService.java
                            CommandListener: TetherCmd::runCommand. argc: 4. argv[0]: tether
                                 TetherController::tetherInterface()    TetherController.cpp
                                     addV6RtrAdvIface()
                                     applyDnsInterfaces()
                     "Tethering: Tethered rndis0"

TetherMasterSM(InitialState): CMD_TETHER_MODE_REQUESTED(1)
                      transitionTo(mTetherModeAliveState);
TetherMasterSM(TetherModeAliveState)
                      turnOnMasterTetherSettings();
                            mNMService.setIpForwardingEnabled(true);
                                setIpFwdEnabled()  TetherController.cpp
                                     echo 1 > /proc/sys/net/ipv4/ip_forward
                                     echo 2 > /proc/sys/net/ipv6/conf/all/proxy_ndp
                                     echo 2 > /proc/sys/net/ipv6/conf/all/forwarding
                            mNMService.startTethering(mDhcpRange);
                                TetherCmd::runCommand. argc: 18. argv[0]: tether   CommandListener.cpp
                                     TetherController::startTethering   "Starting tethering services"
                                          exec("/system/bin/dnsmasq")
                                             "dnsmasq : started, version 2.51 cachesize 150"
                            mNMService.setDnsForwarders(mDefaultDnsServers);
                                TetherController:setDnsForwarders     "Sending update msg to dnsmasq"
                                     update_dns:8.8.8.8:8.8.4.4
                                     update_dns:123.123.123.123:123.123.123.124
                      chooseUpstreamType(mTryCell);
                            "chooseUpstreamType(true), preferredApn =5, got type=0"
                            notifyTetheredOfNewUpstreamIface
                                 "notifying tethered with iface =rmnet0"
                                 sendMessage(TetherInterfaceSM.CMD_TETHER_CONNECTION_CHANGED)
TetherInterfaceSM(TetheredState) CMD_TETHER_CONNECTION_CHANGED                 
                      mNMService.enableNat(mIfaceName, newUpstreamIfaceName);
                           "Enabling NAT - Tethered Iface = rndis0 newUpstreamIfaceName =rmnet0"
                               NatController: enableNat(intIface=<rndis0>, extIface=<rmnet0>)
                                   /system/bin/iptables -t nat -A natctrl_nat_POSTROUTING -o rmnet0 -j MASQUERADE
                                   /system/bin/iptables -A natctrl_FORWARD -i rmnet0 -o rndis0 -m state --state ESTABLISHED,RELATED -g natctrl_tether_counters
                                   /system/bin/iptables -A natctrl_FORWARD -i rndis0 -o rmnet0 -m state --state INVALID -j DROP
                                   /system/bin/iptables -A natctrl_FORWARD -i rndis0 -o rmnet0 -g natctrl_tether_counters
                                   /system/bin/iptables -A natctrl_tether_counters -i rndis0 -o rmnet0 -j RETURN
                                   /system/bin/iptables -A natctrl_tether_counters -i rmnet0 -o rndis0 -j RETURN
                                   /system/bin/iptables -D natctrl_FORWARD -j DROP
                                   /system/bin/iptables -A natctrl_FORWARD -j DROP

system/netd/CommandListener.cpp
setcfg
  ifc_up()   system/core/libnetutils/ifc_utils.c
     ifc_set_flags(name, IFF_UP, 0);
        ioctl(ifc_ctl_sock, SIOCSIFFLAGS, &ifr)

3.dnsmasq正常log

D CommandListener: TetherCmd::runCommand. argc: 16. argv[0]: tether                              
D TetherController: Starting tethering services                                                  
D TetherController: Sending update msg to dnsmasq [update_ifaces:rndis0]                         
D TetherController: Sending update msg to dnsmasq [update_dns:8.8.8.8:8.8.4.4]                   
I dnsmasq : started, version 2.51 cachesize 150                                                  
I dnsmasq : compile time options: no-IPv6 GNU-getopt no-DBus no-I18N DHCP no-scripts no-TFTP     
W dnsmasq : warning: no upstream servers configured                                              
I dnsmasq : DHCP, IP range 192.168.48.2 -- 192.168.48.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.47.2 -- 192.168.47.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.46.2 -- 192.168.46.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.45.2 -- 192.168.45.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.44.2 -- 192.168.44.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.43.2 -- 192.168.43.254, lease time 1h                         
I dnsmasq : DHCP, IP range 192.168.42.2 -- 192.168.42.254, lease time 1h                         
I dnsmasq : read /etc/hosts - 1 addresses                                                        
I dnsmasq : using nameserver 8.8.4.4#53                                                          
I dnsmasq : using nameserver 8.8.8.8#53                                                          
D TetherController: Sending update msg to dnsmasq [update_dns:221.130.33.52:221.130.33.60]       
I dnsmasq : using nameserver 221.130.33.60#53                                                    
I dnsmasq : using nameserver 221.130.33.52#53                                                    
I dnsmasq : DHCPREQUEST(rndis0) 192.168.42.5 02:19:03:66:78:76                                   
I dnsmasq : DHCPACK(rndis0) 192.168.42.5 02:19:03:66:78:76 pcname                                
W dnsmasq : Ignoring domain corpusers.net for DHCP host name pcname                              
I dnsmasq : DHCPREQUEST(rndis0) 192.168.42.5 02:19:03:66:78:76                                   
I dnsmasq : DHCPACK(rndis0) 192.168.42.5 02:19:03:66:78:76 pcname                                
W dnsmasq : Ignoring domain corpusers.net for DHCP host name pcname                              
I dnsmasq : DHCPINFORM(rndis0) 192.168.42.5 02:19:03:66:78:76                                    
I dnsmasq : DHCPACK(rndis0) 192.168.42.5 02:19:03:66:78:76 pcname

4. Debug方法
 
4.1. 手机端运行ip r l/netcfg检查rmnet0, rndis0是否up;如rndis0没有up,检查ifc_up()函数及usb kernel part
4.2. PC端运行ipconfig检查是否从手机分配到ip address(关闭PC端的其他网络,如局域网/WLAN);如没有检查进程dnsmasq是否启动

Android USB tethering相关代码相关推荐

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

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

  2. Android USB Accessory相关知识

    1 开发板 Arduino ATmega2560 2 USB Host CH375 EPSON S1R72U06, UART to USB host EPSON S1R72U16 (compared ...

  3. android USB

    google 在推出API 3.0后 就增加啦USB通讯这块 同时为API  2.3提供啦一个USB通讯吧,这样也让2.3有啦USB通讯功能  不过只支持USBAccessory模式 USB通讯分为两 ...

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

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

  5. Android USB OTG U盘读写相关使用最全总结

    Android USB OTG U盘读写相关使用最全总结 https://blog.csdn.net/qq_29924041/article/details/80141514 androidOTG ( ...

  6. x-http-wrapper: 如何解决每次发版时,修改http相关代码造成的错误!(Android、iOS、h5)...

    其实是我做了个开源工具(^__^),拿出来给大家鉴赏下,欢迎大家提意见 项目:github.com/xuyt11/x-ht- 欢迎关注和star . 功能:这是一个http相关代码的创建工具. 现在我 ...

  7. android 分辨率合集,Android编程之分辨率处理相关代码段合集

    本文实例讲述了Android编程之分辨率处理相关代码段.分享给大家供大家参考,具体如下: 1. 通常我们所说的屏幕分辨率如800x480.960x540等.这些分辨率是可以通过代码获取到的.手机屏幕分 ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

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

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

最新文章

  1. FastAdmin扩展PHPEXCEL,PHP7.3高版本兼容问题
  2. hdu 4099 字典树 + 斐波那契
  3. 给UIButton添加背景图片
  4. linux网络编程之二-----多播(组播)编程
  5. Vue在渲染函数createELement和JSX中使用插槽slot
  6. 机器阅读(一)--整体概述
  7. 秒懂系列 | 史上最简单的Python Django入门教程
  8. Java 虚拟机运行时数据区
  9. 「CSS」常见的清除浮动方法
  10. Java-杂项:Java数组Array和集合List、Set、Map
  11. xml 导入SQL Server 2005
  12. 【Computer Organization笔记12】流水线技术概述
  13. 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
  14. 原创力文档怎么免费下载_谁说下载文档需要下载券?老司机分享的良心工具,全网文档免费下...
  15. 如何手动彻底消除U盘使用痕迹
  16. html网页两边有空隙,怎么让整个内容缩进?就是四周都有间隙。
  17. 嵌入式工程师必备技能--如何使用示波器查看IIC波形
  18. Java基础知识学习笔记总结
  19. 重学Elasticsearch第6章 : SpringBoot整合RestHighLevelClient
  20. 酒精发酵消泡剂重返国内,泡沫该怎么样对应

热门文章

  1. 如何靠3D建模月入2W+?
  2. 计算机大学生的代码作业帮做,现在越来越多的学生使用
  3. 聚类生成anchor框的尺寸和比例
  4. Kubernetes 学习总结(3) Manifests
  5. repo+manifests+git方式管理安卓代码
  6. linux系统fasta程序,求助:如何用命令对fasta格式的序列按长短排序
  7. 四位电脑故障诊断卡使用说明
  8. EDM系统看板多邮件模板邮箱配置地址簿​EDM营销推送邮件系统开发
  9. 安卓开发招聘!免费Android高级工程师学习资源,2年以上经验必看
  10. 3D建模软件测试自学,收藏:5个自学3DMAX教程以及3D模型资源的网站