mirror of https://github.com/OpenIPC/firmware.git
118 lines
3.8 KiB
Diff
118 lines
3.8 KiB
Diff
diff -drupN a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
|
|
--- a/net/ipv6/addrconf.c 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/net/ipv6/addrconf.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -223,9 +223,11 @@ static struct ipv6_devconf ipv6_devconf
|
|
.accept_ra_rtr_pref = 1,
|
|
.rtr_probe_interval = 60 * HZ,
|
|
#ifdef CONFIG_IPV6_ROUTE_INFO
|
|
+ .accept_ra_rt_info_min_plen = 0,
|
|
.accept_ra_rt_info_max_plen = 0,
|
|
#endif
|
|
#endif
|
|
+ .accept_ra_rt_table = 0,
|
|
.proxy_ndp = 0,
|
|
.accept_source_route = 0, /* we do not accept RH0 by default. */
|
|
.disable_ipv6 = 0,
|
|
@@ -269,9 +271,11 @@ static struct ipv6_devconf ipv6_devconf_
|
|
.accept_ra_rtr_pref = 1,
|
|
.rtr_probe_interval = 60 * HZ,
|
|
#ifdef CONFIG_IPV6_ROUTE_INFO
|
|
+ .accept_ra_rt_info_min_plen = 0,
|
|
.accept_ra_rt_info_max_plen = 0,
|
|
#endif
|
|
#endif
|
|
+ .accept_ra_rt_table = 0,
|
|
.proxy_ndp = 0,
|
|
.accept_source_route = 0, /* we do not accept RH0 by default. */
|
|
.disable_ipv6 = 0,
|
|
@@ -2203,6 +2207,31 @@ static void ipv6_try_regen_rndid(struct
|
|
ipv6_regen_rndid(idev);
|
|
}
|
|
|
|
+u32 addrconf_rt_table(const struct net_device *dev, u32 default_table) {
|
|
+ /* Determines into what table to put autoconf PIO/RIO/default routes
|
|
+ * learned on this device.
|
|
+ *
|
|
+ * - If 0, use the same table for every device. This puts routes into
|
|
+ * one of RT_TABLE_{PREFIX,INFO,DFLT} depending on the type of route
|
|
+ * (but note that these three are currently all equal to
|
|
+ * RT6_TABLE_MAIN).
|
|
+ * - If > 0, use the specified table.
|
|
+ * - If < 0, put routes into table dev->ifindex + (-rt_table).
|
|
+ */
|
|
+ struct inet6_dev *idev = in6_dev_get(dev);
|
|
+ u32 table;
|
|
+ int sysctl = idev->cnf.accept_ra_rt_table;
|
|
+ if (sysctl == 0) {
|
|
+ table = default_table;
|
|
+ } else if (sysctl > 0) {
|
|
+ table = (u32) sysctl;
|
|
+ } else {
|
|
+ table = (unsigned) dev->ifindex + (-sysctl);
|
|
+ }
|
|
+ in6_dev_put(idev);
|
|
+ return table;
|
|
+}
|
|
+
|
|
/*
|
|
* Add prefix route.
|
|
*/
|
|
@@ -2212,7 +2241,7 @@ addrconf_prefix_route(struct in6_addr *p
|
|
unsigned long expires, u32 flags)
|
|
{
|
|
struct fib6_config cfg = {
|
|
- .fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX,
|
|
+ .fc_table = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_PREFIX),
|
|
.fc_metric = IP6_RT_PRIO_ADDRCONF,
|
|
.fc_ifindex = dev->ifindex,
|
|
.fc_expires = expires,
|
|
@@ -2245,7 +2274,7 @@ static struct rt6_info *addrconf_get_pre
|
|
struct fib6_node *fn;
|
|
struct rt6_info *rt = NULL;
|
|
struct fib6_table *table;
|
|
- u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_PREFIX;
|
|
+ u32 tb_id = l3mdev_fib_table(dev) ? : addrconf_rt_table(dev, RT6_TABLE_PREFIX);
|
|
|
|
table = fib6_get_table(dev_net(dev), tb_id);
|
|
if (!table)
|
|
@@ -4957,9 +4986,11 @@ static inline void ipv6_store_devconf(st
|
|
array[DEVCONF_RTR_PROBE_INTERVAL] =
|
|
jiffies_to_msecs(cnf->rtr_probe_interval);
|
|
#ifdef CONFIG_IPV6_ROUTE_INFO
|
|
+ array[DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN] = cnf->accept_ra_rt_info_min_plen;
|
|
array[DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN] = cnf->accept_ra_rt_info_max_plen;
|
|
#endif
|
|
#endif
|
|
+ array[DEVCONF_ACCEPT_RA_RT_TABLE] = cnf->accept_ra_rt_table;
|
|
array[DEVCONF_PROXY_NDP] = cnf->proxy_ndp;
|
|
array[DEVCONF_ACCEPT_SOURCE_ROUTE] = cnf->accept_source_route;
|
|
#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
|
|
@@ -5932,6 +5963,13 @@ static const struct ctl_table addrconf_s
|
|
},
|
|
#ifdef CONFIG_IPV6_ROUTE_INFO
|
|
{
|
|
+ .procname = "accept_ra_rt_info_min_plen",
|
|
+ .data = &ipv6_devconf.accept_ra_rt_info_min_plen,
|
|
+ .maxlen = sizeof(int),
|
|
+ .mode = 0644,
|
|
+ .proc_handler = proc_dointvec,
|
|
+ },
|
|
+ {
|
|
.procname = "accept_ra_rt_info_max_plen",
|
|
.data = &ipv6_devconf.accept_ra_rt_info_max_plen,
|
|
.maxlen = sizeof(int),
|
|
@@ -5941,6 +5979,13 @@ static const struct ctl_table addrconf_s
|
|
#endif
|
|
#endif
|
|
{
|
|
+ .procname = "accept_ra_rt_table",
|
|
+ .data = &ipv6_devconf.accept_ra_rt_table,
|
|
+ .maxlen = sizeof(int),
|
|
+ .mode = 0644,
|
|
+ .proc_handler = proc_dointvec,
|
|
+ },
|
|
+ {
|
|
.procname = "proxy_ndp",
|
|
.data = &ipv6_devconf.proxy_ndp,
|
|
.maxlen = sizeof(int),
|