Reapply "net: add sysctl accept_ra_min_rtr_lft"

This reverts commit 7957cd8ab1.

Bug: 320243175
Change-Id: Ia31692230f2f5cbd2ac349edcb2be320497c52f3
Signed-off-by: Carlos Llamas <cmllamas@google.com>
This commit is contained in:
Carlos Llamas
2024-02-13 00:07:05 +00:00
committed by Treehugger Robot
parent 08538f14e5
commit d4c4255fb4
5 changed files with 42 additions and 2 deletions

View File

@@ -1902,6 +1902,14 @@ accept_ra_min_hop_limit - INTEGER
Default: 1 Default: 1
accept_ra_min_rtr_lft - INTEGER
Minimum acceptable router lifetime in Router Advertisement.
RAs with a router lifetime less than this value shall be
ignored. RAs with a router lifetime of 0 are unaffected.
Default: 0
accept_ra_pinfo - BOOLEAN accept_ra_pinfo - BOOLEAN
Learn Prefix Information in Router Advertisement. Learn Prefix Information in Router Advertisement.

View File

@@ -33,6 +33,7 @@ struct ipv6_devconf {
__s32 max_addresses; __s32 max_addresses;
__s32 accept_ra_defrtr; __s32 accept_ra_defrtr;
__s32 accept_ra_min_hop_limit; __s32 accept_ra_min_hop_limit;
__s32 accept_ra_min_rtr_lft;
__s32 accept_ra_pinfo; __s32 accept_ra_pinfo;
__s32 ignore_routes_with_linkdown; __s32 ignore_routes_with_linkdown;
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF

View File

@@ -196,6 +196,13 @@ enum {
DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN, DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN,
DEVCONF_NDISC_TCLASS, DEVCONF_NDISC_TCLASS,
DEVCONF_RPL_SEG_ENABLED, DEVCONF_RPL_SEG_ENABLED,
DEVCONF_RA_DEFRTR_METRIC,
DEVCONF_IOAM6_ENABLED,
DEVCONF_IOAM6_ID,
DEVCONF_IOAM6_ID_WIDE,
DEVCONF_NDISC_EVICT_NOCARRIER,
DEVCONF_ACCEPT_UNTRACKED_NA,
DEVCONF_ACCEPT_RA_MIN_RTR_LFT,
DEVCONF_MAX DEVCONF_MAX
}; };

View File

@@ -209,6 +209,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = {
.accept_ra_defrtr = 1, .accept_ra_defrtr = 1,
.accept_ra_from_local = 0, .accept_ra_from_local = 0,
.accept_ra_min_hop_limit= 1, .accept_ra_min_hop_limit= 1,
.accept_ra_min_rtr_lft = 0,
.accept_ra_pinfo = 1, .accept_ra_pinfo = 1,
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF
.accept_ra_rtr_pref = 1, .accept_ra_rtr_pref = 1,
@@ -265,6 +266,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
.accept_ra_defrtr = 1, .accept_ra_defrtr = 1,
.accept_ra_from_local = 0, .accept_ra_from_local = 0,
.accept_ra_min_hop_limit= 1, .accept_ra_min_hop_limit= 1,
.accept_ra_min_rtr_lft = 0,
.accept_ra_pinfo = 1, .accept_ra_pinfo = 1,
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF
.accept_ra_rtr_pref = 1, .accept_ra_rtr_pref = 1,
@@ -5588,6 +5590,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf,
array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy; array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy;
array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass; array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass;
array[DEVCONF_RPL_SEG_ENABLED] = cnf->rpl_seg_enabled; array[DEVCONF_RPL_SEG_ENABLED] = cnf->rpl_seg_enabled;
array[DEVCONF_ACCEPT_RA_MIN_RTR_LFT] = cnf->accept_ra_min_rtr_lft;
} }
static inline size_t inet6_ifla6_size(void) static inline size_t inet6_ifla6_size(void)
@@ -6741,6 +6744,13 @@ static const struct ctl_table addrconf_sysctl[] = {
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = proc_dointvec,
}, },
{
.procname = "accept_ra_min_rtr_lft",
.data = &ipv6_devconf.accept_ra_min_rtr_lft,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ {
.procname = "accept_ra_pinfo", .procname = "accept_ra_pinfo",
.data = &ipv6_devconf.accept_ra_pinfo, .data = &ipv6_devconf.accept_ra_pinfo,

View File

@@ -1222,6 +1222,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)
return; return;
} }
lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
if (!ipv6_accept_ra(in6_dev)) { if (!ipv6_accept_ra(in6_dev)) {
ND_PRINTK(2, info, ND_PRINTK(2, info,
"RA: %s, did not accept ra for dev: %s\n", "RA: %s, did not accept ra for dev: %s\n",
@@ -1229,6 +1231,13 @@ static void ndisc_router_discovery(struct sk_buff *skb)
goto skip_linkparms; goto skip_linkparms;
} }
if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) {
ND_PRINTK(2, info,
"RA: router lifetime (%ds) is too short: %s\n",
lifetime, skb->dev->name);
goto skip_linkparms;
}
#ifdef CONFIG_IPV6_NDISC_NODETYPE #ifdef CONFIG_IPV6_NDISC_NODETYPE
/* skip link-specific parameters from interior routers */ /* skip link-specific parameters from interior routers */
if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
@@ -1281,8 +1290,6 @@ static void ndisc_router_discovery(struct sk_buff *skb)
goto skip_defrtr; goto skip_defrtr;
} }
lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
#ifdef CONFIG_IPV6_ROUTER_PREF #ifdef CONFIG_IPV6_ROUTER_PREF
pref = ra_msg->icmph.icmp6_router_pref; pref = ra_msg->icmph.icmp6_router_pref;
/* 10b is handled as if it were 00b (medium) */ /* 10b is handled as if it were 00b (medium) */
@@ -1429,6 +1436,13 @@ skip_linkparms:
goto out; goto out;
} }
if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) {
ND_PRINTK(2, info,
"RA: router lifetime (%ds) is too short: %s\n",
lifetime, skb->dev->name);
goto out;
}
#ifdef CONFIG_IPV6_ROUTE_INFO #ifdef CONFIG_IPV6_ROUTE_INFO
if (!in6_dev->cnf.accept_ra_from_local && if (!in6_dev->cnf.accept_ra_from_local &&
ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,