|
|
@@ -0,0 +1,41 @@
|
|
|
+--- a/net/ipv6/ndisc.c
|
|
|
++++ b/net/ipv6/ndisc.c
|
|
|
+@@ -1105,6 +1105,18 @@ errout:
|
|
|
+ rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
|
|
|
+ }
|
|
|
+
|
|
|
++static inline int accept_ra(struct inet6_dev *in6_dev)
|
|
|
++{
|
|
|
++ /*
|
|
|
++ * If forwarding is enabled, RA are not accepted unless the special
|
|
|
++ * hybrid mode (accept_ra=2) is enabled.
|
|
|
++ */
|
|
|
++ if (in6_dev->cnf.forwarding && in6_dev->cnf.accept_ra < 2)
|
|
|
++ return 0;
|
|
|
++
|
|
|
++ return in6_dev->cnf.accept_ra;
|
|
|
++}
|
|
|
++
|
|
|
+ static void ndisc_router_discovery(struct sk_buff *skb)
|
|
|
+ {
|
|
|
+ struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
|
|
|
+@@ -1158,8 +1170,7 @@ static void ndisc_router_discovery(struc
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+- /* skip route and link configuration on routers */
|
|
|
+- if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra)
|
|
|
++ if (!accept_ra(in6_dev))
|
|
|
+ goto skip_linkparms;
|
|
|
+
|
|
|
+ #ifdef CONFIG_IPV6_NDISC_NODETYPE
|
|
|
+@@ -1309,8 +1320,7 @@ skip_linkparms:
|
|
|
+ NEIGH_UPDATE_F_ISROUTER);
|
|
|
+ }
|
|
|
+
|
|
|
+- /* skip route and link configuration on routers */
|
|
|
+- if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra)
|
|
|
++ if (!accept_ra(in6_dev))
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ #ifdef CONFIG_IPV6_ROUTE_INFO
|