Re: [RFC] ipv6: use a random ifid for headerless devices
From: 吉藤英明 <hidden>
Date: 2015-11-30 12:01:33
Hi, 2015-11-30 20:55 GMT+09:00 Bjørn Mork [off-list ref]:
quoted hunk ↗ jump to hunk
Generating a random ifid for devices with no L2 header at all, allowing such devices to take part in IPv6 autoconfiguration. The tuntap driver is one example of a driver where such an ifid would be useful. Note that as there is no persistence, new addresses will be generated every time an interface is brought up: # ip -6 addr show dev tun0 8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 state UNKNOWN qlen 500 inet6 fe80::eef2:111c:f270:92ba/64 scope link valid_lft forever preferred_lft forever # ip link set tun0 down # ip link set tun0 up # ip -6 addr show dev tun0 8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 state UNKNOWN qlen 500 inet6 fe80::eec0:48d0:6b52:8835/64 scope link valid_lft forever preferred_lft forever Signed-off-by: Bjørn Mork <bjorn@mork.no> --- I'm planning raw-ip support for the qmi_wwan driver. And the feedback from primary users (ModemManager++) is that a headerless netdev is preferred over a fake ethernet device. The current plan is to model this after 'tun' devices, using ARPHRD_NONE as type. But these devices will need an IPv6 link local address for full SLAAC support. I am therefore wondering if an approach like this patch will be acceptable, or if I should look for some other solution? Bjørn net/ipv6/addrconf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d84742f003a9..6cf3cae691a5 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c@@ -53,6 +53,7 @@ #include <linux/if_arp.h> #include <linux/if_arcnet.h> #include <linux/if_infiniband.h> +#include <linux/random.h> #include <linux/route.h> #include <linux/inetdevice.h> #include <linux/init.h>@@ -2026,6 +2027,13 @@ static int addrconf_ifid_ip6tnl(u8 *eui, struct net_device *dev) return 0; } +static int addrconf_ifid_random(u8 *eui, struct net_device *dev) +{ + get_random_bytes(eui, 8); + eui[0] |= 0x02; + return 0; +} +
Since random identifier is locally assigned, drop the global bit instead if setting it. --yoshfuji