]> git.openfabrics.org - ~shefty/rdma-dev.git/blobdiff - net/ipv6/ndisc.c
ipv6: add special mode accept_ra=2 to accept RA while configured as router
[~shefty/rdma-dev.git] / net / ipv6 / ndisc.c
index 58841c4ae947f982d3377009066ed636fa37ea75..69a0051cea67b9d22c7fbe6d61718b2ab20111bb 100644 (file)
@@ -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(struct sk_buff *skb)
                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