[IPV6]: ROUTE: Add accept_ra_rt_info_max_plen sysctl.
YOSHIFUJI Hideaki [Tue, 21 Mar 2006 01:07:03 +0000 (17:07 -0800)]
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

Documentation/networking/ip-sysctl.txt
include/linux/ipv6.h
include/linux/sysctl.h
net/ipv6/addrconf.c
net/ipv6/ndisc.c

index 88efed0..35aed1c 100644 (file)
@@ -729,6 +729,15 @@ accept_ra_pinfo - BOOLEAN
        Functional default: enabled if accept_ra is enabled.
                            disabled if accept_ra is disabled.
 
+accept_ra_rt_info_max_plen - INTEGER
+       Maximum prefix length of Route Information in RA.
+
+       Route Information w/ prefix larger than or equal to this
+       variable shall be ignored.
+
+       Functional default: 0 if accept_ra_rtr_pref is enabled.
+                           -1 if accept_ra_rtr_pref is disabled.
+
 accept_ra_rtr_pref - BOOLEAN
        Accept Router Preference in RA.
 
index c609cc7..1263d8c 100644 (file)
@@ -150,6 +150,9 @@ struct ipv6_devconf {
 #ifdef CONFIG_IPV6_ROUTER_PREF
        __s32           accept_ra_rtr_pref;
        __s32           rtr_probe_interval;
+#ifdef CONFIG_IPV6_ROUTE_INFO
+       __s32           accept_ra_rt_info_max_plen;
+#endif
 #endif
        void            *sysctl;
 };
@@ -177,6 +180,7 @@ enum {
        DEVCONF_ACCEPT_RA_PINFO,
        DEVCONF_ACCEPT_RA_RTR_PREF,
        DEVCONF_RTR_PROBE_INTERVAL,
+       DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
        DEVCONF_MAX
 };
 
index f49488f..8ad4bea 100644 (file)
@@ -535,6 +535,7 @@ enum {
        NET_IPV6_ACCEPT_RA_PINFO=19,
        NET_IPV6_ACCEPT_RA_RTR_PREF=20,
        NET_IPV6_RTR_PROBE_INTERVAL=21,
+       NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN=22,
        __NET_IPV6_MAX
 };
 
index e7add61..eb82cd5 100644 (file)
@@ -170,6 +170,9 @@ struct ipv6_devconf ipv6_devconf = {
 #ifdef CONFIG_IPV6_ROUTER_PREF
        .accept_ra_rtr_pref     = 1,
        .rtr_probe_interval     = 60 * HZ,
+#ifdef CONFIG_IPV6_ROUTE_INFO
+       .accept_ra_rt_info_max_plen = 0,
+#endif
 #endif
 };
 
@@ -197,6 +200,9 @@ static struct ipv6_devconf ipv6_devconf_dflt = {
 #ifdef CONFIG_IPV6_ROUTER_PREF
        .accept_ra_rtr_pref     = 1,
        .rtr_probe_interval     = 60 * HZ,
+#ifdef CONFIG_IPV6_ROUTE_INFO
+       .accept_ra_rt_info_max_plen = 0,
+#endif
 #endif
 };
 
@@ -3133,6 +3139,9 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,
 #ifdef CONFIG_IPV6_ROUTER_PREF
        array[DEVCONF_ACCEPT_RA_RTR_PREF] = cnf->accept_ra_rtr_pref;
        array[DEVCONF_RTR_PROBE_INTERVAL] = cnf->rtr_probe_interval;
+#ifdef CONFIV_IPV6_ROUTE_INFO
+       array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen;
+#endif
 #endif
 }
 
@@ -3620,6 +3629,16 @@ static struct addrconf_sysctl_table
                        .proc_handler   =       &proc_dointvec_jiffies,
                        .strategy       =       &sysctl_jiffies,
                },
+#ifdef CONFIV_IPV6_ROUTE_INFO
+               {
+                       .ctl_name       =       NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN,
+                       .procname       =       "accept_ra_rt_info_max_plen",
+                       .data           =       &ipv6_devconf.accept_ra_rt_info_max_plen,
+                       .maxlen         =       sizeof(int),
+                       .mode           =       0644,
+                       .proc_handler   =       &proc_dointvec,
+               },
+#endif
 #endif
                {
                        .ctl_name       =       0,      /* sentinel */
index 1f62569..dfa20d3 100644 (file)
@@ -1214,11 +1214,13 @@ skip_defrtr:
        }
 
 #ifdef CONFIG_IPV6_ROUTE_INFO
-       if (ndopts.nd_opts_ri) {
+       if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
                struct nd_opt_hdr *p;
                for (p = ndopts.nd_opts_ri;
                     p;
                     p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
+                       if (((struct route_info *)p)->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
+                               continue;
                        rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
                                      &skb->nh.ipv6h->saddr);
                }