|
@@ -38,6 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
38
|
38
|
*
|
39
|
39
|
*/
|
40
|
40
|
|
|
41
|
+static struct ipv6conf * ipv6conf_demux ( struct net_device *netdev );
|
41
|
42
|
static int
|
42
|
43
|
ipv6conf_rx_router_advertisement ( struct net_device *netdev,
|
43
|
44
|
struct ndp_router_advertisement_header *radv,
|
|
@@ -341,6 +342,7 @@ ndp_rx_router_advertisement_prefix ( struct net_device *netdev,
|
341
|
342
|
struct ndp_prefix_information_option *prefix_opt = &option->prefix;
|
342
|
343
|
struct in6_addr *router = &sin6_src->sin6_addr;
|
343
|
344
|
struct in6_addr address;
|
|
345
|
+ struct ipv6conf *ipv6conf;
|
344
|
346
|
int prefix_len;
|
345
|
347
|
int rc;
|
346
|
348
|
|
|
@@ -350,14 +352,21 @@ ndp_rx_router_advertisement_prefix ( struct net_device *netdev,
|
350
|
352
|
"short at %zd bytes\n", netdev->name, len );
|
351
|
353
|
return -EINVAL;
|
352
|
354
|
}
|
|
355
|
+
|
|
356
|
+ /* Identify IPv6 configurator, if any */
|
|
357
|
+ ipv6conf = ipv6conf_demux ( netdev );
|
353
|
358
|
DBGC ( netdev, "NDP %s found %sdefault router %s ",
|
354
|
359
|
netdev->name, ( radv->lifetime ? "" : "non-" ),
|
355
|
360
|
inet6_ntoa ( &sin6_src->sin6_addr ) );
|
356
|
|
- DBGC ( netdev, "for %s-link %sautonomous prefix %s/%d\n",
|
|
361
|
+ DBGC ( netdev, "for %s-link %sautonomous prefix %s/%d%s\n",
|
357
|
362
|
( ( prefix_opt->flags & NDP_PREFIX_ON_LINK ) ? "on" : "off" ),
|
358
|
363
|
( ( prefix_opt->flags & NDP_PREFIX_AUTONOMOUS ) ? "" : "non-" ),
|
359
|
364
|
inet6_ntoa ( &prefix_opt->prefix ),
|
360
|
|
- prefix_opt->prefix_len );
|
|
365
|
+ prefix_opt->prefix_len, ( ipv6conf ? "" : " (ignored)" ) );
|
|
366
|
+
|
|
367
|
+ /* Do nothing unless IPv6 autoconfiguration is in progress */
|
|
368
|
+ if ( ! ipv6conf )
|
|
369
|
+ return 0;
|
361
|
370
|
|
362
|
371
|
/* Ignore off-link prefixes */
|
363
|
372
|
if ( ! ( prefix_opt->flags & NDP_PREFIX_ON_LINK ) )
|
|
@@ -915,13 +924,10 @@ ipv6conf_rx_router_advertisement ( struct net_device *netdev,
|
915
|
924
|
|
916
|
925
|
/* Identify IPv6 configurator, if any */
|
917
|
926
|
ipv6conf = ipv6conf_demux ( netdev );
|
918
|
|
- if ( ! ipv6conf ) {
|
919
|
|
- /* Not an error; router advertisements are processed
|
920
|
|
- * as a background activity even when no explicit
|
921
|
|
- * autoconfiguration is taking place.
|
922
|
|
- */
|
|
927
|
+
|
|
928
|
+ /* Do nothing unless IPv6 autoconfiguration is in progress */
|
|
929
|
+ if ( ! ipv6conf )
|
923
|
930
|
return 0;
|
924
|
|
- }
|
925
|
931
|
|
926
|
932
|
/* If this is not the first solicited router advertisement, ignore it */
|
927
|
933
|
if ( ! timer_running ( &ipv6conf->timer ) )
|