通过 USB 将您的 Samsung S7 连接到您最喜欢的 Linux 机器。转到“设置 -> 连接 -> 移动热点和网络共享”并启用“USB 网络共享”。
Android 现在将启用与 Linux 主机的网络共享,因此 Linux 应从手机获取 IP 地址。这就是它被打破的地方。永远不会进行正确的网络设置以允许与电话本身进行任何 IP 连接。
问题是三星 S7 发送了无效/损坏的 Mac 地址:00:00:00:00:00:00。 Linux 网络堆栈根本不使用“零”MAC 地址进行操作。
此问题似乎是由 Samsung S7(android 6.x 和 7.x)引入的。我以前的手机三星 S4 和 S5 可以毫无问题地进行网络共享。
我正在使用 NetworkManager 运行 Fedora 24/25,但任何 Linux 很可能都会暴露同样的问题。
PS:与Win7-64的网络共享有效
ifconfig -a
enp0s20u4: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 00:00:00:00:00:00 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Mar 7 08:56:02 m3800 kernel: usb 1-4: New USB device found, idVendor=04e8, idProduct=6863
Mar 7 08:56:02 m3800 kernel: usb 1-4: New USB device strings: Mfr=3, Product=4, SerialNumber=5
Mar 7 08:56:02 m3800 kernel: usb 1-4: Product: SAMSUNG_Android
Mar 7 08:56:02 m3800 kernel: usb 1-4: Manufacturer: SAMSUNG
Mar 7 08:56:02 m3800 kernel: usb 1-4: SerialNumber: cexxxxxxxxxxxxxxxx
Mar 7 08:56:02 m3800 mtp-probe: checking bus 1, device 6: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4"
Mar 7 08:56:02 m3800 mtp-probe: bus: 1, device: 6 was not an MTP device
Mar 7 08:56:02 m3800 kernel: [ 127.774244] usbcore: registered new interface driver cdc_ether
Mar 7 08:56:02 m3800 kernel: usbcore: registered new interface driver cdc_ether
Mar 7 08:56:02 m3800 kernel: [ 127.777443] rndis_host 1-4:1.0 eth0: register 'rndis_host' at usb-0000:00:14.0-4, RNDIS device, 00:00:00:00:00:00
Mar 7 08:56:02 m3800 kernel: [ 127.777466] usbcore: registered new interface driver rndis_host
Mar 7 08:56:02 m3800 kernel: rndis_host 1-4:1.0 eth0: register 'rndis_host' at usb-0000:00:14.0-4, RNDIS device, 00:00:00:00:00:00
Mar 7 08:56:02 m3800 kernel: usbcore: registered new interface driver rndis_host
Mar 7 08:56:02 m3800 kernel: [ 127.781049] rndis_host 1-4:1.0 enp0s20u4: renamed from eth0
Mar 7 08:56:02 m3800 kernel: rndis_host 1-4:1.0 enp0s20u4: renamed from eth0
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): carrier is OFF
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): new Ethernet device (driver: 'rndis_host' ifindex: 3)
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): exported as /org/freedesktop/NetworkManager/Devices/2
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): device state change: unmanaged -> unavailable (reason 'managed') [10 20 2]
Mar 7 08:56:02 m3800 NetworkManager[876]: <error> [1488905762.697751] [platform/nm-linux-platform.c:2278] link_change(): Netlink error changing link 3: <UP> mtu 0 (1) driver 'rndis_host' udi '/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0/net/enp0s20u4': Invalid address for specified address family
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): preparing device
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> read connection 'Wired connection 1'
Mar 7 08:56:02 m3800 NetworkManager[876]: <info> (enp0s20u4): created default wired connection 'Wired connection 1'
答案1
Linux 网络堆栈不适用于具有“零”MAC 地址的接口。当尝试设置网络配置时,Android 手机的网络共享设置在 Linux 端就会停止。
通过手动设置接口和路由,以下方法目前对我有用。我将其封装在 shell 脚本中:
# cat tetherS7_nwsetup.sh
IFNAME=enp0s20u4
ip a add 192.168.42.2/24 brd + dev $IFNAME
ip link set dev enp0s20u3 address e8:2a:ea:01:02:03
ip link set dev $IFNAME up
route add default gw 192.168.42.129
echo "nameserver 8.8.8.8" >>/etc/resolv.conf
更改 IFNAME 并输入您的接口名称。然后执行:
# chmod +x tetherS7_nwsetup.sh
# sudo ./tetherS7_nwsetup.sh
对于 DNS,我目前使用 Google 的 DNS 服务器。随意改变。希望这些步骤对您有用。
答案2
对于那些特别熟悉构建 Linux 或 Linux 模块的人来说,这里是另一个可能的修复方法。
这添加了对 rndis_host Linux 模块的修复,以更正损坏的 MAC 地址,并使其再次成为网络共享的即插即用解决方案。
有趣的是,有人已经在 rndis_host.c 中添加了一种针对“混乱”mac 地址的解决方法。不幸的是,它不包括三星 S7 的保护壳。我添加了以下几行:
int
generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
{
...
if (bp[0] & 0x02)
eth_hw_addr_random(net);
else
ether_addr_copy(net->dev_addr, bp);
// correct Samsung S7 'zero' mac address
if ( (bp[0]==0) && (bp[1]==0) && (bp[2]==0) /*&& (bp[3]==0) && (bp[4]==0) && (bp[5]==0)*/ ) {
// invalid mac address ==> generate one
eth_hw_addr_random(net);
}
// end of my fix
现在重新构建内核模块并将其替换为原始的“rndis_host.ko.xz”并运行“depmod -a”。我建议重新启动或至少删除旧模块:'rmmod rndis_host'
希望这对你有用。现在只需插入 Smamsung S7 并启用网络共享即可。它现在应该加载新的构建 rndis_host 模块并自动创建正确的接口设置和所需的路由。
# ifconfig enp0s20u3
enp0s20u3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.42.253 netmask 255.255.255.0 broadcast 192.168.42.255
inet6 fe80::f970:b67b:661f:254c prefixlen 64 scopeid 0x20<link>
ether 92:06:fe:75:9e:43 txqueuelen 1000 (Ethernet)
RX packets 100 bytes 35951 (35.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 135 bytes 31911 (31.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.42.129 0.0.0.0 UG 0 0 0 enp0s20u3
192.168.42.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s20u3
这是与我修补的内容的差异:
# diff -u rndis_host.c.ORIG rndis_host.c
--- rndis_host.c.ORIG 2017-04-05 15:19:01.353765062 -0700
+++ rndis_host.c 2017-04-05 15:18:37.327765272 -0700
@@ -434,6 +434,13 @@
else
ether_addr_copy(net->dev_addr, bp);
+//--------- correct Samsung S7 'zero' mac address -------------------------------------------------//
+ if ( (bp[0]==0) && (bp[1]==0) && (bp[2]==0) /*&& (bp[3]==0) && (bp[4]==0) && (bp[5]==0)*/ ) {
+ // invalid mac address ==> generate one
+ eth_hw_addr_random(net);
+ }
+//----- end of correction--------------------------------------------------------------------------//
+
/* set a nonzero filter to enable data transfers */
memset(u.set, 0, sizeof *u.set);
u.set->msg_type = cpu_to_le32(RNDIS_MSG_SET);