Search code examples
androidipv6radvd

Radvd sends wrong RA to android


I have Xiaomi Redmi 4X with rooted Android 8.1.0 AospExtended-v5.3-OFFICIAL (but it also don't work on stock Xiaomi Redmi 4X - on Android 7 without root).

I set up RADVD on Raspberry Pi (forwarding enabled) and IPv6 Hurricane tunnel. My desktop and notebook with Archlinux working perfectly with IPv6 (DualStack and IPv6-only) but 2 Xiaomi don't work (with root and without it) although getting two IPv6 addresses (temporary) and SLAAC with EUI-64.

These addresses are from my /64 prefix. I can ping it from Desktop with fe80:: and can ping Desktop from Androids.

But i can't ping Goolge DNS (2001:4860:4860::8888) and other IPv6 addresses.

Adnroid get IPv6 from RADVD:

ip -6 addr

26: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 11:22:33:44:55:66 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.111/24 brd 192.168.0.255 scope global wlan0
   valid_lft forever preferred_lft forever
inet6 2001:470:****:****:1234:1234:1234:1234/64 scope global temporary dynamic 
   valid_lft 86382sec preferred_lft 14382sec
inet6 2001:470:****:****:1122:33ff:fe44:5566/64 scope global mngtmpaddr dynamic 
   valid_lft 86382sec preferred_lft 14382sec
inet6 fe80::1122:33ff:fe44:5566/64 scope link 
   valid_lft forever preferred_lft forever

Output by ip -6 route is empty.

I trying differents flags like AdvOtherConfigFlag, AdvManagedFlag, AdvHomeAgentFlag and others but it were wrong - Android get IPv6, can ping fe80:: , but can't ping IPv6 Internet.

When i disable RADVD on my local network and set up IPv6 addresses on rooted Android manually:

ip link set dev wlan0 down
ip -6 addr add 2001:470:****:****:1234:1234:4321:4321/64 dev wlan0
ip -6 addr add 2001:470:****:****:1122:33ff:fe44:5566/64 dev wlan0
ip link set dev wlan0 up

ip -6 addr

28: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:470:****:****:1234:1234:4321:4321/64 scope global 
   valid_lft forever preferred_lft forever
inet6 2001:470:****:****:1122:33ff:fe44:5566/64 scope global 
   valid_lft forever preferred_lft forever
inet6 fe80::1122:33ff:fe44:5566/64 scope link 
   valid_lft forever preferred_lft forever

After add default route to Raspberry Pi:

ip -6 route add default via fe80::****:**ff:fe**:**** dev wlan0 proto 
ra metric 100 pref medium

Then pings starts to work! I can ping and open IPv6 sites on Android!

If i enable RADVD (Android get two IPv6) and add route manyally to Raspberry Pi - i whatever can't ping IPv6 addresses in Internet.

My radvd.conf on Raspberry Pi

interface eth0 {
  AdvSendAdvert on;
  MinRtrAdvInterval 300;
  MaxRtrAdvInterval 600;
  AdvHomeAgentFlag off;
  AdvManagedFlag off;
  AdvOtherConfigFlag off;
  prefix 2001:470:****:****::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };

What do you think: why Andorid working with manually IPv6 and not work with RADVD?

Thank you for answers!


Solution

  • After 3 weeks i found a solution! Problem was in my router TPLink H-Ver = WR841N v8 00000000 : S-Ver = 3.16.9 Build 170210 Rel.42078n (last firmware).

    IPv6 don't working with Wi-Fi devices Androids, Notebooks with different Linux. But notebooks works with Ethernet connection!

    When i change my router with another, Androids and other Wi-Fi devices get IPv6, opening IPv6 sites and profit!

    I think what my TPlink not supported IPv6 becouse it is very old.