backport two changes from kernel.org: 65e9b62d4503849b10bedfc29bff0473760cc597 ipv6...
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 30 Nov 2010 01:52:51 +0000 (01:52 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 30 Nov 2010 01:52:51 +0000 (01:52 +0000)
c3bccac2fa76f1619dfe4fb7b9bee69de7f066d8
ipv6: add special mode forwarding=2 to send RS while configured as router

SVN-Revision: 24195

14 files changed:
target/linux/generic/patches-2.6.30/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.30/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.31/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.31/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.32/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.32/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.33/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.33/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.34/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.34/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.35/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.35/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.36/300-ipv6_accept_ra_when_forwarding.patch [new file with mode: 0644]
target/linux/generic/patches-2.6.36/301-ipv6_send_rs_when_forwarding.patch [new file with mode: 0644]

diff --git a/target/linux/generic/patches-2.6.30/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.30/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..b24ee99
--- /dev/null
@@ -0,0 +1,30 @@
+--- 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);
+@@ -1150,7 +1162,7 @@ static void ndisc_router_discovery(struc
+                          skb->dev->name);
+               return;
+       }
+-      if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) {
++      if (!accept_ra(in6_dev)) {
+               in6_dev_put(in6_dev);
+               return;
+       }
diff --git a/target/linux/generic/patches-2.6.30/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.30/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..b4fef3f
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2839,7 +2839,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.31/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.31/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..9e7d093
--- /dev/null
@@ -0,0 +1,30 @@
+--- a/net/ipv6/ndisc.c
++++ b/net/ipv6/ndisc.c
+@@ -1106,6 +1106,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);
+@@ -1151,7 +1163,7 @@ static void ndisc_router_discovery(struc
+                          skb->dev->name);
+               return;
+       }
+-      if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) {
++      if (!accept_ra(in6_dev)) {
+               in6_dev_put(in6_dev);
+               return;
+       }
diff --git a/target/linux/generic/patches-2.6.31/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.31/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..fc4aa9a
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2864,7 +2864,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.32/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.32/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..e9c95cf
--- /dev/null
@@ -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
diff --git a/target/linux/generic/patches-2.6.32/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.32/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..fab7f89
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2888,7 +2888,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.33/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.33/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..6827f32
--- /dev/null
@@ -0,0 +1,41 @@
+--- a/net/ipv6/ndisc.c
++++ b/net/ipv6/ndisc.c
+@@ -1106,6 +1106,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);
+@@ -1159,8 +1171,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
+@@ -1310,8 +1321,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
diff --git a/target/linux/generic/patches-2.6.33/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.33/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..208e800
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2884,7 +2884,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.34/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.34/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..265ae6b
--- /dev/null
@@ -0,0 +1,41 @@
+--- a/net/ipv6/ndisc.c
++++ b/net/ipv6/ndisc.c
+@@ -1107,6 +1107,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);
+@@ -1160,8 +1172,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
+@@ -1311,8 +1322,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
diff --git a/target/linux/generic/patches-2.6.34/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.34/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..4007965
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2924,7 +2924,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.35/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.35/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..e9c95cf
--- /dev/null
@@ -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
diff --git a/target/linux/generic/patches-2.6.35/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.35/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..e039299
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2961,7 +2961,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {
diff --git a/target/linux/generic/patches-2.6.36/300-ipv6_accept_ra_when_forwarding.patch b/target/linux/generic/patches-2.6.36/300-ipv6_accept_ra_when_forwarding.patch
new file mode 100644 (file)
index 0000000..e9c95cf
--- /dev/null
@@ -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
diff --git a/target/linux/generic/patches-2.6.36/301-ipv6_send_rs_when_forwarding.patch b/target/linux/generic/patches-2.6.36/301-ipv6_send_rs_when_forwarding.patch
new file mode 100644 (file)
index 0000000..1252338
--- /dev/null
@@ -0,0 +1,12 @@
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -2964,7 +2964,8 @@ static void addrconf_dad_completed(struc
+          start sending router solicitations.
+        */
+-      if (ifp->idev->cnf.forwarding == 0 &&
++      if ((ifp->idev->cnf.forwarding == 0 ||
++           ifp->idev->cnf.forwarding == 2) &&
+           ifp->idev->cnf.rtr_solicits > 0 &&
+           (dev->flags&IFF_LOOPBACK) == 0 &&
+           (ipv6_addr_type(&ifp->addr) & IPV6_ADDR_LINKLOCAL)) {