USB共享网络流程分析和自动分享网络给PC

1.点击网络共享菜单处理流程
类:TetherSettings.java
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
  ConnectivityManager cm =
                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

  if (preference == mUsbTether) {
            if (!mUsbTethering) {
                boolean newState = mUsbTether.isChecked();

                /// M: update usb tethering @{
                mUsbTether.setEnabled(false);
                mTetherSettingsExt.updateUsbTypeListState(false);
                mUsbTethering = true;
                mUsbTetherCheckEnable = false;
                if (newState) {
                    mUsbTetherDone = false;
                } else {
                    mUsbUnTetherDone = false;
                }
                mUsbTetherFail = false;

                Log.d(TAG, "onPreferenceTreeClick - setusbTethering(" + newState +
                    ") mUsbTethering:  " + mUsbTethering);
                /// @}

                if (newState) {
                    startProvisioningIfNecessary(TETHERING_USB);//若新状态位true,开始网络共享
                } else {
                    if (TetherUtil.isProvisioningNeeded(getActivity())) {
                        TetherService.cancelRecheckAlarmIfNecessary(getActivity(), TETHERING_USB);
                    }
                    setUsbTethering(newState);//设置新的usb网络共享选项状态
                }
            } else {
                return true;
            }
  }  
  ===========》
    private void startProvisioningIfNecessary(int choice) {
        mTetherChoice = choice;
        if (TetherUtil.isProvisioningNeeded(getActivity())) {//弹出对话框让用户选择允许
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setClassName(mProvisionApp[0], mProvisionApp[1]);
            intent.putExtra(TETHER_CHOICE, mTetherChoice);
            startActivityForResult(intent, PROVISION_REQUEST);
        } else {
            startTethering();//开始共享网络的方法
        }
    }
     ===========》
     private void startTethering() {
        switch (mTetherChoice) {
            .....
            case TETHERING_USB: //TETHERING_USB选选等于USB网络共享
                setUsbTethering(true);//
                break;
        }
    }
   ===========》 //到此还是没发现网络是怎么共享出去的
   private void setUsbTethering(boolean enabled) {
        ConnectivityManager cm =
            (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
         //M: move mUsbTether.setChecked(false) as CR ALPS00449289        
        if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
            mUsbTether.setChecked(false);
            mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
            return;
        }
        mUsbTether.setSummary("");
    }    
 ===========》下面看看ConnectivityManager.java的    setUsbTethering(enabled)方法:
 public int setUsbTethering(boolean enable) {
        try {
            return mService.setUsbTethering(enable);//连接服务器类设置共享位true
        } catch (RemoteException e) {
            return TETHER_ERROR_SERVICE_UNAVAIL;
        }
    }
 }
 ===========》看 ConnectivityService类:
  public int setUsbTethering(boolean enable) {
        ConnectivityManager.enforceTetherChangePermission(mContext);
        if (isTetheringSupported()) {
            return mTethering.setUsbTethering(enable);//mTethering为Tethering类对象
        } else {
            return ConnectivityManager.TETHER_ERROR_UNSUPPORTED;
        }
    }
 ===========》查看Tethering类:
   public int setUsbTethering(boolean enable) {
        if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")");
         UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE);
        int value ;

        synchronized (mPublicSync) {
            /** M: ALPS00233672 */
            mUsbTetherEnabled = enable;

            /** M: for bug solving, ALPS00331223 */
            mTetheredFail = false ;
            if (enable) {
                mTetherDone = false ;
                if (mRndisEnabled) {
                    tetherUsb(true);
                } else {
                    mUsbTetherRequested = true;
                    /// M: @{
                    /** EEM Support */
                    //usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS);
                    value = Settings.System.getInt(mContext.getContentResolver()
                            , Settings.System.USB_TETHERING_TYPE
                            , Settings.System.USB_TETHERING_TYPE_DEFAULT);
                    if ((value == Settings.System.USB_TETHERING_TYPE_EEM) && isMtkTetheringEemSupport()) {
                            Log.d(TAG, "The MTK_TETHERING_EEM_SUPPORT is True");
                            usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_EEM);
                    } else {
                            Log.d(TAG, "The MTK_TETHERING_RNDIS only");
                            usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS);
                    }
                    /// @}
                }
            } else {
                //for tear down request from ConnectivityService
                mUnTetherDone = false ;
                tetherUsb(false);
                if (mRndisEnabled) {
                    usbManager.setCurrentFunction(null);
                }
                mUsbTetherRequested = false;
            }
        }
        return ConnectivityManager.TETHER_ERROR_NO_ERROR;
    }

 ===========》看tetherUsb(true)方法:    
 private void tetherUsb(boolean enable) {
        if (VDBG) Log.d(TAG, "tetherUsb " + enable);

        String[] ifaces = new String[0];
        try {
            ifaces = mNMService.listInterfaces();//获取网络消息名列表
            for (String iface : ifaces) {
               if (isUsb(iface)) {//如果属于USB需要的网络消息
                      //且网络分享开启时分享网络消息,否则不分享
                    int result = (enable ? tether(iface) : untether(iface));
                    if (result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
                        return;
                    }
                }
            }
        } catch (Exception e) {
            Log.e(TAG, "Error listing Interfaces", e);
            //return;
        }


        /** M: for bug solving, ALPS00331223 */
        mTetheredFail = true ;
        SystemClock.sleep(500);
        sendTetherStateChangedBroadcast() ;

        Log.e(TAG, "unable start or stop USB tethering");
    }
 ===========》现在看tether(iface),usb是如何把信号分享出去:

    public int tether(String iface) {
        if (DBG) Log.d(TAG, "Tethering " + iface);
        TetherInterfaceSM sm = null;
        synchronized (mPublicSync) {
            sm = mIfaces.get(iface);//通过消息获取网络信号对象
        }
        if (sm == null) {
            Log.e(TAG, "Tried to Tether an unknown iface :" + iface + ", ignoring");
            return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
        }
        if (!sm.isAvailable() && !sm.isErrored()) {
            Log.e(TAG, "Tried to Tether an unavailable iface :" + iface + ", ignoring");
            return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
        }
        sm.sendMessage(TetherInterfaceSM.CMD_TETHER_REQUESTED);//发送需要分享网络信号需求指令
        return ConnectivityManager.TETHER_ERROR_NO_ERROR;
    }
 ===========》CMD_TETHER_REQUESTED消息的处理在InitialState中:
    case CMD_TETHER_REQUESTED:
       setLastError(ConnectivityManager.TETHER_ERROR_NO_ERROR);
       mTetherMasterSM.sendMessage(TetherMasterSM.CMD_TETHER_MODE_REQUESTED,
                                TetherInterfaceSM.this);//这里也没具体处理消息,再次发出一个消息和TetherMasterSM对象
                        /** M: ipv6 tethering @{ */
       if (isTetheringIpv6Support()) {
        setLastError(ConnectivityManager.TETHER_ERROR_IPV6_NO_ERROR);
         if (mIpv6FeatureEnable) {
             mIpv6TetherMasterSM.sendMessage(
                 TetherMasterSM.CMD_TETHER_MODE_REQUESTED,
                    TetherInterfaceSM.this);
                             }
                  }
                        /** @} */
         transitionTo(mStartingState);
        break;    
 ===========》该消息CMD_TETHER_MODE_REQUESTED处理如下
 case CMD_TETHER_MODE_REQUESTED:
    TetherInterfaceSM who = (TetherInterfaceSM)message.obj;
    if (VDBG) Log.d(TAG, "[MSM_Initial][" + mName
           + "] Tether Mode requested by " + who);
    mNotifyList.add(who);
    transitionTo(mTetherModeAliveState);//这里实质传递了一个mTetherModeAliveState状态。
     break;
 ===========》看mTetherModeAliveState初始化:
 class TetherModeAliveState extends TetherMasterUtilState {
            boolean mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE;
            @Override
            public void enter() {
                Log.i(TAG, "[MSM_TetherModeAlive][" + mName + "] enter");
                //打开主机网络信号分享出去
                turnOnMasterTetherSettings(); // may transition us out
                //开始监听SIM信号变化
                startListeningForSimChanges();

                mTryCell = !WAIT_FOR_NETWORK_TO_SETTLE; // better try something first pass
                                                        // or crazy tests cases will fail
                chooseUpstreamType(mTryCell);
                mTryCell = !mTryCell;
            }    

 ===========》查看turnOnMasterTetherSettings()方法:
 protected boolean turnOnMasterTetherSettings() {
                try {
                    /** M: ipv6 tethering @{ */
                    if (isIpv6MasterSmOn()) {
                        if (MASTERSM_IPV4.equals(mName)) {
                            ///M: Fix for CR ALPS00382764
                            //mNMService.setIpForwardingEnabled(true);
                        }
                        else if (MASTERSM_IPV6.equals(mName)) {
                            mNMService.setIpv6ForwardingEnabled(true); }//设置ipv6信息传递可用
                    } else {
                    /** @} */
                        ///M: Fix for CR ALPS00382764
                        //mNMService.setIpForwardingEnabled(true);
                    }
                } catch (Exception e) {
                    transitionTo(mSetIpForwardingEnabledErrorState);
                    return false;
                }
                try {
                    mNMService.startTethering(mDhcpRange);//开始真正分享网络信号
                } catch (Exception e) {
                    try {
                        mNMService.stopTethering();
                        mNMService.startTethering(mDhcpRange);
                    } catch (Exception ee) {
                        transitionTo(mStartTetheringErrorState);
                        return false;
                    }
                }
                return true;
            }

 ===========》到这里NetworkManagementService才真正走到开始分享的方法mNMService.startTethering,看看该方法:
 @Override
    public void setIpForwardingEnabled(boolean enable) {
        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
        try {
            mConnector.execute("ipfwd", enable ? "enable" : "disable", "tethering");
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
    }

    @Override
    public void startTethering(String[] dhcpRange) {
        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
        // cmd is "tether start first_start first_stop second_start second_stop ..."
        // an odd number of addrs will fail

        final Command cmd = new Command("tether", "start");
        for (String d : dhcpRange) {
            cmd.appendArg(d);
        }

        try {
            //mConnector是一个Runnable守护线程NativeDaemonConnector 熟称ndc
           //支持netd指令集,发送的信号字符串数组通过Command组装,真正写入USB线达到共享网络目的
            mConnector.execute(cmd);
        } catch (NativeDaemonConnectorException e) {
            throw e.rethrowAsParcelableException();
        }
    }    
 ===========》到此网络信号终于通过USB线传递来出去,可以看出传递的实际是一个Command的指令对象,其中保存的是一个
ArrayList字符串数组参数,具体传输协议内容如下:
1)设置IP方法时,获取了8组2,254的ip地址域:
03-30 14:07:19.169 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.42.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.42.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.43.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.43.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.44.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.44.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.45.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.45.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.46.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.46.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.47.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.47.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.48.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.48.254
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.49.2
03-30 14:07:19.170 867-933/? E/NetworkManagement: fengqing NETWORK d =192.168.49.254
会获取IP列表然后在分享是组装成字符串列表如下:
2)开始分享网络
97 tether start 192.168.42.2 192.168.42.254 192.168.43.2 192.168.43.254 192.168.44.2 192.168.44.254 192.168.45.2 192.168.45.254 192.168.46.2 192.168.46.254 192.168.47.2 192.168.47.254 192.168.48.2 192.168.48.254 192.168.49.2 192.168.49.254 \0
98 tether dns set 1002 2409:8057:2000::8 2409:8057:2000:4::8 120.196.165.7 221.179.38.7 \0
99 nat enable rndis0 ccmni0 0 \0
100 ipfwd add rndis0 ccmni0 \0
101 ipfwd enable tethering \0

每条USB传输协议内容构成分解如下:

  序列号97 指令类型tether 指令动作start 指令内容xxx 结束符\0
  
这些关键字为Netd命令,见文档结尾附  

其中指令内容可以有多个并列,每条指令都是以指令序列号开始 结束符 结束。 
从以上log看出开启USB网络共享步骤:
1.开始8个IP段:               97 tether start 192.168.42.2 xxx \0
2.dns设置:                    98 tether dns set xxxx  \0 
3.enable rndis0和ccmni0       99 nat enable rndis0 ccmni0 0 \0 
4.将rndis0和ccmni0添加入IP    100 ipfwd add rndis0 ccmni0 \0
5.开始分享                    101 ipfwd enable tethering \0  

enable tethering后,开始具体设置,每次网络发送变化时会重新配置一遍:
337 bandwidth gettetherstats     //带宽控制
338 network create 1011 SYSTEM   //网络控制
339 network interface add 1011 ccmni4  //网络配置管理
340 interface setmtu ccmni4 1410
341 network route add 1011 ccmni4 ::/0 fe80::74a1:f4a:3dac:fcb  //网络路由配置管理
342 resolver clearnetdns 1011
343 bandwidth gettetherstats
344 bandwidth gettetherstats
345 tether dns set 1010 2409:8057:2000::8 2409:8057:2000:4::8 120.196.165.7 221.179.38.7
346 bandwidth removeiquota ccmni0
347 bandwidth setiquota ccmni0 9223372036854775807
348 bandwidth setglobalalert 2097152  

底层Netd支持命令集:
ndc(NativeDeamonConnector):  
2   interface
3       list   //   /sys/class/net
4       getcfg  wlan0
5       setcfg  
6       clearaddrs
7       ipv6privacyextensions  //  Usage: interface ipv6privacyextensions <interface> <enable|disable>
8       ipv6         //  Usage: interface ipv6 <interface> <enable|disable>
9       ipv6ndoffload   //  Usage: interface ipv6ndoffload <interface> <enable|disable>
10      setmtu   //  Usage: interface setmtu <interface> <val>
11      
12  ipfwd
13      status  
14      enable  // ipfwd enable  <requester>
15      disable  //  ipfwd disable <requester>
16      add  //  ipfwd  add   wlan0 dummy0
17      remove  //  ipfwd remove wlan0 dummy0
18      
19  tether
20      stop
21      status
22      interface list/add/remove
23      dns list/set
24      start 
25      
26  nat
27      enable
28      disable
29      
30  pppd
31      attach
32      detach
33      
34  softap
35      startap
36      stopap
37      fwreload
38      status
39      set
40      
41  resolver
42      setnetdns
43      clearnetdns
44      flushnet
45      
46  bandwidth
47      enable
48      disable
49      removequota\rq       // removequota <interface>
50      getquota\gq
51      getiquota\giq        // getiquota <iface>
52      setquota\sq      //   setquota <interface> <bytes>
53      setquotas\sqs    // setquotas <bytes> <interface> ...
54      removequotas\rqs  // removequotas <interface> ...
55      removeiquota\riq  removeiquota <interface>
56      setiquota\siq  // setiquota <interface> <bytes>
57      addnaughtyapps\ana // addnaughtyapps <appUid> ...
58      removenaughtyapps\rna   //removenaughtyapps <appUid> ...
59      happybox   // happybox (enable | disable)
60      addniceapps\aha   //  addniceapps <appUid> ...
61      removeniceapps\rha  // removeniceapps <appUid> ...
62      setglobalalert\sga  // setglobalalert <bytes>
63      debugsettetherglobalalert\dstga  // debugsettetherglobalalert <interface0> <interface1>
64      removeglobalalert\rga
65      debugremovetetherglobalalert\drtga // debugremovetetherglobalalert <interface0> <interface1>
66      setsharedalert\ssa  // setsharedalert <bytes>
67      removesharedalert\rsa  
68      setinterfacealert\sia  // setinterfacealert <interface> <bytes>
69      removeinterfacealert\ria  //  removeinterfacealert <interface>
70      gettetherstats\gts  // gettetherstats [<intInterface> <extInterface>]
71      
72  idletimer
73      enable
74      disable
75      add
76      remove
77      
78  firewall
79      enable  // Usage: firewall enable <whitelist|blacklist>
80      disable
81      is_enabled
82      set_interface_rule  //  Usage: firewall set_interface_rule <rmnet0> <allow|deny>
83      set_egress_source_rule  // Usage: firewall set_egress_source_rule <192.168.0.1> <allow|deny>
84      set_egress_dest_rule  //  Usage: firewall set_egress_dest_rule <192.168.0.1> <80> <allow|deny>
85      set_uid_rule  // Usage: firewall set_uid_rule <dozable|standby|none> <1000> <allow|deny>
86      enable_chain  // Usage: firewall enable_chain <dozable|standby>
87      disable_chain  // Usage: firewall disable_chain <dozable|standby>
88      
89  clatd
90      stop
91      status
92      start
93  
94  strict
95      enable
96      disable
97      set_uid_cleartext_policy
98      
99  network
100     route
101     interface add/remove
102     create vpn
103     destroy
104     permission 
105             // network permission   user   set  <permission>  <uid> ...
106             // network permission   user  clear    <uid> ...
107             // network permission network  set  <permission> <netId> ...
108             // network permission network clear   <netId> ...
109     users  
110             // network users  add   <netId> [<uid>[-<uid>]] ...
111             // network users remove <netId> [<uid>[-<uid>]] ...
112             
113     protect
114             // network protect allow <uid> ...
115             // network protect  deny <uid> ...

系统支持哪些netd指令可以通过adb命令查询,当然要在eng版本下:
adb shell ndc interface list

 

1.功能需求修改:实现连上USB后自动打开网络分享功能:

    USB连上后自动开始网络共享

diff --git a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/frameworks/base/services/usb/java/com/android/ser
index 7437332..e16da06 100644
--- a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -71,6 +71,11 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Scanner;
 import java.util.Set;
+//add auto open usb tethering by fengqing 20190422
+import android.net.ConnectivityManager;
+//add auto open usb tethering by fengqing 20190422
+
+
 
 /**
  * UsbDeviceManager manages USB state in device mode.
@@ -817,7 +822,19 @@ public class UsbDeviceManager {
             if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());
             mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
             mBroadcastedIntent = intent;
+                       //add auto open usb tethering by fengqing 20190422
+                       setUsbTethering(mConnected);
         }
+               
+        private void setUsbTethering(boolean connected){
+                       ConnectivityManager cm =
+                                               (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+                       if (cm !=null && cm.setUsbTethering(connected) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+               Slog.d(TAG, "Tethering start.........successfully ");
+                       } 
+
+               }
+               //add auto open usb tethering by fengqing 20190422
 
         private void updateUsbFunctions() {
             updateAudioSourceFunction();

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值