Android系统添加USB共享网络


测试平台:MT2712,Android9.0,Linux4.9
使用场景:
Android车机,通过USB线连接T-box、手机、PC电脑,进而使用他们的网络上网。
其实Android系统已经支持USB共享网络,但相应的产品系统中还未开启USB共享网络,那么这个时候就需要添加USB网络共享的一些配置,使得产品支持此功能。
Android USB网络共享基于RNDIS实现。

一、代码修改:

1.内核添加RNDIS的支持

CONFIG_USB_USBNET=y
CONFIG_USB_NET_DM9601=y
CONFIG_USB_NET_SR9700=y
CONFIG_USB_NET_SMSC75XX=y
CONFIG_USB_NET_SMSC95XX=y
+CONFIG_USB_NET_RNDIS_HOST=y

具体的网卡名称:
路径:kernel-4.9/drivers/net/usb/usbnet.c

usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
{
.........................................
	dev->net = net;
	strcpy (net->name, "usb%d");
	printk("usbnet_probe usb");
	memcpy (net->dev_addr, node_id, sizeof node_id);
........................................
	// allow device-specific bind/init procedures
	// NOTE net->name still not usable ...
	if (info->bind) {
		// heuristic:  "usb%d" for links we know are two-host,
		// else "eth%d" when there's reasonable doubt.  userspace
		// can rename the link if it knows better.
		if ((dev->driver_info->flags & FLAG_ETHER) != 0 &&
		    ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 ||
		     (net->dev_addr [0] & 0x02) == 0))
				strcpy (net->name, "eth%d");
		/* WLAN devices should always be named "wlan%d" */
		if ((dev->driver_info->flags & FLAG_WLAN) != 0)
			strcpy(net->name, "wlan%d");
		/* WWAN devices should always be named "wwan%d" */
		if ((dev->driver_info->flags & FLAG_WWAN) != 0)
			strcpy(net->name, "wwan%d");
		}
	}

网卡名称默认为usbx,如果是以太网,名称改为ethx,如果是WLAN,名称改为wlanx。

2.init.rc中增加两个针对usb0的配置服务

增加两个针对usb0的配置服务,才能让framework配置得了usb0网卡(服务是是USB网络共享的核心)
具体在MT2712平台,修改的文件为:init.mt2712.ab.emmc.rc

#启动usb网络分配dhcp
service dhcpcd_usb0 /system/bin/dhcpcd -ABDKL -f/system/etc/dhcpcd/dhcpcd.conf
    class main
    disabled
    oneshot
    seclabel u:r:dhcp:s0
#启动usb网络分配ip
service iprenew_usb0 /system/bin/dhcpcd -n
    class main
    disabled
    oneshot
    seclabel u:r:dhcp:s0

3.frameworks中修改配置

对应Android源码,frameworks中添加配置(这边主要是讲述网络是如何启动的,是选择那个网络)
frameworks/base/core/res/res/values/config.xml
原始为:

<string translatable="false" name="config_ethernet_iface_regex">eth\\d</string>

即支持以太网
修改为:

<string translatable="false" name="config_ethernet_iface_regex">usb\\d</string>

即支持USB共享网络。
也可以修改为同时支持以太网和USB共享网络,再根据实际情况,由APP决定使用哪一种网络。

<string translatable="false" name="config_ethernet_iface_regex">eth\\d|usb\\d</string>

config_ethernet_iface_regex的调用流程如下:
路径:frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetTracker.java

EthernetTracker(Context context, Handler handler) {
    mHandler = handler;

    // The services we use.
    IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
    mNMService = INetworkManagementService.Stub.asInterface(b);
	在这里就获取上面设定config_ethernet_iface_regex的值
    // Interface match regex.
    mIfaceMatch = context.getResources().getString(
            com.android.internal.R.string.config_ethernet_iface_regex);

    // Read default Ethernet interface configuration from resources
    final String[] interfaceConfigs = context.getResources().getStringArray(
            com.android.internal.R.array.config_ethernet_interfaces);
    for (String strConfig : interfaceConfigs) {
        parseEthernetConfig(strConfig);
    }

    mConfigStore = new EthernetConfigStore();

    NetworkCapabilities nc = createNetworkCapabilities(true /* clear default capabilities */);
    mFactory = new EthernetNetworkFactory(handler, context, nc);
    mFactory.register();
}

    private void maybeTrackInterface(String iface) {
        if (DBG) Log.i(TAG, "maybeTrackInterface " + iface);
        // If we don't already track this interface, and if this interface matches
        // our regex, start tracking it.
        if (!iface.matches(mIfaceMatch) || mFactory.hasInterface(iface)) {
            return;
        }

        if (mIpConfigForDefaultInterface != null) {
            updateIpConfiguration(iface, mIpConfigForDefaultInterface);
            mIpConfigForDefaultInterface = null;
        }
        addInterface(iface);
    }

同时支持以太网和USB共享网络的情况,可以参考:https://blog.csdn.net/xcyansmile/article/details/109361979

二、调试

Android车机与T-box通过USB连接,Android车机为Host,T-box为Device。
1.准备
Android手机设为USB共享网络:
设置->无线和网络->移动网络共享->USB共享网路
2.USB连接后,在Android车机输入lsusb,以确认有新的USB设备插入。

Bus 003 Device 001: ID 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 2c7c:0125
Bus 004 Device 001: ID 1d6b:0003
Bus 002 Device 001: ID 1d6b:0003

未插入前为:

Bus 003 Device 001: ID 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002
Bus 004 Device 001: ID 1d6b:0003
Bus 002 Device 001: ID 1d6b:0003

3.查看网卡是否生成:ifconfig -a

console:/ # ifconfig -a
ip6tnl0   Link encap:UNSPEC  
          NOARP  MTU:1452  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:0 TX bytes:0 

p2p0      Link encap:Ethernet  HWaddr 02:76:1c:60:1a:16
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 TX bytes:0 

wlan0     Link encap:Ethernet  HWaddr 00:76:1c:60:1a:16  Driver mtk_sdio_client
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 TX bytes:0 

sit0      Link encap:IPv6-in-IPv4  
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:0 TX bytes:0 

ip_vti0   Link encap:UNSPEC  
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:0 TX bytes:0 

tunl0     Link encap:UNSPEC  
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:0 TX bytes:0 

ip6_vti0  Link encap:UNSPEC  
          NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:0 TX bytes:0 

usb0      Link encap:Ethernet  HWaddr 36:28:7d:39:88:1b  Driver rndis_host
          inet addr:192.168.225.24  Bcast:192.168.225.255  Mask:255.255.255.0 
          inet6 addr: fe80::c888:d5a1:7f11:5ea0/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:250 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:333 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:72265 TX bytes:70616 

eth0      Link encap:Ethernet  HWaddr 00:55:7b:b5:7d:f7  Driver dwmac-mediatek
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 TX bytes:0 
          Interrupt:13 Base address:0x4000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0 
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:43 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:43 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:3860 TX bytes:3860

这里有网卡usb0生成。

4.确认联网是否成功:ifconfig

console:/ # ifconfig
wlan0     Link encap:Ethernet  HWaddr 00:76:1c:60:1a:16  Driver mtk_sdio_client
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 TX bytes:0 

usb0      Link encap:Ethernet  HWaddr 36:28:7d:39:88:1b  Driver rndis_host
          inet addr:192.168.225.24  Bcast:192.168.225.255  Mask:255.255.255.0 
          inet6 addr: fe80::c888:d5a1:7f11:5ea0/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:279 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:361 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:73769 TX bytes:74424 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0 
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:43 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:43 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1 
          RX bytes:3860 TX bytes:3860

看到usb0,即表示联网成功,**“RX bytes:73769 TX bytes:74424”**表示接收和发送的数据量。

注意事项:保证Linux kernel中生成的网卡名和frameworks中联网使用的网卡名一致。

参考:https://blog.csdn.net/xcyansmile/article/details/109361979

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值