samsung S7 android não consegue amarrar e não configurar a configuração de rede

3

Conecte seu Samsung S7 via usb à sua máquina linux favorita. Ir para 'Configurações - > Conexões - > mobile hotspot e Tethering 'e habilitar "tethering USB".

O Android agora ativará o tethering com o host Linux e o Linux deverá, consequentemente, adquirir um endereço IP do telefone. É aqui que está quebrado. A configuração de rede adequada nunca é feita para permitir qualquer conexão IP com o próprio telefone.

O problema é que o Samsung S7 envia um endereço Mac inválido / quebrado: 00: 00: 00: 00: 00: 00. E a pilha de rede Linux não opera com um endereço MAC 'zero'.

Parece que esse problema foi introduzido com o Samsung S7 (android 6.xe 7.x). Os meus telemóveis anteriores Samsung S4 e S5 estão ligados sem problemas.

Estou executando o Fedora 24/25 com o NetworkManager, mas qualquer Linux provavelmente exporá o mesmo problema.

PS: tethering com trabalhos do 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'
    
por mattes 04.04.2017 / 20:39

2 respostas

2

A pilha de rede do Linux não funciona com interfaces que tenham um endereço MAC 'zero'. A configuração de tethering com o telefone Android simplesmente pára no lado do Linux, ao tentar configurar a configuração de rede.

O seguinte funciona para mim neste momento, configurando a interface e as rotas manualmente. Eu embrulhei isso em um script de 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

altere IFNAME e insira o nome da sua interface. então extute:

# chmod +x tetherS7_nwsetup.sh 
# sudo ./tetherS7_nwsetup.sh 

No DNS, estou usando o servidor DNS do Google. Sinta-se livre para mudar. Espero que esses passos funcionem com você.

    
por 04.04.2017 / 21:03
0

Para aqueles que estão familiarizados com a construção de módulos Linux ou Linux em particular, aqui está outra possível correção.

Isso adiciona uma correção ao módulo linux rndis_host para corrigir o endereço mac corrompido e torna-o novamente uma solução plug-and-play para tethering.

Curiosamente, alguém já adicionou uma solução alternativa para o endereço mac 'desarrumado' em rndis_host.c. Infelizmente não cobre o case com o Samsung S7. Eu adicionei as seguintes linhas:

   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

Agora reconstrua o módulo do kernel e substitua-o pelo original 'rndis_host.ko.xz' e execute 'depmod -a'. Eu sugiro para reiniciar ou, pelo menos, remover o módulo antigo: 'rmmod rndis_host'

Espero que isso funcione para você. Agora apenas conecte seu Smamsung S7 e ative o tethering. Agora ele deve carregar o novo módulo rndis_host e criar a configuração correta da interface e as rotas necessárias automaticamente.

   # 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

Aqui uma comparação do que eu corrigi:

   # 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);
    
por 06.04.2017 / 00:41