USB를 통해 Samsung S7을 즐겨 사용하는 Linux 컴퓨터에 연결하세요. "설정->연결->모바일 핫스팟 및 테더링"으로 이동하여 "USB 테더링"을 활성화하세요.
이제 Android는 Linux 호스트와의 네트워크 공유를 활성화하므로 Linux는 전화기에서 IP 주소를 얻어야 합니다. 이것이 무너지는 곳입니다. 전화기 자체에 대한 IP 연결을 허용하도록 올바른 네트워크 설정이 이루어지지 않습니다.
문제는 Samsung S7이 유효하지 않거나 손상된 Mac 주소(00:00:00:00:00:00)를 보내고 있다는 것입니다. Linux 네트워크 스택은 "0" MAC 주소로는 전혀 작동하지 않습니다.
이 문제는 Samsung S7(Android 6.x 및 7.x)에서 발생한 것으로 보입니다. 이전 휴대폰인 삼성 S4와 S5는 아무런 문제 없이 테더링되었습니다.
NetworkManager를 사용하여 Fedora 24/25를 실행하고 있지만 모든 Linux에서 동일한 문제가 발생할 가능성이 높습니다.
추신: 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 주소가 "0"인 인터페이스에서는 작동하지 않습니다. 네트워크 구성을 설정하려고 하면 Linux 측에서 Android 휴대폰의 테더링 설정이 중단됩니다.
다음 방법은 현재 인터페이스와 라우팅을 수동으로 설정하여 작동합니다. 이를 쉘 스크립트로 캡슐화합니다.
# 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 모듈 구축에 특히 익숙한 분들을 위해 여기에 또 다른 가능한 수정 사항이 있습니다.
이는 손상된 MAC 주소를 수정하고 다시 네트워크 공유를 위한 플러그 앤 플레이 솔루션으로 만들기 위해 rndis_host Linux 모듈에 수정 사항을 추가합니다.
흥미롭게도 누군가 rndis_host.c에 "복잡한" mac 주소에 대한 해결 방법을 추가했습니다. 안타깝게도 Samsung 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);