ndisc.c (d263dfa7d2697a43f3299b9731cd568ee49cdd2c) | ndisc.c (6b2e04bc240fe9be9e690059f710e9f95346d34d) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Neighbour Discovery for IPv6 4 * Linux INET6 implementation 5 * 6 * Authors: 7 * Pedro Roque <roque@di.fc.ul.pt> 8 * Mike Shaver <shaver@ingenia.com> --- 1159 unchanged lines hidden (view full) --- 1168} 1169 1170static void ndisc_router_discovery(struct sk_buff *skb) 1171{ 1172 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb); 1173 struct neighbour *neigh = NULL; 1174 struct inet6_dev *in6_dev; 1175 struct fib6_info *rt = NULL; | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Neighbour Discovery for IPv6 4 * Linux INET6 implementation 5 * 6 * Authors: 7 * Pedro Roque <roque@di.fc.ul.pt> 8 * Mike Shaver <shaver@ingenia.com> --- 1159 unchanged lines hidden (view full) --- 1168} 1169 1170static void ndisc_router_discovery(struct sk_buff *skb) 1171{ 1172 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb); 1173 struct neighbour *neigh = NULL; 1174 struct inet6_dev *in6_dev; 1175 struct fib6_info *rt = NULL; |
1176 u32 defrtr_usr_metric; |
|
1176 struct net *net; 1177 int lifetime; 1178 struct ndisc_options ndopts; 1179 int optlen; 1180 unsigned int pref = 0; 1181 __u32 old_if_flags; 1182 bool send_ifinfo_notify = false; 1183 --- 114 unchanged lines hidden (view full) --- 1298 if (!neigh) { 1299 ND_PRINTK(0, err, 1300 "RA: %s got default router without neighbour\n", 1301 __func__); 1302 fib6_info_release(rt); 1303 return; 1304 } 1305 } | 1177 struct net *net; 1178 int lifetime; 1179 struct ndisc_options ndopts; 1180 int optlen; 1181 unsigned int pref = 0; 1182 __u32 old_if_flags; 1183 bool send_ifinfo_notify = false; 1184 --- 114 unchanged lines hidden (view full) --- 1299 if (!neigh) { 1300 ND_PRINTK(0, err, 1301 "RA: %s got default router without neighbour\n", 1302 __func__); 1303 fib6_info_release(rt); 1304 return; 1305 } 1306 } |
1306 if (rt && lifetime == 0) { | 1307 /* Set default route metric as specified by user */ 1308 defrtr_usr_metric = in6_dev->cnf.ra_defrtr_metric; 1309 /* delete the route if lifetime is 0 or if metric needs change */ 1310 if (rt && (lifetime == 0 || rt->fib6_metric != defrtr_usr_metric)) { |
1307 ip6_del_rt(net, rt, false); 1308 rt = NULL; 1309 } 1310 | 1311 ip6_del_rt(net, rt, false); 1312 rt = NULL; 1313 } 1314 |
1311 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, for dev: %s\n", 1312 rt, lifetime, skb->dev->name); | 1315 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, metric: %d, for dev: %s\n", 1316 rt, lifetime, defrtr_usr_metric, skb->dev->name); |
1313 if (!rt && lifetime) { 1314 ND_PRINTK(3, info, "RA: adding default router\n"); 1315 1316 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, | 1317 if (!rt && lifetime) { 1318 ND_PRINTK(3, info, "RA: adding default router\n"); 1319 1320 rt = rt6_add_dflt_router(net, &ipv6_hdr(skb)->saddr, |
1317 skb->dev, pref); | 1321 skb->dev, pref, defrtr_usr_metric); |
1318 if (!rt) { 1319 ND_PRINTK(0, err, 1320 "RA: %s failed to add default route\n", 1321 __func__); 1322 return; 1323 } 1324 1325 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, --- 639 unchanged lines hidden --- | 1322 if (!rt) { 1323 ND_PRINTK(0, err, 1324 "RA: %s failed to add default route\n", 1325 __func__); 1326 return; 1327 } 1328 1329 neigh = ip6_neigh_lookup(&rt->fib6_nh->fib_nh_gw6, --- 639 unchanged lines hidden --- |