net: ipv6: Add sysctl entry to disable MTU updates from RA
authorHarout Hedeshian <harouth@codeaurora.org>
Tue, 20 Jan 2015 17:06:05 +0000 (10:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 25 Jan 2015 22:54:41 +0000 (14:54 -0800)
The kernel forcefully applies MTU values received in router
advertisements provided the new MTU is less than the current. This
behavior is undesirable when the user space is managing the MTU. Instead
a sysctl flag 'accept_ra_mtu' is introduced such that the user space
can control whether or not RA provided MTU updates should be applied. The
default behavior is unchanged; user space must explicitly set this flag
to 0 for RA MTUs to be ignored.

Signed-off-by: Harout Hedeshian <harouth@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/ip-sysctl.txt
include/linux/ipv6.h
include/uapi/linux/ipv6.h
net/ipv6/addrconf.c
net/ipv6/ndisc.c

index 85b0221791048aabb65bcee8090562384ab1c628..a5e4c813f17f61274c5b49db71a339f3998c3e4b 100644 (file)
@@ -1287,6 +1287,13 @@ accept_ra_rtr_pref - BOOLEAN
        Functional default: enabled if accept_ra is enabled.
                            disabled if accept_ra is disabled.
 
+accept_ra_mtu - BOOLEAN
+       Apply the MTU value specified in RA option 5 (RFC4861). If
+       disabled, the MTU specified in the RA will be ignored.
+
+       Functional default: enabled if accept_ra is enabled.
+                           disabled if accept_ra is disabled.
+
 accept_redirects - BOOLEAN
        Accept Redirects.
 
index c694e7baa621b3f76d220589e018dd767fa7bfd0..2805062c013fa586440dd0ee34f0cd33a3abf730 100644 (file)
@@ -52,6 +52,7 @@ struct ipv6_devconf {
        __s32           force_tllao;
        __s32           ndisc_notify;
        __s32           suppress_frag_ndisc;
+       __s32           accept_ra_mtu;
        void            *sysctl;
 };
 
index 73cb02dc3065390854fdcc95b6c6821ac2e4a1b0..437a6a4b125a1383be23027c7130966d7c862bd5 100644 (file)
@@ -169,6 +169,7 @@ enum {
        DEVCONF_SUPPRESS_FRAG_NDISC,
        DEVCONF_ACCEPT_RA_FROM_LOCAL,
        DEVCONF_USE_OPTIMISTIC,
+       DEVCONF_ACCEPT_RA_MTU,
        DEVCONF_MAX
 };
 
index d6b4f5d08014c6ad096019120f2d4c5daf776bc2..7dcc065e216021c04ef2efebe165a87209c63fd9 100644 (file)
@@ -201,6 +201,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = {
        .disable_ipv6           = 0,
        .accept_dad             = 1,
        .suppress_frag_ndisc    = 1,
+       .accept_ra_mtu          = 1,
 };
 
 static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
@@ -238,6 +239,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
        .disable_ipv6           = 0,
        .accept_dad             = 1,
        .suppress_frag_ndisc    = 1,
+       .accept_ra_mtu          = 1,
 };
 
 /* Check if a valid qdisc is available */
@@ -4380,6 +4382,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf,
        array[DEVCONF_NDISC_NOTIFY] = cnf->ndisc_notify;
        array[DEVCONF_SUPPRESS_FRAG_NDISC] = cnf->suppress_frag_ndisc;
        array[DEVCONF_ACCEPT_RA_FROM_LOCAL] = cnf->accept_ra_from_local;
+       array[DEVCONF_ACCEPT_RA_MTU] = cnf->accept_ra_mtu;
 }
 
 static inline size_t inet6_ifla6_size(void)
@@ -5258,6 +5261,13 @@ static struct addrconf_sysctl_table
                        .mode           = 0644,
                        .proc_handler   = proc_dointvec,
                },
+               {
+                       .procname       = "accept_ra_mtu",
+                       .data           = &ipv6_devconf.accept_ra_mtu,
+                       .maxlen         = sizeof(int),
+                       .mode           = 0644,
+                       .proc_handler   = proc_dointvec,
+               },
                {
                        /* sentinel */
                }
index 682866777d5383dabaf6e3ae2f6f2deef261f557..8a9d7c19e247ceb58ce51aec5bfd684dfb4cb4ad 100644 (file)
@@ -1348,7 +1348,7 @@ skip_routeinfo:
                }
        }
 
-       if (ndopts.nd_opts_mtu) {
+       if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
                __be32 n;
                u32 mtu;