Android USB tethering相关代码

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是否启动

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android 10.0系统中,可以通过以下步骤实现USB转网口默认固定IP地址的设置: 1. 连接USB转网口设备到Android设备。 2. 在Android设备中打开“设置”应用程序,点击“网络和互联网”选项。 3. 在“网络和互联网”选项中,选择“热点与共享”选项。 4. 在“热点与共享”选项中,选择“USB网络共享”选项。 5. 在“USB网络共享”选项中,开启“USB Tethering”选项,然后点击“USB网口设置”选项。 6. 在“USB网口设置”选项中,选择“静态IP”选项。 7. 在“静态IP”选项中,输入所需的IP地址、子网掩码和网关信息。 8. 点击“保存”按钮完成设置。 经过以上步骤后,Android设备就会将USB转网口设备连接到静态IP地址,并且该设置将在以后的使用中保持不变。需要注意的是,确保所设置的固定IP地址与其他设备使用的IP地址不冲突,以免出现网络连接问题。 ### 回答2: Android 10.0系统的USB转网口默认情况下是动态获取IP地址的,如果需要设置固定IP地址,可以按照以下步骤进行: 1. 连接设备并打开USB调试模式,可以在设置->开发者选项中找到该选项。 2. 打开电脑的命令提示符或终端工具,输入“adb devices”命令,确认设备连接成功。 3. 在终端中输入“adb shell”,进入设备的shell模式。 4. 输入“su”命令,获取root权限。 5. 输入“netcfg”,查看当前所有网络接口及其状态。 6. 根据需要的网络接口,确定其接口名称。一般为“rndis0”或“rmnet0”。 7. 输入“ifconfig [接口名称] [IP地址] netmask [子网掩码] up”命令,设置IP地址与子网掩码。例如:ifconfig rndis0 192.168.1.100 netmask 255.255.255.0 up。 8. 输入“route add default gw [网关地址] [接口名称]”命令,设置默认网关。例如:route add default gw 192.168.1.1 rndis0。 9. 输入“setprop net.dns1 [首选DNS服务器地址]”命令,设置DNS服务器地址。例如:setprop net.dns1 8.8.8.8。 10. 使用ping命令测试网络连接是否正常,例如:ping baidu.com。 以上是Android 10.0系统USB转网口设置固定IP地址的步骤,需要注意的是,该设置仅在当前USB网络连接下有效,并且用户需要具备一定的命令行操作经验。在进行设置时,应根据实际情况进行调整。 ### 回答3: Android 10.0系统的USB转网口功能可以把手机当成一个有线网络适配器使用,将手机通过USB接口与电脑相连,从而实现电脑通过手机进行有线网络访问的功能。要设置USB转网口默认的固定IP地址,可以按照以下步骤进行操作: 1. 打开设置菜单,在“网络和互联网”选项下找到“热点和网络共享”设置,打开该设置。 2. 在热点和网络共享页面中找到“USB网络共享”选项,开启USB网络共享功能。 3. 在“USB网络共享”选项的设置页面中,找到“USB Tethering设置”选项,点击进入。 4. 在“USB Tethering设置”页面中,可以看到“USB网络共享配置”设置项,点击该设置项。 5. 在“USB网络共享配置”设置页面中,可以设置USB网络共享的IP地址、子网掩码、网关、DNS等参数。在IP地址设置中选择“静态”方式,手动设置需要设置的固定IP地址。 6. 完成上述设置后,重新连接电脑和手机的USB接口,电脑会自动获取到设置的固定IP地址,实现USB转网口的固定IP地址功能。 需要注意的是,如果设置的固定IP地址与网络中其他设备的IP地址冲突,就可能会导致无法连接网络或无法正常访问网络。因此,在设置固定IP地址时,需要确保设置的IP地址在网络中是唯一的,避免冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值