ipv6: ndisc: add support for 'PREF64' dns64 prefix identifier
authorMaciej Żenczykowski <maze@google.com>
Tue, 24 Mar 2020 01:10:19 +0000 (18:10 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 27 Mar 2020 03:05:58 +0000 (20:05 -0700)
This is trivial since we already have support for the entirely
identical (from the kernel's point of view) RDNSS, DNSSL, etc. that
also contain opaque data that needs to be passed down to userspace
for further processing.

As specified in draft-ietf-6man-ra-pref64-09 (while it is still a draft,
it is purely waiting on the RFC Editor for cleanups and publishing):
  PREF64 option contains lifetime and a (up to) 96-bit IPv6 prefix.

The 8-bit identifier of the option type as assigned by the IANA is 38.

Since we lack DNS64/NAT64/CLAT support in kernel at the moment,
thus this option should also be passed on to userland.

See:
  https://tools.ietf.org/html/draft-ietf-6man-ra-pref64-09
  https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml#icmpv6-parameters-5

Cc: Erik Kline <ek@google.com>
Cc: Jen Linkova <furry@google.com>
Cc: Lorenzo Colitti <lorenzo@google.com>
Cc: Michael Haro <mharo@google.com>
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Acked-By: Lorenzo Colitti <lorenzo@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ndisc.h
net/ipv6/ndisc.c

index 1c61aeb..7d10711 100644 (file)
@@ -41,6 +41,7 @@ enum {
        ND_OPT_DNSSL = 31,              /* RFC6106 */
        ND_OPT_6CO = 34,                /* RFC6775 */
        ND_OPT_CAPTIVE_PORTAL = 37,     /* RFC7710 */
+       ND_OPT_PREF64 = 38,             /* RFC-ietf-6man-ra-pref64-09 */
        __ND_OPT_MAX
 };
 
index 4a3fecc..6ffa153 100644 (file)
@@ -197,6 +197,7 @@ static inline int ndisc_is_useropt(const struct net_device *dev,
        return opt->nd_opt_type == ND_OPT_RDNSS ||
                opt->nd_opt_type == ND_OPT_DNSSL ||
                opt->nd_opt_type == ND_OPT_CAPTIVE_PORTAL ||
+               opt->nd_opt_type == ND_OPT_PREF64 ||
                ndisc_ops_is_useropt(dev, opt->nd_opt_type);
 }