OpenWRT实现USB共享上网参考文档

注意,本参考文档是基于mtk OpenWRT v3.3分支的。

1、内核支持

CONFIG_PACKAGE_kmod-usb-core=y
CONFIG_PACKAGE_kmod-usb-net=y
# CONFIG_PACKAGE_kmod-usb-net-asix is not set
# CONFIG_PACKAGE_kmod-usb-net-asix-88179 is not set
# CONFIG_PACKAGE_kmod-usb-net-cdc-eem is not set
CONFIG_PACKAGE_kmod-usb-net-cdc-ether=y
# CONFIG_PACKAGE_kmod-usb-net-cdc-mbim is not set
# CONFIG_PACKAGE_kmod-usb-net-cdc-ncm is not set
# CONFIG_PACKAGE_kmod-usb-net-cdc-subset is not set
# CONFIG_PACKAGE_kmod-usb-net-dm9601-ether is not set
# CONFIG_PACKAGE_kmod-usb-net-hso is not set
# CONFIG_PACKAGE_kmod-usb-net-ipheth is not set
# CONFIG_PACKAGE_kmod-usb-net-kalmia is not set
# CONFIG_PACKAGE_kmod-usb-net-kaweth is not set
# CONFIG_PACKAGE_kmod-usb-net-mcs7830 is not set
# CONFIG_PACKAGE_kmod-usb-net-pegasus is not set
# CONFIG_PACKAGE_kmod-usb-net-qmi-wwan is not set
CONFIG_PACKAGE_kmod-usb-net-rndis=y
# CONFIG_PACKAGE_kmod-usb-net-sierrawireless is not set
# CONFIG_PACKAGE_kmod-usb-net-smsc95xx is not set
CONFIG_PACKAGE_kmod-usb-ohci=y
# CONFIG_PACKAGE_kmod-usb-printer is not set
# CONFIG_PACKAGE_kmod-usb-serial is not set
CONFIG_PACKAGE_kmod-usb-storage=y
CONFIG_PACKAGE_kmod-usb-storage-extras=y
CONFIG_PACKAGE_kmod-usb-uhci=y
# CONFIG_PACKAGE_kmod-usb-wdm is not set
# CONFIG_PACKAGE_kmod-usb-yealink is not set
CONFIG_PACKAGE_kmod-usb2=y

2、代码路径:

linux-ramips_mt7620/linux-3.10.14/drivers/net/usb/├── asix_common.c
├── asix_devices.c
├── asix.h
├── ax88172a.c
├── ax88179_178a.c
├── catc.c
├── cdc_eem.c
├── cdc_ether.c
├── cdc_mbim.c
├── cdc_ncm.c
├── cdc-phonet.c
├── cdc_subset.c
├── cx82310_eth.c
├── dm9601.c
├── gl620a.c
├── hso.c
├── int51x1.c
├── ipheth.c
├── kalmia.c
├── kaweth.c
├── Kconfig
├── lg-vl600.c
├── Makefile
├── mcs7830.c
├── modules.order
├── net1080.c
├── pegasus.c
├── pegasus.h
├── plusb.c
├── qmi_wwan.c
├── r8152.c
├── rndis_host.c
├── rtl8150.c
├── sierra_net.c
├── smsc75xx.c
├── smsc75xx.h
├── smsc95xx.c
├── smsc95xx.h
├── usbnet.c
└── zaurus.c

3、Apple

可以分享给 bookmac;

drivers/net/usb/ipheth.c
按linux驱动,应该是可以直接共享网络给路由器,但是没有成功;

4、Android:

开启USB共享网络:

串口会如下打印,出现usb0接口,即可获取地址上网。

需要配置 wan ifname为usb0:

5、iPhone

插入iPhone后,串口打印:

oot@OpenWrt:/# [  509.676000] usb 1-1: new full-speed USB device number 2 using ohci-platform[  509.920000] 
[  509.920000] 
[  509.920000] Unsupported Device!
[  509.920000] Vendor=5ac ProdID=12a8
[  509.920000] Manufacturer=Apple Inc. Product=iPhone
[  509.920000]

menuconfig 支持usbmuxd后,系统启动后,启动usbmuxd;
插入iPhone后,串口打印:

root@OpenWrt:/#  usbmuxd &
root@OpenWrt:/# ps
  PID USER       VSZ STAT COMMAND
    1 root      1420 S    /sbin/procd
    2 root         0 SW   [kthreadd]
    3 root         0 SW   [ksoftirqd/0]
    4 root         0 SW   [kworker/0:0]
    5 root         0 SW<  [kworker/0:0H]
    6 root         0 SW   [kworker/u2:0]
    7 root         0 SW<  [khelper]
    8 root         0 SW   [kworker/u2:1]
   56 root         0 SW<  [writeback]
   58 root         0 SW<  [bioset]
   60 root         0 SW<  [kblockd]
   84 root         0 SW   [kworker/0:1]
   91 root         0 SW   [kswapd0]
   92 root         0 SW   [fsnotify_mark]
  175 root         0 SW<  [deferwq]
  184 root         0 SW   [khubd]
  204 root         0 SW<  [kworker/0:1H]
  250 root         0 SWN  [jffs2_gcd_mtd6]
  395 root       888 S    /sbin/ubusd
  396 root      1484 S    /bin/ash --login
  728 root      1048 S    /sbin/logd -S 16
  773 root      1504 S    /sbin/netifd
  793 root      1184 S    /usr/sbin/odhcpd
  831 root      1148 S    /usr/sbin/dropbear -F -P /var/run/dropbear.1.pid -p
  875 root      1476 S    /usr/sbin/telnetd -F -l /bin/login.sh
  914 root      1532 S    /usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -
 1025 root      1480 S    /usr/sbin/ntpd -n -p 0.openwrt.pool.ntp.org -p 1.ope
 1040 nobody     980 S    /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
 1095 root      2924 S    usbmuxd
 1097 root      1480 R    ps
root@OpenWrt:/# 
root@OpenWrt:/# ipheth-pair --list
ipheth-pair: 0: no devices
root@OpenWrt:/# [   65.804000] usb 1-1: new full-speed USB device number 2 using ohci-platform
[   66.044000] 
[   66.044000] 
[   66.044000] Unsupported Device!
[   66.044000] Vendor=5ac ProdID=12a8
[   66.044000] Manufacturer=Apple Inc. Product=iPhone
[   66.044000] 
[   66.368000] ipheth 1-1:4.2: Apple iPhone USB Ethernet device attached
[   66.384000] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready

root@OpenWrt:/# ipheth-pair --list
3ea7a41ae370913534c0a68a28a374593c6f698a iPhone7

运行中,iPhone首次启动个人热点会出一次oops,关闭后再次开启之后不会再出现,可以修改一些代码;

The driver keeps complaining: "TX timeout"
This happens when you have the driver running but the device isn't yet paired. Don't forget to pair your device every time you connect it to your computer.

root@OpenWrt:/# [  128.832000] ------------[ cut here ]------------
[  128.840000] WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0x254/0x2d4()
[  128.852000] NETDEV WATCHDOG: eth1 (ipheth): transmit queue 0 timed out
[  128.868000] Modules linked in: pppoe ppp_async option iptable_nat cdc_mbim usb_wwan rndis_host qmi_wwan pppox ppp_generic nf_nat_ipv4 nf_conntrack_ipv4 ipt_MASQUERADE cdc_subset cdc_ncm cdc_ether cdc_eem xt_time xt_tcpudp xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_conntrack xt_comment xt_TCPMSS xt_REDIRECT xt_LOG xt_CT usbserial usbnet slhc nf_nat_irc nf_nat_ftp nf_nat nf_defrag_ipv4 nf_conntrack_irc nf_conntrack_ftp ipt_REJECT ipheth crc_ccitt cdc_wdm cdc_acm sg ip6t_REJECT ip6table_raw ip6table_mangle ip6table_filter ip6_tables nf_conntrack_ipv6 nf_conntrack ip_tables x_tables nf_defrag_ipv6 vfat fat ntfs nls_utf8 nls_iso8859_15 nls_iso8859_1 nls_cp850 nls_cp437 usb_storage xhci_hcd ohci_hcd sd_mod scsi_mod usbcore nls_base usb_common mii [last unloaded: iptable_raw]
[  129.004000] CPU: 0 PID: 0 Comm: swapper Not tainted 3.10.14 #4
[  129.016000] Stack : 00000000 00000000 00000000 00000000 80363622 00000032 80313158 80310000
      802cfdd4 80312ea7 00000000 80362dc4 80313158 80310000 00010000 8031ca94
      802d0000 8028459c 8031ef6c 80027f08 00000000 80310000 802d167c 80309c74
      00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
      00000000 00000000 00000000 00000000 00000000 00000000 00000000 80309c00
      ...
[  129.088000] Call Trace:
[  129.092000] [<80010940>] show_stack+0x48/0x70
[  129.100000] [<80028014>] warn_slowpath_common+0x78/0xa8
[  129.112000] [<80028070>] warn_slowpath_fmt+0x2c/0x38
[  129.120000] [<801dd944>] dev_watchdog+0x254/0x2d4
[  129.132000] [<8003518c>] call_timer_fn.isra.35+0x24/0x88
[  129.140000] [<8003537c>] run_timer_softirq+0x18c/0x1cc
[  129.152000] [<8002f19c>] __do_softirq+0xe8/0x1cc
[  129.160000] [<8002f54c>] irq_exit+0x54/0x70
[  129.168000] [<8000b8b0>] ret_from_irq+0x0/0x4
[  129.180000] [<8000d384>] r4k_wait_irqoff+0x18/0x1c
[  129.188000] [<80053f08>] cpu_startup_entry+0xa4/0x10c
[  129.196000] [<8032f904>] start_kernel+0x38c/0x3a4
[  129.208000] 
[  129.212000] ---[ end trace ca76cb33fb76b50e ]---
[  129.220000] ipheth 1-1:4.2: ipheth_tx_timeout: TX timeout

root@OpenWrt:/# ifconfig[  134.832000] ipheth 1-1:4.2: ipheth_tx_timeout: TX timeout

手机开启热点通过USB共享网络:

选择【信任】

如果没有显示下面的【个人热点:1个连接】,关闭【个人热点】后,再开启下。

network配置eth1为wan口,可修改为usb%d

config interface 'wan'
    option ifname 'eth1'
    option proto 'dhcp'

ifconfig 查看eth1,其获取到iPhone分配的地址,并成功上网:

root@OpenWrt:/# ifconfig
br-lan    Link encap:Ethernet  HWaddr B8:55:10:00:DD:B4  
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ba55:10ff:fe00:ddb4/64 Scope:Link
          inet6 addr: fd0b:ad40:4586::1/60 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:1594 (1.5 KiB)

eth0      Link encap:Ethernet  HWaddr B8:55:10:00:DD:B4  
          inet6 addr: fe80::ba55:10ff:fe00:ddb4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:20 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:3393 (3.3 KiB)
          Interrupt:3 

eth0.1    Link encap:Ethernet  HWaddr B8:55:10:00:DD:B4  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:1594 (1.5 KiB)

eth1      Link encap:Ethernet  HWaddr 16:BD:61:99:44:5C  
          inet addr:172.20.10.10  Bcast:172.20.10.15  Mask:255.255.255.240
          inet6 addr: fe80::14bd:61ff:fe99:445c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:29 errors:0 dropped:3 overruns:0 frame:0
          TX packets:43 errors:2 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3847 (3.7 KiB)  TX bytes:6157 (6.0 KiB)

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:1074 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1074 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:74197 (72.4 KiB)  TX bytes:74197 (72.4 KiB)

root@OpenWrt:/# ping www.qq.com
PING www.qq.com (14.17.42.40): 56 data bytes
64 bytes from 14.17.42.40: seq=0 ttl=52 time=47.300 ms
64 bytes from 14.17.42.40: seq=1 ttl=52 time=67.060 ms
^C
--- www.qq.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 47.300/57.180/67.060 ms
root@OpenWrt:/# 
root@OpenWrt:/# ipheth-pair --list
3ea7a41ae370913534c0a68a28a374593c6f698a iPhone7

参考:
https://github.com/dgiagio/ipheth
http://blog.csdn.net/walker0411/article/details/71171895

http://techie-buzz.com/foss/getting-iphone-internet-tethering-working-in-linux.html
https://bugs.launchpad.net/wicd/+bug/1172137

参考:http://blog.csdn.net/wufoodjetsendl1001/article/details/53504583

公司做的无人机(开发板用的是高通的9342 wifi平台,Linux 内核为2.6.31)需要跟手机通讯,要求通信稳定延时低,是通过USB网络共享实现的。

6、与安卓手机共享USB网络

直接在板子linux内核开启rndis和usb相关选项即可。
插拔usb线,因为mac地址变化手机连接上遥控器但连不上飞机的bug,改了9342驱动 extap部分。

7、与iphone手机共享USB网络

  除了修改内核配置(内核添加netlink socket等),还需要移植苹果的一套开源程序和驱动,包含usbmuxd/pair两个应用程序及依赖的十多个库,底层USB驱动模块ipheth.ko。
  ipheth.ko为虚拟的USB网卡驱动。
  usbmuxd用于对usb配置,配置完后生成正确的usb厂商ID,设备ID等。
  pair是握手程序
  设备端iphone USB共享流程: iphone手机通过USB线连接到设备->usbmuxd运行,生成USB厂商ID、设备ID->内核扫描调用ipheth驱动模块,生成eth0网口->pair运行,握手通信->dhcp客户端运行,设备端可通过DHCP拿到172.20.10.x网段的IP。共享完成,在设备端可ping通iphone手机(172.20.10.1)

8、bug记录

1.USB线连接好iphone和9342板子后,需要在iphone的usb网络共享功能,先关闭再打开,才能ping通
  修改pair程序解决
2.USB网络共享+wifi,用chariot做性能测试,运行几秒后提示队列超时(dev_wathchdog:queue eth0 time out…)
  驱动bug,临界区未加锁被wifi中断打乱执行顺序,修改ipheth.c解决

9、调试环境搭建

  板子做host,手机做device,但板子的usb没有供电,所以中间加了个usb hub来解决供电的问题



本文章由作者:佐须之男 整理编辑,原文地址: OpenWRT实现USB共享上网参考文档
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐