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 1c61aeb3a1c06a7526667182cca37613cba88fc0..7d107113f988a6a169b06ee2622d89bdacf2580a 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 4a3feccd5b1010357a66da4b4d6d7b3883ec1e4c..6ffa153e51663bdada3c1544e8925c4fd7f4348e 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);
 }