UPSTREAM: ipv6: ndisc: add support for 'PREF64' dns64 prefix identifier

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>
(cherry picked from commit c24a77edc9a7ac9b5fea75407f197fe1469262f4)
Bug: 150648313
Change-Id: I02bff2103194a8171f907e82f811d7ab66962138
This commit is contained in:
Maciej Żenczykowski 2020-03-23 18:10:19 -07:00
parent 9c1fc2d22c
commit 6db48906aa
3 changed files with 11 additions and 9 deletions

View File

@ -48355,29 +48355,29 @@
<var-decl name='skc_num' type-id='type-id-267' visibility='default' filepath='include/net/sock.h' line='168' column='1'/>
</data-member>
</class-decl>
<class-decl name='nd_opt_hdr' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='104' column='1' id='type-id-5220'>
<class-decl name='nd_opt_hdr' size-in-bits='16' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='105' column='1' id='type-id-5220'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='nd_opt_type' type-id='type-id-23' visibility='default' filepath='include/net/ndisc.h' line='105' column='1'/>
<var-decl name='nd_opt_type' type-id='type-id-23' visibility='default' filepath='include/net/ndisc.h' line='106' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='8'>
<var-decl name='nd_opt_len' type-id='type-id-23' visibility='default' filepath='include/net/ndisc.h' line='106' column='1'/>
<var-decl name='nd_opt_len' type-id='type-id-23' visibility='default' filepath='include/net/ndisc.h' line='107' column='1'/>
</data-member>
</class-decl>
<class-decl name='ndisc_options' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='110' column='1' id='type-id-5221'>
<class-decl name='ndisc_options' size-in-bits='1216' is-struct='yes' visibility='default' filepath='include/net/ndisc.h' line='111' column='1' id='type-id-5221'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='nd_opt_array' type-id='type-id-5151' visibility='default' filepath='include/net/ndisc.h' line='111' column='1'/>
<var-decl name='nd_opt_array' type-id='type-id-5151' visibility='default' filepath='include/net/ndisc.h' line='112' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='960'>
<var-decl name='nd_opts_ri' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='113' column='1'/>
<var-decl name='nd_opts_ri' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='114' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='1024'>
<var-decl name='nd_opts_ri_end' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='114' column='1'/>
<var-decl name='nd_opts_ri_end' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='115' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='1088'>
<var-decl name='nd_useropts' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='116' column='1'/>
<var-decl name='nd_useropts' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='117' column='1'/>
</data-member>
<data-member access='public' layout-offset-in-bits='1152'>
<var-decl name='nd_useropts_end' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='117' column='1'/>
<var-decl name='nd_useropts_end' type-id='type-id-5150' visibility='default' filepath='include/net/ndisc.h' line='118' column='1'/>
</data-member>
</class-decl>
<class-decl name='neighbour' size-in-bits='2816' is-struct='yes' visibility='default' filepath='include/net/neighbour.h' line='134' column='1' id='type-id-5222'>

View 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
};

View 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);
}