Loading...
1/*
2 * Linux INET6 implementation
3 * FIB front-end.
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version
11 * 2 of the License, or (at your option) any later version.
12 */
13
14/* Changes:
15 *
16 * YOSHIFUJI Hideaki @USAGI
17 * reworked default router selection.
18 * - respect outgoing interface
19 * - select from (probably) reachable routers (i.e.
20 * routers in REACHABLE, STALE, DELAY or PROBE states).
21 * - always select the same router if it is (probably)
22 * reachable. otherwise, round-robin the list.
23 * Ville Nuorvala
24 * Fixed routing subtrees.
25 */
26
27#define pr_fmt(fmt) "IPv6: " fmt
28
29#include <linux/capability.h>
30#include <linux/errno.h>
31#include <linux/export.h>
32#include <linux/types.h>
33#include <linux/times.h>
34#include <linux/socket.h>
35#include <linux/sockios.h>
36#include <linux/net.h>
37#include <linux/route.h>
38#include <linux/netdevice.h>
39#include <linux/in6.h>
40#include <linux/mroute6.h>
41#include <linux/init.h>
42#include <linux/if_arp.h>
43#include <linux/proc_fs.h>
44#include <linux/seq_file.h>
45#include <linux/nsproxy.h>
46#include <linux/slab.h>
47#include <net/net_namespace.h>
48#include <net/snmp.h>
49#include <net/ipv6.h>
50#include <net/ip6_fib.h>
51#include <net/ip6_route.h>
52#include <net/ndisc.h>
53#include <net/addrconf.h>
54#include <net/tcp.h>
55#include <linux/rtnetlink.h>
56#include <net/dst.h>
57#include <net/xfrm.h>
58#include <net/netevent.h>
59#include <net/netlink.h>
60
61#include <asm/uaccess.h>
62
63#ifdef CONFIG_SYSCTL
64#include <linux/sysctl.h>
65#endif
66
67static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
68 const struct in6_addr *dest);
69static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie);
70static unsigned int ip6_default_advmss(const struct dst_entry *dst);
71static unsigned int ip6_mtu(const struct dst_entry *dst);
72static struct dst_entry *ip6_negative_advice(struct dst_entry *);
73static void ip6_dst_destroy(struct dst_entry *);
74static void ip6_dst_ifdown(struct dst_entry *,
75 struct net_device *dev, int how);
76static int ip6_dst_gc(struct dst_ops *ops);
77
78static int ip6_pkt_discard(struct sk_buff *skb);
79static int ip6_pkt_discard_out(struct sk_buff *skb);
80static void ip6_link_failure(struct sk_buff *skb);
81static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu);
82
83#ifdef CONFIG_IPV6_ROUTE_INFO
84static struct rt6_info *rt6_add_route_info(struct net *net,
85 const struct in6_addr *prefix, int prefixlen,
86 const struct in6_addr *gwaddr, int ifindex,
87 unsigned int pref);
88static struct rt6_info *rt6_get_route_info(struct net *net,
89 const struct in6_addr *prefix, int prefixlen,
90 const struct in6_addr *gwaddr, int ifindex);
91#endif
92
93static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
94{
95 struct rt6_info *rt = (struct rt6_info *) dst;
96 struct inet_peer *peer;
97 u32 *p = NULL;
98
99 if (!(rt->dst.flags & DST_HOST))
100 return NULL;
101
102 if (!rt->rt6i_peer)
103 rt6_bind_peer(rt, 1);
104
105 peer = rt->rt6i_peer;
106 if (peer) {
107 u32 *old_p = __DST_METRICS_PTR(old);
108 unsigned long prev, new;
109
110 p = peer->metrics;
111 if (inet_metrics_new(peer))
112 memcpy(p, old_p, sizeof(u32) * RTAX_MAX);
113
114 new = (unsigned long) p;
115 prev = cmpxchg(&dst->_metrics, old, new);
116
117 if (prev != old) {
118 p = __DST_METRICS_PTR(prev);
119 if (prev & DST_METRICS_READ_ONLY)
120 p = NULL;
121 }
122 }
123 return p;
124}
125
126static inline const void *choose_neigh_daddr(struct rt6_info *rt, const void *daddr)
127{
128 struct in6_addr *p = &rt->rt6i_gateway;
129
130 if (!ipv6_addr_any(p))
131 return (const void *) p;
132 return daddr;
133}
134
135static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, const void *daddr)
136{
137 struct rt6_info *rt = (struct rt6_info *) dst;
138 struct neighbour *n;
139
140 daddr = choose_neigh_daddr(rt, daddr);
141 n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr);
142 if (n)
143 return n;
144 return neigh_create(&nd_tbl, daddr, dst->dev);
145}
146
147static int rt6_bind_neighbour(struct rt6_info *rt, struct net_device *dev)
148{
149 struct neighbour *n = __ipv6_neigh_lookup(&nd_tbl, dev, &rt->rt6i_gateway);
150 if (!n) {
151 n = neigh_create(&nd_tbl, &rt->rt6i_gateway, dev);
152 if (IS_ERR(n))
153 return PTR_ERR(n);
154 }
155 dst_set_neighbour(&rt->dst, n);
156
157 return 0;
158}
159
160static struct dst_ops ip6_dst_ops_template = {
161 .family = AF_INET6,
162 .protocol = cpu_to_be16(ETH_P_IPV6),
163 .gc = ip6_dst_gc,
164 .gc_thresh = 1024,
165 .check = ip6_dst_check,
166 .default_advmss = ip6_default_advmss,
167 .mtu = ip6_mtu,
168 .cow_metrics = ipv6_cow_metrics,
169 .destroy = ip6_dst_destroy,
170 .ifdown = ip6_dst_ifdown,
171 .negative_advice = ip6_negative_advice,
172 .link_failure = ip6_link_failure,
173 .update_pmtu = ip6_rt_update_pmtu,
174 .local_out = __ip6_local_out,
175 .neigh_lookup = ip6_neigh_lookup,
176};
177
178static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst)
179{
180 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
181
182 return mtu ? : dst->dev->mtu;
183}
184
185static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
186{
187}
188
189static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst,
190 unsigned long old)
191{
192 return NULL;
193}
194
195static struct dst_ops ip6_dst_blackhole_ops = {
196 .family = AF_INET6,
197 .protocol = cpu_to_be16(ETH_P_IPV6),
198 .destroy = ip6_dst_destroy,
199 .check = ip6_dst_check,
200 .mtu = ip6_blackhole_mtu,
201 .default_advmss = ip6_default_advmss,
202 .update_pmtu = ip6_rt_blackhole_update_pmtu,
203 .cow_metrics = ip6_rt_blackhole_cow_metrics,
204 .neigh_lookup = ip6_neigh_lookup,
205};
206
207static const u32 ip6_template_metrics[RTAX_MAX] = {
208 [RTAX_HOPLIMIT - 1] = 255,
209};
210
211static struct rt6_info ip6_null_entry_template = {
212 .dst = {
213 .__refcnt = ATOMIC_INIT(1),
214 .__use = 1,
215 .obsolete = -1,
216 .error = -ENETUNREACH,
217 .input = ip6_pkt_discard,
218 .output = ip6_pkt_discard_out,
219 },
220 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
221 .rt6i_protocol = RTPROT_KERNEL,
222 .rt6i_metric = ~(u32) 0,
223 .rt6i_ref = ATOMIC_INIT(1),
224};
225
226#ifdef CONFIG_IPV6_MULTIPLE_TABLES
227
228static int ip6_pkt_prohibit(struct sk_buff *skb);
229static int ip6_pkt_prohibit_out(struct sk_buff *skb);
230
231static struct rt6_info ip6_prohibit_entry_template = {
232 .dst = {
233 .__refcnt = ATOMIC_INIT(1),
234 .__use = 1,
235 .obsolete = -1,
236 .error = -EACCES,
237 .input = ip6_pkt_prohibit,
238 .output = ip6_pkt_prohibit_out,
239 },
240 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
241 .rt6i_protocol = RTPROT_KERNEL,
242 .rt6i_metric = ~(u32) 0,
243 .rt6i_ref = ATOMIC_INIT(1),
244};
245
246static struct rt6_info ip6_blk_hole_entry_template = {
247 .dst = {
248 .__refcnt = ATOMIC_INIT(1),
249 .__use = 1,
250 .obsolete = -1,
251 .error = -EINVAL,
252 .input = dst_discard,
253 .output = dst_discard,
254 },
255 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
256 .rt6i_protocol = RTPROT_KERNEL,
257 .rt6i_metric = ~(u32) 0,
258 .rt6i_ref = ATOMIC_INIT(1),
259};
260
261#endif
262
263/* allocate dst with ip6_dst_ops */
264static inline struct rt6_info *ip6_dst_alloc(struct dst_ops *ops,
265 struct net_device *dev,
266 int flags)
267{
268 struct rt6_info *rt = dst_alloc(ops, dev, 0, 0, flags);
269
270 if (rt)
271 memset(&rt->rt6i_table, 0,
272 sizeof(*rt) - sizeof(struct dst_entry));
273
274 return rt;
275}
276
277static void ip6_dst_destroy(struct dst_entry *dst)
278{
279 struct rt6_info *rt = (struct rt6_info *)dst;
280 struct inet6_dev *idev = rt->rt6i_idev;
281 struct inet_peer *peer = rt->rt6i_peer;
282
283 if (!(rt->dst.flags & DST_HOST))
284 dst_destroy_metrics_generic(dst);
285
286 if (idev) {
287 rt->rt6i_idev = NULL;
288 in6_dev_put(idev);
289 }
290
291 if (!(rt->rt6i_flags & RTF_EXPIRES) && dst->from)
292 dst_release(dst->from);
293
294 if (peer) {
295 rt->rt6i_peer = NULL;
296 inet_putpeer(peer);
297 }
298}
299
300static atomic_t __rt6_peer_genid = ATOMIC_INIT(0);
301
302static u32 rt6_peer_genid(void)
303{
304 return atomic_read(&__rt6_peer_genid);
305}
306
307void rt6_bind_peer(struct rt6_info *rt, int create)
308{
309 struct inet_peer *peer;
310
311 peer = inet_getpeer_v6(&rt->rt6i_dst.addr, create);
312 if (peer && cmpxchg(&rt->rt6i_peer, NULL, peer) != NULL)
313 inet_putpeer(peer);
314 else
315 rt->rt6i_peer_genid = rt6_peer_genid();
316}
317
318static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
319 int how)
320{
321 struct rt6_info *rt = (struct rt6_info *)dst;
322 struct inet6_dev *idev = rt->rt6i_idev;
323 struct net_device *loopback_dev =
324 dev_net(dev)->loopback_dev;
325
326 if (dev != loopback_dev && idev && idev->dev == dev) {
327 struct inet6_dev *loopback_idev =
328 in6_dev_get(loopback_dev);
329 if (loopback_idev) {
330 rt->rt6i_idev = loopback_idev;
331 in6_dev_put(idev);
332 }
333 }
334}
335
336static bool rt6_check_expired(const struct rt6_info *rt)
337{
338 struct rt6_info *ort = NULL;
339
340 if (rt->rt6i_flags & RTF_EXPIRES) {
341 if (time_after(jiffies, rt->dst.expires))
342 return true;
343 } else if (rt->dst.from) {
344 ort = (struct rt6_info *) rt->dst.from;
345 return (ort->rt6i_flags & RTF_EXPIRES) &&
346 time_after(jiffies, ort->dst.expires);
347 }
348 return false;
349}
350
351static bool rt6_need_strict(const struct in6_addr *daddr)
352{
353 return ipv6_addr_type(daddr) &
354 (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK);
355}
356
357/*
358 * Route lookup. Any table->tb6_lock is implied.
359 */
360
361static inline struct rt6_info *rt6_device_match(struct net *net,
362 struct rt6_info *rt,
363 const struct in6_addr *saddr,
364 int oif,
365 int flags)
366{
367 struct rt6_info *local = NULL;
368 struct rt6_info *sprt;
369
370 if (!oif && ipv6_addr_any(saddr))
371 goto out;
372
373 for (sprt = rt; sprt; sprt = sprt->dst.rt6_next) {
374 struct net_device *dev = sprt->dst.dev;
375
376 if (oif) {
377 if (dev->ifindex == oif)
378 return sprt;
379 if (dev->flags & IFF_LOOPBACK) {
380 if (!sprt->rt6i_idev ||
381 sprt->rt6i_idev->dev->ifindex != oif) {
382 if (flags & RT6_LOOKUP_F_IFACE && oif)
383 continue;
384 if (local && (!oif ||
385 local->rt6i_idev->dev->ifindex == oif))
386 continue;
387 }
388 local = sprt;
389 }
390 } else {
391 if (ipv6_chk_addr(net, saddr, dev,
392 flags & RT6_LOOKUP_F_IFACE))
393 return sprt;
394 }
395 }
396
397 if (oif) {
398 if (local)
399 return local;
400
401 if (flags & RT6_LOOKUP_F_IFACE)
402 return net->ipv6.ip6_null_entry;
403 }
404out:
405 return rt;
406}
407
408#ifdef CONFIG_IPV6_ROUTER_PREF
409static void rt6_probe(struct rt6_info *rt)
410{
411 struct neighbour *neigh;
412 /*
413 * Okay, this does not seem to be appropriate
414 * for now, however, we need to check if it
415 * is really so; aka Router Reachability Probing.
416 *
417 * Router Reachability Probe MUST be rate-limited
418 * to no more than one per minute.
419 */
420 rcu_read_lock();
421 neigh = rt ? dst_get_neighbour_noref(&rt->dst) : NULL;
422 if (!neigh || (neigh->nud_state & NUD_VALID))
423 goto out;
424 read_lock_bh(&neigh->lock);
425 if (!(neigh->nud_state & NUD_VALID) &&
426 time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) {
427 struct in6_addr mcaddr;
428 struct in6_addr *target;
429
430 neigh->updated = jiffies;
431 read_unlock_bh(&neigh->lock);
432
433 target = (struct in6_addr *)&neigh->primary_key;
434 addrconf_addr_solict_mult(target, &mcaddr);
435 ndisc_send_ns(rt->dst.dev, NULL, target, &mcaddr, NULL);
436 } else {
437 read_unlock_bh(&neigh->lock);
438 }
439out:
440 rcu_read_unlock();
441}
442#else
443static inline void rt6_probe(struct rt6_info *rt)
444{
445}
446#endif
447
448/*
449 * Default Router Selection (RFC 2461 6.3.6)
450 */
451static inline int rt6_check_dev(struct rt6_info *rt, int oif)
452{
453 struct net_device *dev = rt->dst.dev;
454 if (!oif || dev->ifindex == oif)
455 return 2;
456 if ((dev->flags & IFF_LOOPBACK) &&
457 rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif)
458 return 1;
459 return 0;
460}
461
462static inline int rt6_check_neigh(struct rt6_info *rt)
463{
464 struct neighbour *neigh;
465 int m;
466
467 rcu_read_lock();
468 neigh = dst_get_neighbour_noref(&rt->dst);
469 if (rt->rt6i_flags & RTF_NONEXTHOP ||
470 !(rt->rt6i_flags & RTF_GATEWAY))
471 m = 1;
472 else if (neigh) {
473 read_lock_bh(&neigh->lock);
474 if (neigh->nud_state & NUD_VALID)
475 m = 2;
476#ifdef CONFIG_IPV6_ROUTER_PREF
477 else if (neigh->nud_state & NUD_FAILED)
478 m = 0;
479#endif
480 else
481 m = 1;
482 read_unlock_bh(&neigh->lock);
483 } else
484 m = 0;
485 rcu_read_unlock();
486 return m;
487}
488
489static int rt6_score_route(struct rt6_info *rt, int oif,
490 int strict)
491{
492 int m, n;
493
494 m = rt6_check_dev(rt, oif);
495 if (!m && (strict & RT6_LOOKUP_F_IFACE))
496 return -1;
497#ifdef CONFIG_IPV6_ROUTER_PREF
498 m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
499#endif
500 n = rt6_check_neigh(rt);
501 if (!n && (strict & RT6_LOOKUP_F_REACHABLE))
502 return -1;
503 return m;
504}
505
506static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
507 int *mpri, struct rt6_info *match)
508{
509 int m;
510
511 if (rt6_check_expired(rt))
512 goto out;
513
514 m = rt6_score_route(rt, oif, strict);
515 if (m < 0)
516 goto out;
517
518 if (m > *mpri) {
519 if (strict & RT6_LOOKUP_F_REACHABLE)
520 rt6_probe(match);
521 *mpri = m;
522 match = rt;
523 } else if (strict & RT6_LOOKUP_F_REACHABLE) {
524 rt6_probe(rt);
525 }
526
527out:
528 return match;
529}
530
531static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
532 struct rt6_info *rr_head,
533 u32 metric, int oif, int strict)
534{
535 struct rt6_info *rt, *match;
536 int mpri = -1;
537
538 match = NULL;
539 for (rt = rr_head; rt && rt->rt6i_metric == metric;
540 rt = rt->dst.rt6_next)
541 match = find_match(rt, oif, strict, &mpri, match);
542 for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric;
543 rt = rt->dst.rt6_next)
544 match = find_match(rt, oif, strict, &mpri, match);
545
546 return match;
547}
548
549static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict)
550{
551 struct rt6_info *match, *rt0;
552 struct net *net;
553
554 rt0 = fn->rr_ptr;
555 if (!rt0)
556 fn->rr_ptr = rt0 = fn->leaf;
557
558 match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict);
559
560 if (!match &&
561 (strict & RT6_LOOKUP_F_REACHABLE)) {
562 struct rt6_info *next = rt0->dst.rt6_next;
563
564 /* no entries matched; do round-robin */
565 if (!next || next->rt6i_metric != rt0->rt6i_metric)
566 next = fn->leaf;
567
568 if (next != rt0)
569 fn->rr_ptr = next;
570 }
571
572 net = dev_net(rt0->dst.dev);
573 return match ? match : net->ipv6.ip6_null_entry;
574}
575
576#ifdef CONFIG_IPV6_ROUTE_INFO
577int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
578 const struct in6_addr *gwaddr)
579{
580 struct net *net = dev_net(dev);
581 struct route_info *rinfo = (struct route_info *) opt;
582 struct in6_addr prefix_buf, *prefix;
583 unsigned int pref;
584 unsigned long lifetime;
585 struct rt6_info *rt;
586
587 if (len < sizeof(struct route_info)) {
588 return -EINVAL;
589 }
590
591 /* Sanity check for prefix_len and length */
592 if (rinfo->length > 3) {
593 return -EINVAL;
594 } else if (rinfo->prefix_len > 128) {
595 return -EINVAL;
596 } else if (rinfo->prefix_len > 64) {
597 if (rinfo->length < 2) {
598 return -EINVAL;
599 }
600 } else if (rinfo->prefix_len > 0) {
601 if (rinfo->length < 1) {
602 return -EINVAL;
603 }
604 }
605
606 pref = rinfo->route_pref;
607 if (pref == ICMPV6_ROUTER_PREF_INVALID)
608 return -EINVAL;
609
610 lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ);
611
612 if (rinfo->length == 3)
613 prefix = (struct in6_addr *)rinfo->prefix;
614 else {
615 /* this function is safe */
616 ipv6_addr_prefix(&prefix_buf,
617 (struct in6_addr *)rinfo->prefix,
618 rinfo->prefix_len);
619 prefix = &prefix_buf;
620 }
621
622 rt = rt6_get_route_info(net, prefix, rinfo->prefix_len, gwaddr,
623 dev->ifindex);
624
625 if (rt && !lifetime) {
626 ip6_del_rt(rt);
627 rt = NULL;
628 }
629
630 if (!rt && lifetime)
631 rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr, dev->ifindex,
632 pref);
633 else if (rt)
634 rt->rt6i_flags = RTF_ROUTEINFO |
635 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
636
637 if (rt) {
638 if (!addrconf_finite_timeout(lifetime))
639 rt6_clean_expires(rt);
640 else
641 rt6_set_expires(rt, jiffies + HZ * lifetime);
642
643 dst_release(&rt->dst);
644 }
645 return 0;
646}
647#endif
648
649#define BACKTRACK(__net, saddr) \
650do { \
651 if (rt == __net->ipv6.ip6_null_entry) { \
652 struct fib6_node *pn; \
653 while (1) { \
654 if (fn->fn_flags & RTN_TL_ROOT) \
655 goto out; \
656 pn = fn->parent; \
657 if (FIB6_SUBTREE(pn) && FIB6_SUBTREE(pn) != fn) \
658 fn = fib6_lookup(FIB6_SUBTREE(pn), NULL, saddr); \
659 else \
660 fn = pn; \
661 if (fn->fn_flags & RTN_RTINFO) \
662 goto restart; \
663 } \
664 } \
665} while (0)
666
667static struct rt6_info *ip6_pol_route_lookup(struct net *net,
668 struct fib6_table *table,
669 struct flowi6 *fl6, int flags)
670{
671 struct fib6_node *fn;
672 struct rt6_info *rt;
673
674 read_lock_bh(&table->tb6_lock);
675 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
676restart:
677 rt = fn->leaf;
678 rt = rt6_device_match(net, rt, &fl6->saddr, fl6->flowi6_oif, flags);
679 BACKTRACK(net, &fl6->saddr);
680out:
681 dst_use(&rt->dst, jiffies);
682 read_unlock_bh(&table->tb6_lock);
683 return rt;
684
685}
686
687struct dst_entry * ip6_route_lookup(struct net *net, struct flowi6 *fl6,
688 int flags)
689{
690 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_lookup);
691}
692EXPORT_SYMBOL_GPL(ip6_route_lookup);
693
694struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
695 const struct in6_addr *saddr, int oif, int strict)
696{
697 struct flowi6 fl6 = {
698 .flowi6_oif = oif,
699 .daddr = *daddr,
700 };
701 struct dst_entry *dst;
702 int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
703
704 if (saddr) {
705 memcpy(&fl6.saddr, saddr, sizeof(*saddr));
706 flags |= RT6_LOOKUP_F_HAS_SADDR;
707 }
708
709 dst = fib6_rule_lookup(net, &fl6, flags, ip6_pol_route_lookup);
710 if (dst->error == 0)
711 return (struct rt6_info *) dst;
712
713 dst_release(dst);
714
715 return NULL;
716}
717
718EXPORT_SYMBOL(rt6_lookup);
719
720/* ip6_ins_rt is called with FREE table->tb6_lock.
721 It takes new route entry, the addition fails by any reason the
722 route is freed. In any case, if caller does not hold it, it may
723 be destroyed.
724 */
725
726static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info)
727{
728 int err;
729 struct fib6_table *table;
730
731 table = rt->rt6i_table;
732 write_lock_bh(&table->tb6_lock);
733 err = fib6_add(&table->tb6_root, rt, info);
734 write_unlock_bh(&table->tb6_lock);
735
736 return err;
737}
738
739int ip6_ins_rt(struct rt6_info *rt)
740{
741 struct nl_info info = {
742 .nl_net = dev_net(rt->dst.dev),
743 };
744 return __ip6_ins_rt(rt, &info);
745}
746
747static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort,
748 const struct in6_addr *daddr,
749 const struct in6_addr *saddr)
750{
751 struct rt6_info *rt;
752
753 /*
754 * Clone the route.
755 */
756
757 rt = ip6_rt_copy(ort, daddr);
758
759 if (rt) {
760 int attempts = !in_softirq();
761
762 if (!(rt->rt6i_flags & RTF_GATEWAY)) {
763 if (ort->rt6i_dst.plen != 128 &&
764 ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
765 rt->rt6i_flags |= RTF_ANYCAST;
766 rt->rt6i_gateway = *daddr;
767 }
768
769 rt->rt6i_flags |= RTF_CACHE;
770
771#ifdef CONFIG_IPV6_SUBTREES
772 if (rt->rt6i_src.plen && saddr) {
773 rt->rt6i_src.addr = *saddr;
774 rt->rt6i_src.plen = 128;
775 }
776#endif
777
778 retry:
779 if (rt6_bind_neighbour(rt, rt->dst.dev)) {
780 struct net *net = dev_net(rt->dst.dev);
781 int saved_rt_min_interval =
782 net->ipv6.sysctl.ip6_rt_gc_min_interval;
783 int saved_rt_elasticity =
784 net->ipv6.sysctl.ip6_rt_gc_elasticity;
785
786 if (attempts-- > 0) {
787 net->ipv6.sysctl.ip6_rt_gc_elasticity = 1;
788 net->ipv6.sysctl.ip6_rt_gc_min_interval = 0;
789
790 ip6_dst_gc(&net->ipv6.ip6_dst_ops);
791
792 net->ipv6.sysctl.ip6_rt_gc_elasticity =
793 saved_rt_elasticity;
794 net->ipv6.sysctl.ip6_rt_gc_min_interval =
795 saved_rt_min_interval;
796 goto retry;
797 }
798
799 net_warn_ratelimited("Neighbour table overflow\n");
800 dst_free(&rt->dst);
801 return NULL;
802 }
803 }
804
805 return rt;
806}
807
808static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort,
809 const struct in6_addr *daddr)
810{
811 struct rt6_info *rt = ip6_rt_copy(ort, daddr);
812
813 if (rt) {
814 rt->rt6i_flags |= RTF_CACHE;
815 dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_noref_raw(&ort->dst)));
816 }
817 return rt;
818}
819
820static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, int oif,
821 struct flowi6 *fl6, int flags)
822{
823 struct fib6_node *fn;
824 struct rt6_info *rt, *nrt;
825 int strict = 0;
826 int attempts = 3;
827 int err;
828 int reachable = net->ipv6.devconf_all->forwarding ? 0 : RT6_LOOKUP_F_REACHABLE;
829
830 strict |= flags & RT6_LOOKUP_F_IFACE;
831
832relookup:
833 read_lock_bh(&table->tb6_lock);
834
835restart_2:
836 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
837
838restart:
839 rt = rt6_select(fn, oif, strict | reachable);
840
841 BACKTRACK(net, &fl6->saddr);
842 if (rt == net->ipv6.ip6_null_entry ||
843 rt->rt6i_flags & RTF_CACHE)
844 goto out;
845
846 dst_hold(&rt->dst);
847 read_unlock_bh(&table->tb6_lock);
848
849 if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
850 nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
851 else if (!(rt->dst.flags & DST_HOST))
852 nrt = rt6_alloc_clone(rt, &fl6->daddr);
853 else
854 goto out2;
855
856 dst_release(&rt->dst);
857 rt = nrt ? : net->ipv6.ip6_null_entry;
858
859 dst_hold(&rt->dst);
860 if (nrt) {
861 err = ip6_ins_rt(nrt);
862 if (!err)
863 goto out2;
864 }
865
866 if (--attempts <= 0)
867 goto out2;
868
869 /*
870 * Race condition! In the gap, when table->tb6_lock was
871 * released someone could insert this route. Relookup.
872 */
873 dst_release(&rt->dst);
874 goto relookup;
875
876out:
877 if (reachable) {
878 reachable = 0;
879 goto restart_2;
880 }
881 dst_hold(&rt->dst);
882 read_unlock_bh(&table->tb6_lock);
883out2:
884 rt->dst.lastuse = jiffies;
885 rt->dst.__use++;
886
887 return rt;
888}
889
890static struct rt6_info *ip6_pol_route_input(struct net *net, struct fib6_table *table,
891 struct flowi6 *fl6, int flags)
892{
893 return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, flags);
894}
895
896static struct dst_entry *ip6_route_input_lookup(struct net *net,
897 struct net_device *dev,
898 struct flowi6 *fl6, int flags)
899{
900 if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
901 flags |= RT6_LOOKUP_F_IFACE;
902
903 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_input);
904}
905
906void ip6_route_input(struct sk_buff *skb)
907{
908 const struct ipv6hdr *iph = ipv6_hdr(skb);
909 struct net *net = dev_net(skb->dev);
910 int flags = RT6_LOOKUP_F_HAS_SADDR;
911 struct flowi6 fl6 = {
912 .flowi6_iif = skb->dev->ifindex,
913 .daddr = iph->daddr,
914 .saddr = iph->saddr,
915 .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK,
916 .flowi6_mark = skb->mark,
917 .flowi6_proto = iph->nexthdr,
918 };
919
920 skb_dst_set(skb, ip6_route_input_lookup(net, skb->dev, &fl6, flags));
921}
922
923static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table,
924 struct flowi6 *fl6, int flags)
925{
926 return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, flags);
927}
928
929struct dst_entry * ip6_route_output(struct net *net, const struct sock *sk,
930 struct flowi6 *fl6)
931{
932 int flags = 0;
933
934 if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr))
935 flags |= RT6_LOOKUP_F_IFACE;
936
937 if (!ipv6_addr_any(&fl6->saddr))
938 flags |= RT6_LOOKUP_F_HAS_SADDR;
939 else if (sk)
940 flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs);
941
942 return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_output);
943}
944
945EXPORT_SYMBOL(ip6_route_output);
946
947struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
948{
949 struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig;
950 struct dst_entry *new = NULL;
951
952 rt = dst_alloc(&ip6_dst_blackhole_ops, ort->dst.dev, 1, 0, 0);
953 if (rt) {
954 memset(&rt->rt6i_table, 0, sizeof(*rt) - sizeof(struct dst_entry));
955
956 new = &rt->dst;
957
958 new->__use = 1;
959 new->input = dst_discard;
960 new->output = dst_discard;
961
962 if (dst_metrics_read_only(&ort->dst))
963 new->_metrics = ort->dst._metrics;
964 else
965 dst_copy_metrics(new, &ort->dst);
966 rt->rt6i_idev = ort->rt6i_idev;
967 if (rt->rt6i_idev)
968 in6_dev_hold(rt->rt6i_idev);
969
970 rt->rt6i_gateway = ort->rt6i_gateway;
971 rt->rt6i_flags = ort->rt6i_flags;
972 rt6_clean_expires(rt);
973 rt->rt6i_metric = 0;
974
975 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
976#ifdef CONFIG_IPV6_SUBTREES
977 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
978#endif
979
980 dst_free(new);
981 }
982
983 dst_release(dst_orig);
984 return new ? new : ERR_PTR(-ENOMEM);
985}
986
987/*
988 * Destination cache support functions
989 */
990
991static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
992{
993 struct rt6_info *rt;
994
995 rt = (struct rt6_info *) dst;
996
997 if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) {
998 if (rt->rt6i_peer_genid != rt6_peer_genid()) {
999 if (!rt->rt6i_peer)
1000 rt6_bind_peer(rt, 0);
1001 rt->rt6i_peer_genid = rt6_peer_genid();
1002 }
1003 return dst;
1004 }
1005 return NULL;
1006}
1007
1008static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
1009{
1010 struct rt6_info *rt = (struct rt6_info *) dst;
1011
1012 if (rt) {
1013 if (rt->rt6i_flags & RTF_CACHE) {
1014 if (rt6_check_expired(rt)) {
1015 ip6_del_rt(rt);
1016 dst = NULL;
1017 }
1018 } else {
1019 dst_release(dst);
1020 dst = NULL;
1021 }
1022 }
1023 return dst;
1024}
1025
1026static void ip6_link_failure(struct sk_buff *skb)
1027{
1028 struct rt6_info *rt;
1029
1030 icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
1031
1032 rt = (struct rt6_info *) skb_dst(skb);
1033 if (rt) {
1034 if (rt->rt6i_flags & RTF_CACHE)
1035 rt6_update_expires(rt, 0);
1036 else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT))
1037 rt->rt6i_node->fn_sernum = -1;
1038 }
1039}
1040
1041static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu)
1042{
1043 struct rt6_info *rt6 = (struct rt6_info*)dst;
1044
1045 if (mtu < dst_mtu(dst) && rt6->rt6i_dst.plen == 128) {
1046 rt6->rt6i_flags |= RTF_MODIFIED;
1047 if (mtu < IPV6_MIN_MTU) {
1048 u32 features = dst_metric(dst, RTAX_FEATURES);
1049 mtu = IPV6_MIN_MTU;
1050 features |= RTAX_FEATURE_ALLFRAG;
1051 dst_metric_set(dst, RTAX_FEATURES, features);
1052 }
1053 dst_metric_set(dst, RTAX_MTU, mtu);
1054 }
1055}
1056
1057static unsigned int ip6_default_advmss(const struct dst_entry *dst)
1058{
1059 struct net_device *dev = dst->dev;
1060 unsigned int mtu = dst_mtu(dst);
1061 struct net *net = dev_net(dev);
1062
1063 mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
1064
1065 if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
1066 mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
1067
1068 /*
1069 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
1070 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
1071 * IPV6_MAXPLEN is also valid and means: "any MSS,
1072 * rely only on pmtu discovery"
1073 */
1074 if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
1075 mtu = IPV6_MAXPLEN;
1076 return mtu;
1077}
1078
1079static unsigned int ip6_mtu(const struct dst_entry *dst)
1080{
1081 struct inet6_dev *idev;
1082 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
1083
1084 if (mtu)
1085 return mtu;
1086
1087 mtu = IPV6_MIN_MTU;
1088
1089 rcu_read_lock();
1090 idev = __in6_dev_get(dst->dev);
1091 if (idev)
1092 mtu = idev->cnf.mtu6;
1093 rcu_read_unlock();
1094
1095 return mtu;
1096}
1097
1098static struct dst_entry *icmp6_dst_gc_list;
1099static DEFINE_SPINLOCK(icmp6_dst_lock);
1100
1101struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
1102 struct neighbour *neigh,
1103 struct flowi6 *fl6)
1104{
1105 struct dst_entry *dst;
1106 struct rt6_info *rt;
1107 struct inet6_dev *idev = in6_dev_get(dev);
1108 struct net *net = dev_net(dev);
1109
1110 if (unlikely(!idev))
1111 return ERR_PTR(-ENODEV);
1112
1113 rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, dev, 0);
1114 if (unlikely(!rt)) {
1115 in6_dev_put(idev);
1116 dst = ERR_PTR(-ENOMEM);
1117 goto out;
1118 }
1119
1120 if (neigh)
1121 neigh_hold(neigh);
1122 else {
1123 neigh = ip6_neigh_lookup(&rt->dst, &fl6->daddr);
1124 if (IS_ERR(neigh)) {
1125 in6_dev_put(idev);
1126 dst_free(&rt->dst);
1127 return ERR_CAST(neigh);
1128 }
1129 }
1130
1131 rt->dst.flags |= DST_HOST;
1132 rt->dst.output = ip6_output;
1133 dst_set_neighbour(&rt->dst, neigh);
1134 atomic_set(&rt->dst.__refcnt, 1);
1135 rt->rt6i_dst.addr = fl6->daddr;
1136 rt->rt6i_dst.plen = 128;
1137 rt->rt6i_idev = idev;
1138 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
1139
1140 spin_lock_bh(&icmp6_dst_lock);
1141 rt->dst.next = icmp6_dst_gc_list;
1142 icmp6_dst_gc_list = &rt->dst;
1143 spin_unlock_bh(&icmp6_dst_lock);
1144
1145 fib6_force_start_gc(net);
1146
1147 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
1148
1149out:
1150 return dst;
1151}
1152
1153int icmp6_dst_gc(void)
1154{
1155 struct dst_entry *dst, **pprev;
1156 int more = 0;
1157
1158 spin_lock_bh(&icmp6_dst_lock);
1159 pprev = &icmp6_dst_gc_list;
1160
1161 while ((dst = *pprev) != NULL) {
1162 if (!atomic_read(&dst->__refcnt)) {
1163 *pprev = dst->next;
1164 dst_free(dst);
1165 } else {
1166 pprev = &dst->next;
1167 ++more;
1168 }
1169 }
1170
1171 spin_unlock_bh(&icmp6_dst_lock);
1172
1173 return more;
1174}
1175
1176static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg),
1177 void *arg)
1178{
1179 struct dst_entry *dst, **pprev;
1180
1181 spin_lock_bh(&icmp6_dst_lock);
1182 pprev = &icmp6_dst_gc_list;
1183 while ((dst = *pprev) != NULL) {
1184 struct rt6_info *rt = (struct rt6_info *) dst;
1185 if (func(rt, arg)) {
1186 *pprev = dst->next;
1187 dst_free(dst);
1188 } else {
1189 pprev = &dst->next;
1190 }
1191 }
1192 spin_unlock_bh(&icmp6_dst_lock);
1193}
1194
1195static int ip6_dst_gc(struct dst_ops *ops)
1196{
1197 unsigned long now = jiffies;
1198 struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
1199 int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
1200 int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size;
1201 int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
1202 int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
1203 unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
1204 int entries;
1205
1206 entries = dst_entries_get_fast(ops);
1207 if (time_after(rt_last_gc + rt_min_interval, now) &&
1208 entries <= rt_max_size)
1209 goto out;
1210
1211 net->ipv6.ip6_rt_gc_expire++;
1212 fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net);
1213 net->ipv6.ip6_rt_last_gc = now;
1214 entries = dst_entries_get_slow(ops);
1215 if (entries < ops->gc_thresh)
1216 net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1;
1217out:
1218 net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>rt_elasticity;
1219 return entries > rt_max_size;
1220}
1221
1222/* Clean host part of a prefix. Not necessary in radix tree,
1223 but results in cleaner routing tables.
1224
1225 Remove it only when all the things will work!
1226 */
1227
1228int ip6_dst_hoplimit(struct dst_entry *dst)
1229{
1230 int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
1231 if (hoplimit == 0) {
1232 struct net_device *dev = dst->dev;
1233 struct inet6_dev *idev;
1234
1235 rcu_read_lock();
1236 idev = __in6_dev_get(dev);
1237 if (idev)
1238 hoplimit = idev->cnf.hop_limit;
1239 else
1240 hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
1241 rcu_read_unlock();
1242 }
1243 return hoplimit;
1244}
1245EXPORT_SYMBOL(ip6_dst_hoplimit);
1246
1247/*
1248 *
1249 */
1250
1251int ip6_route_add(struct fib6_config *cfg)
1252{
1253 int err;
1254 struct net *net = cfg->fc_nlinfo.nl_net;
1255 struct rt6_info *rt = NULL;
1256 struct net_device *dev = NULL;
1257 struct inet6_dev *idev = NULL;
1258 struct fib6_table *table;
1259 int addr_type;
1260
1261 if (cfg->fc_dst_len > 128 || cfg->fc_src_len > 128)
1262 return -EINVAL;
1263#ifndef CONFIG_IPV6_SUBTREES
1264 if (cfg->fc_src_len)
1265 return -EINVAL;
1266#endif
1267 if (cfg->fc_ifindex) {
1268 err = -ENODEV;
1269 dev = dev_get_by_index(net, cfg->fc_ifindex);
1270 if (!dev)
1271 goto out;
1272 idev = in6_dev_get(dev);
1273 if (!idev)
1274 goto out;
1275 }
1276
1277 if (cfg->fc_metric == 0)
1278 cfg->fc_metric = IP6_RT_PRIO_USER;
1279
1280 err = -ENOBUFS;
1281 if (cfg->fc_nlinfo.nlh &&
1282 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
1283 table = fib6_get_table(net, cfg->fc_table);
1284 if (!table) {
1285 pr_warn("NLM_F_CREATE should be specified when creating new route\n");
1286 table = fib6_new_table(net, cfg->fc_table);
1287 }
1288 } else {
1289 table = fib6_new_table(net, cfg->fc_table);
1290 }
1291
1292 if (!table)
1293 goto out;
1294
1295 rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops, NULL, DST_NOCOUNT);
1296
1297 if (!rt) {
1298 err = -ENOMEM;
1299 goto out;
1300 }
1301
1302 rt->dst.obsolete = -1;
1303
1304 if (cfg->fc_flags & RTF_EXPIRES)
1305 rt6_set_expires(rt, jiffies +
1306 clock_t_to_jiffies(cfg->fc_expires));
1307 else
1308 rt6_clean_expires(rt);
1309
1310 if (cfg->fc_protocol == RTPROT_UNSPEC)
1311 cfg->fc_protocol = RTPROT_BOOT;
1312 rt->rt6i_protocol = cfg->fc_protocol;
1313
1314 addr_type = ipv6_addr_type(&cfg->fc_dst);
1315
1316 if (addr_type & IPV6_ADDR_MULTICAST)
1317 rt->dst.input = ip6_mc_input;
1318 else if (cfg->fc_flags & RTF_LOCAL)
1319 rt->dst.input = ip6_input;
1320 else
1321 rt->dst.input = ip6_forward;
1322
1323 rt->dst.output = ip6_output;
1324
1325 ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
1326 rt->rt6i_dst.plen = cfg->fc_dst_len;
1327 if (rt->rt6i_dst.plen == 128)
1328 rt->dst.flags |= DST_HOST;
1329
1330 if (!(rt->dst.flags & DST_HOST) && cfg->fc_mx) {
1331 u32 *metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
1332 if (!metrics) {
1333 err = -ENOMEM;
1334 goto out;
1335 }
1336 dst_init_metrics(&rt->dst, metrics, 0);
1337 }
1338#ifdef CONFIG_IPV6_SUBTREES
1339 ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
1340 rt->rt6i_src.plen = cfg->fc_src_len;
1341#endif
1342
1343 rt->rt6i_metric = cfg->fc_metric;
1344
1345 /* We cannot add true routes via loopback here,
1346 they would result in kernel looping; promote them to reject routes
1347 */
1348 if ((cfg->fc_flags & RTF_REJECT) ||
1349 (dev && (dev->flags & IFF_LOOPBACK) &&
1350 !(addr_type & IPV6_ADDR_LOOPBACK) &&
1351 !(cfg->fc_flags & RTF_LOCAL))) {
1352 /* hold loopback dev/idev if we haven't done so. */
1353 if (dev != net->loopback_dev) {
1354 if (dev) {
1355 dev_put(dev);
1356 in6_dev_put(idev);
1357 }
1358 dev = net->loopback_dev;
1359 dev_hold(dev);
1360 idev = in6_dev_get(dev);
1361 if (!idev) {
1362 err = -ENODEV;
1363 goto out;
1364 }
1365 }
1366 rt->dst.output = ip6_pkt_discard_out;
1367 rt->dst.input = ip6_pkt_discard;
1368 rt->dst.error = -ENETUNREACH;
1369 rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
1370 goto install_route;
1371 }
1372
1373 if (cfg->fc_flags & RTF_GATEWAY) {
1374 const struct in6_addr *gw_addr;
1375 int gwa_type;
1376
1377 gw_addr = &cfg->fc_gateway;
1378 rt->rt6i_gateway = *gw_addr;
1379 gwa_type = ipv6_addr_type(gw_addr);
1380
1381 if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
1382 struct rt6_info *grt;
1383
1384 /* IPv6 strictly inhibits using not link-local
1385 addresses as nexthop address.
1386 Otherwise, router will not able to send redirects.
1387 It is very good, but in some (rare!) circumstances
1388 (SIT, PtP, NBMA NOARP links) it is handy to allow
1389 some exceptions. --ANK
1390 */
1391 err = -EINVAL;
1392 if (!(gwa_type & IPV6_ADDR_UNICAST))
1393 goto out;
1394
1395 grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);
1396
1397 err = -EHOSTUNREACH;
1398 if (!grt)
1399 goto out;
1400 if (dev) {
1401 if (dev != grt->dst.dev) {
1402 dst_release(&grt->dst);
1403 goto out;
1404 }
1405 } else {
1406 dev = grt->dst.dev;
1407 idev = grt->rt6i_idev;
1408 dev_hold(dev);
1409 in6_dev_hold(grt->rt6i_idev);
1410 }
1411 if (!(grt->rt6i_flags & RTF_GATEWAY))
1412 err = 0;
1413 dst_release(&grt->dst);
1414
1415 if (err)
1416 goto out;
1417 }
1418 err = -EINVAL;
1419 if (!dev || (dev->flags & IFF_LOOPBACK))
1420 goto out;
1421 }
1422
1423 err = -ENODEV;
1424 if (!dev)
1425 goto out;
1426
1427 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
1428 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
1429 err = -EINVAL;
1430 goto out;
1431 }
1432 rt->rt6i_prefsrc.addr = cfg->fc_prefsrc;
1433 rt->rt6i_prefsrc.plen = 128;
1434 } else
1435 rt->rt6i_prefsrc.plen = 0;
1436
1437 if (cfg->fc_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) {
1438 err = rt6_bind_neighbour(rt, dev);
1439 if (err)
1440 goto out;
1441 }
1442
1443 rt->rt6i_flags = cfg->fc_flags;
1444
1445install_route:
1446 if (cfg->fc_mx) {
1447 struct nlattr *nla;
1448 int remaining;
1449
1450 nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) {
1451 int type = nla_type(nla);
1452
1453 if (type) {
1454 if (type > RTAX_MAX) {
1455 err = -EINVAL;
1456 goto out;
1457 }
1458
1459 dst_metric_set(&rt->dst, type, nla_get_u32(nla));
1460 }
1461 }
1462 }
1463
1464 rt->dst.dev = dev;
1465 rt->rt6i_idev = idev;
1466 rt->rt6i_table = table;
1467
1468 cfg->fc_nlinfo.nl_net = dev_net(dev);
1469
1470 return __ip6_ins_rt(rt, &cfg->fc_nlinfo);
1471
1472out:
1473 if (dev)
1474 dev_put(dev);
1475 if (idev)
1476 in6_dev_put(idev);
1477 if (rt)
1478 dst_free(&rt->dst);
1479 return err;
1480}
1481
1482static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
1483{
1484 int err;
1485 struct fib6_table *table;
1486 struct net *net = dev_net(rt->dst.dev);
1487
1488 if (rt == net->ipv6.ip6_null_entry)
1489 return -ENOENT;
1490
1491 table = rt->rt6i_table;
1492 write_lock_bh(&table->tb6_lock);
1493
1494 err = fib6_del(rt, info);
1495 dst_release(&rt->dst);
1496
1497 write_unlock_bh(&table->tb6_lock);
1498
1499 return err;
1500}
1501
1502int ip6_del_rt(struct rt6_info *rt)
1503{
1504 struct nl_info info = {
1505 .nl_net = dev_net(rt->dst.dev),
1506 };
1507 return __ip6_del_rt(rt, &info);
1508}
1509
1510static int ip6_route_del(struct fib6_config *cfg)
1511{
1512 struct fib6_table *table;
1513 struct fib6_node *fn;
1514 struct rt6_info *rt;
1515 int err = -ESRCH;
1516
1517 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
1518 if (!table)
1519 return err;
1520
1521 read_lock_bh(&table->tb6_lock);
1522
1523 fn = fib6_locate(&table->tb6_root,
1524 &cfg->fc_dst, cfg->fc_dst_len,
1525 &cfg->fc_src, cfg->fc_src_len);
1526
1527 if (fn) {
1528 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
1529 if (cfg->fc_ifindex &&
1530 (!rt->dst.dev ||
1531 rt->dst.dev->ifindex != cfg->fc_ifindex))
1532 continue;
1533 if (cfg->fc_flags & RTF_GATEWAY &&
1534 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
1535 continue;
1536 if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric)
1537 continue;
1538 dst_hold(&rt->dst);
1539 read_unlock_bh(&table->tb6_lock);
1540
1541 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
1542 }
1543 }
1544 read_unlock_bh(&table->tb6_lock);
1545
1546 return err;
1547}
1548
1549/*
1550 * Handle redirects
1551 */
1552struct ip6rd_flowi {
1553 struct flowi6 fl6;
1554 struct in6_addr gateway;
1555};
1556
1557static struct rt6_info *__ip6_route_redirect(struct net *net,
1558 struct fib6_table *table,
1559 struct flowi6 *fl6,
1560 int flags)
1561{
1562 struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
1563 struct rt6_info *rt;
1564 struct fib6_node *fn;
1565
1566 /*
1567 * Get the "current" route for this destination and
1568 * check if the redirect has come from approriate router.
1569 *
1570 * RFC 2461 specifies that redirects should only be
1571 * accepted if they come from the nexthop to the target.
1572 * Due to the way the routes are chosen, this notion
1573 * is a bit fuzzy and one might need to check all possible
1574 * routes.
1575 */
1576
1577 read_lock_bh(&table->tb6_lock);
1578 fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1579restart:
1580 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
1581 /*
1582 * Current route is on-link; redirect is always invalid.
1583 *
1584 * Seems, previous statement is not true. It could
1585 * be node, which looks for us as on-link (f.e. proxy ndisc)
1586 * But then router serving it might decide, that we should
1587 * know truth 8)8) --ANK (980726).
1588 */
1589 if (rt6_check_expired(rt))
1590 continue;
1591 if (!(rt->rt6i_flags & RTF_GATEWAY))
1592 continue;
1593 if (fl6->flowi6_oif != rt->dst.dev->ifindex)
1594 continue;
1595 if (!ipv6_addr_equal(&rdfl->gateway, &rt->rt6i_gateway))
1596 continue;
1597 break;
1598 }
1599
1600 if (!rt)
1601 rt = net->ipv6.ip6_null_entry;
1602 BACKTRACK(net, &fl6->saddr);
1603out:
1604 dst_hold(&rt->dst);
1605
1606 read_unlock_bh(&table->tb6_lock);
1607
1608 return rt;
1609};
1610
1611static struct rt6_info *ip6_route_redirect(const struct in6_addr *dest,
1612 const struct in6_addr *src,
1613 const struct in6_addr *gateway,
1614 struct net_device *dev)
1615{
1616 int flags = RT6_LOOKUP_F_HAS_SADDR;
1617 struct net *net = dev_net(dev);
1618 struct ip6rd_flowi rdfl = {
1619 .fl6 = {
1620 .flowi6_oif = dev->ifindex,
1621 .daddr = *dest,
1622 .saddr = *src,
1623 },
1624 };
1625
1626 rdfl.gateway = *gateway;
1627
1628 if (rt6_need_strict(dest))
1629 flags |= RT6_LOOKUP_F_IFACE;
1630
1631 return (struct rt6_info *)fib6_rule_lookup(net, &rdfl.fl6,
1632 flags, __ip6_route_redirect);
1633}
1634
1635void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
1636 const struct in6_addr *saddr,
1637 struct neighbour *neigh, u8 *lladdr, int on_link)
1638{
1639 struct rt6_info *rt, *nrt = NULL;
1640 struct netevent_redirect netevent;
1641 struct net *net = dev_net(neigh->dev);
1642
1643 rt = ip6_route_redirect(dest, src, saddr, neigh->dev);
1644
1645 if (rt == net->ipv6.ip6_null_entry) {
1646 net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
1647 goto out;
1648 }
1649
1650 /*
1651 * We have finally decided to accept it.
1652 */
1653
1654 neigh_update(neigh, lladdr, NUD_STALE,
1655 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1656 NEIGH_UPDATE_F_OVERRIDE|
1657 (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1658 NEIGH_UPDATE_F_ISROUTER))
1659 );
1660
1661 /*
1662 * Redirect received -> path was valid.
1663 * Look, redirects are sent only in response to data packets,
1664 * so that this nexthop apparently is reachable. --ANK
1665 */
1666 dst_confirm(&rt->dst);
1667
1668 /* Duplicate redirect: silently ignore. */
1669 if (neigh == dst_get_neighbour_noref_raw(&rt->dst))
1670 goto out;
1671
1672 nrt = ip6_rt_copy(rt, dest);
1673 if (!nrt)
1674 goto out;
1675
1676 nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
1677 if (on_link)
1678 nrt->rt6i_flags &= ~RTF_GATEWAY;
1679
1680 nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
1681 dst_set_neighbour(&nrt->dst, neigh_clone(neigh));
1682
1683 if (ip6_ins_rt(nrt))
1684 goto out;
1685
1686 netevent.old = &rt->dst;
1687 netevent.new = &nrt->dst;
1688 call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
1689
1690 if (rt->rt6i_flags & RTF_CACHE) {
1691 ip6_del_rt(rt);
1692 return;
1693 }
1694
1695out:
1696 dst_release(&rt->dst);
1697}
1698
1699/*
1700 * Handle ICMP "packet too big" messages
1701 * i.e. Path MTU discovery
1702 */
1703
1704static void rt6_do_pmtu_disc(const struct in6_addr *daddr, const struct in6_addr *saddr,
1705 struct net *net, u32 pmtu, int ifindex)
1706{
1707 struct rt6_info *rt, *nrt;
1708 int allfrag = 0;
1709again:
1710 rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
1711 if (!rt)
1712 return;
1713
1714 if (rt6_check_expired(rt)) {
1715 ip6_del_rt(rt);
1716 goto again;
1717 }
1718
1719 if (pmtu >= dst_mtu(&rt->dst))
1720 goto out;
1721
1722 if (pmtu < IPV6_MIN_MTU) {
1723 /*
1724 * According to RFC2460, PMTU is set to the IPv6 Minimum Link
1725 * MTU (1280) and a fragment header should always be included
1726 * after a node receiving Too Big message reporting PMTU is
1727 * less than the IPv6 Minimum Link MTU.
1728 */
1729 pmtu = IPV6_MIN_MTU;
1730 allfrag = 1;
1731 }
1732
1733 /* New mtu received -> path was valid.
1734 They are sent only in response to data packets,
1735 so that this nexthop apparently is reachable. --ANK
1736 */
1737 dst_confirm(&rt->dst);
1738
1739 /* Host route. If it is static, it would be better
1740 not to override it, but add new one, so that
1741 when cache entry will expire old pmtu
1742 would return automatically.
1743 */
1744 if (rt->rt6i_flags & RTF_CACHE) {
1745 dst_metric_set(&rt->dst, RTAX_MTU, pmtu);
1746 if (allfrag) {
1747 u32 features = dst_metric(&rt->dst, RTAX_FEATURES);
1748 features |= RTAX_FEATURE_ALLFRAG;
1749 dst_metric_set(&rt->dst, RTAX_FEATURES, features);
1750 }
1751 rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires);
1752 rt->rt6i_flags |= RTF_MODIFIED;
1753 goto out;
1754 }
1755
1756 /* Network route.
1757 Two cases are possible:
1758 1. It is connected route. Action: COW
1759 2. It is gatewayed route or NONEXTHOP route. Action: clone it.
1760 */
1761 if (!dst_get_neighbour_noref_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
1762 nrt = rt6_alloc_cow(rt, daddr, saddr);
1763 else
1764 nrt = rt6_alloc_clone(rt, daddr);
1765
1766 if (nrt) {
1767 dst_metric_set(&nrt->dst, RTAX_MTU, pmtu);
1768 if (allfrag) {
1769 u32 features = dst_metric(&nrt->dst, RTAX_FEATURES);
1770 features |= RTAX_FEATURE_ALLFRAG;
1771 dst_metric_set(&nrt->dst, RTAX_FEATURES, features);
1772 }
1773
1774 /* According to RFC 1981, detecting PMTU increase shouldn't be
1775 * happened within 5 mins, the recommended timer is 10 mins.
1776 * Here this route expiration time is set to ip6_rt_mtu_expires
1777 * which is 10 mins. After 10 mins the decreased pmtu is expired
1778 * and detecting PMTU increase will be automatically happened.
1779 */
1780 rt6_update_expires(nrt, net->ipv6.sysctl.ip6_rt_mtu_expires);
1781 nrt->rt6i_flags |= RTF_DYNAMIC;
1782 ip6_ins_rt(nrt);
1783 }
1784out:
1785 dst_release(&rt->dst);
1786}
1787
1788void rt6_pmtu_discovery(const struct in6_addr *daddr, const struct in6_addr *saddr,
1789 struct net_device *dev, u32 pmtu)
1790{
1791 struct net *net = dev_net(dev);
1792
1793 /*
1794 * RFC 1981 states that a node "MUST reduce the size of the packets it
1795 * is sending along the path" that caused the Packet Too Big message.
1796 * Since it's not possible in the general case to determine which
1797 * interface was used to send the original packet, we update the MTU
1798 * on the interface that will be used to send future packets. We also
1799 * update the MTU on the interface that received the Packet Too Big in
1800 * case the original packet was forced out that interface with
1801 * SO_BINDTODEVICE or similar. This is the next best thing to the
1802 * correct behaviour, which would be to update the MTU on all
1803 * interfaces.
1804 */
1805 rt6_do_pmtu_disc(daddr, saddr, net, pmtu, 0);
1806 rt6_do_pmtu_disc(daddr, saddr, net, pmtu, dev->ifindex);
1807}
1808
1809/*
1810 * Misc support functions
1811 */
1812
1813static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
1814 const struct in6_addr *dest)
1815{
1816 struct net *net = dev_net(ort->dst.dev);
1817 struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
1818 ort->dst.dev, 0);
1819
1820 if (rt) {
1821 rt->dst.input = ort->dst.input;
1822 rt->dst.output = ort->dst.output;
1823 rt->dst.flags |= DST_HOST;
1824
1825 rt->rt6i_dst.addr = *dest;
1826 rt->rt6i_dst.plen = 128;
1827 dst_copy_metrics(&rt->dst, &ort->dst);
1828 rt->dst.error = ort->dst.error;
1829 rt->rt6i_idev = ort->rt6i_idev;
1830 if (rt->rt6i_idev)
1831 in6_dev_hold(rt->rt6i_idev);
1832 rt->dst.lastuse = jiffies;
1833
1834 rt->rt6i_gateway = ort->rt6i_gateway;
1835 rt->rt6i_flags = ort->rt6i_flags;
1836 if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ==
1837 (RTF_DEFAULT | RTF_ADDRCONF))
1838 rt6_set_from(rt, ort);
1839 else
1840 rt6_clean_expires(rt);
1841 rt->rt6i_metric = 0;
1842
1843#ifdef CONFIG_IPV6_SUBTREES
1844 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
1845#endif
1846 memcpy(&rt->rt6i_prefsrc, &ort->rt6i_prefsrc, sizeof(struct rt6key));
1847 rt->rt6i_table = ort->rt6i_table;
1848 }
1849 return rt;
1850}
1851
1852#ifdef CONFIG_IPV6_ROUTE_INFO
1853static struct rt6_info *rt6_get_route_info(struct net *net,
1854 const struct in6_addr *prefix, int prefixlen,
1855 const struct in6_addr *gwaddr, int ifindex)
1856{
1857 struct fib6_node *fn;
1858 struct rt6_info *rt = NULL;
1859 struct fib6_table *table;
1860
1861 table = fib6_get_table(net, RT6_TABLE_INFO);
1862 if (!table)
1863 return NULL;
1864
1865 write_lock_bh(&table->tb6_lock);
1866 fn = fib6_locate(&table->tb6_root, prefix ,prefixlen, NULL, 0);
1867 if (!fn)
1868 goto out;
1869
1870 for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
1871 if (rt->dst.dev->ifindex != ifindex)
1872 continue;
1873 if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
1874 continue;
1875 if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr))
1876 continue;
1877 dst_hold(&rt->dst);
1878 break;
1879 }
1880out:
1881 write_unlock_bh(&table->tb6_lock);
1882 return rt;
1883}
1884
1885static struct rt6_info *rt6_add_route_info(struct net *net,
1886 const struct in6_addr *prefix, int prefixlen,
1887 const struct in6_addr *gwaddr, int ifindex,
1888 unsigned int pref)
1889{
1890 struct fib6_config cfg = {
1891 .fc_table = RT6_TABLE_INFO,
1892 .fc_metric = IP6_RT_PRIO_USER,
1893 .fc_ifindex = ifindex,
1894 .fc_dst_len = prefixlen,
1895 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
1896 RTF_UP | RTF_PREF(pref),
1897 .fc_nlinfo.pid = 0,
1898 .fc_nlinfo.nlh = NULL,
1899 .fc_nlinfo.nl_net = net,
1900 };
1901
1902 cfg.fc_dst = *prefix;
1903 cfg.fc_gateway = *gwaddr;
1904
1905 /* We should treat it as a default route if prefix length is 0. */
1906 if (!prefixlen)
1907 cfg.fc_flags |= RTF_DEFAULT;
1908
1909 ip6_route_add(&cfg);
1910
1911 return rt6_get_route_info(net, prefix, prefixlen, gwaddr, ifindex);
1912}
1913#endif
1914
1915struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
1916{
1917 struct rt6_info *rt;
1918 struct fib6_table *table;
1919
1920 table = fib6_get_table(dev_net(dev), RT6_TABLE_DFLT);
1921 if (!table)
1922 return NULL;
1923
1924 write_lock_bh(&table->tb6_lock);
1925 for (rt = table->tb6_root.leaf; rt; rt=rt->dst.rt6_next) {
1926 if (dev == rt->dst.dev &&
1927 ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
1928 ipv6_addr_equal(&rt->rt6i_gateway, addr))
1929 break;
1930 }
1931 if (rt)
1932 dst_hold(&rt->dst);
1933 write_unlock_bh(&table->tb6_lock);
1934 return rt;
1935}
1936
1937struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
1938 struct net_device *dev,
1939 unsigned int pref)
1940{
1941 struct fib6_config cfg = {
1942 .fc_table = RT6_TABLE_DFLT,
1943 .fc_metric = IP6_RT_PRIO_USER,
1944 .fc_ifindex = dev->ifindex,
1945 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
1946 RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
1947 .fc_nlinfo.pid = 0,
1948 .fc_nlinfo.nlh = NULL,
1949 .fc_nlinfo.nl_net = dev_net(dev),
1950 };
1951
1952 cfg.fc_gateway = *gwaddr;
1953
1954 ip6_route_add(&cfg);
1955
1956 return rt6_get_dflt_router(gwaddr, dev);
1957}
1958
1959void rt6_purge_dflt_routers(struct net *net)
1960{
1961 struct rt6_info *rt;
1962 struct fib6_table *table;
1963
1964 /* NOTE: Keep consistent with rt6_get_dflt_router */
1965 table = fib6_get_table(net, RT6_TABLE_DFLT);
1966 if (!table)
1967 return;
1968
1969restart:
1970 read_lock_bh(&table->tb6_lock);
1971 for (rt = table->tb6_root.leaf; rt; rt = rt->dst.rt6_next) {
1972 if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
1973 dst_hold(&rt->dst);
1974 read_unlock_bh(&table->tb6_lock);
1975 ip6_del_rt(rt);
1976 goto restart;
1977 }
1978 }
1979 read_unlock_bh(&table->tb6_lock);
1980}
1981
1982static void rtmsg_to_fib6_config(struct net *net,
1983 struct in6_rtmsg *rtmsg,
1984 struct fib6_config *cfg)
1985{
1986 memset(cfg, 0, sizeof(*cfg));
1987
1988 cfg->fc_table = RT6_TABLE_MAIN;
1989 cfg->fc_ifindex = rtmsg->rtmsg_ifindex;
1990 cfg->fc_metric = rtmsg->rtmsg_metric;
1991 cfg->fc_expires = rtmsg->rtmsg_info;
1992 cfg->fc_dst_len = rtmsg->rtmsg_dst_len;
1993 cfg->fc_src_len = rtmsg->rtmsg_src_len;
1994 cfg->fc_flags = rtmsg->rtmsg_flags;
1995
1996 cfg->fc_nlinfo.nl_net = net;
1997
1998 cfg->fc_dst = rtmsg->rtmsg_dst;
1999 cfg->fc_src = rtmsg->rtmsg_src;
2000 cfg->fc_gateway = rtmsg->rtmsg_gateway;
2001}
2002
2003int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg)
2004{
2005 struct fib6_config cfg;
2006 struct in6_rtmsg rtmsg;
2007 int err;
2008
2009 switch(cmd) {
2010 case SIOCADDRT: /* Add a route */
2011 case SIOCDELRT: /* Delete a route */
2012 if (!capable(CAP_NET_ADMIN))
2013 return -EPERM;
2014 err = copy_from_user(&rtmsg, arg,
2015 sizeof(struct in6_rtmsg));
2016 if (err)
2017 return -EFAULT;
2018
2019 rtmsg_to_fib6_config(net, &rtmsg, &cfg);
2020
2021 rtnl_lock();
2022 switch (cmd) {
2023 case SIOCADDRT:
2024 err = ip6_route_add(&cfg);
2025 break;
2026 case SIOCDELRT:
2027 err = ip6_route_del(&cfg);
2028 break;
2029 default:
2030 err = -EINVAL;
2031 }
2032 rtnl_unlock();
2033
2034 return err;
2035 }
2036
2037 return -EINVAL;
2038}
2039
2040/*
2041 * Drop the packet on the floor
2042 */
2043
2044static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
2045{
2046 int type;
2047 struct dst_entry *dst = skb_dst(skb);
2048 switch (ipstats_mib_noroutes) {
2049 case IPSTATS_MIB_INNOROUTES:
2050 type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
2051 if (type == IPV6_ADDR_ANY) {
2052 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2053 IPSTATS_MIB_INADDRERRORS);
2054 break;
2055 }
2056 /* FALLTHROUGH */
2057 case IPSTATS_MIB_OUTNOROUTES:
2058 IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
2059 ipstats_mib_noroutes);
2060 break;
2061 }
2062 icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
2063 kfree_skb(skb);
2064 return 0;
2065}
2066
2067static int ip6_pkt_discard(struct sk_buff *skb)
2068{
2069 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
2070}
2071
2072static int ip6_pkt_discard_out(struct sk_buff *skb)
2073{
2074 skb->dev = skb_dst(skb)->dev;
2075 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
2076}
2077
2078#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2079
2080static int ip6_pkt_prohibit(struct sk_buff *skb)
2081{
2082 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
2083}
2084
2085static int ip6_pkt_prohibit_out(struct sk_buff *skb)
2086{
2087 skb->dev = skb_dst(skb)->dev;
2088 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
2089}
2090
2091#endif
2092
2093/*
2094 * Allocate a dst for local (unicast / anycast) address.
2095 */
2096
2097struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
2098 const struct in6_addr *addr,
2099 bool anycast)
2100{
2101 struct net *net = dev_net(idev->dev);
2102 struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops,
2103 net->loopback_dev, 0);
2104 int err;
2105
2106 if (!rt) {
2107 net_warn_ratelimited("Maximum number of routes reached, consider increasing route/max_size\n");
2108 return ERR_PTR(-ENOMEM);
2109 }
2110
2111 in6_dev_hold(idev);
2112
2113 rt->dst.flags |= DST_HOST;
2114 rt->dst.input = ip6_input;
2115 rt->dst.output = ip6_output;
2116 rt->rt6i_idev = idev;
2117 rt->dst.obsolete = -1;
2118
2119 rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
2120 if (anycast)
2121 rt->rt6i_flags |= RTF_ANYCAST;
2122 else
2123 rt->rt6i_flags |= RTF_LOCAL;
2124 err = rt6_bind_neighbour(rt, rt->dst.dev);
2125 if (err) {
2126 dst_free(&rt->dst);
2127 return ERR_PTR(err);
2128 }
2129
2130 rt->rt6i_dst.addr = *addr;
2131 rt->rt6i_dst.plen = 128;
2132 rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL);
2133
2134 atomic_set(&rt->dst.__refcnt, 1);
2135
2136 return rt;
2137}
2138
2139int ip6_route_get_saddr(struct net *net,
2140 struct rt6_info *rt,
2141 const struct in6_addr *daddr,
2142 unsigned int prefs,
2143 struct in6_addr *saddr)
2144{
2145 struct inet6_dev *idev = ip6_dst_idev((struct dst_entry*)rt);
2146 int err = 0;
2147 if (rt->rt6i_prefsrc.plen)
2148 *saddr = rt->rt6i_prefsrc.addr;
2149 else
2150 err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL,
2151 daddr, prefs, saddr);
2152 return err;
2153}
2154
2155/* remove deleted ip from prefsrc entries */
2156struct arg_dev_net_ip {
2157 struct net_device *dev;
2158 struct net *net;
2159 struct in6_addr *addr;
2160};
2161
2162static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg)
2163{
2164 struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
2165 struct net *net = ((struct arg_dev_net_ip *)arg)->net;
2166 struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
2167
2168 if (((void *)rt->dst.dev == dev || !dev) &&
2169 rt != net->ipv6.ip6_null_entry &&
2170 ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
2171 /* remove prefsrc entry */
2172 rt->rt6i_prefsrc.plen = 0;
2173 }
2174 return 0;
2175}
2176
2177void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
2178{
2179 struct net *net = dev_net(ifp->idev->dev);
2180 struct arg_dev_net_ip adni = {
2181 .dev = ifp->idev->dev,
2182 .net = net,
2183 .addr = &ifp->addr,
2184 };
2185 fib6_clean_all(net, fib6_remove_prefsrc, 0, &adni);
2186}
2187
2188struct arg_dev_net {
2189 struct net_device *dev;
2190 struct net *net;
2191};
2192
2193static int fib6_ifdown(struct rt6_info *rt, void *arg)
2194{
2195 const struct arg_dev_net *adn = arg;
2196 const struct net_device *dev = adn->dev;
2197
2198 if ((rt->dst.dev == dev || !dev) &&
2199 rt != adn->net->ipv6.ip6_null_entry)
2200 return -1;
2201
2202 return 0;
2203}
2204
2205void rt6_ifdown(struct net *net, struct net_device *dev)
2206{
2207 struct arg_dev_net adn = {
2208 .dev = dev,
2209 .net = net,
2210 };
2211
2212 fib6_clean_all(net, fib6_ifdown, 0, &adn);
2213 icmp6_clean_all(fib6_ifdown, &adn);
2214}
2215
2216struct rt6_mtu_change_arg {
2217 struct net_device *dev;
2218 unsigned int mtu;
2219};
2220
2221static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
2222{
2223 struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
2224 struct inet6_dev *idev;
2225
2226 /* In IPv6 pmtu discovery is not optional,
2227 so that RTAX_MTU lock cannot disable it.
2228 We still use this lock to block changes
2229 caused by addrconf/ndisc.
2230 */
2231
2232 idev = __in6_dev_get(arg->dev);
2233 if (!idev)
2234 return 0;
2235
2236 /* For administrative MTU increase, there is no way to discover
2237 IPv6 PMTU increase, so PMTU increase should be updated here.
2238 Since RFC 1981 doesn't include administrative MTU increase
2239 update PMTU increase is a MUST. (i.e. jumbo frame)
2240 */
2241 /*
2242 If new MTU is less than route PMTU, this new MTU will be the
2243 lowest MTU in the path, update the route PMTU to reflect PMTU
2244 decreases; if new MTU is greater than route PMTU, and the
2245 old MTU is the lowest MTU in the path, update the route PMTU
2246 to reflect the increase. In this case if the other nodes' MTU
2247 also have the lowest MTU, TOO BIG MESSAGE will be lead to
2248 PMTU discouvery.
2249 */
2250 if (rt->dst.dev == arg->dev &&
2251 !dst_metric_locked(&rt->dst, RTAX_MTU) &&
2252 (dst_mtu(&rt->dst) >= arg->mtu ||
2253 (dst_mtu(&rt->dst) < arg->mtu &&
2254 dst_mtu(&rt->dst) == idev->cnf.mtu6))) {
2255 dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu);
2256 }
2257 return 0;
2258}
2259
2260void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
2261{
2262 struct rt6_mtu_change_arg arg = {
2263 .dev = dev,
2264 .mtu = mtu,
2265 };
2266
2267 fib6_clean_all(dev_net(dev), rt6_mtu_change_route, 0, &arg);
2268}
2269
2270static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
2271 [RTA_GATEWAY] = { .len = sizeof(struct in6_addr) },
2272 [RTA_OIF] = { .type = NLA_U32 },
2273 [RTA_IIF] = { .type = NLA_U32 },
2274 [RTA_PRIORITY] = { .type = NLA_U32 },
2275 [RTA_METRICS] = { .type = NLA_NESTED },
2276};
2277
2278static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
2279 struct fib6_config *cfg)
2280{
2281 struct rtmsg *rtm;
2282 struct nlattr *tb[RTA_MAX+1];
2283 int err;
2284
2285 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2286 if (err < 0)
2287 goto errout;
2288
2289 err = -EINVAL;
2290 rtm = nlmsg_data(nlh);
2291 memset(cfg, 0, sizeof(*cfg));
2292
2293 cfg->fc_table = rtm->rtm_table;
2294 cfg->fc_dst_len = rtm->rtm_dst_len;
2295 cfg->fc_src_len = rtm->rtm_src_len;
2296 cfg->fc_flags = RTF_UP;
2297 cfg->fc_protocol = rtm->rtm_protocol;
2298
2299 if (rtm->rtm_type == RTN_UNREACHABLE)
2300 cfg->fc_flags |= RTF_REJECT;
2301
2302 if (rtm->rtm_type == RTN_LOCAL)
2303 cfg->fc_flags |= RTF_LOCAL;
2304
2305 cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
2306 cfg->fc_nlinfo.nlh = nlh;
2307 cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
2308
2309 if (tb[RTA_GATEWAY]) {
2310 nla_memcpy(&cfg->fc_gateway, tb[RTA_GATEWAY], 16);
2311 cfg->fc_flags |= RTF_GATEWAY;
2312 }
2313
2314 if (tb[RTA_DST]) {
2315 int plen = (rtm->rtm_dst_len + 7) >> 3;
2316
2317 if (nla_len(tb[RTA_DST]) < plen)
2318 goto errout;
2319
2320 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
2321 }
2322
2323 if (tb[RTA_SRC]) {
2324 int plen = (rtm->rtm_src_len + 7) >> 3;
2325
2326 if (nla_len(tb[RTA_SRC]) < plen)
2327 goto errout;
2328
2329 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
2330 }
2331
2332 if (tb[RTA_PREFSRC])
2333 nla_memcpy(&cfg->fc_prefsrc, tb[RTA_PREFSRC], 16);
2334
2335 if (tb[RTA_OIF])
2336 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
2337
2338 if (tb[RTA_PRIORITY])
2339 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
2340
2341 if (tb[RTA_METRICS]) {
2342 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
2343 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
2344 }
2345
2346 if (tb[RTA_TABLE])
2347 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
2348
2349 err = 0;
2350errout:
2351 return err;
2352}
2353
2354static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
2355{
2356 struct fib6_config cfg;
2357 int err;
2358
2359 err = rtm_to_fib6_config(skb, nlh, &cfg);
2360 if (err < 0)
2361 return err;
2362
2363 return ip6_route_del(&cfg);
2364}
2365
2366static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
2367{
2368 struct fib6_config cfg;
2369 int err;
2370
2371 err = rtm_to_fib6_config(skb, nlh, &cfg);
2372 if (err < 0)
2373 return err;
2374
2375 return ip6_route_add(&cfg);
2376}
2377
2378static inline size_t rt6_nlmsg_size(void)
2379{
2380 return NLMSG_ALIGN(sizeof(struct rtmsg))
2381 + nla_total_size(16) /* RTA_SRC */
2382 + nla_total_size(16) /* RTA_DST */
2383 + nla_total_size(16) /* RTA_GATEWAY */
2384 + nla_total_size(16) /* RTA_PREFSRC */
2385 + nla_total_size(4) /* RTA_TABLE */
2386 + nla_total_size(4) /* RTA_IIF */
2387 + nla_total_size(4) /* RTA_OIF */
2388 + nla_total_size(4) /* RTA_PRIORITY */
2389 + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
2390 + nla_total_size(sizeof(struct rta_cacheinfo));
2391}
2392
2393static int rt6_fill_node(struct net *net,
2394 struct sk_buff *skb, struct rt6_info *rt,
2395 struct in6_addr *dst, struct in6_addr *src,
2396 int iif, int type, u32 pid, u32 seq,
2397 int prefix, int nowait, unsigned int flags)
2398{
2399 const struct inet_peer *peer;
2400 struct rtmsg *rtm;
2401 struct nlmsghdr *nlh;
2402 long expires;
2403 u32 table;
2404 struct neighbour *n;
2405 u32 ts, tsage;
2406
2407 if (prefix) { /* user wants prefix routes only */
2408 if (!(rt->rt6i_flags & RTF_PREFIX_RT)) {
2409 /* success since this is not a prefix route */
2410 return 1;
2411 }
2412 }
2413
2414 nlh = nlmsg_put(skb, pid, seq, type, sizeof(*rtm), flags);
2415 if (!nlh)
2416 return -EMSGSIZE;
2417
2418 rtm = nlmsg_data(nlh);
2419 rtm->rtm_family = AF_INET6;
2420 rtm->rtm_dst_len = rt->rt6i_dst.plen;
2421 rtm->rtm_src_len = rt->rt6i_src.plen;
2422 rtm->rtm_tos = 0;
2423 if (rt->rt6i_table)
2424 table = rt->rt6i_table->tb6_id;
2425 else
2426 table = RT6_TABLE_UNSPEC;
2427 rtm->rtm_table = table;
2428 if (nla_put_u32(skb, RTA_TABLE, table))
2429 goto nla_put_failure;
2430 if (rt->rt6i_flags & RTF_REJECT)
2431 rtm->rtm_type = RTN_UNREACHABLE;
2432 else if (rt->rt6i_flags & RTF_LOCAL)
2433 rtm->rtm_type = RTN_LOCAL;
2434 else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK))
2435 rtm->rtm_type = RTN_LOCAL;
2436 else
2437 rtm->rtm_type = RTN_UNICAST;
2438 rtm->rtm_flags = 0;
2439 rtm->rtm_scope = RT_SCOPE_UNIVERSE;
2440 rtm->rtm_protocol = rt->rt6i_protocol;
2441 if (rt->rt6i_flags & RTF_DYNAMIC)
2442 rtm->rtm_protocol = RTPROT_REDIRECT;
2443 else if (rt->rt6i_flags & RTF_ADDRCONF)
2444 rtm->rtm_protocol = RTPROT_KERNEL;
2445 else if (rt->rt6i_flags & RTF_DEFAULT)
2446 rtm->rtm_protocol = RTPROT_RA;
2447
2448 if (rt->rt6i_flags & RTF_CACHE)
2449 rtm->rtm_flags |= RTM_F_CLONED;
2450
2451 if (dst) {
2452 if (nla_put(skb, RTA_DST, 16, dst))
2453 goto nla_put_failure;
2454 rtm->rtm_dst_len = 128;
2455 } else if (rtm->rtm_dst_len)
2456 if (nla_put(skb, RTA_DST, 16, &rt->rt6i_dst.addr))
2457 goto nla_put_failure;
2458#ifdef CONFIG_IPV6_SUBTREES
2459 if (src) {
2460 if (nla_put(skb, RTA_SRC, 16, src))
2461 goto nla_put_failure;
2462 rtm->rtm_src_len = 128;
2463 } else if (rtm->rtm_src_len &&
2464 nla_put(skb, RTA_SRC, 16, &rt->rt6i_src.addr))
2465 goto nla_put_failure;
2466#endif
2467 if (iif) {
2468#ifdef CONFIG_IPV6_MROUTE
2469 if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) {
2470 int err = ip6mr_get_route(net, skb, rtm, nowait);
2471 if (err <= 0) {
2472 if (!nowait) {
2473 if (err == 0)
2474 return 0;
2475 goto nla_put_failure;
2476 } else {
2477 if (err == -EMSGSIZE)
2478 goto nla_put_failure;
2479 }
2480 }
2481 } else
2482#endif
2483 if (nla_put_u32(skb, RTA_IIF, iif))
2484 goto nla_put_failure;
2485 } else if (dst) {
2486 struct in6_addr saddr_buf;
2487 if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 &&
2488 nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2489 goto nla_put_failure;
2490 }
2491
2492 if (rt->rt6i_prefsrc.plen) {
2493 struct in6_addr saddr_buf;
2494 saddr_buf = rt->rt6i_prefsrc.addr;
2495 if (nla_put(skb, RTA_PREFSRC, 16, &saddr_buf))
2496 goto nla_put_failure;
2497 }
2498
2499 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
2500 goto nla_put_failure;
2501
2502 rcu_read_lock();
2503 n = dst_get_neighbour_noref(&rt->dst);
2504 if (n) {
2505 if (nla_put(skb, RTA_GATEWAY, 16, &n->primary_key) < 0) {
2506 rcu_read_unlock();
2507 goto nla_put_failure;
2508 }
2509 }
2510 rcu_read_unlock();
2511
2512 if (rt->dst.dev &&
2513 nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex))
2514 goto nla_put_failure;
2515 if (nla_put_u32(skb, RTA_PRIORITY, rt->rt6i_metric))
2516 goto nla_put_failure;
2517 if (!(rt->rt6i_flags & RTF_EXPIRES))
2518 expires = 0;
2519 else if (rt->dst.expires - jiffies < INT_MAX)
2520 expires = rt->dst.expires - jiffies;
2521 else
2522 expires = INT_MAX;
2523
2524 peer = rt->rt6i_peer;
2525 ts = tsage = 0;
2526 if (peer && peer->tcp_ts_stamp) {
2527 ts = peer->tcp_ts;
2528 tsage = get_seconds() - peer->tcp_ts_stamp;
2529 }
2530
2531 if (rtnl_put_cacheinfo(skb, &rt->dst, 0, ts, tsage,
2532 expires, rt->dst.error) < 0)
2533 goto nla_put_failure;
2534
2535 return nlmsg_end(skb, nlh);
2536
2537nla_put_failure:
2538 nlmsg_cancel(skb, nlh);
2539 return -EMSGSIZE;
2540}
2541
2542int rt6_dump_route(struct rt6_info *rt, void *p_arg)
2543{
2544 struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
2545 int prefix;
2546
2547 if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) {
2548 struct rtmsg *rtm = nlmsg_data(arg->cb->nlh);
2549 prefix = (rtm->rtm_flags & RTM_F_PREFIX) != 0;
2550 } else
2551 prefix = 0;
2552
2553 return rt6_fill_node(arg->net,
2554 arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
2555 NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq,
2556 prefix, 0, NLM_F_MULTI);
2557}
2558
2559static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg)
2560{
2561 struct net *net = sock_net(in_skb->sk);
2562 struct nlattr *tb[RTA_MAX+1];
2563 struct rt6_info *rt;
2564 struct sk_buff *skb;
2565 struct rtmsg *rtm;
2566 struct flowi6 fl6;
2567 int err, iif = 0, oif = 0;
2568
2569 err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy);
2570 if (err < 0)
2571 goto errout;
2572
2573 err = -EINVAL;
2574 memset(&fl6, 0, sizeof(fl6));
2575
2576 if (tb[RTA_SRC]) {
2577 if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
2578 goto errout;
2579
2580 fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
2581 }
2582
2583 if (tb[RTA_DST]) {
2584 if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
2585 goto errout;
2586
2587 fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
2588 }
2589
2590 if (tb[RTA_IIF])
2591 iif = nla_get_u32(tb[RTA_IIF]);
2592
2593 if (tb[RTA_OIF])
2594 oif = nla_get_u32(tb[RTA_OIF]);
2595
2596 if (iif) {
2597 struct net_device *dev;
2598 int flags = 0;
2599
2600 dev = __dev_get_by_index(net, iif);
2601 if (!dev) {
2602 err = -ENODEV;
2603 goto errout;
2604 }
2605
2606 fl6.flowi6_iif = iif;
2607
2608 if (!ipv6_addr_any(&fl6.saddr))
2609 flags |= RT6_LOOKUP_F_HAS_SADDR;
2610
2611 rt = (struct rt6_info *)ip6_route_input_lookup(net, dev, &fl6,
2612 flags);
2613 } else {
2614 fl6.flowi6_oif = oif;
2615
2616 rt = (struct rt6_info *)ip6_route_output(net, NULL, &fl6);
2617 }
2618
2619 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
2620 if (!skb) {
2621 dst_release(&rt->dst);
2622 err = -ENOBUFS;
2623 goto errout;
2624 }
2625
2626 /* Reserve room for dummy headers, this skb can pass
2627 through good chunk of routing engine.
2628 */
2629 skb_reset_mac_header(skb);
2630 skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr));
2631
2632 skb_dst_set(skb, &rt->dst);
2633
2634 err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif,
2635 RTM_NEWROUTE, NETLINK_CB(in_skb).pid,
2636 nlh->nlmsg_seq, 0, 0, 0);
2637 if (err < 0) {
2638 kfree_skb(skb);
2639 goto errout;
2640 }
2641
2642 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).pid);
2643errout:
2644 return err;
2645}
2646
2647void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info)
2648{
2649 struct sk_buff *skb;
2650 struct net *net = info->nl_net;
2651 u32 seq;
2652 int err;
2653
2654 err = -ENOBUFS;
2655 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
2656
2657 skb = nlmsg_new(rt6_nlmsg_size(), gfp_any());
2658 if (!skb)
2659 goto errout;
2660
2661 err = rt6_fill_node(net, skb, rt, NULL, NULL, 0,
2662 event, info->pid, seq, 0, 0, 0);
2663 if (err < 0) {
2664 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
2665 WARN_ON(err == -EMSGSIZE);
2666 kfree_skb(skb);
2667 goto errout;
2668 }
2669 rtnl_notify(skb, net, info->pid, RTNLGRP_IPV6_ROUTE,
2670 info->nlh, gfp_any());
2671 return;
2672errout:
2673 if (err < 0)
2674 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
2675}
2676
2677static int ip6_route_dev_notify(struct notifier_block *this,
2678 unsigned long event, void *data)
2679{
2680 struct net_device *dev = (struct net_device *)data;
2681 struct net *net = dev_net(dev);
2682
2683 if (event == NETDEV_REGISTER && (dev->flags & IFF_LOOPBACK)) {
2684 net->ipv6.ip6_null_entry->dst.dev = dev;
2685 net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
2686#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2687 net->ipv6.ip6_prohibit_entry->dst.dev = dev;
2688 net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
2689 net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
2690 net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
2691#endif
2692 }
2693
2694 return NOTIFY_OK;
2695}
2696
2697/*
2698 * /proc
2699 */
2700
2701#ifdef CONFIG_PROC_FS
2702
2703struct rt6_proc_arg
2704{
2705 char *buffer;
2706 int offset;
2707 int length;
2708 int skip;
2709 int len;
2710};
2711
2712static int rt6_info_route(struct rt6_info *rt, void *p_arg)
2713{
2714 struct seq_file *m = p_arg;
2715 struct neighbour *n;
2716
2717 seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen);
2718
2719#ifdef CONFIG_IPV6_SUBTREES
2720 seq_printf(m, "%pi6 %02x ", &rt->rt6i_src.addr, rt->rt6i_src.plen);
2721#else
2722 seq_puts(m, "00000000000000000000000000000000 00 ");
2723#endif
2724 rcu_read_lock();
2725 n = dst_get_neighbour_noref(&rt->dst);
2726 if (n) {
2727 seq_printf(m, "%pi6", n->primary_key);
2728 } else {
2729 seq_puts(m, "00000000000000000000000000000000");
2730 }
2731 rcu_read_unlock();
2732 seq_printf(m, " %08x %08x %08x %08x %8s\n",
2733 rt->rt6i_metric, atomic_read(&rt->dst.__refcnt),
2734 rt->dst.__use, rt->rt6i_flags,
2735 rt->dst.dev ? rt->dst.dev->name : "");
2736 return 0;
2737}
2738
2739static int ipv6_route_show(struct seq_file *m, void *v)
2740{
2741 struct net *net = (struct net *)m->private;
2742 fib6_clean_all_ro(net, rt6_info_route, 0, m);
2743 return 0;
2744}
2745
2746static int ipv6_route_open(struct inode *inode, struct file *file)
2747{
2748 return single_open_net(inode, file, ipv6_route_show);
2749}
2750
2751static const struct file_operations ipv6_route_proc_fops = {
2752 .owner = THIS_MODULE,
2753 .open = ipv6_route_open,
2754 .read = seq_read,
2755 .llseek = seq_lseek,
2756 .release = single_release_net,
2757};
2758
2759static int rt6_stats_seq_show(struct seq_file *seq, void *v)
2760{
2761 struct net *net = (struct net *)seq->private;
2762 seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
2763 net->ipv6.rt6_stats->fib_nodes,
2764 net->ipv6.rt6_stats->fib_route_nodes,
2765 net->ipv6.rt6_stats->fib_rt_alloc,
2766 net->ipv6.rt6_stats->fib_rt_entries,
2767 net->ipv6.rt6_stats->fib_rt_cache,
2768 dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
2769 net->ipv6.rt6_stats->fib_discarded_routes);
2770
2771 return 0;
2772}
2773
2774static int rt6_stats_seq_open(struct inode *inode, struct file *file)
2775{
2776 return single_open_net(inode, file, rt6_stats_seq_show);
2777}
2778
2779static const struct file_operations rt6_stats_seq_fops = {
2780 .owner = THIS_MODULE,
2781 .open = rt6_stats_seq_open,
2782 .read = seq_read,
2783 .llseek = seq_lseek,
2784 .release = single_release_net,
2785};
2786#endif /* CONFIG_PROC_FS */
2787
2788#ifdef CONFIG_SYSCTL
2789
2790static
2791int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write,
2792 void __user *buffer, size_t *lenp, loff_t *ppos)
2793{
2794 struct net *net;
2795 int delay;
2796 if (!write)
2797 return -EINVAL;
2798
2799 net = (struct net *)ctl->extra1;
2800 delay = net->ipv6.sysctl.flush_delay;
2801 proc_dointvec(ctl, write, buffer, lenp, ppos);
2802 fib6_run_gc(delay <= 0 ? ~0UL : (unsigned long)delay, net);
2803 return 0;
2804}
2805
2806ctl_table ipv6_route_table_template[] = {
2807 {
2808 .procname = "flush",
2809 .data = &init_net.ipv6.sysctl.flush_delay,
2810 .maxlen = sizeof(int),
2811 .mode = 0200,
2812 .proc_handler = ipv6_sysctl_rtcache_flush
2813 },
2814 {
2815 .procname = "gc_thresh",
2816 .data = &ip6_dst_ops_template.gc_thresh,
2817 .maxlen = sizeof(int),
2818 .mode = 0644,
2819 .proc_handler = proc_dointvec,
2820 },
2821 {
2822 .procname = "max_size",
2823 .data = &init_net.ipv6.sysctl.ip6_rt_max_size,
2824 .maxlen = sizeof(int),
2825 .mode = 0644,
2826 .proc_handler = proc_dointvec,
2827 },
2828 {
2829 .procname = "gc_min_interval",
2830 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
2831 .maxlen = sizeof(int),
2832 .mode = 0644,
2833 .proc_handler = proc_dointvec_jiffies,
2834 },
2835 {
2836 .procname = "gc_timeout",
2837 .data = &init_net.ipv6.sysctl.ip6_rt_gc_timeout,
2838 .maxlen = sizeof(int),
2839 .mode = 0644,
2840 .proc_handler = proc_dointvec_jiffies,
2841 },
2842 {
2843 .procname = "gc_interval",
2844 .data = &init_net.ipv6.sysctl.ip6_rt_gc_interval,
2845 .maxlen = sizeof(int),
2846 .mode = 0644,
2847 .proc_handler = proc_dointvec_jiffies,
2848 },
2849 {
2850 .procname = "gc_elasticity",
2851 .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
2852 .maxlen = sizeof(int),
2853 .mode = 0644,
2854 .proc_handler = proc_dointvec,
2855 },
2856 {
2857 .procname = "mtu_expires",
2858 .data = &init_net.ipv6.sysctl.ip6_rt_mtu_expires,
2859 .maxlen = sizeof(int),
2860 .mode = 0644,
2861 .proc_handler = proc_dointvec_jiffies,
2862 },
2863 {
2864 .procname = "min_adv_mss",
2865 .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss,
2866 .maxlen = sizeof(int),
2867 .mode = 0644,
2868 .proc_handler = proc_dointvec,
2869 },
2870 {
2871 .procname = "gc_min_interval_ms",
2872 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
2873 .maxlen = sizeof(int),
2874 .mode = 0644,
2875 .proc_handler = proc_dointvec_ms_jiffies,
2876 },
2877 { }
2878};
2879
2880struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
2881{
2882 struct ctl_table *table;
2883
2884 table = kmemdup(ipv6_route_table_template,
2885 sizeof(ipv6_route_table_template),
2886 GFP_KERNEL);
2887
2888 if (table) {
2889 table[0].data = &net->ipv6.sysctl.flush_delay;
2890 table[0].extra1 = net;
2891 table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
2892 table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;
2893 table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
2894 table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
2895 table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
2896 table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
2897 table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
2898 table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
2899 table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
2900 }
2901
2902 return table;
2903}
2904#endif
2905
2906static int __net_init ip6_route_net_init(struct net *net)
2907{
2908 int ret = -ENOMEM;
2909
2910 memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
2911 sizeof(net->ipv6.ip6_dst_ops));
2912
2913 if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
2914 goto out_ip6_dst_ops;
2915
2916 net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
2917 sizeof(*net->ipv6.ip6_null_entry),
2918 GFP_KERNEL);
2919 if (!net->ipv6.ip6_null_entry)
2920 goto out_ip6_dst_entries;
2921 net->ipv6.ip6_null_entry->dst.path =
2922 (struct dst_entry *)net->ipv6.ip6_null_entry;
2923 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
2924 dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
2925 ip6_template_metrics, true);
2926
2927#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2928 net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
2929 sizeof(*net->ipv6.ip6_prohibit_entry),
2930 GFP_KERNEL);
2931 if (!net->ipv6.ip6_prohibit_entry)
2932 goto out_ip6_null_entry;
2933 net->ipv6.ip6_prohibit_entry->dst.path =
2934 (struct dst_entry *)net->ipv6.ip6_prohibit_entry;
2935 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
2936 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
2937 ip6_template_metrics, true);
2938
2939 net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
2940 sizeof(*net->ipv6.ip6_blk_hole_entry),
2941 GFP_KERNEL);
2942 if (!net->ipv6.ip6_blk_hole_entry)
2943 goto out_ip6_prohibit_entry;
2944 net->ipv6.ip6_blk_hole_entry->dst.path =
2945 (struct dst_entry *)net->ipv6.ip6_blk_hole_entry;
2946 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
2947 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
2948 ip6_template_metrics, true);
2949#endif
2950
2951 net->ipv6.sysctl.flush_delay = 0;
2952 net->ipv6.sysctl.ip6_rt_max_size = 4096;
2953 net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
2954 net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
2955 net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
2956 net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
2957 net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
2958 net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
2959
2960 net->ipv6.ip6_rt_gc_expire = 30*HZ;
2961
2962 ret = 0;
2963out:
2964 return ret;
2965
2966#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2967out_ip6_prohibit_entry:
2968 kfree(net->ipv6.ip6_prohibit_entry);
2969out_ip6_null_entry:
2970 kfree(net->ipv6.ip6_null_entry);
2971#endif
2972out_ip6_dst_entries:
2973 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
2974out_ip6_dst_ops:
2975 goto out;
2976}
2977
2978static void __net_exit ip6_route_net_exit(struct net *net)
2979{
2980 kfree(net->ipv6.ip6_null_entry);
2981#ifdef CONFIG_IPV6_MULTIPLE_TABLES
2982 kfree(net->ipv6.ip6_prohibit_entry);
2983 kfree(net->ipv6.ip6_blk_hole_entry);
2984#endif
2985 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
2986}
2987
2988static int __net_init ip6_route_net_init_late(struct net *net)
2989{
2990#ifdef CONFIG_PROC_FS
2991 proc_net_fops_create(net, "ipv6_route", 0, &ipv6_route_proc_fops);
2992 proc_net_fops_create(net, "rt6_stats", S_IRUGO, &rt6_stats_seq_fops);
2993#endif
2994 return 0;
2995}
2996
2997static void __net_exit ip6_route_net_exit_late(struct net *net)
2998{
2999#ifdef CONFIG_PROC_FS
3000 proc_net_remove(net, "ipv6_route");
3001 proc_net_remove(net, "rt6_stats");
3002#endif
3003}
3004
3005static struct pernet_operations ip6_route_net_ops = {
3006 .init = ip6_route_net_init,
3007 .exit = ip6_route_net_exit,
3008};
3009
3010static struct pernet_operations ip6_route_net_late_ops = {
3011 .init = ip6_route_net_init_late,
3012 .exit = ip6_route_net_exit_late,
3013};
3014
3015static struct notifier_block ip6_route_dev_notifier = {
3016 .notifier_call = ip6_route_dev_notify,
3017 .priority = 0,
3018};
3019
3020int __init ip6_route_init(void)
3021{
3022 int ret;
3023
3024 ret = -ENOMEM;
3025 ip6_dst_ops_template.kmem_cachep =
3026 kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
3027 SLAB_HWCACHE_ALIGN, NULL);
3028 if (!ip6_dst_ops_template.kmem_cachep)
3029 goto out;
3030
3031 ret = dst_entries_init(&ip6_dst_blackhole_ops);
3032 if (ret)
3033 goto out_kmem_cache;
3034
3035 ret = register_pernet_subsys(&ip6_route_net_ops);
3036 if (ret)
3037 goto out_dst_entries;
3038
3039 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
3040
3041 /* Registering of the loopback is done before this portion of code,
3042 * the loopback reference in rt6_info will not be taken, do it
3043 * manually for init_net */
3044 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
3045 init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3046 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
3047 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
3048 init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3049 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
3050 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
3051 #endif
3052 ret = fib6_init();
3053 if (ret)
3054 goto out_register_subsys;
3055
3056 ret = xfrm6_init();
3057 if (ret)
3058 goto out_fib6_init;
3059
3060 ret = fib6_rules_init();
3061 if (ret)
3062 goto xfrm6_init;
3063
3064 ret = register_pernet_subsys(&ip6_route_net_late_ops);
3065 if (ret)
3066 goto fib6_rules_init;
3067
3068 ret = -ENOBUFS;
3069 if (__rtnl_register(PF_INET6, RTM_NEWROUTE, inet6_rtm_newroute, NULL, NULL) ||
3070 __rtnl_register(PF_INET6, RTM_DELROUTE, inet6_rtm_delroute, NULL, NULL) ||
3071 __rtnl_register(PF_INET6, RTM_GETROUTE, inet6_rtm_getroute, NULL, NULL))
3072 goto out_register_late_subsys;
3073
3074 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
3075 if (ret)
3076 goto out_register_late_subsys;
3077
3078out:
3079 return ret;
3080
3081out_register_late_subsys:
3082 unregister_pernet_subsys(&ip6_route_net_late_ops);
3083fib6_rules_init:
3084 fib6_rules_cleanup();
3085xfrm6_init:
3086 xfrm6_fini();
3087out_fib6_init:
3088 fib6_gc_cleanup();
3089out_register_subsys:
3090 unregister_pernet_subsys(&ip6_route_net_ops);
3091out_dst_entries:
3092 dst_entries_destroy(&ip6_dst_blackhole_ops);
3093out_kmem_cache:
3094 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
3095 goto out;
3096}
3097
3098void ip6_route_cleanup(void)
3099{
3100 unregister_netdevice_notifier(&ip6_route_dev_notifier);
3101 unregister_pernet_subsys(&ip6_route_net_late_ops);
3102 fib6_rules_cleanup();
3103 xfrm6_fini();
3104 fib6_gc_cleanup();
3105 unregister_pernet_subsys(&ip6_route_net_ops);
3106 dst_entries_destroy(&ip6_dst_blackhole_ops);
3107 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
3108}
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Linux INET6 implementation
4 * FIB front-end.
5 *
6 * Authors:
7 * Pedro Roque <roque@di.fc.ul.pt>
8 */
9
10/* Changes:
11 *
12 * YOSHIFUJI Hideaki @USAGI
13 * reworked default router selection.
14 * - respect outgoing interface
15 * - select from (probably) reachable routers (i.e.
16 * routers in REACHABLE, STALE, DELAY or PROBE states).
17 * - always select the same router if it is (probably)
18 * reachable. otherwise, round-robin the list.
19 * Ville Nuorvala
20 * Fixed routing subtrees.
21 */
22
23#define pr_fmt(fmt) "IPv6: " fmt
24
25#include <linux/capability.h>
26#include <linux/errno.h>
27#include <linux/export.h>
28#include <linux/types.h>
29#include <linux/times.h>
30#include <linux/socket.h>
31#include <linux/sockios.h>
32#include <linux/net.h>
33#include <linux/route.h>
34#include <linux/netdevice.h>
35#include <linux/in6.h>
36#include <linux/mroute6.h>
37#include <linux/init.h>
38#include <linux/if_arp.h>
39#include <linux/proc_fs.h>
40#include <linux/seq_file.h>
41#include <linux/nsproxy.h>
42#include <linux/slab.h>
43#include <linux/jhash.h>
44#include <linux/siphash.h>
45#include <net/net_namespace.h>
46#include <net/snmp.h>
47#include <net/ipv6.h>
48#include <net/ip6_fib.h>
49#include <net/ip6_route.h>
50#include <net/ndisc.h>
51#include <net/addrconf.h>
52#include <net/tcp.h>
53#include <linux/rtnetlink.h>
54#include <net/dst.h>
55#include <net/dst_metadata.h>
56#include <net/xfrm.h>
57#include <net/netevent.h>
58#include <net/netlink.h>
59#include <net/rtnh.h>
60#include <net/lwtunnel.h>
61#include <net/ip_tunnels.h>
62#include <net/l3mdev.h>
63#include <net/ip.h>
64#include <linux/uaccess.h>
65#include <linux/btf_ids.h>
66
67#ifdef CONFIG_SYSCTL
68#include <linux/sysctl.h>
69#endif
70
71static int ip6_rt_type_to_error(u8 fib6_type);
72
73#define CREATE_TRACE_POINTS
74#include <trace/events/fib6.h>
75EXPORT_TRACEPOINT_SYMBOL_GPL(fib6_table_lookup);
76#undef CREATE_TRACE_POINTS
77
78enum rt6_nud_state {
79 RT6_NUD_FAIL_HARD = -3,
80 RT6_NUD_FAIL_PROBE = -2,
81 RT6_NUD_FAIL_DO_RR = -1,
82 RT6_NUD_SUCCEED = 1
83};
84
85INDIRECT_CALLABLE_SCOPE
86struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie);
87static unsigned int ip6_default_advmss(const struct dst_entry *dst);
88INDIRECT_CALLABLE_SCOPE
89unsigned int ip6_mtu(const struct dst_entry *dst);
90static struct dst_entry *ip6_negative_advice(struct dst_entry *);
91static void ip6_dst_destroy(struct dst_entry *);
92static void ip6_dst_ifdown(struct dst_entry *,
93 struct net_device *dev, int how);
94static int ip6_dst_gc(struct dst_ops *ops);
95
96static int ip6_pkt_discard(struct sk_buff *skb);
97static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
98static int ip6_pkt_prohibit(struct sk_buff *skb);
99static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
100static void ip6_link_failure(struct sk_buff *skb);
101static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
102 struct sk_buff *skb, u32 mtu,
103 bool confirm_neigh);
104static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
105 struct sk_buff *skb);
106static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
107 int strict);
108static size_t rt6_nlmsg_size(struct fib6_info *f6i);
109static int rt6_fill_node(struct net *net, struct sk_buff *skb,
110 struct fib6_info *rt, struct dst_entry *dst,
111 struct in6_addr *dest, struct in6_addr *src,
112 int iif, int type, u32 portid, u32 seq,
113 unsigned int flags);
114static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
115 const struct in6_addr *daddr,
116 const struct in6_addr *saddr);
117
118#ifdef CONFIG_IPV6_ROUTE_INFO
119static struct fib6_info *rt6_add_route_info(struct net *net,
120 const struct in6_addr *prefix, int prefixlen,
121 const struct in6_addr *gwaddr,
122 struct net_device *dev,
123 unsigned int pref);
124static struct fib6_info *rt6_get_route_info(struct net *net,
125 const struct in6_addr *prefix, int prefixlen,
126 const struct in6_addr *gwaddr,
127 struct net_device *dev);
128#endif
129
130struct uncached_list {
131 spinlock_t lock;
132 struct list_head head;
133 struct list_head quarantine;
134};
135
136static DEFINE_PER_CPU_ALIGNED(struct uncached_list, rt6_uncached_list);
137
138void rt6_uncached_list_add(struct rt6_info *rt)
139{
140 struct uncached_list *ul = raw_cpu_ptr(&rt6_uncached_list);
141
142 rt->rt6i_uncached_list = ul;
143
144 spin_lock_bh(&ul->lock);
145 list_add_tail(&rt->rt6i_uncached, &ul->head);
146 spin_unlock_bh(&ul->lock);
147}
148
149void rt6_uncached_list_del(struct rt6_info *rt)
150{
151 if (!list_empty(&rt->rt6i_uncached)) {
152 struct uncached_list *ul = rt->rt6i_uncached_list;
153
154 spin_lock_bh(&ul->lock);
155 list_del_init(&rt->rt6i_uncached);
156 spin_unlock_bh(&ul->lock);
157 }
158}
159
160static void rt6_uncached_list_flush_dev(struct net_device *dev)
161{
162 int cpu;
163
164 for_each_possible_cpu(cpu) {
165 struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
166 struct rt6_info *rt, *safe;
167
168 if (list_empty(&ul->head))
169 continue;
170
171 spin_lock_bh(&ul->lock);
172 list_for_each_entry_safe(rt, safe, &ul->head, rt6i_uncached) {
173 struct inet6_dev *rt_idev = rt->rt6i_idev;
174 struct net_device *rt_dev = rt->dst.dev;
175 bool handled = false;
176
177 if (rt_idev->dev == dev) {
178 rt->rt6i_idev = in6_dev_get(blackhole_netdev);
179 in6_dev_put(rt_idev);
180 handled = true;
181 }
182
183 if (rt_dev == dev) {
184 rt->dst.dev = blackhole_netdev;
185 netdev_ref_replace(rt_dev, blackhole_netdev,
186 &rt->dst.dev_tracker,
187 GFP_ATOMIC);
188 handled = true;
189 }
190 if (handled)
191 list_move(&rt->rt6i_uncached,
192 &ul->quarantine);
193 }
194 spin_unlock_bh(&ul->lock);
195 }
196}
197
198static inline const void *choose_neigh_daddr(const struct in6_addr *p,
199 struct sk_buff *skb,
200 const void *daddr)
201{
202 if (!ipv6_addr_any(p))
203 return (const void *) p;
204 else if (skb)
205 return &ipv6_hdr(skb)->daddr;
206 return daddr;
207}
208
209struct neighbour *ip6_neigh_lookup(const struct in6_addr *gw,
210 struct net_device *dev,
211 struct sk_buff *skb,
212 const void *daddr)
213{
214 struct neighbour *n;
215
216 daddr = choose_neigh_daddr(gw, skb, daddr);
217 n = __ipv6_neigh_lookup(dev, daddr);
218 if (n)
219 return n;
220
221 n = neigh_create(&nd_tbl, daddr, dev);
222 return IS_ERR(n) ? NULL : n;
223}
224
225static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
226 struct sk_buff *skb,
227 const void *daddr)
228{
229 const struct rt6_info *rt = container_of(dst, struct rt6_info, dst);
230
231 return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any),
232 dst->dev, skb, daddr);
233}
234
235static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
236{
237 struct net_device *dev = dst->dev;
238 struct rt6_info *rt = (struct rt6_info *)dst;
239
240 daddr = choose_neigh_daddr(rt6_nexthop(rt, &in6addr_any), NULL, daddr);
241 if (!daddr)
242 return;
243 if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
244 return;
245 if (ipv6_addr_is_multicast((const struct in6_addr *)daddr))
246 return;
247 __ipv6_confirm_neigh(dev, daddr);
248}
249
250static struct dst_ops ip6_dst_ops_template = {
251 .family = AF_INET6,
252 .gc = ip6_dst_gc,
253 .gc_thresh = 1024,
254 .check = ip6_dst_check,
255 .default_advmss = ip6_default_advmss,
256 .mtu = ip6_mtu,
257 .cow_metrics = dst_cow_metrics_generic,
258 .destroy = ip6_dst_destroy,
259 .ifdown = ip6_dst_ifdown,
260 .negative_advice = ip6_negative_advice,
261 .link_failure = ip6_link_failure,
262 .update_pmtu = ip6_rt_update_pmtu,
263 .redirect = rt6_do_redirect,
264 .local_out = __ip6_local_out,
265 .neigh_lookup = ip6_dst_neigh_lookup,
266 .confirm_neigh = ip6_confirm_neigh,
267};
268
269static struct dst_ops ip6_dst_blackhole_ops = {
270 .family = AF_INET6,
271 .default_advmss = ip6_default_advmss,
272 .neigh_lookup = ip6_dst_neigh_lookup,
273 .check = ip6_dst_check,
274 .destroy = ip6_dst_destroy,
275 .cow_metrics = dst_cow_metrics_generic,
276 .update_pmtu = dst_blackhole_update_pmtu,
277 .redirect = dst_blackhole_redirect,
278 .mtu = dst_blackhole_mtu,
279};
280
281static const u32 ip6_template_metrics[RTAX_MAX] = {
282 [RTAX_HOPLIMIT - 1] = 0,
283};
284
285static const struct fib6_info fib6_null_entry_template = {
286 .fib6_flags = (RTF_REJECT | RTF_NONEXTHOP),
287 .fib6_protocol = RTPROT_KERNEL,
288 .fib6_metric = ~(u32)0,
289 .fib6_ref = REFCOUNT_INIT(1),
290 .fib6_type = RTN_UNREACHABLE,
291 .fib6_metrics = (struct dst_metrics *)&dst_default_metrics,
292};
293
294static const struct rt6_info ip6_null_entry_template = {
295 .dst = {
296 .__refcnt = ATOMIC_INIT(1),
297 .__use = 1,
298 .obsolete = DST_OBSOLETE_FORCE_CHK,
299 .error = -ENETUNREACH,
300 .input = ip6_pkt_discard,
301 .output = ip6_pkt_discard_out,
302 },
303 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
304};
305
306#ifdef CONFIG_IPV6_MULTIPLE_TABLES
307
308static const struct rt6_info ip6_prohibit_entry_template = {
309 .dst = {
310 .__refcnt = ATOMIC_INIT(1),
311 .__use = 1,
312 .obsolete = DST_OBSOLETE_FORCE_CHK,
313 .error = -EACCES,
314 .input = ip6_pkt_prohibit,
315 .output = ip6_pkt_prohibit_out,
316 },
317 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
318};
319
320static const struct rt6_info ip6_blk_hole_entry_template = {
321 .dst = {
322 .__refcnt = ATOMIC_INIT(1),
323 .__use = 1,
324 .obsolete = DST_OBSOLETE_FORCE_CHK,
325 .error = -EINVAL,
326 .input = dst_discard,
327 .output = dst_discard_out,
328 },
329 .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP),
330};
331
332#endif
333
334static void rt6_info_init(struct rt6_info *rt)
335{
336 memset_after(rt, 0, dst);
337 INIT_LIST_HEAD(&rt->rt6i_uncached);
338}
339
340/* allocate dst with ip6_dst_ops */
341struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev,
342 int flags)
343{
344 struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
345 1, DST_OBSOLETE_FORCE_CHK, flags);
346
347 if (rt) {
348 rt6_info_init(rt);
349 atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
350 }
351
352 return rt;
353}
354EXPORT_SYMBOL(ip6_dst_alloc);
355
356static void ip6_dst_destroy(struct dst_entry *dst)
357{
358 struct rt6_info *rt = (struct rt6_info *)dst;
359 struct fib6_info *from;
360 struct inet6_dev *idev;
361
362 ip_dst_metrics_put(dst);
363 rt6_uncached_list_del(rt);
364
365 idev = rt->rt6i_idev;
366 if (idev) {
367 rt->rt6i_idev = NULL;
368 in6_dev_put(idev);
369 }
370
371 from = xchg((__force struct fib6_info **)&rt->from, NULL);
372 fib6_info_release(from);
373}
374
375static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
376 int how)
377{
378 struct rt6_info *rt = (struct rt6_info *)dst;
379 struct inet6_dev *idev = rt->rt6i_idev;
380
381 if (idev && idev->dev != blackhole_netdev) {
382 struct inet6_dev *blackhole_idev = in6_dev_get(blackhole_netdev);
383
384 if (blackhole_idev) {
385 rt->rt6i_idev = blackhole_idev;
386 in6_dev_put(idev);
387 }
388 }
389}
390
391static bool __rt6_check_expired(const struct rt6_info *rt)
392{
393 if (rt->rt6i_flags & RTF_EXPIRES)
394 return time_after(jiffies, rt->dst.expires);
395 else
396 return false;
397}
398
399static bool rt6_check_expired(const struct rt6_info *rt)
400{
401 struct fib6_info *from;
402
403 from = rcu_dereference(rt->from);
404
405 if (rt->rt6i_flags & RTF_EXPIRES) {
406 if (time_after(jiffies, rt->dst.expires))
407 return true;
408 } else if (from) {
409 return rt->dst.obsolete != DST_OBSOLETE_FORCE_CHK ||
410 fib6_check_expired(from);
411 }
412 return false;
413}
414
415void fib6_select_path(const struct net *net, struct fib6_result *res,
416 struct flowi6 *fl6, int oif, bool have_oif_match,
417 const struct sk_buff *skb, int strict)
418{
419 struct fib6_info *sibling, *next_sibling;
420 struct fib6_info *match = res->f6i;
421
422 if (!match->nh && (!match->fib6_nsiblings || have_oif_match))
423 goto out;
424
425 if (match->nh && have_oif_match && res->nh)
426 return;
427
428 /* We might have already computed the hash for ICMPv6 errors. In such
429 * case it will always be non-zero. Otherwise now is the time to do it.
430 */
431 if (!fl6->mp_hash &&
432 (!match->nh || nexthop_is_multipath(match->nh)))
433 fl6->mp_hash = rt6_multipath_hash(net, fl6, skb, NULL);
434
435 if (unlikely(match->nh)) {
436 nexthop_path_fib6_result(res, fl6->mp_hash);
437 return;
438 }
439
440 if (fl6->mp_hash <= atomic_read(&match->fib6_nh->fib_nh_upper_bound))
441 goto out;
442
443 list_for_each_entry_safe(sibling, next_sibling, &match->fib6_siblings,
444 fib6_siblings) {
445 const struct fib6_nh *nh = sibling->fib6_nh;
446 int nh_upper_bound;
447
448 nh_upper_bound = atomic_read(&nh->fib_nh_upper_bound);
449 if (fl6->mp_hash > nh_upper_bound)
450 continue;
451 if (rt6_score_route(nh, sibling->fib6_flags, oif, strict) < 0)
452 break;
453 match = sibling;
454 break;
455 }
456
457out:
458 res->f6i = match;
459 res->nh = match->fib6_nh;
460}
461
462/*
463 * Route lookup. rcu_read_lock() should be held.
464 */
465
466static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
467 const struct in6_addr *saddr, int oif, int flags)
468{
469 const struct net_device *dev;
470
471 if (nh->fib_nh_flags & RTNH_F_DEAD)
472 return false;
473
474 dev = nh->fib_nh_dev;
475 if (oif) {
476 if (dev->ifindex == oif)
477 return true;
478 } else {
479 if (ipv6_chk_addr(net, saddr, dev,
480 flags & RT6_LOOKUP_F_IFACE))
481 return true;
482 }
483
484 return false;
485}
486
487struct fib6_nh_dm_arg {
488 struct net *net;
489 const struct in6_addr *saddr;
490 int oif;
491 int flags;
492 struct fib6_nh *nh;
493};
494
495static int __rt6_nh_dev_match(struct fib6_nh *nh, void *_arg)
496{
497 struct fib6_nh_dm_arg *arg = _arg;
498
499 arg->nh = nh;
500 return __rt6_device_match(arg->net, nh, arg->saddr, arg->oif,
501 arg->flags);
502}
503
504/* returns fib6_nh from nexthop or NULL */
505static struct fib6_nh *rt6_nh_dev_match(struct net *net, struct nexthop *nh,
506 struct fib6_result *res,
507 const struct in6_addr *saddr,
508 int oif, int flags)
509{
510 struct fib6_nh_dm_arg arg = {
511 .net = net,
512 .saddr = saddr,
513 .oif = oif,
514 .flags = flags,
515 };
516
517 if (nexthop_is_blackhole(nh))
518 return NULL;
519
520 if (nexthop_for_each_fib6_nh(nh, __rt6_nh_dev_match, &arg))
521 return arg.nh;
522
523 return NULL;
524}
525
526static void rt6_device_match(struct net *net, struct fib6_result *res,
527 const struct in6_addr *saddr, int oif, int flags)
528{
529 struct fib6_info *f6i = res->f6i;
530 struct fib6_info *spf6i;
531 struct fib6_nh *nh;
532
533 if (!oif && ipv6_addr_any(saddr)) {
534 if (unlikely(f6i->nh)) {
535 nh = nexthop_fib6_nh(f6i->nh);
536 if (nexthop_is_blackhole(f6i->nh))
537 goto out_blackhole;
538 } else {
539 nh = f6i->fib6_nh;
540 }
541 if (!(nh->fib_nh_flags & RTNH_F_DEAD))
542 goto out;
543 }
544
545 for (spf6i = f6i; spf6i; spf6i = rcu_dereference(spf6i->fib6_next)) {
546 bool matched = false;
547
548 if (unlikely(spf6i->nh)) {
549 nh = rt6_nh_dev_match(net, spf6i->nh, res, saddr,
550 oif, flags);
551 if (nh)
552 matched = true;
553 } else {
554 nh = spf6i->fib6_nh;
555 if (__rt6_device_match(net, nh, saddr, oif, flags))
556 matched = true;
557 }
558 if (matched) {
559 res->f6i = spf6i;
560 goto out;
561 }
562 }
563
564 if (oif && flags & RT6_LOOKUP_F_IFACE) {
565 res->f6i = net->ipv6.fib6_null_entry;
566 nh = res->f6i->fib6_nh;
567 goto out;
568 }
569
570 if (unlikely(f6i->nh)) {
571 nh = nexthop_fib6_nh(f6i->nh);
572 if (nexthop_is_blackhole(f6i->nh))
573 goto out_blackhole;
574 } else {
575 nh = f6i->fib6_nh;
576 }
577
578 if (nh->fib_nh_flags & RTNH_F_DEAD) {
579 res->f6i = net->ipv6.fib6_null_entry;
580 nh = res->f6i->fib6_nh;
581 }
582out:
583 res->nh = nh;
584 res->fib6_type = res->f6i->fib6_type;
585 res->fib6_flags = res->f6i->fib6_flags;
586 return;
587
588out_blackhole:
589 res->fib6_flags |= RTF_REJECT;
590 res->fib6_type = RTN_BLACKHOLE;
591 res->nh = nh;
592}
593
594#ifdef CONFIG_IPV6_ROUTER_PREF
595struct __rt6_probe_work {
596 struct work_struct work;
597 struct in6_addr target;
598 struct net_device *dev;
599 netdevice_tracker dev_tracker;
600};
601
602static void rt6_probe_deferred(struct work_struct *w)
603{
604 struct in6_addr mcaddr;
605 struct __rt6_probe_work *work =
606 container_of(w, struct __rt6_probe_work, work);
607
608 addrconf_addr_solict_mult(&work->target, &mcaddr);
609 ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL, 0);
610 netdev_put(work->dev, &work->dev_tracker);
611 kfree(work);
612}
613
614static void rt6_probe(struct fib6_nh *fib6_nh)
615{
616 struct __rt6_probe_work *work = NULL;
617 const struct in6_addr *nh_gw;
618 unsigned long last_probe;
619 struct neighbour *neigh;
620 struct net_device *dev;
621 struct inet6_dev *idev;
622
623 /*
624 * Okay, this does not seem to be appropriate
625 * for now, however, we need to check if it
626 * is really so; aka Router Reachability Probing.
627 *
628 * Router Reachability Probe MUST be rate-limited
629 * to no more than one per minute.
630 */
631 if (!fib6_nh->fib_nh_gw_family)
632 return;
633
634 nh_gw = &fib6_nh->fib_nh_gw6;
635 dev = fib6_nh->fib_nh_dev;
636 rcu_read_lock_bh();
637 last_probe = READ_ONCE(fib6_nh->last_probe);
638 idev = __in6_dev_get(dev);
639 neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
640 if (neigh) {
641 if (neigh->nud_state & NUD_VALID)
642 goto out;
643
644 write_lock(&neigh->lock);
645 if (!(neigh->nud_state & NUD_VALID) &&
646 time_after(jiffies,
647 neigh->updated + idev->cnf.rtr_probe_interval)) {
648 work = kmalloc(sizeof(*work), GFP_ATOMIC);
649 if (work)
650 __neigh_set_probe_once(neigh);
651 }
652 write_unlock(&neigh->lock);
653 } else if (time_after(jiffies, last_probe +
654 idev->cnf.rtr_probe_interval)) {
655 work = kmalloc(sizeof(*work), GFP_ATOMIC);
656 }
657
658 if (!work || cmpxchg(&fib6_nh->last_probe,
659 last_probe, jiffies) != last_probe) {
660 kfree(work);
661 } else {
662 INIT_WORK(&work->work, rt6_probe_deferred);
663 work->target = *nh_gw;
664 netdev_hold(dev, &work->dev_tracker, GFP_ATOMIC);
665 work->dev = dev;
666 schedule_work(&work->work);
667 }
668
669out:
670 rcu_read_unlock_bh();
671}
672#else
673static inline void rt6_probe(struct fib6_nh *fib6_nh)
674{
675}
676#endif
677
678/*
679 * Default Router Selection (RFC 2461 6.3.6)
680 */
681static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
682{
683 enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
684 struct neighbour *neigh;
685
686 rcu_read_lock_bh();
687 neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
688 &fib6_nh->fib_nh_gw6);
689 if (neigh) {
690 read_lock(&neigh->lock);
691 if (neigh->nud_state & NUD_VALID)
692 ret = RT6_NUD_SUCCEED;
693#ifdef CONFIG_IPV6_ROUTER_PREF
694 else if (!(neigh->nud_state & NUD_FAILED))
695 ret = RT6_NUD_SUCCEED;
696 else
697 ret = RT6_NUD_FAIL_PROBE;
698#endif
699 read_unlock(&neigh->lock);
700 } else {
701 ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ?
702 RT6_NUD_SUCCEED : RT6_NUD_FAIL_DO_RR;
703 }
704 rcu_read_unlock_bh();
705
706 return ret;
707}
708
709static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
710 int strict)
711{
712 int m = 0;
713
714 if (!oif || nh->fib_nh_dev->ifindex == oif)
715 m = 2;
716
717 if (!m && (strict & RT6_LOOKUP_F_IFACE))
718 return RT6_NUD_FAIL_HARD;
719#ifdef CONFIG_IPV6_ROUTER_PREF
720 m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(fib6_flags)) << 2;
721#endif
722 if ((strict & RT6_LOOKUP_F_REACHABLE) &&
723 !(fib6_flags & RTF_NONEXTHOP) && nh->fib_nh_gw_family) {
724 int n = rt6_check_neigh(nh);
725 if (n < 0)
726 return n;
727 }
728 return m;
729}
730
731static bool find_match(struct fib6_nh *nh, u32 fib6_flags,
732 int oif, int strict, int *mpri, bool *do_rr)
733{
734 bool match_do_rr = false;
735 bool rc = false;
736 int m;
737
738 if (nh->fib_nh_flags & RTNH_F_DEAD)
739 goto out;
740
741 if (ip6_ignore_linkdown(nh->fib_nh_dev) &&
742 nh->fib_nh_flags & RTNH_F_LINKDOWN &&
743 !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
744 goto out;
745
746 m = rt6_score_route(nh, fib6_flags, oif, strict);
747 if (m == RT6_NUD_FAIL_DO_RR) {
748 match_do_rr = true;
749 m = 0; /* lowest valid score */
750 } else if (m == RT6_NUD_FAIL_HARD) {
751 goto out;
752 }
753
754 if (strict & RT6_LOOKUP_F_REACHABLE)
755 rt6_probe(nh);
756
757 /* note that m can be RT6_NUD_FAIL_PROBE at this point */
758 if (m > *mpri) {
759 *do_rr = match_do_rr;
760 *mpri = m;
761 rc = true;
762 }
763out:
764 return rc;
765}
766
767struct fib6_nh_frl_arg {
768 u32 flags;
769 int oif;
770 int strict;
771 int *mpri;
772 bool *do_rr;
773 struct fib6_nh *nh;
774};
775
776static int rt6_nh_find_match(struct fib6_nh *nh, void *_arg)
777{
778 struct fib6_nh_frl_arg *arg = _arg;
779
780 arg->nh = nh;
781 return find_match(nh, arg->flags, arg->oif, arg->strict,
782 arg->mpri, arg->do_rr);
783}
784
785static void __find_rr_leaf(struct fib6_info *f6i_start,
786 struct fib6_info *nomatch, u32 metric,
787 struct fib6_result *res, struct fib6_info **cont,
788 int oif, int strict, bool *do_rr, int *mpri)
789{
790 struct fib6_info *f6i;
791
792 for (f6i = f6i_start;
793 f6i && f6i != nomatch;
794 f6i = rcu_dereference(f6i->fib6_next)) {
795 bool matched = false;
796 struct fib6_nh *nh;
797
798 if (cont && f6i->fib6_metric != metric) {
799 *cont = f6i;
800 return;
801 }
802
803 if (fib6_check_expired(f6i))
804 continue;
805
806 if (unlikely(f6i->nh)) {
807 struct fib6_nh_frl_arg arg = {
808 .flags = f6i->fib6_flags,
809 .oif = oif,
810 .strict = strict,
811 .mpri = mpri,
812 .do_rr = do_rr
813 };
814
815 if (nexthop_is_blackhole(f6i->nh)) {
816 res->fib6_flags = RTF_REJECT;
817 res->fib6_type = RTN_BLACKHOLE;
818 res->f6i = f6i;
819 res->nh = nexthop_fib6_nh(f6i->nh);
820 return;
821 }
822 if (nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_find_match,
823 &arg)) {
824 matched = true;
825 nh = arg.nh;
826 }
827 } else {
828 nh = f6i->fib6_nh;
829 if (find_match(nh, f6i->fib6_flags, oif, strict,
830 mpri, do_rr))
831 matched = true;
832 }
833 if (matched) {
834 res->f6i = f6i;
835 res->nh = nh;
836 res->fib6_flags = f6i->fib6_flags;
837 res->fib6_type = f6i->fib6_type;
838 }
839 }
840}
841
842static void find_rr_leaf(struct fib6_node *fn, struct fib6_info *leaf,
843 struct fib6_info *rr_head, int oif, int strict,
844 bool *do_rr, struct fib6_result *res)
845{
846 u32 metric = rr_head->fib6_metric;
847 struct fib6_info *cont = NULL;
848 int mpri = -1;
849
850 __find_rr_leaf(rr_head, NULL, metric, res, &cont,
851 oif, strict, do_rr, &mpri);
852
853 __find_rr_leaf(leaf, rr_head, metric, res, &cont,
854 oif, strict, do_rr, &mpri);
855
856 if (res->f6i || !cont)
857 return;
858
859 __find_rr_leaf(cont, NULL, metric, res, NULL,
860 oif, strict, do_rr, &mpri);
861}
862
863static void rt6_select(struct net *net, struct fib6_node *fn, int oif,
864 struct fib6_result *res, int strict)
865{
866 struct fib6_info *leaf = rcu_dereference(fn->leaf);
867 struct fib6_info *rt0;
868 bool do_rr = false;
869 int key_plen;
870
871 /* make sure this function or its helpers sets f6i */
872 res->f6i = NULL;
873
874 if (!leaf || leaf == net->ipv6.fib6_null_entry)
875 goto out;
876
877 rt0 = rcu_dereference(fn->rr_ptr);
878 if (!rt0)
879 rt0 = leaf;
880
881 /* Double check to make sure fn is not an intermediate node
882 * and fn->leaf does not points to its child's leaf
883 * (This might happen if all routes under fn are deleted from
884 * the tree and fib6_repair_tree() is called on the node.)
885 */
886 key_plen = rt0->fib6_dst.plen;
887#ifdef CONFIG_IPV6_SUBTREES
888 if (rt0->fib6_src.plen)
889 key_plen = rt0->fib6_src.plen;
890#endif
891 if (fn->fn_bit != key_plen)
892 goto out;
893
894 find_rr_leaf(fn, leaf, rt0, oif, strict, &do_rr, res);
895 if (do_rr) {
896 struct fib6_info *next = rcu_dereference(rt0->fib6_next);
897
898 /* no entries matched; do round-robin */
899 if (!next || next->fib6_metric != rt0->fib6_metric)
900 next = leaf;
901
902 if (next != rt0) {
903 spin_lock_bh(&leaf->fib6_table->tb6_lock);
904 /* make sure next is not being deleted from the tree */
905 if (next->fib6_node)
906 rcu_assign_pointer(fn->rr_ptr, next);
907 spin_unlock_bh(&leaf->fib6_table->tb6_lock);
908 }
909 }
910
911out:
912 if (!res->f6i) {
913 res->f6i = net->ipv6.fib6_null_entry;
914 res->nh = res->f6i->fib6_nh;
915 res->fib6_flags = res->f6i->fib6_flags;
916 res->fib6_type = res->f6i->fib6_type;
917 }
918}
919
920static bool rt6_is_gw_or_nonexthop(const struct fib6_result *res)
921{
922 return (res->f6i->fib6_flags & RTF_NONEXTHOP) ||
923 res->nh->fib_nh_gw_family;
924}
925
926#ifdef CONFIG_IPV6_ROUTE_INFO
927int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
928 const struct in6_addr *gwaddr)
929{
930 struct net *net = dev_net(dev);
931 struct route_info *rinfo = (struct route_info *) opt;
932 struct in6_addr prefix_buf, *prefix;
933 unsigned int pref;
934 unsigned long lifetime;
935 struct fib6_info *rt;
936
937 if (len < sizeof(struct route_info)) {
938 return -EINVAL;
939 }
940
941 /* Sanity check for prefix_len and length */
942 if (rinfo->length > 3) {
943 return -EINVAL;
944 } else if (rinfo->prefix_len > 128) {
945 return -EINVAL;
946 } else if (rinfo->prefix_len > 64) {
947 if (rinfo->length < 2) {
948 return -EINVAL;
949 }
950 } else if (rinfo->prefix_len > 0) {
951 if (rinfo->length < 1) {
952 return -EINVAL;
953 }
954 }
955
956 pref = rinfo->route_pref;
957 if (pref == ICMPV6_ROUTER_PREF_INVALID)
958 return -EINVAL;
959
960 lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ);
961
962 if (rinfo->length == 3)
963 prefix = (struct in6_addr *)rinfo->prefix;
964 else {
965 /* this function is safe */
966 ipv6_addr_prefix(&prefix_buf,
967 (struct in6_addr *)rinfo->prefix,
968 rinfo->prefix_len);
969 prefix = &prefix_buf;
970 }
971
972 if (rinfo->prefix_len == 0)
973 rt = rt6_get_dflt_router(net, gwaddr, dev);
974 else
975 rt = rt6_get_route_info(net, prefix, rinfo->prefix_len,
976 gwaddr, dev);
977
978 if (rt && !lifetime) {
979 ip6_del_rt(net, rt, false);
980 rt = NULL;
981 }
982
983 if (!rt && lifetime)
984 rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr,
985 dev, pref);
986 else if (rt)
987 rt->fib6_flags = RTF_ROUTEINFO |
988 (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
989
990 if (rt) {
991 if (!addrconf_finite_timeout(lifetime))
992 fib6_clean_expires(rt);
993 else
994 fib6_set_expires(rt, jiffies + HZ * lifetime);
995
996 fib6_info_release(rt);
997 }
998 return 0;
999}
1000#endif
1001
1002/*
1003 * Misc support functions
1004 */
1005
1006/* called with rcu_lock held */
1007static struct net_device *ip6_rt_get_dev_rcu(const struct fib6_result *res)
1008{
1009 struct net_device *dev = res->nh->fib_nh_dev;
1010
1011 if (res->fib6_flags & (RTF_LOCAL | RTF_ANYCAST)) {
1012 /* for copies of local routes, dst->dev needs to be the
1013 * device if it is a master device, the master device if
1014 * device is enslaved, and the loopback as the default
1015 */
1016 if (netif_is_l3_slave(dev) &&
1017 !rt6_need_strict(&res->f6i->fib6_dst.addr))
1018 dev = l3mdev_master_dev_rcu(dev);
1019 else if (!netif_is_l3_master(dev))
1020 dev = dev_net(dev)->loopback_dev;
1021 /* last case is netif_is_l3_master(dev) is true in which
1022 * case we want dev returned to be dev
1023 */
1024 }
1025
1026 return dev;
1027}
1028
1029static const int fib6_prop[RTN_MAX + 1] = {
1030 [RTN_UNSPEC] = 0,
1031 [RTN_UNICAST] = 0,
1032 [RTN_LOCAL] = 0,
1033 [RTN_BROADCAST] = 0,
1034 [RTN_ANYCAST] = 0,
1035 [RTN_MULTICAST] = 0,
1036 [RTN_BLACKHOLE] = -EINVAL,
1037 [RTN_UNREACHABLE] = -EHOSTUNREACH,
1038 [RTN_PROHIBIT] = -EACCES,
1039 [RTN_THROW] = -EAGAIN,
1040 [RTN_NAT] = -EINVAL,
1041 [RTN_XRESOLVE] = -EINVAL,
1042};
1043
1044static int ip6_rt_type_to_error(u8 fib6_type)
1045{
1046 return fib6_prop[fib6_type];
1047}
1048
1049static unsigned short fib6_info_dst_flags(struct fib6_info *rt)
1050{
1051 unsigned short flags = 0;
1052
1053 if (rt->dst_nocount)
1054 flags |= DST_NOCOUNT;
1055 if (rt->dst_nopolicy)
1056 flags |= DST_NOPOLICY;
1057
1058 return flags;
1059}
1060
1061static void ip6_rt_init_dst_reject(struct rt6_info *rt, u8 fib6_type)
1062{
1063 rt->dst.error = ip6_rt_type_to_error(fib6_type);
1064
1065 switch (fib6_type) {
1066 case RTN_BLACKHOLE:
1067 rt->dst.output = dst_discard_out;
1068 rt->dst.input = dst_discard;
1069 break;
1070 case RTN_PROHIBIT:
1071 rt->dst.output = ip6_pkt_prohibit_out;
1072 rt->dst.input = ip6_pkt_prohibit;
1073 break;
1074 case RTN_THROW:
1075 case RTN_UNREACHABLE:
1076 default:
1077 rt->dst.output = ip6_pkt_discard_out;
1078 rt->dst.input = ip6_pkt_discard;
1079 break;
1080 }
1081}
1082
1083static void ip6_rt_init_dst(struct rt6_info *rt, const struct fib6_result *res)
1084{
1085 struct fib6_info *f6i = res->f6i;
1086
1087 if (res->fib6_flags & RTF_REJECT) {
1088 ip6_rt_init_dst_reject(rt, res->fib6_type);
1089 return;
1090 }
1091
1092 rt->dst.error = 0;
1093 rt->dst.output = ip6_output;
1094
1095 if (res->fib6_type == RTN_LOCAL || res->fib6_type == RTN_ANYCAST) {
1096 rt->dst.input = ip6_input;
1097 } else if (ipv6_addr_type(&f6i->fib6_dst.addr) & IPV6_ADDR_MULTICAST) {
1098 rt->dst.input = ip6_mc_input;
1099 } else {
1100 rt->dst.input = ip6_forward;
1101 }
1102
1103 if (res->nh->fib_nh_lws) {
1104 rt->dst.lwtstate = lwtstate_get(res->nh->fib_nh_lws);
1105 lwtunnel_set_redirect(&rt->dst);
1106 }
1107
1108 rt->dst.lastuse = jiffies;
1109}
1110
1111/* Caller must already hold reference to @from */
1112static void rt6_set_from(struct rt6_info *rt, struct fib6_info *from)
1113{
1114 rt->rt6i_flags &= ~RTF_EXPIRES;
1115 rcu_assign_pointer(rt->from, from);
1116 ip_dst_init_metrics(&rt->dst, from->fib6_metrics);
1117}
1118
1119/* Caller must already hold reference to f6i in result */
1120static void ip6_rt_copy_init(struct rt6_info *rt, const struct fib6_result *res)
1121{
1122 const struct fib6_nh *nh = res->nh;
1123 const struct net_device *dev = nh->fib_nh_dev;
1124 struct fib6_info *f6i = res->f6i;
1125
1126 ip6_rt_init_dst(rt, res);
1127
1128 rt->rt6i_dst = f6i->fib6_dst;
1129 rt->rt6i_idev = dev ? in6_dev_get(dev) : NULL;
1130 rt->rt6i_flags = res->fib6_flags;
1131 if (nh->fib_nh_gw_family) {
1132 rt->rt6i_gateway = nh->fib_nh_gw6;
1133 rt->rt6i_flags |= RTF_GATEWAY;
1134 }
1135 rt6_set_from(rt, f6i);
1136#ifdef CONFIG_IPV6_SUBTREES
1137 rt->rt6i_src = f6i->fib6_src;
1138#endif
1139}
1140
1141static struct fib6_node* fib6_backtrack(struct fib6_node *fn,
1142 struct in6_addr *saddr)
1143{
1144 struct fib6_node *pn, *sn;
1145 while (1) {
1146 if (fn->fn_flags & RTN_TL_ROOT)
1147 return NULL;
1148 pn = rcu_dereference(fn->parent);
1149 sn = FIB6_SUBTREE(pn);
1150 if (sn && sn != fn)
1151 fn = fib6_node_lookup(sn, NULL, saddr);
1152 else
1153 fn = pn;
1154 if (fn->fn_flags & RTN_RTINFO)
1155 return fn;
1156 }
1157}
1158
1159static bool ip6_hold_safe(struct net *net, struct rt6_info **prt)
1160{
1161 struct rt6_info *rt = *prt;
1162
1163 if (dst_hold_safe(&rt->dst))
1164 return true;
1165 if (net) {
1166 rt = net->ipv6.ip6_null_entry;
1167 dst_hold(&rt->dst);
1168 } else {
1169 rt = NULL;
1170 }
1171 *prt = rt;
1172 return false;
1173}
1174
1175/* called with rcu_lock held */
1176static struct rt6_info *ip6_create_rt_rcu(const struct fib6_result *res)
1177{
1178 struct net_device *dev = res->nh->fib_nh_dev;
1179 struct fib6_info *f6i = res->f6i;
1180 unsigned short flags;
1181 struct rt6_info *nrt;
1182
1183 if (!fib6_info_hold_safe(f6i))
1184 goto fallback;
1185
1186 flags = fib6_info_dst_flags(f6i);
1187 nrt = ip6_dst_alloc(dev_net(dev), dev, flags);
1188 if (!nrt) {
1189 fib6_info_release(f6i);
1190 goto fallback;
1191 }
1192
1193 ip6_rt_copy_init(nrt, res);
1194 return nrt;
1195
1196fallback:
1197 nrt = dev_net(dev)->ipv6.ip6_null_entry;
1198 dst_hold(&nrt->dst);
1199 return nrt;
1200}
1201
1202INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_lookup(struct net *net,
1203 struct fib6_table *table,
1204 struct flowi6 *fl6,
1205 const struct sk_buff *skb,
1206 int flags)
1207{
1208 struct fib6_result res = {};
1209 struct fib6_node *fn;
1210 struct rt6_info *rt;
1211
1212 rcu_read_lock();
1213 fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1214restart:
1215 res.f6i = rcu_dereference(fn->leaf);
1216 if (!res.f6i)
1217 res.f6i = net->ipv6.fib6_null_entry;
1218 else
1219 rt6_device_match(net, &res, &fl6->saddr, fl6->flowi6_oif,
1220 flags);
1221
1222 if (res.f6i == net->ipv6.fib6_null_entry) {
1223 fn = fib6_backtrack(fn, &fl6->saddr);
1224 if (fn)
1225 goto restart;
1226
1227 rt = net->ipv6.ip6_null_entry;
1228 dst_hold(&rt->dst);
1229 goto out;
1230 } else if (res.fib6_flags & RTF_REJECT) {
1231 goto do_create;
1232 }
1233
1234 fib6_select_path(net, &res, fl6, fl6->flowi6_oif,
1235 fl6->flowi6_oif != 0, skb, flags);
1236
1237 /* Search through exception table */
1238 rt = rt6_find_cached_rt(&res, &fl6->daddr, &fl6->saddr);
1239 if (rt) {
1240 if (ip6_hold_safe(net, &rt))
1241 dst_use_noref(&rt->dst, jiffies);
1242 } else {
1243do_create:
1244 rt = ip6_create_rt_rcu(&res);
1245 }
1246
1247out:
1248 trace_fib6_table_lookup(net, &res, table, fl6);
1249
1250 rcu_read_unlock();
1251
1252 return rt;
1253}
1254
1255struct dst_entry *ip6_route_lookup(struct net *net, struct flowi6 *fl6,
1256 const struct sk_buff *skb, int flags)
1257{
1258 return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_lookup);
1259}
1260EXPORT_SYMBOL_GPL(ip6_route_lookup);
1261
1262struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
1263 const struct in6_addr *saddr, int oif,
1264 const struct sk_buff *skb, int strict)
1265{
1266 struct flowi6 fl6 = {
1267 .flowi6_oif = oif,
1268 .daddr = *daddr,
1269 };
1270 struct dst_entry *dst;
1271 int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
1272
1273 if (saddr) {
1274 memcpy(&fl6.saddr, saddr, sizeof(*saddr));
1275 flags |= RT6_LOOKUP_F_HAS_SADDR;
1276 }
1277
1278 dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
1279 if (dst->error == 0)
1280 return (struct rt6_info *) dst;
1281
1282 dst_release(dst);
1283
1284 return NULL;
1285}
1286EXPORT_SYMBOL(rt6_lookup);
1287
1288/* ip6_ins_rt is called with FREE table->tb6_lock.
1289 * It takes new route entry, the addition fails by any reason the
1290 * route is released.
1291 * Caller must hold dst before calling it.
1292 */
1293
1294static int __ip6_ins_rt(struct fib6_info *rt, struct nl_info *info,
1295 struct netlink_ext_ack *extack)
1296{
1297 int err;
1298 struct fib6_table *table;
1299
1300 table = rt->fib6_table;
1301 spin_lock_bh(&table->tb6_lock);
1302 err = fib6_add(&table->tb6_root, rt, info, extack);
1303 spin_unlock_bh(&table->tb6_lock);
1304
1305 return err;
1306}
1307
1308int ip6_ins_rt(struct net *net, struct fib6_info *rt)
1309{
1310 struct nl_info info = { .nl_net = net, };
1311
1312 return __ip6_ins_rt(rt, &info, NULL);
1313}
1314
1315static struct rt6_info *ip6_rt_cache_alloc(const struct fib6_result *res,
1316 const struct in6_addr *daddr,
1317 const struct in6_addr *saddr)
1318{
1319 struct fib6_info *f6i = res->f6i;
1320 struct net_device *dev;
1321 struct rt6_info *rt;
1322
1323 /*
1324 * Clone the route.
1325 */
1326
1327 if (!fib6_info_hold_safe(f6i))
1328 return NULL;
1329
1330 dev = ip6_rt_get_dev_rcu(res);
1331 rt = ip6_dst_alloc(dev_net(dev), dev, 0);
1332 if (!rt) {
1333 fib6_info_release(f6i);
1334 return NULL;
1335 }
1336
1337 ip6_rt_copy_init(rt, res);
1338 rt->rt6i_flags |= RTF_CACHE;
1339 rt->rt6i_dst.addr = *daddr;
1340 rt->rt6i_dst.plen = 128;
1341
1342 if (!rt6_is_gw_or_nonexthop(res)) {
1343 if (f6i->fib6_dst.plen != 128 &&
1344 ipv6_addr_equal(&f6i->fib6_dst.addr, daddr))
1345 rt->rt6i_flags |= RTF_ANYCAST;
1346#ifdef CONFIG_IPV6_SUBTREES
1347 if (rt->rt6i_src.plen && saddr) {
1348 rt->rt6i_src.addr = *saddr;
1349 rt->rt6i_src.plen = 128;
1350 }
1351#endif
1352 }
1353
1354 return rt;
1355}
1356
1357static struct rt6_info *ip6_rt_pcpu_alloc(const struct fib6_result *res)
1358{
1359 struct fib6_info *f6i = res->f6i;
1360 unsigned short flags = fib6_info_dst_flags(f6i);
1361 struct net_device *dev;
1362 struct rt6_info *pcpu_rt;
1363
1364 if (!fib6_info_hold_safe(f6i))
1365 return NULL;
1366
1367 rcu_read_lock();
1368 dev = ip6_rt_get_dev_rcu(res);
1369 pcpu_rt = ip6_dst_alloc(dev_net(dev), dev, flags | DST_NOCOUNT);
1370 rcu_read_unlock();
1371 if (!pcpu_rt) {
1372 fib6_info_release(f6i);
1373 return NULL;
1374 }
1375 ip6_rt_copy_init(pcpu_rt, res);
1376 pcpu_rt->rt6i_flags |= RTF_PCPU;
1377
1378 if (f6i->nh)
1379 pcpu_rt->sernum = rt_genid_ipv6(dev_net(dev));
1380
1381 return pcpu_rt;
1382}
1383
1384static bool rt6_is_valid(const struct rt6_info *rt6)
1385{
1386 return rt6->sernum == rt_genid_ipv6(dev_net(rt6->dst.dev));
1387}
1388
1389/* It should be called with rcu_read_lock() acquired */
1390static struct rt6_info *rt6_get_pcpu_route(const struct fib6_result *res)
1391{
1392 struct rt6_info *pcpu_rt;
1393
1394 pcpu_rt = this_cpu_read(*res->nh->rt6i_pcpu);
1395
1396 if (pcpu_rt && pcpu_rt->sernum && !rt6_is_valid(pcpu_rt)) {
1397 struct rt6_info *prev, **p;
1398
1399 p = this_cpu_ptr(res->nh->rt6i_pcpu);
1400 prev = xchg(p, NULL);
1401 if (prev) {
1402 dst_dev_put(&prev->dst);
1403 dst_release(&prev->dst);
1404 }
1405
1406 pcpu_rt = NULL;
1407 }
1408
1409 return pcpu_rt;
1410}
1411
1412static struct rt6_info *rt6_make_pcpu_route(struct net *net,
1413 const struct fib6_result *res)
1414{
1415 struct rt6_info *pcpu_rt, *prev, **p;
1416
1417 pcpu_rt = ip6_rt_pcpu_alloc(res);
1418 if (!pcpu_rt)
1419 return NULL;
1420
1421 p = this_cpu_ptr(res->nh->rt6i_pcpu);
1422 prev = cmpxchg(p, NULL, pcpu_rt);
1423 BUG_ON(prev);
1424
1425 if (res->f6i->fib6_destroying) {
1426 struct fib6_info *from;
1427
1428 from = xchg((__force struct fib6_info **)&pcpu_rt->from, NULL);
1429 fib6_info_release(from);
1430 }
1431
1432 return pcpu_rt;
1433}
1434
1435/* exception hash table implementation
1436 */
1437static DEFINE_SPINLOCK(rt6_exception_lock);
1438
1439/* Remove rt6_ex from hash table and free the memory
1440 * Caller must hold rt6_exception_lock
1441 */
1442static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
1443 struct rt6_exception *rt6_ex)
1444{
1445 struct fib6_info *from;
1446 struct net *net;
1447
1448 if (!bucket || !rt6_ex)
1449 return;
1450
1451 net = dev_net(rt6_ex->rt6i->dst.dev);
1452 net->ipv6.rt6_stats->fib_rt_cache--;
1453
1454 /* purge completely the exception to allow releasing the held resources:
1455 * some [sk] cache may keep the dst around for unlimited time
1456 */
1457 from = xchg((__force struct fib6_info **)&rt6_ex->rt6i->from, NULL);
1458 fib6_info_release(from);
1459 dst_dev_put(&rt6_ex->rt6i->dst);
1460
1461 hlist_del_rcu(&rt6_ex->hlist);
1462 dst_release(&rt6_ex->rt6i->dst);
1463 kfree_rcu(rt6_ex, rcu);
1464 WARN_ON_ONCE(!bucket->depth);
1465 bucket->depth--;
1466}
1467
1468/* Remove oldest rt6_ex in bucket and free the memory
1469 * Caller must hold rt6_exception_lock
1470 */
1471static void rt6_exception_remove_oldest(struct rt6_exception_bucket *bucket)
1472{
1473 struct rt6_exception *rt6_ex, *oldest = NULL;
1474
1475 if (!bucket)
1476 return;
1477
1478 hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
1479 if (!oldest || time_before(rt6_ex->stamp, oldest->stamp))
1480 oldest = rt6_ex;
1481 }
1482 rt6_remove_exception(bucket, oldest);
1483}
1484
1485static u32 rt6_exception_hash(const struct in6_addr *dst,
1486 const struct in6_addr *src)
1487{
1488 static siphash_aligned_key_t rt6_exception_key;
1489 struct {
1490 struct in6_addr dst;
1491 struct in6_addr src;
1492 } __aligned(SIPHASH_ALIGNMENT) combined = {
1493 .dst = *dst,
1494 };
1495 u64 val;
1496
1497 net_get_random_once(&rt6_exception_key, sizeof(rt6_exception_key));
1498
1499#ifdef CONFIG_IPV6_SUBTREES
1500 if (src)
1501 combined.src = *src;
1502#endif
1503 val = siphash(&combined, sizeof(combined), &rt6_exception_key);
1504
1505 return hash_64(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
1506}
1507
1508/* Helper function to find the cached rt in the hash table
1509 * and update bucket pointer to point to the bucket for this
1510 * (daddr, saddr) pair
1511 * Caller must hold rt6_exception_lock
1512 */
1513static struct rt6_exception *
1514__rt6_find_exception_spinlock(struct rt6_exception_bucket **bucket,
1515 const struct in6_addr *daddr,
1516 const struct in6_addr *saddr)
1517{
1518 struct rt6_exception *rt6_ex;
1519 u32 hval;
1520
1521 if (!(*bucket) || !daddr)
1522 return NULL;
1523
1524 hval = rt6_exception_hash(daddr, saddr);
1525 *bucket += hval;
1526
1527 hlist_for_each_entry(rt6_ex, &(*bucket)->chain, hlist) {
1528 struct rt6_info *rt6 = rt6_ex->rt6i;
1529 bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1530
1531#ifdef CONFIG_IPV6_SUBTREES
1532 if (matched && saddr)
1533 matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1534#endif
1535 if (matched)
1536 return rt6_ex;
1537 }
1538 return NULL;
1539}
1540
1541/* Helper function to find the cached rt in the hash table
1542 * and update bucket pointer to point to the bucket for this
1543 * (daddr, saddr) pair
1544 * Caller must hold rcu_read_lock()
1545 */
1546static struct rt6_exception *
1547__rt6_find_exception_rcu(struct rt6_exception_bucket **bucket,
1548 const struct in6_addr *daddr,
1549 const struct in6_addr *saddr)
1550{
1551 struct rt6_exception *rt6_ex;
1552 u32 hval;
1553
1554 WARN_ON_ONCE(!rcu_read_lock_held());
1555
1556 if (!(*bucket) || !daddr)
1557 return NULL;
1558
1559 hval = rt6_exception_hash(daddr, saddr);
1560 *bucket += hval;
1561
1562 hlist_for_each_entry_rcu(rt6_ex, &(*bucket)->chain, hlist) {
1563 struct rt6_info *rt6 = rt6_ex->rt6i;
1564 bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1565
1566#ifdef CONFIG_IPV6_SUBTREES
1567 if (matched && saddr)
1568 matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1569#endif
1570 if (matched)
1571 return rt6_ex;
1572 }
1573 return NULL;
1574}
1575
1576static unsigned int fib6_mtu(const struct fib6_result *res)
1577{
1578 const struct fib6_nh *nh = res->nh;
1579 unsigned int mtu;
1580
1581 if (res->f6i->fib6_pmtu) {
1582 mtu = res->f6i->fib6_pmtu;
1583 } else {
1584 struct net_device *dev = nh->fib_nh_dev;
1585 struct inet6_dev *idev;
1586
1587 rcu_read_lock();
1588 idev = __in6_dev_get(dev);
1589 mtu = idev->cnf.mtu6;
1590 rcu_read_unlock();
1591 }
1592
1593 mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
1594
1595 return mtu - lwtunnel_headroom(nh->fib_nh_lws, mtu);
1596}
1597
1598#define FIB6_EXCEPTION_BUCKET_FLUSHED 0x1UL
1599
1600/* used when the flushed bit is not relevant, only access to the bucket
1601 * (ie., all bucket users except rt6_insert_exception);
1602 *
1603 * called under rcu lock; sometimes called with rt6_exception_lock held
1604 */
1605static
1606struct rt6_exception_bucket *fib6_nh_get_excptn_bucket(const struct fib6_nh *nh,
1607 spinlock_t *lock)
1608{
1609 struct rt6_exception_bucket *bucket;
1610
1611 if (lock)
1612 bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1613 lockdep_is_held(lock));
1614 else
1615 bucket = rcu_dereference(nh->rt6i_exception_bucket);
1616
1617 /* remove bucket flushed bit if set */
1618 if (bucket) {
1619 unsigned long p = (unsigned long)bucket;
1620
1621 p &= ~FIB6_EXCEPTION_BUCKET_FLUSHED;
1622 bucket = (struct rt6_exception_bucket *)p;
1623 }
1624
1625 return bucket;
1626}
1627
1628static bool fib6_nh_excptn_bucket_flushed(struct rt6_exception_bucket *bucket)
1629{
1630 unsigned long p = (unsigned long)bucket;
1631
1632 return !!(p & FIB6_EXCEPTION_BUCKET_FLUSHED);
1633}
1634
1635/* called with rt6_exception_lock held */
1636static void fib6_nh_excptn_bucket_set_flushed(struct fib6_nh *nh,
1637 spinlock_t *lock)
1638{
1639 struct rt6_exception_bucket *bucket;
1640 unsigned long p;
1641
1642 bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1643 lockdep_is_held(lock));
1644
1645 p = (unsigned long)bucket;
1646 p |= FIB6_EXCEPTION_BUCKET_FLUSHED;
1647 bucket = (struct rt6_exception_bucket *)p;
1648 rcu_assign_pointer(nh->rt6i_exception_bucket, bucket);
1649}
1650
1651static int rt6_insert_exception(struct rt6_info *nrt,
1652 const struct fib6_result *res)
1653{
1654 struct net *net = dev_net(nrt->dst.dev);
1655 struct rt6_exception_bucket *bucket;
1656 struct fib6_info *f6i = res->f6i;
1657 struct in6_addr *src_key = NULL;
1658 struct rt6_exception *rt6_ex;
1659 struct fib6_nh *nh = res->nh;
1660 int max_depth;
1661 int err = 0;
1662
1663 spin_lock_bh(&rt6_exception_lock);
1664
1665 bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1666 lockdep_is_held(&rt6_exception_lock));
1667 if (!bucket) {
1668 bucket = kcalloc(FIB6_EXCEPTION_BUCKET_SIZE, sizeof(*bucket),
1669 GFP_ATOMIC);
1670 if (!bucket) {
1671 err = -ENOMEM;
1672 goto out;
1673 }
1674 rcu_assign_pointer(nh->rt6i_exception_bucket, bucket);
1675 } else if (fib6_nh_excptn_bucket_flushed(bucket)) {
1676 err = -EINVAL;
1677 goto out;
1678 }
1679
1680#ifdef CONFIG_IPV6_SUBTREES
1681 /* fib6_src.plen != 0 indicates f6i is in subtree
1682 * and exception table is indexed by a hash of
1683 * both fib6_dst and fib6_src.
1684 * Otherwise, the exception table is indexed by
1685 * a hash of only fib6_dst.
1686 */
1687 if (f6i->fib6_src.plen)
1688 src_key = &nrt->rt6i_src.addr;
1689#endif
1690 /* rt6_mtu_change() might lower mtu on f6i.
1691 * Only insert this exception route if its mtu
1692 * is less than f6i's mtu value.
1693 */
1694 if (dst_metric_raw(&nrt->dst, RTAX_MTU) >= fib6_mtu(res)) {
1695 err = -EINVAL;
1696 goto out;
1697 }
1698
1699 rt6_ex = __rt6_find_exception_spinlock(&bucket, &nrt->rt6i_dst.addr,
1700 src_key);
1701 if (rt6_ex)
1702 rt6_remove_exception(bucket, rt6_ex);
1703
1704 rt6_ex = kzalloc(sizeof(*rt6_ex), GFP_ATOMIC);
1705 if (!rt6_ex) {
1706 err = -ENOMEM;
1707 goto out;
1708 }
1709 rt6_ex->rt6i = nrt;
1710 rt6_ex->stamp = jiffies;
1711 hlist_add_head_rcu(&rt6_ex->hlist, &bucket->chain);
1712 bucket->depth++;
1713 net->ipv6.rt6_stats->fib_rt_cache++;
1714
1715 /* Randomize max depth to avoid some side channels attacks. */
1716 max_depth = FIB6_MAX_DEPTH + get_random_u32_below(FIB6_MAX_DEPTH);
1717 while (bucket->depth > max_depth)
1718 rt6_exception_remove_oldest(bucket);
1719
1720out:
1721 spin_unlock_bh(&rt6_exception_lock);
1722
1723 /* Update fn->fn_sernum to invalidate all cached dst */
1724 if (!err) {
1725 spin_lock_bh(&f6i->fib6_table->tb6_lock);
1726 fib6_update_sernum(net, f6i);
1727 spin_unlock_bh(&f6i->fib6_table->tb6_lock);
1728 fib6_force_start_gc(net);
1729 }
1730
1731 return err;
1732}
1733
1734static void fib6_nh_flush_exceptions(struct fib6_nh *nh, struct fib6_info *from)
1735{
1736 struct rt6_exception_bucket *bucket;
1737 struct rt6_exception *rt6_ex;
1738 struct hlist_node *tmp;
1739 int i;
1740
1741 spin_lock_bh(&rt6_exception_lock);
1742
1743 bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
1744 if (!bucket)
1745 goto out;
1746
1747 /* Prevent rt6_insert_exception() to recreate the bucket list */
1748 if (!from)
1749 fib6_nh_excptn_bucket_set_flushed(nh, &rt6_exception_lock);
1750
1751 for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1752 hlist_for_each_entry_safe(rt6_ex, tmp, &bucket->chain, hlist) {
1753 if (!from ||
1754 rcu_access_pointer(rt6_ex->rt6i->from) == from)
1755 rt6_remove_exception(bucket, rt6_ex);
1756 }
1757 WARN_ON_ONCE(!from && bucket->depth);
1758 bucket++;
1759 }
1760out:
1761 spin_unlock_bh(&rt6_exception_lock);
1762}
1763
1764static int rt6_nh_flush_exceptions(struct fib6_nh *nh, void *arg)
1765{
1766 struct fib6_info *f6i = arg;
1767
1768 fib6_nh_flush_exceptions(nh, f6i);
1769
1770 return 0;
1771}
1772
1773void rt6_flush_exceptions(struct fib6_info *f6i)
1774{
1775 if (f6i->nh)
1776 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_flush_exceptions,
1777 f6i);
1778 else
1779 fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1780}
1781
1782/* Find cached rt in the hash table inside passed in rt
1783 * Caller has to hold rcu_read_lock()
1784 */
1785static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
1786 const struct in6_addr *daddr,
1787 const struct in6_addr *saddr)
1788{
1789 const struct in6_addr *src_key = NULL;
1790 struct rt6_exception_bucket *bucket;
1791 struct rt6_exception *rt6_ex;
1792 struct rt6_info *ret = NULL;
1793
1794#ifdef CONFIG_IPV6_SUBTREES
1795 /* fib6i_src.plen != 0 indicates f6i is in subtree
1796 * and exception table is indexed by a hash of
1797 * both fib6_dst and fib6_src.
1798 * However, the src addr used to create the hash
1799 * might not be exactly the passed in saddr which
1800 * is a /128 addr from the flow.
1801 * So we need to use f6i->fib6_src to redo lookup
1802 * if the passed in saddr does not find anything.
1803 * (See the logic in ip6_rt_cache_alloc() on how
1804 * rt->rt6i_src is updated.)
1805 */
1806 if (res->f6i->fib6_src.plen)
1807 src_key = saddr;
1808find_ex:
1809#endif
1810 bucket = fib6_nh_get_excptn_bucket(res->nh, NULL);
1811 rt6_ex = __rt6_find_exception_rcu(&bucket, daddr, src_key);
1812
1813 if (rt6_ex && !rt6_check_expired(rt6_ex->rt6i))
1814 ret = rt6_ex->rt6i;
1815
1816#ifdef CONFIG_IPV6_SUBTREES
1817 /* Use fib6_src as src_key and redo lookup */
1818 if (!ret && src_key && src_key != &res->f6i->fib6_src.addr) {
1819 src_key = &res->f6i->fib6_src.addr;
1820 goto find_ex;
1821 }
1822#endif
1823
1824 return ret;
1825}
1826
1827/* Remove the passed in cached rt from the hash table that contains it */
1828static int fib6_nh_remove_exception(const struct fib6_nh *nh, int plen,
1829 const struct rt6_info *rt)
1830{
1831 const struct in6_addr *src_key = NULL;
1832 struct rt6_exception_bucket *bucket;
1833 struct rt6_exception *rt6_ex;
1834 int err;
1835
1836 if (!rcu_access_pointer(nh->rt6i_exception_bucket))
1837 return -ENOENT;
1838
1839 spin_lock_bh(&rt6_exception_lock);
1840 bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
1841
1842#ifdef CONFIG_IPV6_SUBTREES
1843 /* rt6i_src.plen != 0 indicates 'from' is in subtree
1844 * and exception table is indexed by a hash of
1845 * both rt6i_dst and rt6i_src.
1846 * Otherwise, the exception table is indexed by
1847 * a hash of only rt6i_dst.
1848 */
1849 if (plen)
1850 src_key = &rt->rt6i_src.addr;
1851#endif
1852 rt6_ex = __rt6_find_exception_spinlock(&bucket,
1853 &rt->rt6i_dst.addr,
1854 src_key);
1855 if (rt6_ex) {
1856 rt6_remove_exception(bucket, rt6_ex);
1857 err = 0;
1858 } else {
1859 err = -ENOENT;
1860 }
1861
1862 spin_unlock_bh(&rt6_exception_lock);
1863 return err;
1864}
1865
1866struct fib6_nh_excptn_arg {
1867 struct rt6_info *rt;
1868 int plen;
1869};
1870
1871static int rt6_nh_remove_exception_rt(struct fib6_nh *nh, void *_arg)
1872{
1873 struct fib6_nh_excptn_arg *arg = _arg;
1874 int err;
1875
1876 err = fib6_nh_remove_exception(nh, arg->plen, arg->rt);
1877 if (err == 0)
1878 return 1;
1879
1880 return 0;
1881}
1882
1883static int rt6_remove_exception_rt(struct rt6_info *rt)
1884{
1885 struct fib6_info *from;
1886
1887 from = rcu_dereference(rt->from);
1888 if (!from || !(rt->rt6i_flags & RTF_CACHE))
1889 return -EINVAL;
1890
1891 if (from->nh) {
1892 struct fib6_nh_excptn_arg arg = {
1893 .rt = rt,
1894 .plen = from->fib6_src.plen
1895 };
1896 int rc;
1897
1898 /* rc = 1 means an entry was found */
1899 rc = nexthop_for_each_fib6_nh(from->nh,
1900 rt6_nh_remove_exception_rt,
1901 &arg);
1902 return rc ? 0 : -ENOENT;
1903 }
1904
1905 return fib6_nh_remove_exception(from->fib6_nh,
1906 from->fib6_src.plen, rt);
1907}
1908
1909/* Find rt6_ex which contains the passed in rt cache and
1910 * refresh its stamp
1911 */
1912static void fib6_nh_update_exception(const struct fib6_nh *nh, int plen,
1913 const struct rt6_info *rt)
1914{
1915 const struct in6_addr *src_key = NULL;
1916 struct rt6_exception_bucket *bucket;
1917 struct rt6_exception *rt6_ex;
1918
1919 bucket = fib6_nh_get_excptn_bucket(nh, NULL);
1920#ifdef CONFIG_IPV6_SUBTREES
1921 /* rt6i_src.plen != 0 indicates 'from' is in subtree
1922 * and exception table is indexed by a hash of
1923 * both rt6i_dst and rt6i_src.
1924 * Otherwise, the exception table is indexed by
1925 * a hash of only rt6i_dst.
1926 */
1927 if (plen)
1928 src_key = &rt->rt6i_src.addr;
1929#endif
1930 rt6_ex = __rt6_find_exception_rcu(&bucket, &rt->rt6i_dst.addr, src_key);
1931 if (rt6_ex)
1932 rt6_ex->stamp = jiffies;
1933}
1934
1935struct fib6_nh_match_arg {
1936 const struct net_device *dev;
1937 const struct in6_addr *gw;
1938 struct fib6_nh *match;
1939};
1940
1941/* determine if fib6_nh has given device and gateway */
1942static int fib6_nh_find_match(struct fib6_nh *nh, void *_arg)
1943{
1944 struct fib6_nh_match_arg *arg = _arg;
1945
1946 if (arg->dev != nh->fib_nh_dev ||
1947 (arg->gw && !nh->fib_nh_gw_family) ||
1948 (!arg->gw && nh->fib_nh_gw_family) ||
1949 (arg->gw && !ipv6_addr_equal(arg->gw, &nh->fib_nh_gw6)))
1950 return 0;
1951
1952 arg->match = nh;
1953
1954 /* found a match, break the loop */
1955 return 1;
1956}
1957
1958static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
1959{
1960 struct fib6_info *from;
1961 struct fib6_nh *fib6_nh;
1962
1963 rcu_read_lock();
1964
1965 from = rcu_dereference(rt->from);
1966 if (!from || !(rt->rt6i_flags & RTF_CACHE))
1967 goto unlock;
1968
1969 if (from->nh) {
1970 struct fib6_nh_match_arg arg = {
1971 .dev = rt->dst.dev,
1972 .gw = &rt->rt6i_gateway,
1973 };
1974
1975 nexthop_for_each_fib6_nh(from->nh, fib6_nh_find_match, &arg);
1976
1977 if (!arg.match)
1978 goto unlock;
1979 fib6_nh = arg.match;
1980 } else {
1981 fib6_nh = from->fib6_nh;
1982 }
1983 fib6_nh_update_exception(fib6_nh, from->fib6_src.plen, rt);
1984unlock:
1985 rcu_read_unlock();
1986}
1987
1988static bool rt6_mtu_change_route_allowed(struct inet6_dev *idev,
1989 struct rt6_info *rt, int mtu)
1990{
1991 /* If the new MTU is lower than the route PMTU, this new MTU will be the
1992 * lowest MTU in the path: always allow updating the route PMTU to
1993 * reflect PMTU decreases.
1994 *
1995 * If the new MTU is higher, and the route PMTU is equal to the local
1996 * MTU, this means the old MTU is the lowest in the path, so allow
1997 * updating it: if other nodes now have lower MTUs, PMTU discovery will
1998 * handle this.
1999 */
2000
2001 if (dst_mtu(&rt->dst) >= mtu)
2002 return true;
2003
2004 if (dst_mtu(&rt->dst) == idev->cnf.mtu6)
2005 return true;
2006
2007 return false;
2008}
2009
2010static void rt6_exceptions_update_pmtu(struct inet6_dev *idev,
2011 const struct fib6_nh *nh, int mtu)
2012{
2013 struct rt6_exception_bucket *bucket;
2014 struct rt6_exception *rt6_ex;
2015 int i;
2016
2017 bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
2018 if (!bucket)
2019 return;
2020
2021 for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2022 hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
2023 struct rt6_info *entry = rt6_ex->rt6i;
2024
2025 /* For RTF_CACHE with rt6i_pmtu == 0 (i.e. a redirected
2026 * route), the metrics of its rt->from have already
2027 * been updated.
2028 */
2029 if (dst_metric_raw(&entry->dst, RTAX_MTU) &&
2030 rt6_mtu_change_route_allowed(idev, entry, mtu))
2031 dst_metric_set(&entry->dst, RTAX_MTU, mtu);
2032 }
2033 bucket++;
2034 }
2035}
2036
2037#define RTF_CACHE_GATEWAY (RTF_GATEWAY | RTF_CACHE)
2038
2039static void fib6_nh_exceptions_clean_tohost(const struct fib6_nh *nh,
2040 const struct in6_addr *gateway)
2041{
2042 struct rt6_exception_bucket *bucket;
2043 struct rt6_exception *rt6_ex;
2044 struct hlist_node *tmp;
2045 int i;
2046
2047 if (!rcu_access_pointer(nh->rt6i_exception_bucket))
2048 return;
2049
2050 spin_lock_bh(&rt6_exception_lock);
2051 bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
2052 if (bucket) {
2053 for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2054 hlist_for_each_entry_safe(rt6_ex, tmp,
2055 &bucket->chain, hlist) {
2056 struct rt6_info *entry = rt6_ex->rt6i;
2057
2058 if ((entry->rt6i_flags & RTF_CACHE_GATEWAY) ==
2059 RTF_CACHE_GATEWAY &&
2060 ipv6_addr_equal(gateway,
2061 &entry->rt6i_gateway)) {
2062 rt6_remove_exception(bucket, rt6_ex);
2063 }
2064 }
2065 bucket++;
2066 }
2067 }
2068
2069 spin_unlock_bh(&rt6_exception_lock);
2070}
2071
2072static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,
2073 struct rt6_exception *rt6_ex,
2074 struct fib6_gc_args *gc_args,
2075 unsigned long now)
2076{
2077 struct rt6_info *rt = rt6_ex->rt6i;
2078
2079 /* we are pruning and obsoleting aged-out and non gateway exceptions
2080 * even if others have still references to them, so that on next
2081 * dst_check() such references can be dropped.
2082 * EXPIRES exceptions - e.g. pmtu-generated ones are pruned when
2083 * expired, independently from their aging, as per RFC 8201 section 4
2084 */
2085 if (!(rt->rt6i_flags & RTF_EXPIRES)) {
2086 if (time_after_eq(now, rt->dst.lastuse + gc_args->timeout)) {
2087 RT6_TRACE("aging clone %p\n", rt);
2088 rt6_remove_exception(bucket, rt6_ex);
2089 return;
2090 }
2091 } else if (time_after(jiffies, rt->dst.expires)) {
2092 RT6_TRACE("purging expired route %p\n", rt);
2093 rt6_remove_exception(bucket, rt6_ex);
2094 return;
2095 }
2096
2097 if (rt->rt6i_flags & RTF_GATEWAY) {
2098 struct neighbour *neigh;
2099
2100 neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
2101
2102 if (!(neigh && (neigh->flags & NTF_ROUTER))) {
2103 RT6_TRACE("purging route %p via non-router but gateway\n",
2104 rt);
2105 rt6_remove_exception(bucket, rt6_ex);
2106 return;
2107 }
2108 }
2109
2110 gc_args->more++;
2111}
2112
2113static void fib6_nh_age_exceptions(const struct fib6_nh *nh,
2114 struct fib6_gc_args *gc_args,
2115 unsigned long now)
2116{
2117 struct rt6_exception_bucket *bucket;
2118 struct rt6_exception *rt6_ex;
2119 struct hlist_node *tmp;
2120 int i;
2121
2122 if (!rcu_access_pointer(nh->rt6i_exception_bucket))
2123 return;
2124
2125 rcu_read_lock_bh();
2126 spin_lock(&rt6_exception_lock);
2127 bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
2128 if (bucket) {
2129 for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2130 hlist_for_each_entry_safe(rt6_ex, tmp,
2131 &bucket->chain, hlist) {
2132 rt6_age_examine_exception(bucket, rt6_ex,
2133 gc_args, now);
2134 }
2135 bucket++;
2136 }
2137 }
2138 spin_unlock(&rt6_exception_lock);
2139 rcu_read_unlock_bh();
2140}
2141
2142struct fib6_nh_age_excptn_arg {
2143 struct fib6_gc_args *gc_args;
2144 unsigned long now;
2145};
2146
2147static int rt6_nh_age_exceptions(struct fib6_nh *nh, void *_arg)
2148{
2149 struct fib6_nh_age_excptn_arg *arg = _arg;
2150
2151 fib6_nh_age_exceptions(nh, arg->gc_args, arg->now);
2152 return 0;
2153}
2154
2155void rt6_age_exceptions(struct fib6_info *f6i,
2156 struct fib6_gc_args *gc_args,
2157 unsigned long now)
2158{
2159 if (f6i->nh) {
2160 struct fib6_nh_age_excptn_arg arg = {
2161 .gc_args = gc_args,
2162 .now = now
2163 };
2164
2165 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_age_exceptions,
2166 &arg);
2167 } else {
2168 fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2169 }
2170}
2171
2172/* must be called with rcu lock held */
2173int fib6_table_lookup(struct net *net, struct fib6_table *table, int oif,
2174 struct flowi6 *fl6, struct fib6_result *res, int strict)
2175{
2176 struct fib6_node *fn, *saved_fn;
2177
2178 fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
2179 saved_fn = fn;
2180
2181redo_rt6_select:
2182 rt6_select(net, fn, oif, res, strict);
2183 if (res->f6i == net->ipv6.fib6_null_entry) {
2184 fn = fib6_backtrack(fn, &fl6->saddr);
2185 if (fn)
2186 goto redo_rt6_select;
2187 else if (strict & RT6_LOOKUP_F_REACHABLE) {
2188 /* also consider unreachable route */
2189 strict &= ~RT6_LOOKUP_F_REACHABLE;
2190 fn = saved_fn;
2191 goto redo_rt6_select;
2192 }
2193 }
2194
2195 trace_fib6_table_lookup(net, res, table, fl6);
2196
2197 return 0;
2198}
2199
2200struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
2201 int oif, struct flowi6 *fl6,
2202 const struct sk_buff *skb, int flags)
2203{
2204 struct fib6_result res = {};
2205 struct rt6_info *rt = NULL;
2206 int strict = 0;
2207
2208 WARN_ON_ONCE((flags & RT6_LOOKUP_F_DST_NOREF) &&
2209 !rcu_read_lock_held());
2210
2211 strict |= flags & RT6_LOOKUP_F_IFACE;
2212 strict |= flags & RT6_LOOKUP_F_IGNORE_LINKSTATE;
2213 if (net->ipv6.devconf_all->forwarding == 0)
2214 strict |= RT6_LOOKUP_F_REACHABLE;
2215
2216 rcu_read_lock();
2217
2218 fib6_table_lookup(net, table, oif, fl6, &res, strict);
2219 if (res.f6i == net->ipv6.fib6_null_entry)
2220 goto out;
2221
2222 fib6_select_path(net, &res, fl6, oif, false, skb, strict);
2223
2224 /*Search through exception table */
2225 rt = rt6_find_cached_rt(&res, &fl6->daddr, &fl6->saddr);
2226 if (rt) {
2227 goto out;
2228 } else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) &&
2229 !res.nh->fib_nh_gw_family)) {
2230 /* Create a RTF_CACHE clone which will not be
2231 * owned by the fib6 tree. It is for the special case where
2232 * the daddr in the skb during the neighbor look-up is different
2233 * from the fl6->daddr used to look-up route here.
2234 */
2235 rt = ip6_rt_cache_alloc(&res, &fl6->daddr, NULL);
2236
2237 if (rt) {
2238 /* 1 refcnt is taken during ip6_rt_cache_alloc().
2239 * As rt6_uncached_list_add() does not consume refcnt,
2240 * this refcnt is always returned to the caller even
2241 * if caller sets RT6_LOOKUP_F_DST_NOREF flag.
2242 */
2243 rt6_uncached_list_add(rt);
2244 rcu_read_unlock();
2245
2246 return rt;
2247 }
2248 } else {
2249 /* Get a percpu copy */
2250 local_bh_disable();
2251 rt = rt6_get_pcpu_route(&res);
2252
2253 if (!rt)
2254 rt = rt6_make_pcpu_route(net, &res);
2255
2256 local_bh_enable();
2257 }
2258out:
2259 if (!rt)
2260 rt = net->ipv6.ip6_null_entry;
2261 if (!(flags & RT6_LOOKUP_F_DST_NOREF))
2262 ip6_hold_safe(net, &rt);
2263 rcu_read_unlock();
2264
2265 return rt;
2266}
2267EXPORT_SYMBOL_GPL(ip6_pol_route);
2268
2269INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_input(struct net *net,
2270 struct fib6_table *table,
2271 struct flowi6 *fl6,
2272 const struct sk_buff *skb,
2273 int flags)
2274{
2275 return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, skb, flags);
2276}
2277
2278struct dst_entry *ip6_route_input_lookup(struct net *net,
2279 struct net_device *dev,
2280 struct flowi6 *fl6,
2281 const struct sk_buff *skb,
2282 int flags)
2283{
2284 if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
2285 flags |= RT6_LOOKUP_F_IFACE;
2286
2287 return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_input);
2288}
2289EXPORT_SYMBOL_GPL(ip6_route_input_lookup);
2290
2291static void ip6_multipath_l3_keys(const struct sk_buff *skb,
2292 struct flow_keys *keys,
2293 struct flow_keys *flkeys)
2294{
2295 const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
2296 const struct ipv6hdr *key_iph = outer_iph;
2297 struct flow_keys *_flkeys = flkeys;
2298 const struct ipv6hdr *inner_iph;
2299 const struct icmp6hdr *icmph;
2300 struct ipv6hdr _inner_iph;
2301 struct icmp6hdr _icmph;
2302
2303 if (likely(outer_iph->nexthdr != IPPROTO_ICMPV6))
2304 goto out;
2305
2306 icmph = skb_header_pointer(skb, skb_transport_offset(skb),
2307 sizeof(_icmph), &_icmph);
2308 if (!icmph)
2309 goto out;
2310
2311 if (!icmpv6_is_err(icmph->icmp6_type))
2312 goto out;
2313
2314 inner_iph = skb_header_pointer(skb,
2315 skb_transport_offset(skb) + sizeof(*icmph),
2316 sizeof(_inner_iph), &_inner_iph);
2317 if (!inner_iph)
2318 goto out;
2319
2320 key_iph = inner_iph;
2321 _flkeys = NULL;
2322out:
2323 if (_flkeys) {
2324 keys->addrs.v6addrs.src = _flkeys->addrs.v6addrs.src;
2325 keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
2326 keys->tags.flow_label = _flkeys->tags.flow_label;
2327 keys->basic.ip_proto = _flkeys->basic.ip_proto;
2328 } else {
2329 keys->addrs.v6addrs.src = key_iph->saddr;
2330 keys->addrs.v6addrs.dst = key_iph->daddr;
2331 keys->tags.flow_label = ip6_flowlabel(key_iph);
2332 keys->basic.ip_proto = key_iph->nexthdr;
2333 }
2334}
2335
2336static u32 rt6_multipath_custom_hash_outer(const struct net *net,
2337 const struct sk_buff *skb,
2338 bool *p_has_inner)
2339{
2340 u32 hash_fields = ip6_multipath_hash_fields(net);
2341 struct flow_keys keys, hash_keys;
2342
2343 if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))
2344 return 0;
2345
2346 memset(&hash_keys, 0, sizeof(hash_keys));
2347 skb_flow_dissect_flow_keys(skb, &keys, FLOW_DISSECTOR_F_STOP_AT_ENCAP);
2348
2349 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2350 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_IP)
2351 hash_keys.addrs.v6addrs.src = keys.addrs.v6addrs.src;
2352 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_IP)
2353 hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2354 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_IP_PROTO)
2355 hash_keys.basic.ip_proto = keys.basic.ip_proto;
2356 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_FLOWLABEL)
2357 hash_keys.tags.flow_label = keys.tags.flow_label;
2358 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_PORT)
2359 hash_keys.ports.src = keys.ports.src;
2360 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
2361 hash_keys.ports.dst = keys.ports.dst;
2362
2363 *p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION);
2364 return flow_hash_from_keys(&hash_keys);
2365}
2366
2367static u32 rt6_multipath_custom_hash_inner(const struct net *net,
2368 const struct sk_buff *skb,
2369 bool has_inner)
2370{
2371 u32 hash_fields = ip6_multipath_hash_fields(net);
2372 struct flow_keys keys, hash_keys;
2373
2374 /* We assume the packet carries an encapsulation, but if none was
2375 * encountered during dissection of the outer flow, then there is no
2376 * point in calling the flow dissector again.
2377 */
2378 if (!has_inner)
2379 return 0;
2380
2381 if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_MASK))
2382 return 0;
2383
2384 memset(&hash_keys, 0, sizeof(hash_keys));
2385 skb_flow_dissect_flow_keys(skb, &keys, 0);
2386
2387 if (!(keys.control.flags & FLOW_DIS_ENCAPSULATION))
2388 return 0;
2389
2390 if (keys.control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
2391 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
2392 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_IP)
2393 hash_keys.addrs.v4addrs.src = keys.addrs.v4addrs.src;
2394 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_IP)
2395 hash_keys.addrs.v4addrs.dst = keys.addrs.v4addrs.dst;
2396 } else if (keys.control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
2397 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2398 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_IP)
2399 hash_keys.addrs.v6addrs.src = keys.addrs.v6addrs.src;
2400 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_IP)
2401 hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2402 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_FLOWLABEL)
2403 hash_keys.tags.flow_label = keys.tags.flow_label;
2404 }
2405
2406 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_IP_PROTO)
2407 hash_keys.basic.ip_proto = keys.basic.ip_proto;
2408 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_PORT)
2409 hash_keys.ports.src = keys.ports.src;
2410 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT)
2411 hash_keys.ports.dst = keys.ports.dst;
2412
2413 return flow_hash_from_keys(&hash_keys);
2414}
2415
2416static u32 rt6_multipath_custom_hash_skb(const struct net *net,
2417 const struct sk_buff *skb)
2418{
2419 u32 mhash, mhash_inner;
2420 bool has_inner = true;
2421
2422 mhash = rt6_multipath_custom_hash_outer(net, skb, &has_inner);
2423 mhash_inner = rt6_multipath_custom_hash_inner(net, skb, has_inner);
2424
2425 return jhash_2words(mhash, mhash_inner, 0);
2426}
2427
2428static u32 rt6_multipath_custom_hash_fl6(const struct net *net,
2429 const struct flowi6 *fl6)
2430{
2431 u32 hash_fields = ip6_multipath_hash_fields(net);
2432 struct flow_keys hash_keys;
2433
2434 if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))
2435 return 0;
2436
2437 memset(&hash_keys, 0, sizeof(hash_keys));
2438 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2439 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_IP)
2440 hash_keys.addrs.v6addrs.src = fl6->saddr;
2441 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_IP)
2442 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2443 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_IP_PROTO)
2444 hash_keys.basic.ip_proto = fl6->flowi6_proto;
2445 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_FLOWLABEL)
2446 hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2447 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_PORT)
2448 hash_keys.ports.src = fl6->fl6_sport;
2449 if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
2450 hash_keys.ports.dst = fl6->fl6_dport;
2451
2452 return flow_hash_from_keys(&hash_keys);
2453}
2454
2455/* if skb is set it will be used and fl6 can be NULL */
2456u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
2457 const struct sk_buff *skb, struct flow_keys *flkeys)
2458{
2459 struct flow_keys hash_keys;
2460 u32 mhash = 0;
2461
2462 switch (ip6_multipath_hash_policy(net)) {
2463 case 0:
2464 memset(&hash_keys, 0, sizeof(hash_keys));
2465 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2466 if (skb) {
2467 ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
2468 } else {
2469 hash_keys.addrs.v6addrs.src = fl6->saddr;
2470 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2471 hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2472 hash_keys.basic.ip_proto = fl6->flowi6_proto;
2473 }
2474 mhash = flow_hash_from_keys(&hash_keys);
2475 break;
2476 case 1:
2477 if (skb) {
2478 unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
2479 struct flow_keys keys;
2480
2481 /* short-circuit if we already have L4 hash present */
2482 if (skb->l4_hash)
2483 return skb_get_hash_raw(skb) >> 1;
2484
2485 memset(&hash_keys, 0, sizeof(hash_keys));
2486
2487 if (!flkeys) {
2488 skb_flow_dissect_flow_keys(skb, &keys, flag);
2489 flkeys = &keys;
2490 }
2491 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2492 hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
2493 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2494 hash_keys.ports.src = flkeys->ports.src;
2495 hash_keys.ports.dst = flkeys->ports.dst;
2496 hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
2497 } else {
2498 memset(&hash_keys, 0, sizeof(hash_keys));
2499 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2500 hash_keys.addrs.v6addrs.src = fl6->saddr;
2501 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2502 hash_keys.ports.src = fl6->fl6_sport;
2503 hash_keys.ports.dst = fl6->fl6_dport;
2504 hash_keys.basic.ip_proto = fl6->flowi6_proto;
2505 }
2506 mhash = flow_hash_from_keys(&hash_keys);
2507 break;
2508 case 2:
2509 memset(&hash_keys, 0, sizeof(hash_keys));
2510 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2511 if (skb) {
2512 struct flow_keys keys;
2513
2514 if (!flkeys) {
2515 skb_flow_dissect_flow_keys(skb, &keys, 0);
2516 flkeys = &keys;
2517 }
2518
2519 /* Inner can be v4 or v6 */
2520 if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
2521 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
2522 hash_keys.addrs.v4addrs.src = flkeys->addrs.v4addrs.src;
2523 hash_keys.addrs.v4addrs.dst = flkeys->addrs.v4addrs.dst;
2524 } else if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
2525 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2526 hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
2527 hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2528 hash_keys.tags.flow_label = flkeys->tags.flow_label;
2529 hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
2530 } else {
2531 /* Same as case 0 */
2532 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2533 ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
2534 }
2535 } else {
2536 /* Same as case 0 */
2537 hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2538 hash_keys.addrs.v6addrs.src = fl6->saddr;
2539 hash_keys.addrs.v6addrs.dst = fl6->daddr;
2540 hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2541 hash_keys.basic.ip_proto = fl6->flowi6_proto;
2542 }
2543 mhash = flow_hash_from_keys(&hash_keys);
2544 break;
2545 case 3:
2546 if (skb)
2547 mhash = rt6_multipath_custom_hash_skb(net, skb);
2548 else
2549 mhash = rt6_multipath_custom_hash_fl6(net, fl6);
2550 break;
2551 }
2552
2553 return mhash >> 1;
2554}
2555
2556/* Called with rcu held */
2557void ip6_route_input(struct sk_buff *skb)
2558{
2559 const struct ipv6hdr *iph = ipv6_hdr(skb);
2560 struct net *net = dev_net(skb->dev);
2561 int flags = RT6_LOOKUP_F_HAS_SADDR | RT6_LOOKUP_F_DST_NOREF;
2562 struct ip_tunnel_info *tun_info;
2563 struct flowi6 fl6 = {
2564 .flowi6_iif = skb->dev->ifindex,
2565 .daddr = iph->daddr,
2566 .saddr = iph->saddr,
2567 .flowlabel = ip6_flowinfo(iph),
2568 .flowi6_mark = skb->mark,
2569 .flowi6_proto = iph->nexthdr,
2570 };
2571 struct flow_keys *flkeys = NULL, _flkeys;
2572
2573 tun_info = skb_tunnel_info(skb);
2574 if (tun_info && !(tun_info->mode & IP_TUNNEL_INFO_TX))
2575 fl6.flowi6_tun_key.tun_id = tun_info->key.tun_id;
2576
2577 if (fib6_rules_early_flow_dissect(net, skb, &fl6, &_flkeys))
2578 flkeys = &_flkeys;
2579
2580 if (unlikely(fl6.flowi6_proto == IPPROTO_ICMPV6))
2581 fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, flkeys);
2582 skb_dst_drop(skb);
2583 skb_dst_set_noref(skb, ip6_route_input_lookup(net, skb->dev,
2584 &fl6, skb, flags));
2585}
2586
2587INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_output(struct net *net,
2588 struct fib6_table *table,
2589 struct flowi6 *fl6,
2590 const struct sk_buff *skb,
2591 int flags)
2592{
2593 return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, skb, flags);
2594}
2595
2596struct dst_entry *ip6_route_output_flags_noref(struct net *net,
2597 const struct sock *sk,
2598 struct flowi6 *fl6, int flags)
2599{
2600 bool any_src;
2601
2602 if (ipv6_addr_type(&fl6->daddr) &
2603 (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL)) {
2604 struct dst_entry *dst;
2605
2606 /* This function does not take refcnt on the dst */
2607 dst = l3mdev_link_scope_lookup(net, fl6);
2608 if (dst)
2609 return dst;
2610 }
2611
2612 fl6->flowi6_iif = LOOPBACK_IFINDEX;
2613
2614 flags |= RT6_LOOKUP_F_DST_NOREF;
2615 any_src = ipv6_addr_any(&fl6->saddr);
2616 if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr) ||
2617 (fl6->flowi6_oif && any_src))
2618 flags |= RT6_LOOKUP_F_IFACE;
2619
2620 if (!any_src)
2621 flags |= RT6_LOOKUP_F_HAS_SADDR;
2622 else if (sk)
2623 flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs);
2624
2625 return fib6_rule_lookup(net, fl6, NULL, flags, ip6_pol_route_output);
2626}
2627EXPORT_SYMBOL_GPL(ip6_route_output_flags_noref);
2628
2629struct dst_entry *ip6_route_output_flags(struct net *net,
2630 const struct sock *sk,
2631 struct flowi6 *fl6,
2632 int flags)
2633{
2634 struct dst_entry *dst;
2635 struct rt6_info *rt6;
2636
2637 rcu_read_lock();
2638 dst = ip6_route_output_flags_noref(net, sk, fl6, flags);
2639 rt6 = (struct rt6_info *)dst;
2640 /* For dst cached in uncached_list, refcnt is already taken. */
2641 if (list_empty(&rt6->rt6i_uncached) && !dst_hold_safe(dst)) {
2642 dst = &net->ipv6.ip6_null_entry->dst;
2643 dst_hold(dst);
2644 }
2645 rcu_read_unlock();
2646
2647 return dst;
2648}
2649EXPORT_SYMBOL_GPL(ip6_route_output_flags);
2650
2651struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
2652{
2653 struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig;
2654 struct net_device *loopback_dev = net->loopback_dev;
2655 struct dst_entry *new = NULL;
2656
2657 rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1,
2658 DST_OBSOLETE_DEAD, 0);
2659 if (rt) {
2660 rt6_info_init(rt);
2661 atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
2662
2663 new = &rt->dst;
2664 new->__use = 1;
2665 new->input = dst_discard;
2666 new->output = dst_discard_out;
2667
2668 dst_copy_metrics(new, &ort->dst);
2669
2670 rt->rt6i_idev = in6_dev_get(loopback_dev);
2671 rt->rt6i_gateway = ort->rt6i_gateway;
2672 rt->rt6i_flags = ort->rt6i_flags & ~RTF_PCPU;
2673
2674 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
2675#ifdef CONFIG_IPV6_SUBTREES
2676 memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
2677#endif
2678 }
2679
2680 dst_release(dst_orig);
2681 return new ? new : ERR_PTR(-ENOMEM);
2682}
2683
2684/*
2685 * Destination cache support functions
2686 */
2687
2688static bool fib6_check(struct fib6_info *f6i, u32 cookie)
2689{
2690 u32 rt_cookie = 0;
2691
2692 if (!fib6_get_cookie_safe(f6i, &rt_cookie) || rt_cookie != cookie)
2693 return false;
2694
2695 if (fib6_check_expired(f6i))
2696 return false;
2697
2698 return true;
2699}
2700
2701static struct dst_entry *rt6_check(struct rt6_info *rt,
2702 struct fib6_info *from,
2703 u32 cookie)
2704{
2705 u32 rt_cookie = 0;
2706
2707 if (!from || !fib6_get_cookie_safe(from, &rt_cookie) ||
2708 rt_cookie != cookie)
2709 return NULL;
2710
2711 if (rt6_check_expired(rt))
2712 return NULL;
2713
2714 return &rt->dst;
2715}
2716
2717static struct dst_entry *rt6_dst_from_check(struct rt6_info *rt,
2718 struct fib6_info *from,
2719 u32 cookie)
2720{
2721 if (!__rt6_check_expired(rt) &&
2722 rt->dst.obsolete == DST_OBSOLETE_FORCE_CHK &&
2723 fib6_check(from, cookie))
2724 return &rt->dst;
2725 else
2726 return NULL;
2727}
2728
2729INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst,
2730 u32 cookie)
2731{
2732 struct dst_entry *dst_ret;
2733 struct fib6_info *from;
2734 struct rt6_info *rt;
2735
2736 rt = container_of(dst, struct rt6_info, dst);
2737
2738 if (rt->sernum)
2739 return rt6_is_valid(rt) ? dst : NULL;
2740
2741 rcu_read_lock();
2742
2743 /* All IPV6 dsts are created with ->obsolete set to the value
2744 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
2745 * into this function always.
2746 */
2747
2748 from = rcu_dereference(rt->from);
2749
2750 if (from && (rt->rt6i_flags & RTF_PCPU ||
2751 unlikely(!list_empty(&rt->rt6i_uncached))))
2752 dst_ret = rt6_dst_from_check(rt, from, cookie);
2753 else
2754 dst_ret = rt6_check(rt, from, cookie);
2755
2756 rcu_read_unlock();
2757
2758 return dst_ret;
2759}
2760EXPORT_INDIRECT_CALLABLE(ip6_dst_check);
2761
2762static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
2763{
2764 struct rt6_info *rt = (struct rt6_info *) dst;
2765
2766 if (rt) {
2767 if (rt->rt6i_flags & RTF_CACHE) {
2768 rcu_read_lock();
2769 if (rt6_check_expired(rt)) {
2770 rt6_remove_exception_rt(rt);
2771 dst = NULL;
2772 }
2773 rcu_read_unlock();
2774 } else {
2775 dst_release(dst);
2776 dst = NULL;
2777 }
2778 }
2779 return dst;
2780}
2781
2782static void ip6_link_failure(struct sk_buff *skb)
2783{
2784 struct rt6_info *rt;
2785
2786 icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
2787
2788 rt = (struct rt6_info *) skb_dst(skb);
2789 if (rt) {
2790 rcu_read_lock();
2791 if (rt->rt6i_flags & RTF_CACHE) {
2792 rt6_remove_exception_rt(rt);
2793 } else {
2794 struct fib6_info *from;
2795 struct fib6_node *fn;
2796
2797 from = rcu_dereference(rt->from);
2798 if (from) {
2799 fn = rcu_dereference(from->fib6_node);
2800 if (fn && (rt->rt6i_flags & RTF_DEFAULT))
2801 WRITE_ONCE(fn->fn_sernum, -1);
2802 }
2803 }
2804 rcu_read_unlock();
2805 }
2806}
2807
2808static void rt6_update_expires(struct rt6_info *rt0, int timeout)
2809{
2810 if (!(rt0->rt6i_flags & RTF_EXPIRES)) {
2811 struct fib6_info *from;
2812
2813 rcu_read_lock();
2814 from = rcu_dereference(rt0->from);
2815 if (from)
2816 rt0->dst.expires = from->expires;
2817 rcu_read_unlock();
2818 }
2819
2820 dst_set_expires(&rt0->dst, timeout);
2821 rt0->rt6i_flags |= RTF_EXPIRES;
2822}
2823
2824static void rt6_do_update_pmtu(struct rt6_info *rt, u32 mtu)
2825{
2826 struct net *net = dev_net(rt->dst.dev);
2827
2828 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
2829 rt->rt6i_flags |= RTF_MODIFIED;
2830 rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires);
2831}
2832
2833static bool rt6_cache_allowed_for_pmtu(const struct rt6_info *rt)
2834{
2835 return !(rt->rt6i_flags & RTF_CACHE) &&
2836 (rt->rt6i_flags & RTF_PCPU || rcu_access_pointer(rt->from));
2837}
2838
2839static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
2840 const struct ipv6hdr *iph, u32 mtu,
2841 bool confirm_neigh)
2842{
2843 const struct in6_addr *daddr, *saddr;
2844 struct rt6_info *rt6 = (struct rt6_info *)dst;
2845
2846 /* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU)
2847 * IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it.
2848 * [see also comment in rt6_mtu_change_route()]
2849 */
2850
2851 if (iph) {
2852 daddr = &iph->daddr;
2853 saddr = &iph->saddr;
2854 } else if (sk) {
2855 daddr = &sk->sk_v6_daddr;
2856 saddr = &inet6_sk(sk)->saddr;
2857 } else {
2858 daddr = NULL;
2859 saddr = NULL;
2860 }
2861
2862 if (confirm_neigh)
2863 dst_confirm_neigh(dst, daddr);
2864
2865 if (mtu < IPV6_MIN_MTU)
2866 return;
2867 if (mtu >= dst_mtu(dst))
2868 return;
2869
2870 if (!rt6_cache_allowed_for_pmtu(rt6)) {
2871 rt6_do_update_pmtu(rt6, mtu);
2872 /* update rt6_ex->stamp for cache */
2873 if (rt6->rt6i_flags & RTF_CACHE)
2874 rt6_update_exception_stamp_rt(rt6);
2875 } else if (daddr) {
2876 struct fib6_result res = {};
2877 struct rt6_info *nrt6;
2878
2879 rcu_read_lock();
2880 res.f6i = rcu_dereference(rt6->from);
2881 if (!res.f6i)
2882 goto out_unlock;
2883
2884 res.fib6_flags = res.f6i->fib6_flags;
2885 res.fib6_type = res.f6i->fib6_type;
2886
2887 if (res.f6i->nh) {
2888 struct fib6_nh_match_arg arg = {
2889 .dev = dst->dev,
2890 .gw = &rt6->rt6i_gateway,
2891 };
2892
2893 nexthop_for_each_fib6_nh(res.f6i->nh,
2894 fib6_nh_find_match, &arg);
2895
2896 /* fib6_info uses a nexthop that does not have fib6_nh
2897 * using the dst->dev + gw. Should be impossible.
2898 */
2899 if (!arg.match)
2900 goto out_unlock;
2901
2902 res.nh = arg.match;
2903 } else {
2904 res.nh = res.f6i->fib6_nh;
2905 }
2906
2907 nrt6 = ip6_rt_cache_alloc(&res, daddr, saddr);
2908 if (nrt6) {
2909 rt6_do_update_pmtu(nrt6, mtu);
2910 if (rt6_insert_exception(nrt6, &res))
2911 dst_release_immediate(&nrt6->dst);
2912 }
2913out_unlock:
2914 rcu_read_unlock();
2915 }
2916}
2917
2918static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
2919 struct sk_buff *skb, u32 mtu,
2920 bool confirm_neigh)
2921{
2922 __ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu,
2923 confirm_neigh);
2924}
2925
2926void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
2927 int oif, u32 mark, kuid_t uid)
2928{
2929 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
2930 struct dst_entry *dst;
2931 struct flowi6 fl6 = {
2932 .flowi6_oif = oif,
2933 .flowi6_mark = mark ? mark : IP6_REPLY_MARK(net, skb->mark),
2934 .daddr = iph->daddr,
2935 .saddr = iph->saddr,
2936 .flowlabel = ip6_flowinfo(iph),
2937 .flowi6_uid = uid,
2938 };
2939
2940 dst = ip6_route_output(net, NULL, &fl6);
2941 if (!dst->error)
2942 __ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu), true);
2943 dst_release(dst);
2944}
2945EXPORT_SYMBOL_GPL(ip6_update_pmtu);
2946
2947void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
2948{
2949 int oif = sk->sk_bound_dev_if;
2950 struct dst_entry *dst;
2951
2952 if (!oif && skb->dev)
2953 oif = l3mdev_master_ifindex(skb->dev);
2954
2955 ip6_update_pmtu(skb, sock_net(sk), mtu, oif, sk->sk_mark, sk->sk_uid);
2956
2957 dst = __sk_dst_get(sk);
2958 if (!dst || !dst->obsolete ||
2959 dst->ops->check(dst, inet6_sk(sk)->dst_cookie))
2960 return;
2961
2962 bh_lock_sock(sk);
2963 if (!sock_owned_by_user(sk) && !ipv6_addr_v4mapped(&sk->sk_v6_daddr))
2964 ip6_datagram_dst_update(sk, false);
2965 bh_unlock_sock(sk);
2966}
2967EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
2968
2969void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,
2970 const struct flowi6 *fl6)
2971{
2972#ifdef CONFIG_IPV6_SUBTREES
2973 struct ipv6_pinfo *np = inet6_sk(sk);
2974#endif
2975
2976 ip6_dst_store(sk, dst,
2977 ipv6_addr_equal(&fl6->daddr, &sk->sk_v6_daddr) ?
2978 &sk->sk_v6_daddr : NULL,
2979#ifdef CONFIG_IPV6_SUBTREES
2980 ipv6_addr_equal(&fl6->saddr, &np->saddr) ?
2981 &np->saddr :
2982#endif
2983 NULL);
2984}
2985
2986static bool ip6_redirect_nh_match(const struct fib6_result *res,
2987 struct flowi6 *fl6,
2988 const struct in6_addr *gw,
2989 struct rt6_info **ret)
2990{
2991 const struct fib6_nh *nh = res->nh;
2992
2993 if (nh->fib_nh_flags & RTNH_F_DEAD || !nh->fib_nh_gw_family ||
2994 fl6->flowi6_oif != nh->fib_nh_dev->ifindex)
2995 return false;
2996
2997 /* rt_cache's gateway might be different from its 'parent'
2998 * in the case of an ip redirect.
2999 * So we keep searching in the exception table if the gateway
3000 * is different.
3001 */
3002 if (!ipv6_addr_equal(gw, &nh->fib_nh_gw6)) {
3003 struct rt6_info *rt_cache;
3004
3005 rt_cache = rt6_find_cached_rt(res, &fl6->daddr, &fl6->saddr);
3006 if (rt_cache &&
3007 ipv6_addr_equal(gw, &rt_cache->rt6i_gateway)) {
3008 *ret = rt_cache;
3009 return true;
3010 }
3011 return false;
3012 }
3013 return true;
3014}
3015
3016struct fib6_nh_rd_arg {
3017 struct fib6_result *res;
3018 struct flowi6 *fl6;
3019 const struct in6_addr *gw;
3020 struct rt6_info **ret;
3021};
3022
3023static int fib6_nh_redirect_match(struct fib6_nh *nh, void *_arg)
3024{
3025 struct fib6_nh_rd_arg *arg = _arg;
3026
3027 arg->res->nh = nh;
3028 return ip6_redirect_nh_match(arg->res, arg->fl6, arg->gw, arg->ret);
3029}
3030
3031/* Handle redirects */
3032struct ip6rd_flowi {
3033 struct flowi6 fl6;
3034 struct in6_addr gateway;
3035};
3036
3037INDIRECT_CALLABLE_SCOPE struct rt6_info *__ip6_route_redirect(struct net *net,
3038 struct fib6_table *table,
3039 struct flowi6 *fl6,
3040 const struct sk_buff *skb,
3041 int flags)
3042{
3043 struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
3044 struct rt6_info *ret = NULL;
3045 struct fib6_result res = {};
3046 struct fib6_nh_rd_arg arg = {
3047 .res = &res,
3048 .fl6 = fl6,
3049 .gw = &rdfl->gateway,
3050 .ret = &ret
3051 };
3052 struct fib6_info *rt;
3053 struct fib6_node *fn;
3054
3055 /* Get the "current" route for this destination and
3056 * check if the redirect has come from appropriate router.
3057 *
3058 * RFC 4861 specifies that redirects should only be
3059 * accepted if they come from the nexthop to the target.
3060 * Due to the way the routes are chosen, this notion
3061 * is a bit fuzzy and one might need to check all possible
3062 * routes.
3063 */
3064
3065 rcu_read_lock();
3066 fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
3067restart:
3068 for_each_fib6_node_rt_rcu(fn) {
3069 res.f6i = rt;
3070 if (fib6_check_expired(rt))
3071 continue;
3072 if (rt->fib6_flags & RTF_REJECT)
3073 break;
3074 if (unlikely(rt->nh)) {
3075 if (nexthop_is_blackhole(rt->nh))
3076 continue;
3077 /* on match, res->nh is filled in and potentially ret */
3078 if (nexthop_for_each_fib6_nh(rt->nh,
3079 fib6_nh_redirect_match,
3080 &arg))
3081 goto out;
3082 } else {
3083 res.nh = rt->fib6_nh;
3084 if (ip6_redirect_nh_match(&res, fl6, &rdfl->gateway,
3085 &ret))
3086 goto out;
3087 }
3088 }
3089
3090 if (!rt)
3091 rt = net->ipv6.fib6_null_entry;
3092 else if (rt->fib6_flags & RTF_REJECT) {
3093 ret = net->ipv6.ip6_null_entry;
3094 goto out;
3095 }
3096
3097 if (rt == net->ipv6.fib6_null_entry) {
3098 fn = fib6_backtrack(fn, &fl6->saddr);
3099 if (fn)
3100 goto restart;
3101 }
3102
3103 res.f6i = rt;
3104 res.nh = rt->fib6_nh;
3105out:
3106 if (ret) {
3107 ip6_hold_safe(net, &ret);
3108 } else {
3109 res.fib6_flags = res.f6i->fib6_flags;
3110 res.fib6_type = res.f6i->fib6_type;
3111 ret = ip6_create_rt_rcu(&res);
3112 }
3113
3114 rcu_read_unlock();
3115
3116 trace_fib6_table_lookup(net, &res, table, fl6);
3117 return ret;
3118};
3119
3120static struct dst_entry *ip6_route_redirect(struct net *net,
3121 const struct flowi6 *fl6,
3122 const struct sk_buff *skb,
3123 const struct in6_addr *gateway)
3124{
3125 int flags = RT6_LOOKUP_F_HAS_SADDR;
3126 struct ip6rd_flowi rdfl;
3127
3128 rdfl.fl6 = *fl6;
3129 rdfl.gateway = *gateway;
3130
3131 return fib6_rule_lookup(net, &rdfl.fl6, skb,
3132 flags, __ip6_route_redirect);
3133}
3134
3135void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark,
3136 kuid_t uid)
3137{
3138 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
3139 struct dst_entry *dst;
3140 struct flowi6 fl6 = {
3141 .flowi6_iif = LOOPBACK_IFINDEX,
3142 .flowi6_oif = oif,
3143 .flowi6_mark = mark,
3144 .daddr = iph->daddr,
3145 .saddr = iph->saddr,
3146 .flowlabel = ip6_flowinfo(iph),
3147 .flowi6_uid = uid,
3148 };
3149
3150 dst = ip6_route_redirect(net, &fl6, skb, &ipv6_hdr(skb)->saddr);
3151 rt6_do_redirect(dst, NULL, skb);
3152 dst_release(dst);
3153}
3154EXPORT_SYMBOL_GPL(ip6_redirect);
3155
3156void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif)
3157{
3158 const struct ipv6hdr *iph = ipv6_hdr(skb);
3159 const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb);
3160 struct dst_entry *dst;
3161 struct flowi6 fl6 = {
3162 .flowi6_iif = LOOPBACK_IFINDEX,
3163 .flowi6_oif = oif,
3164 .daddr = msg->dest,
3165 .saddr = iph->daddr,
3166 .flowi6_uid = sock_net_uid(net, NULL),
3167 };
3168
3169 dst = ip6_route_redirect(net, &fl6, skb, &iph->saddr);
3170 rt6_do_redirect(dst, NULL, skb);
3171 dst_release(dst);
3172}
3173
3174void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
3175{
3176 ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark,
3177 sk->sk_uid);
3178}
3179EXPORT_SYMBOL_GPL(ip6_sk_redirect);
3180
3181static unsigned int ip6_default_advmss(const struct dst_entry *dst)
3182{
3183 struct net_device *dev = dst->dev;
3184 unsigned int mtu = dst_mtu(dst);
3185 struct net *net = dev_net(dev);
3186
3187 mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
3188
3189 if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
3190 mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
3191
3192 /*
3193 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
3194 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
3195 * IPV6_MAXPLEN is also valid and means: "any MSS,
3196 * rely only on pmtu discovery"
3197 */
3198 if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
3199 mtu = IPV6_MAXPLEN;
3200 return mtu;
3201}
3202
3203INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst)
3204{
3205 return ip6_dst_mtu_maybe_forward(dst, false);
3206}
3207EXPORT_INDIRECT_CALLABLE(ip6_mtu);
3208
3209/* MTU selection:
3210 * 1. mtu on route is locked - use it
3211 * 2. mtu from nexthop exception
3212 * 3. mtu from egress device
3213 *
3214 * based on ip6_dst_mtu_forward and exception logic of
3215 * rt6_find_cached_rt; called with rcu_read_lock
3216 */
3217u32 ip6_mtu_from_fib6(const struct fib6_result *res,
3218 const struct in6_addr *daddr,
3219 const struct in6_addr *saddr)
3220{
3221 const struct fib6_nh *nh = res->nh;
3222 struct fib6_info *f6i = res->f6i;
3223 struct inet6_dev *idev;
3224 struct rt6_info *rt;
3225 u32 mtu = 0;
3226
3227 if (unlikely(fib6_metric_locked(f6i, RTAX_MTU))) {
3228 mtu = f6i->fib6_pmtu;
3229 if (mtu)
3230 goto out;
3231 }
3232
3233 rt = rt6_find_cached_rt(res, daddr, saddr);
3234 if (unlikely(rt)) {
3235 mtu = dst_metric_raw(&rt->dst, RTAX_MTU);
3236 } else {
3237 struct net_device *dev = nh->fib_nh_dev;
3238
3239 mtu = IPV6_MIN_MTU;
3240 idev = __in6_dev_get(dev);
3241 if (idev && idev->cnf.mtu6 > mtu)
3242 mtu = idev->cnf.mtu6;
3243 }
3244
3245 mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
3246out:
3247 return mtu - lwtunnel_headroom(nh->fib_nh_lws, mtu);
3248}
3249
3250struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
3251 struct flowi6 *fl6)
3252{
3253 struct dst_entry *dst;
3254 struct rt6_info *rt;
3255 struct inet6_dev *idev = in6_dev_get(dev);
3256 struct net *net = dev_net(dev);
3257
3258 if (unlikely(!idev))
3259 return ERR_PTR(-ENODEV);
3260
3261 rt = ip6_dst_alloc(net, dev, 0);
3262 if (unlikely(!rt)) {
3263 in6_dev_put(idev);
3264 dst = ERR_PTR(-ENOMEM);
3265 goto out;
3266 }
3267
3268 rt->dst.input = ip6_input;
3269 rt->dst.output = ip6_output;
3270 rt->rt6i_gateway = fl6->daddr;
3271 rt->rt6i_dst.addr = fl6->daddr;
3272 rt->rt6i_dst.plen = 128;
3273 rt->rt6i_idev = idev;
3274 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
3275
3276 /* Add this dst into uncached_list so that rt6_disable_ip() can
3277 * do proper release of the net_device
3278 */
3279 rt6_uncached_list_add(rt);
3280
3281 dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
3282
3283out:
3284 return dst;
3285}
3286
3287static int ip6_dst_gc(struct dst_ops *ops)
3288{
3289 struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
3290 int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
3291 int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size;
3292 int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
3293 int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
3294 unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
3295 unsigned int val;
3296 int entries;
3297
3298 entries = dst_entries_get_fast(ops);
3299 if (entries > rt_max_size)
3300 entries = dst_entries_get_slow(ops);
3301
3302 if (time_after(rt_last_gc + rt_min_interval, jiffies) &&
3303 entries <= rt_max_size)
3304 goto out;
3305
3306 fib6_run_gc(atomic_inc_return(&net->ipv6.ip6_rt_gc_expire), net, true);
3307 entries = dst_entries_get_slow(ops);
3308 if (entries < ops->gc_thresh)
3309 atomic_set(&net->ipv6.ip6_rt_gc_expire, rt_gc_timeout >> 1);
3310out:
3311 val = atomic_read(&net->ipv6.ip6_rt_gc_expire);
3312 atomic_set(&net->ipv6.ip6_rt_gc_expire, val - (val >> rt_elasticity));
3313 return entries > rt_max_size;
3314}
3315
3316static int ip6_nh_lookup_table(struct net *net, struct fib6_config *cfg,
3317 const struct in6_addr *gw_addr, u32 tbid,
3318 int flags, struct fib6_result *res)
3319{
3320 struct flowi6 fl6 = {
3321 .flowi6_oif = cfg->fc_ifindex,
3322 .daddr = *gw_addr,
3323 .saddr = cfg->fc_prefsrc,
3324 };
3325 struct fib6_table *table;
3326 int err;
3327
3328 table = fib6_get_table(net, tbid);
3329 if (!table)
3330 return -EINVAL;
3331
3332 if (!ipv6_addr_any(&cfg->fc_prefsrc))
3333 flags |= RT6_LOOKUP_F_HAS_SADDR;
3334
3335 flags |= RT6_LOOKUP_F_IGNORE_LINKSTATE;
3336
3337 err = fib6_table_lookup(net, table, cfg->fc_ifindex, &fl6, res, flags);
3338 if (!err && res->f6i != net->ipv6.fib6_null_entry)
3339 fib6_select_path(net, res, &fl6, cfg->fc_ifindex,
3340 cfg->fc_ifindex != 0, NULL, flags);
3341
3342 return err;
3343}
3344
3345static int ip6_route_check_nh_onlink(struct net *net,
3346 struct fib6_config *cfg,
3347 const struct net_device *dev,
3348 struct netlink_ext_ack *extack)
3349{
3350 u32 tbid = l3mdev_fib_table_rcu(dev) ? : RT_TABLE_MAIN;
3351 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3352 struct fib6_result res = {};
3353 int err;
3354
3355 err = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0, &res);
3356 if (!err && !(res.fib6_flags & RTF_REJECT) &&
3357 /* ignore match if it is the default route */
3358 !ipv6_addr_any(&res.f6i->fib6_dst.addr) &&
3359 (res.fib6_type != RTN_UNICAST || dev != res.nh->fib_nh_dev)) {
3360 NL_SET_ERR_MSG(extack,
3361 "Nexthop has invalid gateway or device mismatch");
3362 err = -EINVAL;
3363 }
3364
3365 return err;
3366}
3367
3368static int ip6_route_check_nh(struct net *net,
3369 struct fib6_config *cfg,
3370 struct net_device **_dev,
3371 struct inet6_dev **idev)
3372{
3373 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3374 struct net_device *dev = _dev ? *_dev : NULL;
3375 int flags = RT6_LOOKUP_F_IFACE;
3376 struct fib6_result res = {};
3377 int err = -EHOSTUNREACH;
3378
3379 if (cfg->fc_table) {
3380 err = ip6_nh_lookup_table(net, cfg, gw_addr,
3381 cfg->fc_table, flags, &res);
3382 /* gw_addr can not require a gateway or resolve to a reject
3383 * route. If a device is given, it must match the result.
3384 */
3385 if (err || res.fib6_flags & RTF_REJECT ||
3386 res.nh->fib_nh_gw_family ||
3387 (dev && dev != res.nh->fib_nh_dev))
3388 err = -EHOSTUNREACH;
3389 }
3390
3391 if (err < 0) {
3392 struct flowi6 fl6 = {
3393 .flowi6_oif = cfg->fc_ifindex,
3394 .daddr = *gw_addr,
3395 };
3396
3397 err = fib6_lookup(net, cfg->fc_ifindex, &fl6, &res, flags);
3398 if (err || res.fib6_flags & RTF_REJECT ||
3399 res.nh->fib_nh_gw_family)
3400 err = -EHOSTUNREACH;
3401
3402 if (err)
3403 return err;
3404
3405 fib6_select_path(net, &res, &fl6, cfg->fc_ifindex,
3406 cfg->fc_ifindex != 0, NULL, flags);
3407 }
3408
3409 err = 0;
3410 if (dev) {
3411 if (dev != res.nh->fib_nh_dev)
3412 err = -EHOSTUNREACH;
3413 } else {
3414 *_dev = dev = res.nh->fib_nh_dev;
3415 dev_hold(dev);
3416 *idev = in6_dev_get(dev);
3417 }
3418
3419 return err;
3420}
3421
3422static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
3423 struct net_device **_dev, struct inet6_dev **idev,
3424 struct netlink_ext_ack *extack)
3425{
3426 const struct in6_addr *gw_addr = &cfg->fc_gateway;
3427 int gwa_type = ipv6_addr_type(gw_addr);
3428 bool skip_dev = gwa_type & IPV6_ADDR_LINKLOCAL ? false : true;
3429 const struct net_device *dev = *_dev;
3430 bool need_addr_check = !dev;
3431 int err = -EINVAL;
3432
3433 /* if gw_addr is local we will fail to detect this in case
3434 * address is still TENTATIVE (DAD in progress). rt6_lookup()
3435 * will return already-added prefix route via interface that
3436 * prefix route was assigned to, which might be non-loopback.
3437 */
3438 if (dev &&
3439 ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
3440 NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
3441 goto out;
3442 }
3443
3444 if (gwa_type != (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST)) {
3445 /* IPv6 strictly inhibits using not link-local
3446 * addresses as nexthop address.
3447 * Otherwise, router will not able to send redirects.
3448 * It is very good, but in some (rare!) circumstances
3449 * (SIT, PtP, NBMA NOARP links) it is handy to allow
3450 * some exceptions. --ANK
3451 * We allow IPv4-mapped nexthops to support RFC4798-type
3452 * addressing
3453 */
3454 if (!(gwa_type & (IPV6_ADDR_UNICAST | IPV6_ADDR_MAPPED))) {
3455 NL_SET_ERR_MSG(extack, "Invalid gateway address");
3456 goto out;
3457 }
3458
3459 rcu_read_lock();
3460
3461 if (cfg->fc_flags & RTNH_F_ONLINK)
3462 err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
3463 else
3464 err = ip6_route_check_nh(net, cfg, _dev, idev);
3465
3466 rcu_read_unlock();
3467
3468 if (err)
3469 goto out;
3470 }
3471
3472 /* reload in case device was changed */
3473 dev = *_dev;
3474
3475 err = -EINVAL;
3476 if (!dev) {
3477 NL_SET_ERR_MSG(extack, "Egress device not specified");
3478 goto out;
3479 } else if (dev->flags & IFF_LOOPBACK) {
3480 NL_SET_ERR_MSG(extack,
3481 "Egress device can not be loopback device for this route");
3482 goto out;
3483 }
3484
3485 /* if we did not check gw_addr above, do so now that the
3486 * egress device has been resolved.
3487 */
3488 if (need_addr_check &&
3489 ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
3490 NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
3491 goto out;
3492 }
3493
3494 err = 0;
3495out:
3496 return err;
3497}
3498
3499static bool fib6_is_reject(u32 flags, struct net_device *dev, int addr_type)
3500{
3501 if ((flags & RTF_REJECT) ||
3502 (dev && (dev->flags & IFF_LOOPBACK) &&
3503 !(addr_type & IPV6_ADDR_LOOPBACK) &&
3504 !(flags & (RTF_ANYCAST | RTF_LOCAL))))
3505 return true;
3506
3507 return false;
3508}
3509
3510int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
3511 struct fib6_config *cfg, gfp_t gfp_flags,
3512 struct netlink_ext_ack *extack)
3513{
3514 struct net_device *dev = NULL;
3515 struct inet6_dev *idev = NULL;
3516 int addr_type;
3517 int err;
3518
3519 fib6_nh->fib_nh_family = AF_INET6;
3520#ifdef CONFIG_IPV6_ROUTER_PREF
3521 fib6_nh->last_probe = jiffies;
3522#endif
3523 if (cfg->fc_is_fdb) {
3524 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3525 fib6_nh->fib_nh_gw_family = AF_INET6;
3526 return 0;
3527 }
3528
3529 err = -ENODEV;
3530 if (cfg->fc_ifindex) {
3531 dev = dev_get_by_index(net, cfg->fc_ifindex);
3532 if (!dev)
3533 goto out;
3534 idev = in6_dev_get(dev);
3535 if (!idev)
3536 goto out;
3537 }
3538
3539 if (cfg->fc_flags & RTNH_F_ONLINK) {
3540 if (!dev) {
3541 NL_SET_ERR_MSG(extack,
3542 "Nexthop device required for onlink");
3543 goto out;
3544 }
3545
3546 if (!(dev->flags & IFF_UP)) {
3547 NL_SET_ERR_MSG(extack, "Nexthop device is not up");
3548 err = -ENETDOWN;
3549 goto out;
3550 }
3551
3552 fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
3553 }
3554
3555 fib6_nh->fib_nh_weight = 1;
3556
3557 /* We cannot add true routes via loopback here,
3558 * they would result in kernel looping; promote them to reject routes
3559 */
3560 addr_type = ipv6_addr_type(&cfg->fc_dst);
3561 if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) {
3562 /* hold loopback dev/idev if we haven't done so. */
3563 if (dev != net->loopback_dev) {
3564 if (dev) {
3565 dev_put(dev);
3566 in6_dev_put(idev);
3567 }
3568 dev = net->loopback_dev;
3569 dev_hold(dev);
3570 idev = in6_dev_get(dev);
3571 if (!idev) {
3572 err = -ENODEV;
3573 goto out;
3574 }
3575 }
3576 goto pcpu_alloc;
3577 }
3578
3579 if (cfg->fc_flags & RTF_GATEWAY) {
3580 err = ip6_validate_gw(net, cfg, &dev, &idev, extack);
3581 if (err)
3582 goto out;
3583
3584 fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3585 fib6_nh->fib_nh_gw_family = AF_INET6;
3586 }
3587
3588 err = -ENODEV;
3589 if (!dev)
3590 goto out;
3591
3592 if (idev->cnf.disable_ipv6) {
3593 NL_SET_ERR_MSG(extack, "IPv6 is disabled on nexthop device");
3594 err = -EACCES;
3595 goto out;
3596 }
3597
3598 if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
3599 NL_SET_ERR_MSG(extack, "Nexthop device is not up");
3600 err = -ENETDOWN;
3601 goto out;
3602 }
3603
3604 if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
3605 !netif_carrier_ok(dev))
3606 fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
3607
3608 err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3609 cfg->fc_encap_type, cfg, gfp_flags, extack);
3610 if (err)
3611 goto out;
3612
3613pcpu_alloc:
3614 fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
3615 if (!fib6_nh->rt6i_pcpu) {
3616 err = -ENOMEM;
3617 goto out;
3618 }
3619
3620 fib6_nh->fib_nh_dev = dev;
3621 netdev_tracker_alloc(dev, &fib6_nh->fib_nh_dev_tracker, gfp_flags);
3622
3623 fib6_nh->fib_nh_oif = dev->ifindex;
3624 err = 0;
3625out:
3626 if (idev)
3627 in6_dev_put(idev);
3628
3629 if (err) {
3630 lwtstate_put(fib6_nh->fib_nh_lws);
3631 fib6_nh->fib_nh_lws = NULL;
3632 dev_put(dev);
3633 }
3634
3635 return err;
3636}
3637
3638void fib6_nh_release(struct fib6_nh *fib6_nh)
3639{
3640 struct rt6_exception_bucket *bucket;
3641
3642 rcu_read_lock();
3643
3644 fib6_nh_flush_exceptions(fib6_nh, NULL);
3645 bucket = fib6_nh_get_excptn_bucket(fib6_nh, NULL);
3646 if (bucket) {
3647 rcu_assign_pointer(fib6_nh->rt6i_exception_bucket, NULL);
3648 kfree(bucket);
3649 }
3650
3651 rcu_read_unlock();
3652
3653 fib6_nh_release_dsts(fib6_nh);
3654 free_percpu(fib6_nh->rt6i_pcpu);
3655
3656 fib_nh_common_release(&fib6_nh->nh_common);
3657}
3658
3659void fib6_nh_release_dsts(struct fib6_nh *fib6_nh)
3660{
3661 int cpu;
3662
3663 if (!fib6_nh->rt6i_pcpu)
3664 return;
3665
3666 for_each_possible_cpu(cpu) {
3667 struct rt6_info *pcpu_rt, **ppcpu_rt;
3668
3669 ppcpu_rt = per_cpu_ptr(fib6_nh->rt6i_pcpu, cpu);
3670 pcpu_rt = xchg(ppcpu_rt, NULL);
3671 if (pcpu_rt) {
3672 dst_dev_put(&pcpu_rt->dst);
3673 dst_release(&pcpu_rt->dst);
3674 }
3675 }
3676}
3677
3678static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
3679 gfp_t gfp_flags,
3680 struct netlink_ext_ack *extack)
3681{
3682 struct net *net = cfg->fc_nlinfo.nl_net;
3683 struct fib6_info *rt = NULL;
3684 struct nexthop *nh = NULL;
3685 struct fib6_table *table;
3686 struct fib6_nh *fib6_nh;
3687 int err = -EINVAL;
3688 int addr_type;
3689
3690 /* RTF_PCPU is an internal flag; can not be set by userspace */
3691 if (cfg->fc_flags & RTF_PCPU) {
3692 NL_SET_ERR_MSG(extack, "Userspace can not set RTF_PCPU");
3693 goto out;
3694 }
3695
3696 /* RTF_CACHE is an internal flag; can not be set by userspace */
3697 if (cfg->fc_flags & RTF_CACHE) {
3698 NL_SET_ERR_MSG(extack, "Userspace can not set RTF_CACHE");
3699 goto out;
3700 }
3701
3702 if (cfg->fc_type > RTN_MAX) {
3703 NL_SET_ERR_MSG(extack, "Invalid route type");
3704 goto out;
3705 }
3706
3707 if (cfg->fc_dst_len > 128) {
3708 NL_SET_ERR_MSG(extack, "Invalid prefix length");
3709 goto out;
3710 }
3711 if (cfg->fc_src_len > 128) {
3712 NL_SET_ERR_MSG(extack, "Invalid source address length");
3713 goto out;
3714 }
3715#ifndef CONFIG_IPV6_SUBTREES
3716 if (cfg->fc_src_len) {
3717 NL_SET_ERR_MSG(extack,
3718 "Specifying source address requires IPV6_SUBTREES to be enabled");
3719 goto out;
3720 }
3721#endif
3722 if (cfg->fc_nh_id) {
3723 nh = nexthop_find_by_id(net, cfg->fc_nh_id);
3724 if (!nh) {
3725 NL_SET_ERR_MSG(extack, "Nexthop id does not exist");
3726 goto out;
3727 }
3728 err = fib6_check_nexthop(nh, cfg, extack);
3729 if (err)
3730 goto out;
3731 }
3732
3733 err = -ENOBUFS;
3734 if (cfg->fc_nlinfo.nlh &&
3735 !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
3736 table = fib6_get_table(net, cfg->fc_table);
3737 if (!table) {
3738 pr_warn("NLM_F_CREATE should be specified when creating new route\n");
3739 table = fib6_new_table(net, cfg->fc_table);
3740 }
3741 } else {
3742 table = fib6_new_table(net, cfg->fc_table);
3743 }
3744
3745 if (!table)
3746 goto out;
3747
3748 err = -ENOMEM;
3749 rt = fib6_info_alloc(gfp_flags, !nh);
3750 if (!rt)
3751 goto out;
3752
3753 rt->fib6_metrics = ip_fib_metrics_init(net, cfg->fc_mx, cfg->fc_mx_len,
3754 extack);
3755 if (IS_ERR(rt->fib6_metrics)) {
3756 err = PTR_ERR(rt->fib6_metrics);
3757 /* Do not leave garbage there. */
3758 rt->fib6_metrics = (struct dst_metrics *)&dst_default_metrics;
3759 goto out_free;
3760 }
3761
3762 if (cfg->fc_flags & RTF_ADDRCONF)
3763 rt->dst_nocount = true;
3764
3765 if (cfg->fc_flags & RTF_EXPIRES)
3766 fib6_set_expires(rt, jiffies +
3767 clock_t_to_jiffies(cfg->fc_expires));
3768 else
3769 fib6_clean_expires(rt);
3770
3771 if (cfg->fc_protocol == RTPROT_UNSPEC)
3772 cfg->fc_protocol = RTPROT_BOOT;
3773 rt->fib6_protocol = cfg->fc_protocol;
3774
3775 rt->fib6_table = table;
3776 rt->fib6_metric = cfg->fc_metric;
3777 rt->fib6_type = cfg->fc_type ? : RTN_UNICAST;
3778 rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY;
3779
3780 ipv6_addr_prefix(&rt->fib6_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
3781 rt->fib6_dst.plen = cfg->fc_dst_len;
3782
3783#ifdef CONFIG_IPV6_SUBTREES
3784 ipv6_addr_prefix(&rt->fib6_src.addr, &cfg->fc_src, cfg->fc_src_len);
3785 rt->fib6_src.plen = cfg->fc_src_len;
3786#endif
3787 if (nh) {
3788 if (rt->fib6_src.plen) {
3789 NL_SET_ERR_MSG(extack, "Nexthops can not be used with source routing");
3790 goto out_free;
3791 }
3792 if (!nexthop_get(nh)) {
3793 NL_SET_ERR_MSG(extack, "Nexthop has been deleted");
3794 goto out_free;
3795 }
3796 rt->nh = nh;
3797 fib6_nh = nexthop_fib6_nh(rt->nh);
3798 } else {
3799 err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
3800 if (err)
3801 goto out;
3802
3803 fib6_nh = rt->fib6_nh;
3804
3805 /* We cannot add true routes via loopback here, they would
3806 * result in kernel looping; promote them to reject routes
3807 */
3808 addr_type = ipv6_addr_type(&cfg->fc_dst);
3809 if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3810 addr_type))
3811 rt->fib6_flags = RTF_REJECT | RTF_NONEXTHOP;
3812 }
3813
3814 if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
3815 struct net_device *dev = fib6_nh->fib_nh_dev;
3816
3817 if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
3818 NL_SET_ERR_MSG(extack, "Invalid source address");
3819 err = -EINVAL;
3820 goto out;
3821 }
3822 rt->fib6_prefsrc.addr = cfg->fc_prefsrc;
3823 rt->fib6_prefsrc.plen = 128;
3824 } else
3825 rt->fib6_prefsrc.plen = 0;
3826
3827 return rt;
3828out:
3829 fib6_info_release(rt);
3830 return ERR_PTR(err);
3831out_free:
3832 ip_fib_metrics_put(rt->fib6_metrics);
3833 kfree(rt);
3834 return ERR_PTR(err);
3835}
3836
3837int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
3838 struct netlink_ext_ack *extack)
3839{
3840 struct fib6_info *rt;
3841 int err;
3842
3843 rt = ip6_route_info_create(cfg, gfp_flags, extack);
3844 if (IS_ERR(rt))
3845 return PTR_ERR(rt);
3846
3847 err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack);
3848 fib6_info_release(rt);
3849
3850 return err;
3851}
3852
3853static int __ip6_del_rt(struct fib6_info *rt, struct nl_info *info)
3854{
3855 struct net *net = info->nl_net;
3856 struct fib6_table *table;
3857 int err;
3858
3859 if (rt == net->ipv6.fib6_null_entry) {
3860 err = -ENOENT;
3861 goto out;
3862 }
3863
3864 table = rt->fib6_table;
3865 spin_lock_bh(&table->tb6_lock);
3866 err = fib6_del(rt, info);
3867 spin_unlock_bh(&table->tb6_lock);
3868
3869out:
3870 fib6_info_release(rt);
3871 return err;
3872}
3873
3874int ip6_del_rt(struct net *net, struct fib6_info *rt, bool skip_notify)
3875{
3876 struct nl_info info = {
3877 .nl_net = net,
3878 .skip_notify = skip_notify
3879 };
3880
3881 return __ip6_del_rt(rt, &info);
3882}
3883
3884static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
3885{
3886 struct nl_info *info = &cfg->fc_nlinfo;
3887 struct net *net = info->nl_net;
3888 struct sk_buff *skb = NULL;
3889 struct fib6_table *table;
3890 int err = -ENOENT;
3891
3892 if (rt == net->ipv6.fib6_null_entry)
3893 goto out_put;
3894 table = rt->fib6_table;
3895 spin_lock_bh(&table->tb6_lock);
3896
3897 if (rt->fib6_nsiblings && cfg->fc_delete_all_nh) {
3898 struct fib6_info *sibling, *next_sibling;
3899 struct fib6_node *fn;
3900
3901 /* prefer to send a single notification with all hops */
3902 skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
3903 if (skb) {
3904 u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
3905
3906 if (rt6_fill_node(net, skb, rt, NULL,
3907 NULL, NULL, 0, RTM_DELROUTE,
3908 info->portid, seq, 0) < 0) {
3909 kfree_skb(skb);
3910 skb = NULL;
3911 } else
3912 info->skip_notify = 1;
3913 }
3914
3915 /* 'rt' points to the first sibling route. If it is not the
3916 * leaf, then we do not need to send a notification. Otherwise,
3917 * we need to check if the last sibling has a next route or not
3918 * and emit a replace or delete notification, respectively.
3919 */
3920 info->skip_notify_kernel = 1;
3921 fn = rcu_dereference_protected(rt->fib6_node,
3922 lockdep_is_held(&table->tb6_lock));
3923 if (rcu_access_pointer(fn->leaf) == rt) {
3924 struct fib6_info *last_sibling, *replace_rt;
3925
3926 last_sibling = list_last_entry(&rt->fib6_siblings,
3927 struct fib6_info,
3928 fib6_siblings);
3929 replace_rt = rcu_dereference_protected(
3930 last_sibling->fib6_next,
3931 lockdep_is_held(&table->tb6_lock));
3932 if (replace_rt)
3933 call_fib6_entry_notifiers_replace(net,
3934 replace_rt);
3935 else
3936 call_fib6_multipath_entry_notifiers(net,
3937 FIB_EVENT_ENTRY_DEL,
3938 rt, rt->fib6_nsiblings,
3939 NULL);
3940 }
3941 list_for_each_entry_safe(sibling, next_sibling,
3942 &rt->fib6_siblings,
3943 fib6_siblings) {
3944 err = fib6_del(sibling, info);
3945 if (err)
3946 goto out_unlock;
3947 }
3948 }
3949
3950 err = fib6_del(rt, info);
3951out_unlock:
3952 spin_unlock_bh(&table->tb6_lock);
3953out_put:
3954 fib6_info_release(rt);
3955
3956 if (skb) {
3957 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
3958 info->nlh, gfp_any());
3959 }
3960 return err;
3961}
3962
3963static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg)
3964{
3965 int rc = -ESRCH;
3966
3967 if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex)
3968 goto out;
3969
3970 if (cfg->fc_flags & RTF_GATEWAY &&
3971 !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
3972 goto out;
3973
3974 rc = rt6_remove_exception_rt(rt);
3975out:
3976 return rc;
3977}
3978
3979static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt,
3980 struct fib6_nh *nh)
3981{
3982 struct fib6_result res = {
3983 .f6i = rt,
3984 .nh = nh,
3985 };
3986 struct rt6_info *rt_cache;
3987
3988 rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src);
3989 if (rt_cache)
3990 return __ip6_del_cached_rt(rt_cache, cfg);
3991
3992 return 0;
3993}
3994
3995struct fib6_nh_del_cached_rt_arg {
3996 struct fib6_config *cfg;
3997 struct fib6_info *f6i;
3998};
3999
4000static int fib6_nh_del_cached_rt(struct fib6_nh *nh, void *_arg)
4001{
4002 struct fib6_nh_del_cached_rt_arg *arg = _arg;
4003 int rc;
4004
4005 rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh);
4006 return rc != -ESRCH ? rc : 0;
4007}
4008
4009static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i)
4010{
4011 struct fib6_nh_del_cached_rt_arg arg = {
4012 .cfg = cfg,
4013 .f6i = f6i
4014 };
4015
4016 return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_del_cached_rt, &arg);
4017}
4018
4019static int ip6_route_del(struct fib6_config *cfg,
4020 struct netlink_ext_ack *extack)
4021{
4022 struct fib6_table *table;
4023 struct fib6_info *rt;
4024 struct fib6_node *fn;
4025 int err = -ESRCH;
4026
4027 table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
4028 if (!table) {
4029 NL_SET_ERR_MSG(extack, "FIB table does not exist");
4030 return err;
4031 }
4032
4033 rcu_read_lock();
4034
4035 fn = fib6_locate(&table->tb6_root,
4036 &cfg->fc_dst, cfg->fc_dst_len,
4037 &cfg->fc_src, cfg->fc_src_len,
4038 !(cfg->fc_flags & RTF_CACHE));
4039
4040 if (fn) {
4041 for_each_fib6_node_rt_rcu(fn) {
4042 struct fib6_nh *nh;
4043
4044 if (rt->nh && cfg->fc_nh_id &&
4045 rt->nh->id != cfg->fc_nh_id)
4046 continue;
4047
4048 if (cfg->fc_flags & RTF_CACHE) {
4049 int rc = 0;
4050
4051 if (rt->nh) {
4052 rc = ip6_del_cached_rt_nh(cfg, rt);
4053 } else if (cfg->fc_nh_id) {
4054 continue;
4055 } else {
4056 nh = rt->fib6_nh;
4057 rc = ip6_del_cached_rt(cfg, rt, nh);
4058 }
4059 if (rc != -ESRCH) {
4060 rcu_read_unlock();
4061 return rc;
4062 }
4063 continue;
4064 }
4065
4066 if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric)
4067 continue;
4068 if (cfg->fc_protocol &&
4069 cfg->fc_protocol != rt->fib6_protocol)
4070 continue;
4071
4072 if (rt->nh) {
4073 if (!fib6_info_hold_safe(rt))
4074 continue;
4075 rcu_read_unlock();
4076
4077 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4078 }
4079 if (cfg->fc_nh_id)
4080 continue;
4081
4082 nh = rt->fib6_nh;
4083 if (cfg->fc_ifindex &&
4084 (!nh->fib_nh_dev ||
4085 nh->fib_nh_dev->ifindex != cfg->fc_ifindex))
4086 continue;
4087 if (cfg->fc_flags & RTF_GATEWAY &&
4088 !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6))
4089 continue;
4090 if (!fib6_info_hold_safe(rt))
4091 continue;
4092 rcu_read_unlock();
4093
4094 /* if gateway was specified only delete the one hop */
4095 if (cfg->fc_flags & RTF_GATEWAY)
4096 return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4097
4098 return __ip6_del_rt_siblings(rt, cfg);
4099 }
4100 }
4101 rcu_read_unlock();
4102
4103 return err;
4104}
4105
4106static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
4107{
4108 struct netevent_redirect netevent;
4109 struct rt6_info *rt, *nrt = NULL;
4110 struct fib6_result res = {};
4111 struct ndisc_options ndopts;
4112 struct inet6_dev *in6_dev;
4113 struct neighbour *neigh;
4114 struct rd_msg *msg;
4115 int optlen, on_link;
4116 u8 *lladdr;
4117
4118 optlen = skb_tail_pointer(skb) - skb_transport_header(skb);
4119 optlen -= sizeof(*msg);
4120
4121 if (optlen < 0) {
4122 net_dbg_ratelimited("rt6_do_redirect: packet too short\n");
4123 return;
4124 }
4125
4126 msg = (struct rd_msg *)icmp6_hdr(skb);
4127
4128 if (ipv6_addr_is_multicast(&msg->dest)) {
4129 net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n");
4130 return;
4131 }
4132
4133 on_link = 0;
4134 if (ipv6_addr_equal(&msg->dest, &msg->target)) {
4135 on_link = 1;
4136 } else if (ipv6_addr_type(&msg->target) !=
4137 (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
4138 net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n");
4139 return;
4140 }
4141
4142 in6_dev = __in6_dev_get(skb->dev);
4143 if (!in6_dev)
4144 return;
4145 if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects)
4146 return;
4147
4148 /* RFC2461 8.1:
4149 * The IP source address of the Redirect MUST be the same as the current
4150 * first-hop router for the specified ICMP Destination Address.
4151 */
4152
4153 if (!ndisc_parse_options(skb->dev, msg->opt, optlen, &ndopts)) {
4154 net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
4155 return;
4156 }
4157
4158 lladdr = NULL;
4159 if (ndopts.nd_opts_tgt_lladdr) {
4160 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
4161 skb->dev);
4162 if (!lladdr) {
4163 net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n");
4164 return;
4165 }
4166 }
4167
4168 rt = (struct rt6_info *) dst;
4169 if (rt->rt6i_flags & RTF_REJECT) {
4170 net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
4171 return;
4172 }
4173
4174 /* Redirect received -> path was valid.
4175 * Look, redirects are sent only in response to data packets,
4176 * so that this nexthop apparently is reachable. --ANK
4177 */
4178 dst_confirm_neigh(&rt->dst, &ipv6_hdr(skb)->saddr);
4179
4180 neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1);
4181 if (!neigh)
4182 return;
4183
4184 /*
4185 * We have finally decided to accept it.
4186 */
4187
4188 ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
4189 NEIGH_UPDATE_F_WEAK_OVERRIDE|
4190 NEIGH_UPDATE_F_OVERRIDE|
4191 (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
4192 NEIGH_UPDATE_F_ISROUTER)),
4193 NDISC_REDIRECT, &ndopts);
4194
4195 rcu_read_lock();
4196 res.f6i = rcu_dereference(rt->from);
4197 if (!res.f6i)
4198 goto out;
4199
4200 if (res.f6i->nh) {
4201 struct fib6_nh_match_arg arg = {
4202 .dev = dst->dev,
4203 .gw = &rt->rt6i_gateway,
4204 };
4205
4206 nexthop_for_each_fib6_nh(res.f6i->nh,
4207 fib6_nh_find_match, &arg);
4208
4209 /* fib6_info uses a nexthop that does not have fib6_nh
4210 * using the dst->dev. Should be impossible
4211 */
4212 if (!arg.match)
4213 goto out;
4214 res.nh = arg.match;
4215 } else {
4216 res.nh = res.f6i->fib6_nh;
4217 }
4218
4219 res.fib6_flags = res.f6i->fib6_flags;
4220 res.fib6_type = res.f6i->fib6_type;
4221 nrt = ip6_rt_cache_alloc(&res, &msg->dest, NULL);
4222 if (!nrt)
4223 goto out;
4224
4225 nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
4226 if (on_link)
4227 nrt->rt6i_flags &= ~RTF_GATEWAY;
4228
4229 nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
4230
4231 /* rt6_insert_exception() will take care of duplicated exceptions */
4232 if (rt6_insert_exception(nrt, &res)) {
4233 dst_release_immediate(&nrt->dst);
4234 goto out;
4235 }
4236
4237 netevent.old = &rt->dst;
4238 netevent.new = &nrt->dst;
4239 netevent.daddr = &msg->dest;
4240 netevent.neigh = neigh;
4241 call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
4242
4243out:
4244 rcu_read_unlock();
4245 neigh_release(neigh);
4246}
4247
4248#ifdef CONFIG_IPV6_ROUTE_INFO
4249static struct fib6_info *rt6_get_route_info(struct net *net,
4250 const struct in6_addr *prefix, int prefixlen,
4251 const struct in6_addr *gwaddr,
4252 struct net_device *dev)
4253{
4254 u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4255 int ifindex = dev->ifindex;
4256 struct fib6_node *fn;
4257 struct fib6_info *rt = NULL;
4258 struct fib6_table *table;
4259
4260 table = fib6_get_table(net, tb_id);
4261 if (!table)
4262 return NULL;
4263
4264 rcu_read_lock();
4265 fn = fib6_locate(&table->tb6_root, prefix, prefixlen, NULL, 0, true);
4266 if (!fn)
4267 goto out;
4268
4269 for_each_fib6_node_rt_rcu(fn) {
4270 /* these routes do not use nexthops */
4271 if (rt->nh)
4272 continue;
4273 if (rt->fib6_nh->fib_nh_dev->ifindex != ifindex)
4274 continue;
4275 if (!(rt->fib6_flags & RTF_ROUTEINFO) ||
4276 !rt->fib6_nh->fib_nh_gw_family)
4277 continue;
4278 if (!ipv6_addr_equal(&rt->fib6_nh->fib_nh_gw6, gwaddr))
4279 continue;
4280 if (!fib6_info_hold_safe(rt))
4281 continue;
4282 break;
4283 }
4284out:
4285 rcu_read_unlock();
4286 return rt;
4287}
4288
4289static struct fib6_info *rt6_add_route_info(struct net *net,
4290 const struct in6_addr *prefix, int prefixlen,
4291 const struct in6_addr *gwaddr,
4292 struct net_device *dev,
4293 unsigned int pref)
4294{
4295 struct fib6_config cfg = {
4296 .fc_metric = IP6_RT_PRIO_USER,
4297 .fc_ifindex = dev->ifindex,
4298 .fc_dst_len = prefixlen,
4299 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
4300 RTF_UP | RTF_PREF(pref),
4301 .fc_protocol = RTPROT_RA,
4302 .fc_type = RTN_UNICAST,
4303 .fc_nlinfo.portid = 0,
4304 .fc_nlinfo.nlh = NULL,
4305 .fc_nlinfo.nl_net = net,
4306 };
4307
4308 cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4309 cfg.fc_dst = *prefix;
4310 cfg.fc_gateway = *gwaddr;
4311
4312 /* We should treat it as a default route if prefix length is 0. */
4313 if (!prefixlen)
4314 cfg.fc_flags |= RTF_DEFAULT;
4315
4316 ip6_route_add(&cfg, GFP_ATOMIC, NULL);
4317
4318 return rt6_get_route_info(net, prefix, prefixlen, gwaddr, dev);
4319}
4320#endif
4321
4322struct fib6_info *rt6_get_dflt_router(struct net *net,
4323 const struct in6_addr *addr,
4324 struct net_device *dev)
4325{
4326 u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
4327 struct fib6_info *rt;
4328 struct fib6_table *table;
4329
4330 table = fib6_get_table(net, tb_id);
4331 if (!table)
4332 return NULL;
4333
4334 rcu_read_lock();
4335 for_each_fib6_node_rt_rcu(&table->tb6_root) {
4336 struct fib6_nh *nh;
4337
4338 /* RA routes do not use nexthops */
4339 if (rt->nh)
4340 continue;
4341
4342 nh = rt->fib6_nh;
4343 if (dev == nh->fib_nh_dev &&
4344 ((rt->fib6_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
4345 ipv6_addr_equal(&nh->fib_nh_gw6, addr))
4346 break;
4347 }
4348 if (rt && !fib6_info_hold_safe(rt))
4349 rt = NULL;
4350 rcu_read_unlock();
4351 return rt;
4352}
4353
4354struct fib6_info *rt6_add_dflt_router(struct net *net,
4355 const struct in6_addr *gwaddr,
4356 struct net_device *dev,
4357 unsigned int pref,
4358 u32 defrtr_usr_metric)
4359{
4360 struct fib6_config cfg = {
4361 .fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT,
4362 .fc_metric = defrtr_usr_metric,
4363 .fc_ifindex = dev->ifindex,
4364 .fc_flags = RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
4365 RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
4366 .fc_protocol = RTPROT_RA,
4367 .fc_type = RTN_UNICAST,
4368 .fc_nlinfo.portid = 0,
4369 .fc_nlinfo.nlh = NULL,
4370 .fc_nlinfo.nl_net = net,
4371 };
4372
4373 cfg.fc_gateway = *gwaddr;
4374
4375 if (!ip6_route_add(&cfg, GFP_ATOMIC, NULL)) {
4376 struct fib6_table *table;
4377
4378 table = fib6_get_table(dev_net(dev), cfg.fc_table);
4379 if (table)
4380 table->flags |= RT6_TABLE_HAS_DFLT_ROUTER;
4381 }
4382
4383 return rt6_get_dflt_router(net, gwaddr, dev);
4384}
4385
4386static void __rt6_purge_dflt_routers(struct net *net,
4387 struct fib6_table *table)
4388{
4389 struct fib6_info *rt;
4390
4391restart:
4392 rcu_read_lock();
4393 for_each_fib6_node_rt_rcu(&table->tb6_root) {
4394 struct net_device *dev = fib6_info_nh_dev(rt);
4395 struct inet6_dev *idev = dev ? __in6_dev_get(dev) : NULL;
4396
4397 if (rt->fib6_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
4398 (!idev || idev->cnf.accept_ra != 2) &&
4399 fib6_info_hold_safe(rt)) {
4400 rcu_read_unlock();
4401 ip6_del_rt(net, rt, false);
4402 goto restart;
4403 }
4404 }
4405 rcu_read_unlock();
4406
4407 table->flags &= ~RT6_TABLE_HAS_DFLT_ROUTER;
4408}
4409
4410void rt6_purge_dflt_routers(struct net *net)
4411{
4412 struct fib6_table *table;
4413 struct hlist_head *head;
4414 unsigned int h;
4415
4416 rcu_read_lock();
4417
4418 for (h = 0; h < FIB6_TABLE_HASHSZ; h++) {
4419 head = &net->ipv6.fib_table_hash[h];
4420 hlist_for_each_entry_rcu(table, head, tb6_hlist) {
4421 if (table->flags & RT6_TABLE_HAS_DFLT_ROUTER)
4422 __rt6_purge_dflt_routers(net, table);
4423 }
4424 }
4425
4426 rcu_read_unlock();
4427}
4428
4429static void rtmsg_to_fib6_config(struct net *net,
4430 struct in6_rtmsg *rtmsg,
4431 struct fib6_config *cfg)
4432{
4433 *cfg = (struct fib6_config){
4434 .fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
4435 : RT6_TABLE_MAIN,
4436 .fc_ifindex = rtmsg->rtmsg_ifindex,
4437 .fc_metric = rtmsg->rtmsg_metric ? : IP6_RT_PRIO_USER,
4438 .fc_expires = rtmsg->rtmsg_info,
4439 .fc_dst_len = rtmsg->rtmsg_dst_len,
4440 .fc_src_len = rtmsg->rtmsg_src_len,
4441 .fc_flags = rtmsg->rtmsg_flags,
4442 .fc_type = rtmsg->rtmsg_type,
4443
4444 .fc_nlinfo.nl_net = net,
4445
4446 .fc_dst = rtmsg->rtmsg_dst,
4447 .fc_src = rtmsg->rtmsg_src,
4448 .fc_gateway = rtmsg->rtmsg_gateway,
4449 };
4450}
4451
4452int ipv6_route_ioctl(struct net *net, unsigned int cmd, struct in6_rtmsg *rtmsg)
4453{
4454 struct fib6_config cfg;
4455 int err;
4456
4457 if (cmd != SIOCADDRT && cmd != SIOCDELRT)
4458 return -EINVAL;
4459 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
4460 return -EPERM;
4461
4462 rtmsg_to_fib6_config(net, rtmsg, &cfg);
4463
4464 rtnl_lock();
4465 switch (cmd) {
4466 case SIOCADDRT:
4467 err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
4468 break;
4469 case SIOCDELRT:
4470 err = ip6_route_del(&cfg, NULL);
4471 break;
4472 }
4473 rtnl_unlock();
4474 return err;
4475}
4476
4477/*
4478 * Drop the packet on the floor
4479 */
4480
4481static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
4482{
4483 struct dst_entry *dst = skb_dst(skb);
4484 struct net *net = dev_net(dst->dev);
4485 struct inet6_dev *idev;
4486 SKB_DR(reason);
4487 int type;
4488
4489 if (netif_is_l3_master(skb->dev) ||
4490 dst->dev == net->loopback_dev)
4491 idev = __in6_dev_get_safely(dev_get_by_index_rcu(net, IP6CB(skb)->iif));
4492 else
4493 idev = ip6_dst_idev(dst);
4494
4495 switch (ipstats_mib_noroutes) {
4496 case IPSTATS_MIB_INNOROUTES:
4497 type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
4498 if (type == IPV6_ADDR_ANY) {
4499 SKB_DR_SET(reason, IP_INADDRERRORS);
4500 IP6_INC_STATS(net, idev, IPSTATS_MIB_INADDRERRORS);
4501 break;
4502 }
4503 SKB_DR_SET(reason, IP_INNOROUTES);
4504 fallthrough;
4505 case IPSTATS_MIB_OUTNOROUTES:
4506 SKB_DR_OR(reason, IP_OUTNOROUTES);
4507 IP6_INC_STATS(net, idev, ipstats_mib_noroutes);
4508 break;
4509 }
4510
4511 /* Start over by dropping the dst for l3mdev case */
4512 if (netif_is_l3_master(skb->dev))
4513 skb_dst_drop(skb);
4514
4515 icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
4516 kfree_skb_reason(skb, reason);
4517 return 0;
4518}
4519
4520static int ip6_pkt_discard(struct sk_buff *skb)
4521{
4522 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
4523}
4524
4525static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
4526{
4527 skb->dev = skb_dst(skb)->dev;
4528 return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
4529}
4530
4531static int ip6_pkt_prohibit(struct sk_buff *skb)
4532{
4533 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
4534}
4535
4536static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb)
4537{
4538 skb->dev = skb_dst(skb)->dev;
4539 return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
4540}
4541
4542/*
4543 * Allocate a dst for local (unicast / anycast) address.
4544 */
4545
4546struct fib6_info *addrconf_f6i_alloc(struct net *net,
4547 struct inet6_dev *idev,
4548 const struct in6_addr *addr,
4549 bool anycast, gfp_t gfp_flags)
4550{
4551 struct fib6_config cfg = {
4552 .fc_table = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL,
4553 .fc_ifindex = idev->dev->ifindex,
4554 .fc_flags = RTF_UP | RTF_NONEXTHOP,
4555 .fc_dst = *addr,
4556 .fc_dst_len = 128,
4557 .fc_protocol = RTPROT_KERNEL,
4558 .fc_nlinfo.nl_net = net,
4559 .fc_ignore_dev_down = true,
4560 };
4561 struct fib6_info *f6i;
4562
4563 if (anycast) {
4564 cfg.fc_type = RTN_ANYCAST;
4565 cfg.fc_flags |= RTF_ANYCAST;
4566 } else {
4567 cfg.fc_type = RTN_LOCAL;
4568 cfg.fc_flags |= RTF_LOCAL;
4569 }
4570
4571 f6i = ip6_route_info_create(&cfg, gfp_flags, NULL);
4572 if (!IS_ERR(f6i)) {
4573 f6i->dst_nocount = true;
4574
4575 if (!anycast &&
4576 (net->ipv6.devconf_all->disable_policy ||
4577 idev->cnf.disable_policy))
4578 f6i->dst_nopolicy = true;
4579 }
4580
4581 return f6i;
4582}
4583
4584/* remove deleted ip from prefsrc entries */
4585struct arg_dev_net_ip {
4586 struct net_device *dev;
4587 struct net *net;
4588 struct in6_addr *addr;
4589};
4590
4591static int fib6_remove_prefsrc(struct fib6_info *rt, void *arg)
4592{
4593 struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
4594 struct net *net = ((struct arg_dev_net_ip *)arg)->net;
4595 struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
4596
4597 if (!rt->nh &&
4598 ((void *)rt->fib6_nh->fib_nh_dev == dev || !dev) &&
4599 rt != net->ipv6.fib6_null_entry &&
4600 ipv6_addr_equal(addr, &rt->fib6_prefsrc.addr)) {
4601 spin_lock_bh(&rt6_exception_lock);
4602 /* remove prefsrc entry */
4603 rt->fib6_prefsrc.plen = 0;
4604 spin_unlock_bh(&rt6_exception_lock);
4605 }
4606 return 0;
4607}
4608
4609void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
4610{
4611 struct net *net = dev_net(ifp->idev->dev);
4612 struct arg_dev_net_ip adni = {
4613 .dev = ifp->idev->dev,
4614 .net = net,
4615 .addr = &ifp->addr,
4616 };
4617 fib6_clean_all(net, fib6_remove_prefsrc, &adni);
4618}
4619
4620#define RTF_RA_ROUTER (RTF_ADDRCONF | RTF_DEFAULT)
4621
4622/* Remove routers and update dst entries when gateway turn into host. */
4623static int fib6_clean_tohost(struct fib6_info *rt, void *arg)
4624{
4625 struct in6_addr *gateway = (struct in6_addr *)arg;
4626 struct fib6_nh *nh;
4627
4628 /* RA routes do not use nexthops */
4629 if (rt->nh)
4630 return 0;
4631
4632 nh = rt->fib6_nh;
4633 if (((rt->fib6_flags & RTF_RA_ROUTER) == RTF_RA_ROUTER) &&
4634 nh->fib_nh_gw_family && ipv6_addr_equal(gateway, &nh->fib_nh_gw6))
4635 return -1;
4636
4637 /* Further clean up cached routes in exception table.
4638 * This is needed because cached route may have a different
4639 * gateway than its 'parent' in the case of an ip redirect.
4640 */
4641 fib6_nh_exceptions_clean_tohost(nh, gateway);
4642
4643 return 0;
4644}
4645
4646void rt6_clean_tohost(struct net *net, struct in6_addr *gateway)
4647{
4648 fib6_clean_all(net, fib6_clean_tohost, gateway);
4649}
4650
4651struct arg_netdev_event {
4652 const struct net_device *dev;
4653 union {
4654 unsigned char nh_flags;
4655 unsigned long event;
4656 };
4657};
4658
4659static struct fib6_info *rt6_multipath_first_sibling(const struct fib6_info *rt)
4660{
4661 struct fib6_info *iter;
4662 struct fib6_node *fn;
4663
4664 fn = rcu_dereference_protected(rt->fib6_node,
4665 lockdep_is_held(&rt->fib6_table->tb6_lock));
4666 iter = rcu_dereference_protected(fn->leaf,
4667 lockdep_is_held(&rt->fib6_table->tb6_lock));
4668 while (iter) {
4669 if (iter->fib6_metric == rt->fib6_metric &&
4670 rt6_qualify_for_ecmp(iter))
4671 return iter;
4672 iter = rcu_dereference_protected(iter->fib6_next,
4673 lockdep_is_held(&rt->fib6_table->tb6_lock));
4674 }
4675
4676 return NULL;
4677}
4678
4679/* only called for fib entries with builtin fib6_nh */
4680static bool rt6_is_dead(const struct fib6_info *rt)
4681{
4682 if (rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD ||
4683 (rt->fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN &&
4684 ip6_ignore_linkdown(rt->fib6_nh->fib_nh_dev)))
4685 return true;
4686
4687 return false;
4688}
4689
4690static int rt6_multipath_total_weight(const struct fib6_info *rt)
4691{
4692 struct fib6_info *iter;
4693 int total = 0;
4694
4695 if (!rt6_is_dead(rt))
4696 total += rt->fib6_nh->fib_nh_weight;
4697
4698 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings) {
4699 if (!rt6_is_dead(iter))
4700 total += iter->fib6_nh->fib_nh_weight;
4701 }
4702
4703 return total;
4704}
4705
4706static void rt6_upper_bound_set(struct fib6_info *rt, int *weight, int total)
4707{
4708 int upper_bound = -1;
4709
4710 if (!rt6_is_dead(rt)) {
4711 *weight += rt->fib6_nh->fib_nh_weight;
4712 upper_bound = DIV_ROUND_CLOSEST_ULL((u64) (*weight) << 31,
4713 total) - 1;
4714 }
4715 atomic_set(&rt->fib6_nh->fib_nh_upper_bound, upper_bound);
4716}
4717
4718static void rt6_multipath_upper_bound_set(struct fib6_info *rt, int total)
4719{
4720 struct fib6_info *iter;
4721 int weight = 0;
4722
4723 rt6_upper_bound_set(rt, &weight, total);
4724
4725 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4726 rt6_upper_bound_set(iter, &weight, total);
4727}
4728
4729void rt6_multipath_rebalance(struct fib6_info *rt)
4730{
4731 struct fib6_info *first;
4732 int total;
4733
4734 /* In case the entire multipath route was marked for flushing,
4735 * then there is no need to rebalance upon the removal of every
4736 * sibling route.
4737 */
4738 if (!rt->fib6_nsiblings || rt->should_flush)
4739 return;
4740
4741 /* During lookup routes are evaluated in order, so we need to
4742 * make sure upper bounds are assigned from the first sibling
4743 * onwards.
4744 */
4745 first = rt6_multipath_first_sibling(rt);
4746 if (WARN_ON_ONCE(!first))
4747 return;
4748
4749 total = rt6_multipath_total_weight(first);
4750 rt6_multipath_upper_bound_set(first, total);
4751}
4752
4753static int fib6_ifup(struct fib6_info *rt, void *p_arg)
4754{
4755 const struct arg_netdev_event *arg = p_arg;
4756 struct net *net = dev_net(arg->dev);
4757
4758 if (rt != net->ipv6.fib6_null_entry && !rt->nh &&
4759 rt->fib6_nh->fib_nh_dev == arg->dev) {
4760 rt->fib6_nh->fib_nh_flags &= ~arg->nh_flags;
4761 fib6_update_sernum_upto_root(net, rt);
4762 rt6_multipath_rebalance(rt);
4763 }
4764
4765 return 0;
4766}
4767
4768void rt6_sync_up(struct net_device *dev, unsigned char nh_flags)
4769{
4770 struct arg_netdev_event arg = {
4771 .dev = dev,
4772 {
4773 .nh_flags = nh_flags,
4774 },
4775 };
4776
4777 if (nh_flags & RTNH_F_DEAD && netif_carrier_ok(dev))
4778 arg.nh_flags |= RTNH_F_LINKDOWN;
4779
4780 fib6_clean_all(dev_net(dev), fib6_ifup, &arg);
4781}
4782
4783/* only called for fib entries with inline fib6_nh */
4784static bool rt6_multipath_uses_dev(const struct fib6_info *rt,
4785 const struct net_device *dev)
4786{
4787 struct fib6_info *iter;
4788
4789 if (rt->fib6_nh->fib_nh_dev == dev)
4790 return true;
4791 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4792 if (iter->fib6_nh->fib_nh_dev == dev)
4793 return true;
4794
4795 return false;
4796}
4797
4798static void rt6_multipath_flush(struct fib6_info *rt)
4799{
4800 struct fib6_info *iter;
4801
4802 rt->should_flush = 1;
4803 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4804 iter->should_flush = 1;
4805}
4806
4807static unsigned int rt6_multipath_dead_count(const struct fib6_info *rt,
4808 const struct net_device *down_dev)
4809{
4810 struct fib6_info *iter;
4811 unsigned int dead = 0;
4812
4813 if (rt->fib6_nh->fib_nh_dev == down_dev ||
4814 rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4815 dead++;
4816 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4817 if (iter->fib6_nh->fib_nh_dev == down_dev ||
4818 iter->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4819 dead++;
4820
4821 return dead;
4822}
4823
4824static void rt6_multipath_nh_flags_set(struct fib6_info *rt,
4825 const struct net_device *dev,
4826 unsigned char nh_flags)
4827{
4828 struct fib6_info *iter;
4829
4830 if (rt->fib6_nh->fib_nh_dev == dev)
4831 rt->fib6_nh->fib_nh_flags |= nh_flags;
4832 list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4833 if (iter->fib6_nh->fib_nh_dev == dev)
4834 iter->fib6_nh->fib_nh_flags |= nh_flags;
4835}
4836
4837/* called with write lock held for table with rt */
4838static int fib6_ifdown(struct fib6_info *rt, void *p_arg)
4839{
4840 const struct arg_netdev_event *arg = p_arg;
4841 const struct net_device *dev = arg->dev;
4842 struct net *net = dev_net(dev);
4843
4844 if (rt == net->ipv6.fib6_null_entry || rt->nh)
4845 return 0;
4846
4847 switch (arg->event) {
4848 case NETDEV_UNREGISTER:
4849 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4850 case NETDEV_DOWN:
4851 if (rt->should_flush)
4852 return -1;
4853 if (!rt->fib6_nsiblings)
4854 return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4855 if (rt6_multipath_uses_dev(rt, dev)) {
4856 unsigned int count;
4857
4858 count = rt6_multipath_dead_count(rt, dev);
4859 if (rt->fib6_nsiblings + 1 == count) {
4860 rt6_multipath_flush(rt);
4861 return -1;
4862 }
4863 rt6_multipath_nh_flags_set(rt, dev, RTNH_F_DEAD |
4864 RTNH_F_LINKDOWN);
4865 fib6_update_sernum(net, rt);
4866 rt6_multipath_rebalance(rt);
4867 }
4868 return -2;
4869 case NETDEV_CHANGE:
4870 if (rt->fib6_nh->fib_nh_dev != dev ||
4871 rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST))
4872 break;
4873 rt->fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
4874 rt6_multipath_rebalance(rt);
4875 break;
4876 }
4877
4878 return 0;
4879}
4880
4881void rt6_sync_down_dev(struct net_device *dev, unsigned long event)
4882{
4883 struct arg_netdev_event arg = {
4884 .dev = dev,
4885 {
4886 .event = event,
4887 },
4888 };
4889 struct net *net = dev_net(dev);
4890
4891 if (net->ipv6.sysctl.skip_notify_on_dev_down)
4892 fib6_clean_all_skip_notify(net, fib6_ifdown, &arg);
4893 else
4894 fib6_clean_all(net, fib6_ifdown, &arg);
4895}
4896
4897void rt6_disable_ip(struct net_device *dev, unsigned long event)
4898{
4899 rt6_sync_down_dev(dev, event);
4900 rt6_uncached_list_flush_dev(dev);
4901 neigh_ifdown(&nd_tbl, dev);
4902}
4903
4904struct rt6_mtu_change_arg {
4905 struct net_device *dev;
4906 unsigned int mtu;
4907 struct fib6_info *f6i;
4908};
4909
4910static int fib6_nh_mtu_change(struct fib6_nh *nh, void *_arg)
4911{
4912 struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *)_arg;
4913 struct fib6_info *f6i = arg->f6i;
4914
4915 /* For administrative MTU increase, there is no way to discover
4916 * IPv6 PMTU increase, so PMTU increase should be updated here.
4917 * Since RFC 1981 doesn't include administrative MTU increase
4918 * update PMTU increase is a MUST. (i.e. jumbo frame)
4919 */
4920 if (nh->fib_nh_dev == arg->dev) {
4921 struct inet6_dev *idev = __in6_dev_get(arg->dev);
4922 u32 mtu = f6i->fib6_pmtu;
4923
4924 if (mtu >= arg->mtu ||
4925 (mtu < arg->mtu && mtu == idev->cnf.mtu6))
4926 fib6_metric_set(f6i, RTAX_MTU, arg->mtu);
4927
4928 spin_lock_bh(&rt6_exception_lock);
4929 rt6_exceptions_update_pmtu(idev, nh, arg->mtu);
4930 spin_unlock_bh(&rt6_exception_lock);
4931 }
4932
4933 return 0;
4934}
4935
4936static int rt6_mtu_change_route(struct fib6_info *f6i, void *p_arg)
4937{
4938 struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
4939 struct inet6_dev *idev;
4940
4941 /* In IPv6 pmtu discovery is not optional,
4942 so that RTAX_MTU lock cannot disable it.
4943 We still use this lock to block changes
4944 caused by addrconf/ndisc.
4945 */
4946
4947 idev = __in6_dev_get(arg->dev);
4948 if (!idev)
4949 return 0;
4950
4951 if (fib6_metric_locked(f6i, RTAX_MTU))
4952 return 0;
4953
4954 arg->f6i = f6i;
4955 if (f6i->nh) {
4956 /* fib6_nh_mtu_change only returns 0, so this is safe */
4957 return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_mtu_change,
4958 arg);
4959 }
4960
4961 return fib6_nh_mtu_change(f6i->fib6_nh, arg);
4962}
4963
4964void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
4965{
4966 struct rt6_mtu_change_arg arg = {
4967 .dev = dev,
4968 .mtu = mtu,
4969 };
4970
4971 fib6_clean_all(dev_net(dev), rt6_mtu_change_route, &arg);
4972}
4973
4974static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
4975 [RTA_UNSPEC] = { .strict_start_type = RTA_DPORT + 1 },
4976 [RTA_GATEWAY] = { .len = sizeof(struct in6_addr) },
4977 [RTA_PREFSRC] = { .len = sizeof(struct in6_addr) },
4978 [RTA_OIF] = { .type = NLA_U32 },
4979 [RTA_IIF] = { .type = NLA_U32 },
4980 [RTA_PRIORITY] = { .type = NLA_U32 },
4981 [RTA_METRICS] = { .type = NLA_NESTED },
4982 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) },
4983 [RTA_PREF] = { .type = NLA_U8 },
4984 [RTA_ENCAP_TYPE] = { .type = NLA_U16 },
4985 [RTA_ENCAP] = { .type = NLA_NESTED },
4986 [RTA_EXPIRES] = { .type = NLA_U32 },
4987 [RTA_UID] = { .type = NLA_U32 },
4988 [RTA_MARK] = { .type = NLA_U32 },
4989 [RTA_TABLE] = { .type = NLA_U32 },
4990 [RTA_IP_PROTO] = { .type = NLA_U8 },
4991 [RTA_SPORT] = { .type = NLA_U16 },
4992 [RTA_DPORT] = { .type = NLA_U16 },
4993 [RTA_NH_ID] = { .type = NLA_U32 },
4994};
4995
4996static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
4997 struct fib6_config *cfg,
4998 struct netlink_ext_ack *extack)
4999{
5000 struct rtmsg *rtm;
5001 struct nlattr *tb[RTA_MAX+1];
5002 unsigned int pref;
5003 int err;
5004
5005 err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
5006 rtm_ipv6_policy, extack);
5007 if (err < 0)
5008 goto errout;
5009
5010 err = -EINVAL;
5011 rtm = nlmsg_data(nlh);
5012
5013 if (rtm->rtm_tos) {
5014 NL_SET_ERR_MSG(extack,
5015 "Invalid dsfield (tos): option not available for IPv6");
5016 goto errout;
5017 }
5018
5019 *cfg = (struct fib6_config){
5020 .fc_table = rtm->rtm_table,
5021 .fc_dst_len = rtm->rtm_dst_len,
5022 .fc_src_len = rtm->rtm_src_len,
5023 .fc_flags = RTF_UP,
5024 .fc_protocol = rtm->rtm_protocol,
5025 .fc_type = rtm->rtm_type,
5026
5027 .fc_nlinfo.portid = NETLINK_CB(skb).portid,
5028 .fc_nlinfo.nlh = nlh,
5029 .fc_nlinfo.nl_net = sock_net(skb->sk),
5030 };
5031
5032 if (rtm->rtm_type == RTN_UNREACHABLE ||
5033 rtm->rtm_type == RTN_BLACKHOLE ||
5034 rtm->rtm_type == RTN_PROHIBIT ||
5035 rtm->rtm_type == RTN_THROW)
5036 cfg->fc_flags |= RTF_REJECT;
5037
5038 if (rtm->rtm_type == RTN_LOCAL)
5039 cfg->fc_flags |= RTF_LOCAL;
5040
5041 if (rtm->rtm_flags & RTM_F_CLONED)
5042 cfg->fc_flags |= RTF_CACHE;
5043
5044 cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK);
5045
5046 if (tb[RTA_NH_ID]) {
5047 if (tb[RTA_GATEWAY] || tb[RTA_OIF] ||
5048 tb[RTA_MULTIPATH] || tb[RTA_ENCAP]) {
5049 NL_SET_ERR_MSG(extack,
5050 "Nexthop specification and nexthop id are mutually exclusive");
5051 goto errout;
5052 }
5053 cfg->fc_nh_id = nla_get_u32(tb[RTA_NH_ID]);
5054 }
5055
5056 if (tb[RTA_GATEWAY]) {
5057 cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
5058 cfg->fc_flags |= RTF_GATEWAY;
5059 }
5060 if (tb[RTA_VIA]) {
5061 NL_SET_ERR_MSG(extack, "IPv6 does not support RTA_VIA attribute");
5062 goto errout;
5063 }
5064
5065 if (tb[RTA_DST]) {
5066 int plen = (rtm->rtm_dst_len + 7) >> 3;
5067
5068 if (nla_len(tb[RTA_DST]) < plen)
5069 goto errout;
5070
5071 nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
5072 }
5073
5074 if (tb[RTA_SRC]) {
5075 int plen = (rtm->rtm_src_len + 7) >> 3;
5076
5077 if (nla_len(tb[RTA_SRC]) < plen)
5078 goto errout;
5079
5080 nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
5081 }
5082
5083 if (tb[RTA_PREFSRC])
5084 cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]);
5085
5086 if (tb[RTA_OIF])
5087 cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
5088
5089 if (tb[RTA_PRIORITY])
5090 cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
5091
5092 if (tb[RTA_METRICS]) {
5093 cfg->fc_mx = nla_data(tb[RTA_METRICS]);
5094 cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
5095 }
5096
5097 if (tb[RTA_TABLE])
5098 cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
5099
5100 if (tb[RTA_MULTIPATH]) {
5101 cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
5102 cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
5103
5104 err = lwtunnel_valid_encap_type_attr(cfg->fc_mp,
5105 cfg->fc_mp_len, extack);
5106 if (err < 0)
5107 goto errout;
5108 }
5109
5110 if (tb[RTA_PREF]) {
5111 pref = nla_get_u8(tb[RTA_PREF]);
5112 if (pref != ICMPV6_ROUTER_PREF_LOW &&
5113 pref != ICMPV6_ROUTER_PREF_HIGH)
5114 pref = ICMPV6_ROUTER_PREF_MEDIUM;
5115 cfg->fc_flags |= RTF_PREF(pref);
5116 }
5117
5118 if (tb[RTA_ENCAP])
5119 cfg->fc_encap = tb[RTA_ENCAP];
5120
5121 if (tb[RTA_ENCAP_TYPE]) {
5122 cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
5123
5124 err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
5125 if (err < 0)
5126 goto errout;
5127 }
5128
5129 if (tb[RTA_EXPIRES]) {
5130 unsigned long timeout = addrconf_timeout_fixup(nla_get_u32(tb[RTA_EXPIRES]), HZ);
5131
5132 if (addrconf_finite_timeout(timeout)) {
5133 cfg->fc_expires = jiffies_to_clock_t(timeout * HZ);
5134 cfg->fc_flags |= RTF_EXPIRES;
5135 }
5136 }
5137
5138 err = 0;
5139errout:
5140 return err;
5141}
5142
5143struct rt6_nh {
5144 struct fib6_info *fib6_info;
5145 struct fib6_config r_cfg;
5146 struct list_head next;
5147};
5148
5149static int ip6_route_info_append(struct net *net,
5150 struct list_head *rt6_nh_list,
5151 struct fib6_info *rt,
5152 struct fib6_config *r_cfg)
5153{
5154 struct rt6_nh *nh;
5155 int err = -EEXIST;
5156
5157 list_for_each_entry(nh, rt6_nh_list, next) {
5158 /* check if fib6_info already exists */
5159 if (rt6_duplicate_nexthop(nh->fib6_info, rt))
5160 return err;
5161 }
5162
5163 nh = kzalloc(sizeof(*nh), GFP_KERNEL);
5164 if (!nh)
5165 return -ENOMEM;
5166 nh->fib6_info = rt;
5167 memcpy(&nh->r_cfg, r_cfg, sizeof(*r_cfg));
5168 list_add_tail(&nh->next, rt6_nh_list);
5169
5170 return 0;
5171}
5172
5173static void ip6_route_mpath_notify(struct fib6_info *rt,
5174 struct fib6_info *rt_last,
5175 struct nl_info *info,
5176 __u16 nlflags)
5177{
5178 /* if this is an APPEND route, then rt points to the first route
5179 * inserted and rt_last points to last route inserted. Userspace
5180 * wants a consistent dump of the route which starts at the first
5181 * nexthop. Since sibling routes are always added at the end of
5182 * the list, find the first sibling of the last route appended
5183 */
5184 if ((nlflags & NLM_F_APPEND) && rt_last && rt_last->fib6_nsiblings) {
5185 rt = list_first_entry(&rt_last->fib6_siblings,
5186 struct fib6_info,
5187 fib6_siblings);
5188 }
5189
5190 if (rt)
5191 inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags);
5192}
5193
5194static bool ip6_route_mpath_should_notify(const struct fib6_info *rt)
5195{
5196 bool rt_can_ecmp = rt6_qualify_for_ecmp(rt);
5197 bool should_notify = false;
5198 struct fib6_info *leaf;
5199 struct fib6_node *fn;
5200
5201 rcu_read_lock();
5202 fn = rcu_dereference(rt->fib6_node);
5203 if (!fn)
5204 goto out;
5205
5206 leaf = rcu_dereference(fn->leaf);
5207 if (!leaf)
5208 goto out;
5209
5210 if (rt == leaf ||
5211 (rt_can_ecmp && rt->fib6_metric == leaf->fib6_metric &&
5212 rt6_qualify_for_ecmp(leaf)))
5213 should_notify = true;
5214out:
5215 rcu_read_unlock();
5216
5217 return should_notify;
5218}
5219
5220static int fib6_gw_from_attr(struct in6_addr *gw, struct nlattr *nla,
5221 struct netlink_ext_ack *extack)
5222{
5223 if (nla_len(nla) < sizeof(*gw)) {
5224 NL_SET_ERR_MSG(extack, "Invalid IPv6 address in RTA_GATEWAY");
5225 return -EINVAL;
5226 }
5227
5228 *gw = nla_get_in6_addr(nla);
5229
5230 return 0;
5231}
5232
5233static int ip6_route_multipath_add(struct fib6_config *cfg,
5234 struct netlink_ext_ack *extack)
5235{
5236 struct fib6_info *rt_notif = NULL, *rt_last = NULL;
5237 struct nl_info *info = &cfg->fc_nlinfo;
5238 struct fib6_config r_cfg;
5239 struct rtnexthop *rtnh;
5240 struct fib6_info *rt;
5241 struct rt6_nh *err_nh;
5242 struct rt6_nh *nh, *nh_safe;
5243 __u16 nlflags;
5244 int remaining;
5245 int attrlen;
5246 int err = 1;
5247 int nhn = 0;
5248 int replace = (cfg->fc_nlinfo.nlh &&
5249 (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
5250 LIST_HEAD(rt6_nh_list);
5251
5252 nlflags = replace ? NLM_F_REPLACE : NLM_F_CREATE;
5253 if (info->nlh && info->nlh->nlmsg_flags & NLM_F_APPEND)
5254 nlflags |= NLM_F_APPEND;
5255
5256 remaining = cfg->fc_mp_len;
5257 rtnh = (struct rtnexthop *)cfg->fc_mp;
5258
5259 /* Parse a Multipath Entry and build a list (rt6_nh_list) of
5260 * fib6_info structs per nexthop
5261 */
5262 while (rtnh_ok(rtnh, remaining)) {
5263 memcpy(&r_cfg, cfg, sizeof(*cfg));
5264 if (rtnh->rtnh_ifindex)
5265 r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
5266
5267 attrlen = rtnh_attrlen(rtnh);
5268 if (attrlen > 0) {
5269 struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
5270
5271 nla = nla_find(attrs, attrlen, RTA_GATEWAY);
5272 if (nla) {
5273 err = fib6_gw_from_attr(&r_cfg.fc_gateway, nla,
5274 extack);
5275 if (err)
5276 goto cleanup;
5277
5278 r_cfg.fc_flags |= RTF_GATEWAY;
5279 }
5280 r_cfg.fc_encap = nla_find(attrs, attrlen, RTA_ENCAP);
5281
5282 /* RTA_ENCAP_TYPE length checked in
5283 * lwtunnel_valid_encap_type_attr
5284 */
5285 nla = nla_find(attrs, attrlen, RTA_ENCAP_TYPE);
5286 if (nla)
5287 r_cfg.fc_encap_type = nla_get_u16(nla);
5288 }
5289
5290 r_cfg.fc_flags |= (rtnh->rtnh_flags & RTNH_F_ONLINK);
5291 rt = ip6_route_info_create(&r_cfg, GFP_KERNEL, extack);
5292 if (IS_ERR(rt)) {
5293 err = PTR_ERR(rt);
5294 rt = NULL;
5295 goto cleanup;
5296 }
5297 if (!rt6_qualify_for_ecmp(rt)) {
5298 err = -EINVAL;
5299 NL_SET_ERR_MSG(extack,
5300 "Device only routes can not be added for IPv6 using the multipath API.");
5301 fib6_info_release(rt);
5302 goto cleanup;
5303 }
5304
5305 rt->fib6_nh->fib_nh_weight = rtnh->rtnh_hops + 1;
5306
5307 err = ip6_route_info_append(info->nl_net, &rt6_nh_list,
5308 rt, &r_cfg);
5309 if (err) {
5310 fib6_info_release(rt);
5311 goto cleanup;
5312 }
5313
5314 rtnh = rtnh_next(rtnh, &remaining);
5315 }
5316
5317 if (list_empty(&rt6_nh_list)) {
5318 NL_SET_ERR_MSG(extack,
5319 "Invalid nexthop configuration - no valid nexthops");
5320 return -EINVAL;
5321 }
5322
5323 /* for add and replace send one notification with all nexthops.
5324 * Skip the notification in fib6_add_rt2node and send one with
5325 * the full route when done
5326 */
5327 info->skip_notify = 1;
5328
5329 /* For add and replace, send one notification with all nexthops. For
5330 * append, send one notification with all appended nexthops.
5331 */
5332 info->skip_notify_kernel = 1;
5333
5334 err_nh = NULL;
5335 list_for_each_entry(nh, &rt6_nh_list, next) {
5336 err = __ip6_ins_rt(nh->fib6_info, info, extack);
5337 fib6_info_release(nh->fib6_info);
5338
5339 if (!err) {
5340 /* save reference to last route successfully inserted */
5341 rt_last = nh->fib6_info;
5342
5343 /* save reference to first route for notification */
5344 if (!rt_notif)
5345 rt_notif = nh->fib6_info;
5346 }
5347
5348 /* nh->fib6_info is used or freed at this point, reset to NULL*/
5349 nh->fib6_info = NULL;
5350 if (err) {
5351 if (replace && nhn)
5352 NL_SET_ERR_MSG_MOD(extack,
5353 "multipath route replace failed (check consistency of installed routes)");
5354 err_nh = nh;
5355 goto add_errout;
5356 }
5357
5358 /* Because each route is added like a single route we remove
5359 * these flags after the first nexthop: if there is a collision,
5360 * we have already failed to add the first nexthop:
5361 * fib6_add_rt2node() has rejected it; when replacing, old
5362 * nexthops have been replaced by first new, the rest should
5363 * be added to it.
5364 */
5365 if (cfg->fc_nlinfo.nlh) {
5366 cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
5367 NLM_F_REPLACE);
5368 cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE;
5369 }
5370 nhn++;
5371 }
5372
5373 /* An in-kernel notification should only be sent in case the new
5374 * multipath route is added as the first route in the node, or if
5375 * it was appended to it. We pass 'rt_notif' since it is the first
5376 * sibling and might allow us to skip some checks in the replace case.
5377 */
5378 if (ip6_route_mpath_should_notify(rt_notif)) {
5379 enum fib_event_type fib_event;
5380
5381 if (rt_notif->fib6_nsiblings != nhn - 1)
5382 fib_event = FIB_EVENT_ENTRY_APPEND;
5383 else
5384 fib_event = FIB_EVENT_ENTRY_REPLACE;
5385
5386 err = call_fib6_multipath_entry_notifiers(info->nl_net,
5387 fib_event, rt_notif,
5388 nhn - 1, extack);
5389 if (err) {
5390 /* Delete all the siblings that were just added */
5391 err_nh = NULL;
5392 goto add_errout;
5393 }
5394 }
5395
5396 /* success ... tell user about new route */
5397 ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
5398 goto cleanup;
5399
5400add_errout:
5401 /* send notification for routes that were added so that
5402 * the delete notifications sent by ip6_route_del are
5403 * coherent
5404 */
5405 if (rt_notif)
5406 ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
5407
5408 /* Delete routes that were already added */
5409 list_for_each_entry(nh, &rt6_nh_list, next) {
5410 if (err_nh == nh)
5411 break;
5412 ip6_route_del(&nh->r_cfg, extack);
5413 }
5414
5415cleanup:
5416 list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
5417 if (nh->fib6_info)
5418 fib6_info_release(nh->fib6_info);
5419 list_del(&nh->next);
5420 kfree(nh);
5421 }
5422
5423 return err;
5424}
5425
5426static int ip6_route_multipath_del(struct fib6_config *cfg,
5427 struct netlink_ext_ack *extack)
5428{
5429 struct fib6_config r_cfg;
5430 struct rtnexthop *rtnh;
5431 int last_err = 0;
5432 int remaining;
5433 int attrlen;
5434 int err;
5435
5436 remaining = cfg->fc_mp_len;
5437 rtnh = (struct rtnexthop *)cfg->fc_mp;
5438
5439 /* Parse a Multipath Entry */
5440 while (rtnh_ok(rtnh, remaining)) {
5441 memcpy(&r_cfg, cfg, sizeof(*cfg));
5442 if (rtnh->rtnh_ifindex)
5443 r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
5444
5445 attrlen = rtnh_attrlen(rtnh);
5446 if (attrlen > 0) {
5447 struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
5448
5449 nla = nla_find(attrs, attrlen, RTA_GATEWAY);
5450 if (nla) {
5451 err = fib6_gw_from_attr(&r_cfg.fc_gateway, nla,
5452 extack);
5453 if (err) {
5454 last_err = err;
5455 goto next_rtnh;
5456 }
5457
5458 r_cfg.fc_flags |= RTF_GATEWAY;
5459 }
5460 }
5461 err = ip6_route_del(&r_cfg, extack);
5462 if (err)
5463 last_err = err;
5464
5465next_rtnh:
5466 rtnh = rtnh_next(rtnh, &remaining);
5467 }
5468
5469 return last_err;
5470}
5471
5472static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh,
5473 struct netlink_ext_ack *extack)
5474{
5475 struct fib6_config cfg;
5476 int err;
5477
5478 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5479 if (err < 0)
5480 return err;
5481
5482 if (cfg.fc_nh_id &&
5483 !nexthop_find_by_id(sock_net(skb->sk), cfg.fc_nh_id)) {
5484 NL_SET_ERR_MSG(extack, "Nexthop id does not exist");
5485 return -EINVAL;
5486 }
5487
5488 if (cfg.fc_mp)
5489 return ip6_route_multipath_del(&cfg, extack);
5490 else {
5491 cfg.fc_delete_all_nh = 1;
5492 return ip6_route_del(&cfg, extack);
5493 }
5494}
5495
5496static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
5497 struct netlink_ext_ack *extack)
5498{
5499 struct fib6_config cfg;
5500 int err;
5501
5502 err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5503 if (err < 0)
5504 return err;
5505
5506 if (cfg.fc_metric == 0)
5507 cfg.fc_metric = IP6_RT_PRIO_USER;
5508
5509 if (cfg.fc_mp)
5510 return ip6_route_multipath_add(&cfg, extack);
5511 else
5512 return ip6_route_add(&cfg, GFP_KERNEL, extack);
5513}
5514
5515/* add the overhead of this fib6_nh to nexthop_len */
5516static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)
5517{
5518 int *nexthop_len = arg;
5519
5520 *nexthop_len += nla_total_size(0) /* RTA_MULTIPATH */
5521 + NLA_ALIGN(sizeof(struct rtnexthop))
5522 + nla_total_size(16); /* RTA_GATEWAY */
5523
5524 if (nh->fib_nh_lws) {
5525 /* RTA_ENCAP_TYPE */
5526 *nexthop_len += lwtunnel_get_encap_size(nh->fib_nh_lws);
5527 /* RTA_ENCAP */
5528 *nexthop_len += nla_total_size(2);
5529 }
5530
5531 return 0;
5532}
5533
5534static size_t rt6_nlmsg_size(struct fib6_info *f6i)
5535{
5536 int nexthop_len;
5537
5538 if (f6i->nh) {
5539 nexthop_len = nla_total_size(4); /* RTA_NH_ID */
5540 nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_nlmsg_size,
5541 &nexthop_len);
5542 } else {
5543 struct fib6_nh *nh = f6i->fib6_nh;
5544
5545 nexthop_len = 0;
5546 if (f6i->fib6_nsiblings) {
5547 nexthop_len = nla_total_size(0) /* RTA_MULTIPATH */
5548 + NLA_ALIGN(sizeof(struct rtnexthop))
5549 + nla_total_size(16) /* RTA_GATEWAY */
5550 + lwtunnel_get_encap_size(nh->fib_nh_lws);
5551
5552 nexthop_len *= f6i->fib6_nsiblings;
5553 }
5554 nexthop_len += lwtunnel_get_encap_size(nh->fib_nh_lws);
5555 }
5556
5557 return NLMSG_ALIGN(sizeof(struct rtmsg))
5558 + nla_total_size(16) /* RTA_SRC */
5559 + nla_total_size(16) /* RTA_DST */
5560 + nla_total_size(16) /* RTA_GATEWAY */
5561 + nla_total_size(16) /* RTA_PREFSRC */
5562 + nla_total_size(4) /* RTA_TABLE */
5563 + nla_total_size(4) /* RTA_IIF */
5564 + nla_total_size(4) /* RTA_OIF */
5565 + nla_total_size(4) /* RTA_PRIORITY */
5566 + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
5567 + nla_total_size(sizeof(struct rta_cacheinfo))
5568 + nla_total_size(TCP_CA_NAME_MAX) /* RTAX_CC_ALGO */
5569 + nla_total_size(1) /* RTA_PREF */
5570 + nexthop_len;
5571}
5572
5573static int rt6_fill_node_nexthop(struct sk_buff *skb, struct nexthop *nh,
5574 unsigned char *flags)
5575{
5576 if (nexthop_is_multipath(nh)) {
5577 struct nlattr *mp;
5578
5579 mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
5580 if (!mp)
5581 goto nla_put_failure;
5582
5583 if (nexthop_mpath_fill_node(skb, nh, AF_INET6))
5584 goto nla_put_failure;
5585
5586 nla_nest_end(skb, mp);
5587 } else {
5588 struct fib6_nh *fib6_nh;
5589
5590 fib6_nh = nexthop_fib6_nh(nh);
5591 if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
5592 flags, false) < 0)
5593 goto nla_put_failure;
5594 }
5595
5596 return 0;
5597
5598nla_put_failure:
5599 return -EMSGSIZE;
5600}
5601
5602static int rt6_fill_node(struct net *net, struct sk_buff *skb,
5603 struct fib6_info *rt, struct dst_entry *dst,
5604 struct in6_addr *dest, struct in6_addr *src,
5605 int iif, int type, u32 portid, u32 seq,
5606 unsigned int flags)
5607{
5608 struct rt6_info *rt6 = (struct rt6_info *)dst;
5609 struct rt6key *rt6_dst, *rt6_src;
5610 u32 *pmetrics, table, rt6_flags;
5611 unsigned char nh_flags = 0;
5612 struct nlmsghdr *nlh;
5613 struct rtmsg *rtm;
5614 long expires = 0;
5615
5616 nlh = nlmsg_put(skb, portid, seq, type, sizeof(*rtm), flags);
5617 if (!nlh)
5618 return -EMSGSIZE;
5619
5620 if (rt6) {
5621 rt6_dst = &rt6->rt6i_dst;
5622 rt6_src = &rt6->rt6i_src;
5623 rt6_flags = rt6->rt6i_flags;
5624 } else {
5625 rt6_dst = &rt->fib6_dst;
5626 rt6_src = &rt->fib6_src;
5627 rt6_flags = rt->fib6_flags;
5628 }
5629
5630 rtm = nlmsg_data(nlh);
5631 rtm->rtm_family = AF_INET6;
5632 rtm->rtm_dst_len = rt6_dst->plen;
5633 rtm->rtm_src_len = rt6_src->plen;
5634 rtm->rtm_tos = 0;
5635 if (rt->fib6_table)
5636 table = rt->fib6_table->tb6_id;
5637 else
5638 table = RT6_TABLE_UNSPEC;
5639 rtm->rtm_table = table < 256 ? table : RT_TABLE_COMPAT;
5640 if (nla_put_u32(skb, RTA_TABLE, table))
5641 goto nla_put_failure;
5642
5643 rtm->rtm_type = rt->fib6_type;
5644 rtm->rtm_flags = 0;
5645 rtm->rtm_scope = RT_SCOPE_UNIVERSE;
5646 rtm->rtm_protocol = rt->fib6_protocol;
5647
5648 if (rt6_flags & RTF_CACHE)
5649 rtm->rtm_flags |= RTM_F_CLONED;
5650
5651 if (dest) {
5652 if (nla_put_in6_addr(skb, RTA_DST, dest))
5653 goto nla_put_failure;
5654 rtm->rtm_dst_len = 128;
5655 } else if (rtm->rtm_dst_len)
5656 if (nla_put_in6_addr(skb, RTA_DST, &rt6_dst->addr))
5657 goto nla_put_failure;
5658#ifdef CONFIG_IPV6_SUBTREES
5659 if (src) {
5660 if (nla_put_in6_addr(skb, RTA_SRC, src))
5661 goto nla_put_failure;
5662 rtm->rtm_src_len = 128;
5663 } else if (rtm->rtm_src_len &&
5664 nla_put_in6_addr(skb, RTA_SRC, &rt6_src->addr))
5665 goto nla_put_failure;
5666#endif
5667 if (iif) {
5668#ifdef CONFIG_IPV6_MROUTE
5669 if (ipv6_addr_is_multicast(&rt6_dst->addr)) {
5670 int err = ip6mr_get_route(net, skb, rtm, portid);
5671
5672 if (err == 0)
5673 return 0;
5674 if (err < 0)
5675 goto nla_put_failure;
5676 } else
5677#endif
5678 if (nla_put_u32(skb, RTA_IIF, iif))
5679 goto nla_put_failure;
5680 } else if (dest) {
5681 struct in6_addr saddr_buf;
5682 if (ip6_route_get_saddr(net, rt, dest, 0, &saddr_buf) == 0 &&
5683 nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
5684 goto nla_put_failure;
5685 }
5686
5687 if (rt->fib6_prefsrc.plen) {
5688 struct in6_addr saddr_buf;
5689 saddr_buf = rt->fib6_prefsrc.addr;
5690 if (nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
5691 goto nla_put_failure;
5692 }
5693
5694 pmetrics = dst ? dst_metrics_ptr(dst) : rt->fib6_metrics->metrics;
5695 if (rtnetlink_put_metrics(skb, pmetrics) < 0)
5696 goto nla_put_failure;
5697
5698 if (nla_put_u32(skb, RTA_PRIORITY, rt->fib6_metric))
5699 goto nla_put_failure;
5700
5701 /* For multipath routes, walk the siblings list and add
5702 * each as a nexthop within RTA_MULTIPATH.
5703 */
5704 if (rt6) {
5705 if (rt6_flags & RTF_GATEWAY &&
5706 nla_put_in6_addr(skb, RTA_GATEWAY, &rt6->rt6i_gateway))
5707 goto nla_put_failure;
5708
5709 if (dst->dev && nla_put_u32(skb, RTA_OIF, dst->dev->ifindex))
5710 goto nla_put_failure;
5711
5712 if (dst->lwtstate &&
5713 lwtunnel_fill_encap(skb, dst->lwtstate, RTA_ENCAP, RTA_ENCAP_TYPE) < 0)
5714 goto nla_put_failure;
5715 } else if (rt->fib6_nsiblings) {
5716 struct fib6_info *sibling, *next_sibling;
5717 struct nlattr *mp;
5718
5719 mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
5720 if (!mp)
5721 goto nla_put_failure;
5722
5723 if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
5724 rt->fib6_nh->fib_nh_weight, AF_INET6,
5725 0) < 0)
5726 goto nla_put_failure;
5727
5728 list_for_each_entry_safe(sibling, next_sibling,
5729 &rt->fib6_siblings, fib6_siblings) {
5730 if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
5731 sibling->fib6_nh->fib_nh_weight,
5732 AF_INET6, 0) < 0)
5733 goto nla_put_failure;
5734 }
5735
5736 nla_nest_end(skb, mp);
5737 } else if (rt->nh) {
5738 if (nla_put_u32(skb, RTA_NH_ID, rt->nh->id))
5739 goto nla_put_failure;
5740
5741 if (nexthop_is_blackhole(rt->nh))
5742 rtm->rtm_type = RTN_BLACKHOLE;
5743
5744 if (READ_ONCE(net->ipv4.sysctl_nexthop_compat_mode) &&
5745 rt6_fill_node_nexthop(skb, rt->nh, &nh_flags) < 0)
5746 goto nla_put_failure;
5747
5748 rtm->rtm_flags |= nh_flags;
5749 } else {
5750 if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
5751 &nh_flags, false) < 0)
5752 goto nla_put_failure;
5753
5754 rtm->rtm_flags |= nh_flags;
5755 }
5756
5757 if (rt6_flags & RTF_EXPIRES) {
5758 expires = dst ? dst->expires : rt->expires;
5759 expires -= jiffies;
5760 }
5761
5762 if (!dst) {
5763 if (READ_ONCE(rt->offload))
5764 rtm->rtm_flags |= RTM_F_OFFLOAD;
5765 if (READ_ONCE(rt->trap))
5766 rtm->rtm_flags |= RTM_F_TRAP;
5767 if (READ_ONCE(rt->offload_failed))
5768 rtm->rtm_flags |= RTM_F_OFFLOAD_FAILED;
5769 }
5770
5771 if (rtnl_put_cacheinfo(skb, dst, 0, expires, dst ? dst->error : 0) < 0)
5772 goto nla_put_failure;
5773
5774 if (nla_put_u8(skb, RTA_PREF, IPV6_EXTRACT_PREF(rt6_flags)))
5775 goto nla_put_failure;
5776
5777
5778 nlmsg_end(skb, nlh);
5779 return 0;
5780
5781nla_put_failure:
5782 nlmsg_cancel(skb, nlh);
5783 return -EMSGSIZE;
5784}
5785
5786static int fib6_info_nh_uses_dev(struct fib6_nh *nh, void *arg)
5787{
5788 const struct net_device *dev = arg;
5789
5790 if (nh->fib_nh_dev == dev)
5791 return 1;
5792
5793 return 0;
5794}
5795
5796static bool fib6_info_uses_dev(const struct fib6_info *f6i,
5797 const struct net_device *dev)
5798{
5799 if (f6i->nh) {
5800 struct net_device *_dev = (struct net_device *)dev;
5801
5802 return !!nexthop_for_each_fib6_nh(f6i->nh,
5803 fib6_info_nh_uses_dev,
5804 _dev);
5805 }
5806
5807 if (f6i->fib6_nh->fib_nh_dev == dev)
5808 return true;
5809
5810 if (f6i->fib6_nsiblings) {
5811 struct fib6_info *sibling, *next_sibling;
5812
5813 list_for_each_entry_safe(sibling, next_sibling,
5814 &f6i->fib6_siblings, fib6_siblings) {
5815 if (sibling->fib6_nh->fib_nh_dev == dev)
5816 return true;
5817 }
5818 }
5819
5820 return false;
5821}
5822
5823struct fib6_nh_exception_dump_walker {
5824 struct rt6_rtnl_dump_arg *dump;
5825 struct fib6_info *rt;
5826 unsigned int flags;
5827 unsigned int skip;
5828 unsigned int count;
5829};
5830
5831static int rt6_nh_dump_exceptions(struct fib6_nh *nh, void *arg)
5832{
5833 struct fib6_nh_exception_dump_walker *w = arg;
5834 struct rt6_rtnl_dump_arg *dump = w->dump;
5835 struct rt6_exception_bucket *bucket;
5836 struct rt6_exception *rt6_ex;
5837 int i, err;
5838
5839 bucket = fib6_nh_get_excptn_bucket(nh, NULL);
5840 if (!bucket)
5841 return 0;
5842
5843 for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
5844 hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
5845 if (w->skip) {
5846 w->skip--;
5847 continue;
5848 }
5849
5850 /* Expiration of entries doesn't bump sernum, insertion
5851 * does. Removal is triggered by insertion, so we can
5852 * rely on the fact that if entries change between two
5853 * partial dumps, this node is scanned again completely,
5854 * see rt6_insert_exception() and fib6_dump_table().
5855 *
5856 * Count expired entries we go through as handled
5857 * entries that we'll skip next time, in case of partial
5858 * node dump. Otherwise, if entries expire meanwhile,
5859 * we'll skip the wrong amount.
5860 */
5861 if (rt6_check_expired(rt6_ex->rt6i)) {
5862 w->count++;
5863 continue;
5864 }
5865
5866 err = rt6_fill_node(dump->net, dump->skb, w->rt,
5867 &rt6_ex->rt6i->dst, NULL, NULL, 0,
5868 RTM_NEWROUTE,
5869 NETLINK_CB(dump->cb->skb).portid,
5870 dump->cb->nlh->nlmsg_seq, w->flags);
5871 if (err)
5872 return err;
5873
5874 w->count++;
5875 }
5876 bucket++;
5877 }
5878
5879 return 0;
5880}
5881
5882/* Return -1 if done with node, number of handled routes on partial dump */
5883int rt6_dump_route(struct fib6_info *rt, void *p_arg, unsigned int skip)
5884{
5885 struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
5886 struct fib_dump_filter *filter = &arg->filter;
5887 unsigned int flags = NLM_F_MULTI;
5888 struct net *net = arg->net;
5889 int count = 0;
5890
5891 if (rt == net->ipv6.fib6_null_entry)
5892 return -1;
5893
5894 if ((filter->flags & RTM_F_PREFIX) &&
5895 !(rt->fib6_flags & RTF_PREFIX_RT)) {
5896 /* success since this is not a prefix route */
5897 return -1;
5898 }
5899 if (filter->filter_set &&
5900 ((filter->rt_type && rt->fib6_type != filter->rt_type) ||
5901 (filter->dev && !fib6_info_uses_dev(rt, filter->dev)) ||
5902 (filter->protocol && rt->fib6_protocol != filter->protocol))) {
5903 return -1;
5904 }
5905
5906 if (filter->filter_set ||
5907 !filter->dump_routes || !filter->dump_exceptions) {
5908 flags |= NLM_F_DUMP_FILTERED;
5909 }
5910
5911 if (filter->dump_routes) {
5912 if (skip) {
5913 skip--;
5914 } else {
5915 if (rt6_fill_node(net, arg->skb, rt, NULL, NULL, NULL,
5916 0, RTM_NEWROUTE,
5917 NETLINK_CB(arg->cb->skb).portid,
5918 arg->cb->nlh->nlmsg_seq, flags)) {
5919 return 0;
5920 }
5921 count++;
5922 }
5923 }
5924
5925 if (filter->dump_exceptions) {
5926 struct fib6_nh_exception_dump_walker w = { .dump = arg,
5927 .rt = rt,
5928 .flags = flags,
5929 .skip = skip,
5930 .count = 0 };
5931 int err;
5932
5933 rcu_read_lock();
5934 if (rt->nh) {
5935 err = nexthop_for_each_fib6_nh(rt->nh,
5936 rt6_nh_dump_exceptions,
5937 &w);
5938 } else {
5939 err = rt6_nh_dump_exceptions(rt->fib6_nh, &w);
5940 }
5941 rcu_read_unlock();
5942
5943 if (err)
5944 return count + w.count;
5945 }
5946
5947 return -1;
5948}
5949
5950static int inet6_rtm_valid_getroute_req(struct sk_buff *skb,
5951 const struct nlmsghdr *nlh,
5952 struct nlattr **tb,
5953 struct netlink_ext_ack *extack)
5954{
5955 struct rtmsg *rtm;
5956 int i, err;
5957
5958 if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) {
5959 NL_SET_ERR_MSG_MOD(extack,
5960 "Invalid header for get route request");
5961 return -EINVAL;
5962 }
5963
5964 if (!netlink_strict_get_check(skb))
5965 return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
5966 rtm_ipv6_policy, extack);
5967
5968 rtm = nlmsg_data(nlh);
5969 if ((rtm->rtm_src_len && rtm->rtm_src_len != 128) ||
5970 (rtm->rtm_dst_len && rtm->rtm_dst_len != 128) ||
5971 rtm->rtm_table || rtm->rtm_protocol || rtm->rtm_scope ||
5972 rtm->rtm_type) {
5973 NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for get route request");
5974 return -EINVAL;
5975 }
5976 if (rtm->rtm_flags & ~RTM_F_FIB_MATCH) {
5977 NL_SET_ERR_MSG_MOD(extack,
5978 "Invalid flags for get route request");
5979 return -EINVAL;
5980 }
5981
5982 err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
5983 rtm_ipv6_policy, extack);
5984 if (err)
5985 return err;
5986
5987 if ((tb[RTA_SRC] && !rtm->rtm_src_len) ||
5988 (tb[RTA_DST] && !rtm->rtm_dst_len)) {
5989 NL_SET_ERR_MSG_MOD(extack, "rtm_src_len and rtm_dst_len must be 128 for IPv6");
5990 return -EINVAL;
5991 }
5992
5993 for (i = 0; i <= RTA_MAX; i++) {
5994 if (!tb[i])
5995 continue;
5996
5997 switch (i) {
5998 case RTA_SRC:
5999 case RTA_DST:
6000 case RTA_IIF:
6001 case RTA_OIF:
6002 case RTA_MARK:
6003 case RTA_UID:
6004 case RTA_SPORT:
6005 case RTA_DPORT:
6006 case RTA_IP_PROTO:
6007 break;
6008 default:
6009 NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in get route request");
6010 return -EINVAL;
6011 }
6012 }
6013
6014 return 0;
6015}
6016
6017static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
6018 struct netlink_ext_ack *extack)
6019{
6020 struct net *net = sock_net(in_skb->sk);
6021 struct nlattr *tb[RTA_MAX+1];
6022 int err, iif = 0, oif = 0;
6023 struct fib6_info *from;
6024 struct dst_entry *dst;
6025 struct rt6_info *rt;
6026 struct sk_buff *skb;
6027 struct rtmsg *rtm;
6028 struct flowi6 fl6 = {};
6029 bool fibmatch;
6030
6031 err = inet6_rtm_valid_getroute_req(in_skb, nlh, tb, extack);
6032 if (err < 0)
6033 goto errout;
6034
6035 err = -EINVAL;
6036 rtm = nlmsg_data(nlh);
6037 fl6.flowlabel = ip6_make_flowinfo(rtm->rtm_tos, 0);
6038 fibmatch = !!(rtm->rtm_flags & RTM_F_FIB_MATCH);
6039
6040 if (tb[RTA_SRC]) {
6041 if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
6042 goto errout;
6043
6044 fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
6045 }
6046
6047 if (tb[RTA_DST]) {
6048 if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
6049 goto errout;
6050
6051 fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
6052 }
6053
6054 if (tb[RTA_IIF])
6055 iif = nla_get_u32(tb[RTA_IIF]);
6056
6057 if (tb[RTA_OIF])
6058 oif = nla_get_u32(tb[RTA_OIF]);
6059
6060 if (tb[RTA_MARK])
6061 fl6.flowi6_mark = nla_get_u32(tb[RTA_MARK]);
6062
6063 if (tb[RTA_UID])
6064 fl6.flowi6_uid = make_kuid(current_user_ns(),
6065 nla_get_u32(tb[RTA_UID]));
6066 else
6067 fl6.flowi6_uid = iif ? INVALID_UID : current_uid();
6068
6069 if (tb[RTA_SPORT])
6070 fl6.fl6_sport = nla_get_be16(tb[RTA_SPORT]);
6071
6072 if (tb[RTA_DPORT])
6073 fl6.fl6_dport = nla_get_be16(tb[RTA_DPORT]);
6074
6075 if (tb[RTA_IP_PROTO]) {
6076 err = rtm_getroute_parse_ip_proto(tb[RTA_IP_PROTO],
6077 &fl6.flowi6_proto, AF_INET6,
6078 extack);
6079 if (err)
6080 goto errout;
6081 }
6082
6083 if (iif) {
6084 struct net_device *dev;
6085 int flags = 0;
6086
6087 rcu_read_lock();
6088
6089 dev = dev_get_by_index_rcu(net, iif);
6090 if (!dev) {
6091 rcu_read_unlock();
6092 err = -ENODEV;
6093 goto errout;
6094 }
6095
6096 fl6.flowi6_iif = iif;
6097
6098 if (!ipv6_addr_any(&fl6.saddr))
6099 flags |= RT6_LOOKUP_F_HAS_SADDR;
6100
6101 dst = ip6_route_input_lookup(net, dev, &fl6, NULL, flags);
6102
6103 rcu_read_unlock();
6104 } else {
6105 fl6.flowi6_oif = oif;
6106
6107 dst = ip6_route_output(net, NULL, &fl6);
6108 }
6109
6110
6111 rt = container_of(dst, struct rt6_info, dst);
6112 if (rt->dst.error) {
6113 err = rt->dst.error;
6114 ip6_rt_put(rt);
6115 goto errout;
6116 }
6117
6118 if (rt == net->ipv6.ip6_null_entry) {
6119 err = rt->dst.error;
6120 ip6_rt_put(rt);
6121 goto errout;
6122 }
6123
6124 skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
6125 if (!skb) {
6126 ip6_rt_put(rt);
6127 err = -ENOBUFS;
6128 goto errout;
6129 }
6130
6131 skb_dst_set(skb, &rt->dst);
6132
6133 rcu_read_lock();
6134 from = rcu_dereference(rt->from);
6135 if (from) {
6136 if (fibmatch)
6137 err = rt6_fill_node(net, skb, from, NULL, NULL, NULL,
6138 iif, RTM_NEWROUTE,
6139 NETLINK_CB(in_skb).portid,
6140 nlh->nlmsg_seq, 0);
6141 else
6142 err = rt6_fill_node(net, skb, from, dst, &fl6.daddr,
6143 &fl6.saddr, iif, RTM_NEWROUTE,
6144 NETLINK_CB(in_skb).portid,
6145 nlh->nlmsg_seq, 0);
6146 } else {
6147 err = -ENETUNREACH;
6148 }
6149 rcu_read_unlock();
6150
6151 if (err < 0) {
6152 kfree_skb(skb);
6153 goto errout;
6154 }
6155
6156 err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
6157errout:
6158 return err;
6159}
6160
6161void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
6162 unsigned int nlm_flags)
6163{
6164 struct sk_buff *skb;
6165 struct net *net = info->nl_net;
6166 u32 seq;
6167 int err;
6168
6169 err = -ENOBUFS;
6170 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
6171
6172 skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
6173 if (!skb)
6174 goto errout;
6175
6176 err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
6177 event, info->portid, seq, nlm_flags);
6178 if (err < 0) {
6179 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6180 WARN_ON(err == -EMSGSIZE);
6181 kfree_skb(skb);
6182 goto errout;
6183 }
6184 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
6185 info->nlh, gfp_any());
6186 return;
6187errout:
6188 if (err < 0)
6189 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6190}
6191
6192void fib6_rt_update(struct net *net, struct fib6_info *rt,
6193 struct nl_info *info)
6194{
6195 u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
6196 struct sk_buff *skb;
6197 int err = -ENOBUFS;
6198
6199 skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
6200 if (!skb)
6201 goto errout;
6202
6203 err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
6204 RTM_NEWROUTE, info->portid, seq, NLM_F_REPLACE);
6205 if (err < 0) {
6206 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6207 WARN_ON(err == -EMSGSIZE);
6208 kfree_skb(skb);
6209 goto errout;
6210 }
6211 rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
6212 info->nlh, gfp_any());
6213 return;
6214errout:
6215 if (err < 0)
6216 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6217}
6218
6219void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
6220 bool offload, bool trap, bool offload_failed)
6221{
6222 struct sk_buff *skb;
6223 int err;
6224
6225 if (READ_ONCE(f6i->offload) == offload &&
6226 READ_ONCE(f6i->trap) == trap &&
6227 READ_ONCE(f6i->offload_failed) == offload_failed)
6228 return;
6229
6230 WRITE_ONCE(f6i->offload, offload);
6231 WRITE_ONCE(f6i->trap, trap);
6232
6233 /* 2 means send notifications only if offload_failed was changed. */
6234 if (net->ipv6.sysctl.fib_notify_on_flag_change == 2 &&
6235 READ_ONCE(f6i->offload_failed) == offload_failed)
6236 return;
6237
6238 WRITE_ONCE(f6i->offload_failed, offload_failed);
6239
6240 if (!rcu_access_pointer(f6i->fib6_node))
6241 /* The route was removed from the tree, do not send
6242 * notification.
6243 */
6244 return;
6245
6246 if (!net->ipv6.sysctl.fib_notify_on_flag_change)
6247 return;
6248
6249 skb = nlmsg_new(rt6_nlmsg_size(f6i), GFP_KERNEL);
6250 if (!skb) {
6251 err = -ENOBUFS;
6252 goto errout;
6253 }
6254
6255 err = rt6_fill_node(net, skb, f6i, NULL, NULL, NULL, 0, RTM_NEWROUTE, 0,
6256 0, 0);
6257 if (err < 0) {
6258 /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6259 WARN_ON(err == -EMSGSIZE);
6260 kfree_skb(skb);
6261 goto errout;
6262 }
6263
6264 rtnl_notify(skb, net, 0, RTNLGRP_IPV6_ROUTE, NULL, GFP_KERNEL);
6265 return;
6266
6267errout:
6268 rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6269}
6270EXPORT_SYMBOL(fib6_info_hw_flags_set);
6271
6272static int ip6_route_dev_notify(struct notifier_block *this,
6273 unsigned long event, void *ptr)
6274{
6275 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
6276 struct net *net = dev_net(dev);
6277
6278 if (!(dev->flags & IFF_LOOPBACK))
6279 return NOTIFY_OK;
6280
6281 if (event == NETDEV_REGISTER) {
6282 net->ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = dev;
6283 net->ipv6.ip6_null_entry->dst.dev = dev;
6284 net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
6285#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6286 net->ipv6.ip6_prohibit_entry->dst.dev = dev;
6287 net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
6288 net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
6289 net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
6290#endif
6291 } else if (event == NETDEV_UNREGISTER &&
6292 dev->reg_state != NETREG_UNREGISTERED) {
6293 /* NETDEV_UNREGISTER could be fired for multiple times by
6294 * netdev_wait_allrefs(). Make sure we only call this once.
6295 */
6296 in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
6297#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6298 in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
6299 in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
6300#endif
6301 }
6302
6303 return NOTIFY_OK;
6304}
6305
6306/*
6307 * /proc
6308 */
6309
6310#ifdef CONFIG_PROC_FS
6311static int rt6_stats_seq_show(struct seq_file *seq, void *v)
6312{
6313 struct net *net = (struct net *)seq->private;
6314 seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
6315 net->ipv6.rt6_stats->fib_nodes,
6316 net->ipv6.rt6_stats->fib_route_nodes,
6317 atomic_read(&net->ipv6.rt6_stats->fib_rt_alloc),
6318 net->ipv6.rt6_stats->fib_rt_entries,
6319 net->ipv6.rt6_stats->fib_rt_cache,
6320 dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
6321 net->ipv6.rt6_stats->fib_discarded_routes);
6322
6323 return 0;
6324}
6325#endif /* CONFIG_PROC_FS */
6326
6327#ifdef CONFIG_SYSCTL
6328
6329static int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write,
6330 void *buffer, size_t *lenp, loff_t *ppos)
6331{
6332 struct net *net;
6333 int delay;
6334 int ret;
6335 if (!write)
6336 return -EINVAL;
6337
6338 net = (struct net *)ctl->extra1;
6339 delay = net->ipv6.sysctl.flush_delay;
6340 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
6341 if (ret)
6342 return ret;
6343
6344 fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
6345 return 0;
6346}
6347
6348static struct ctl_table ipv6_route_table_template[] = {
6349 {
6350 .procname = "max_size",
6351 .data = &init_net.ipv6.sysctl.ip6_rt_max_size,
6352 .maxlen = sizeof(int),
6353 .mode = 0644,
6354 .proc_handler = proc_dointvec,
6355 },
6356 {
6357 .procname = "gc_thresh",
6358 .data = &ip6_dst_ops_template.gc_thresh,
6359 .maxlen = sizeof(int),
6360 .mode = 0644,
6361 .proc_handler = proc_dointvec,
6362 },
6363 {
6364 .procname = "flush",
6365 .data = &init_net.ipv6.sysctl.flush_delay,
6366 .maxlen = sizeof(int),
6367 .mode = 0200,
6368 .proc_handler = ipv6_sysctl_rtcache_flush
6369 },
6370 {
6371 .procname = "gc_min_interval",
6372 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
6373 .maxlen = sizeof(int),
6374 .mode = 0644,
6375 .proc_handler = proc_dointvec_jiffies,
6376 },
6377 {
6378 .procname = "gc_timeout",
6379 .data = &init_net.ipv6.sysctl.ip6_rt_gc_timeout,
6380 .maxlen = sizeof(int),
6381 .mode = 0644,
6382 .proc_handler = proc_dointvec_jiffies,
6383 },
6384 {
6385 .procname = "gc_interval",
6386 .data = &init_net.ipv6.sysctl.ip6_rt_gc_interval,
6387 .maxlen = sizeof(int),
6388 .mode = 0644,
6389 .proc_handler = proc_dointvec_jiffies,
6390 },
6391 {
6392 .procname = "gc_elasticity",
6393 .data = &init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
6394 .maxlen = sizeof(int),
6395 .mode = 0644,
6396 .proc_handler = proc_dointvec,
6397 },
6398 {
6399 .procname = "mtu_expires",
6400 .data = &init_net.ipv6.sysctl.ip6_rt_mtu_expires,
6401 .maxlen = sizeof(int),
6402 .mode = 0644,
6403 .proc_handler = proc_dointvec_jiffies,
6404 },
6405 {
6406 .procname = "min_adv_mss",
6407 .data = &init_net.ipv6.sysctl.ip6_rt_min_advmss,
6408 .maxlen = sizeof(int),
6409 .mode = 0644,
6410 .proc_handler = proc_dointvec,
6411 },
6412 {
6413 .procname = "gc_min_interval_ms",
6414 .data = &init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
6415 .maxlen = sizeof(int),
6416 .mode = 0644,
6417 .proc_handler = proc_dointvec_ms_jiffies,
6418 },
6419 {
6420 .procname = "skip_notify_on_dev_down",
6421 .data = &init_net.ipv6.sysctl.skip_notify_on_dev_down,
6422 .maxlen = sizeof(int),
6423 .mode = 0644,
6424 .proc_handler = proc_dointvec_minmax,
6425 .extra1 = SYSCTL_ZERO,
6426 .extra2 = SYSCTL_ONE,
6427 },
6428 { }
6429};
6430
6431struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
6432{
6433 struct ctl_table *table;
6434
6435 table = kmemdup(ipv6_route_table_template,
6436 sizeof(ipv6_route_table_template),
6437 GFP_KERNEL);
6438
6439 if (table) {
6440 table[0].data = &net->ipv6.sysctl.ip6_rt_max_size;
6441 table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
6442 table[2].data = &net->ipv6.sysctl.flush_delay;
6443 table[2].extra1 = net;
6444 table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
6445 table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
6446 table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
6447 table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
6448 table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
6449 table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
6450 table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
6451 table[10].data = &net->ipv6.sysctl.skip_notify_on_dev_down;
6452
6453 /* Don't export sysctls to unprivileged users */
6454 if (net->user_ns != &init_user_ns)
6455 table[1].procname = NULL;
6456 }
6457
6458 return table;
6459}
6460#endif
6461
6462static int __net_init ip6_route_net_init(struct net *net)
6463{
6464 int ret = -ENOMEM;
6465
6466 memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
6467 sizeof(net->ipv6.ip6_dst_ops));
6468
6469 if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
6470 goto out_ip6_dst_ops;
6471
6472 net->ipv6.fib6_null_entry = fib6_info_alloc(GFP_KERNEL, true);
6473 if (!net->ipv6.fib6_null_entry)
6474 goto out_ip6_dst_entries;
6475 memcpy(net->ipv6.fib6_null_entry, &fib6_null_entry_template,
6476 sizeof(*net->ipv6.fib6_null_entry));
6477
6478 net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
6479 sizeof(*net->ipv6.ip6_null_entry),
6480 GFP_KERNEL);
6481 if (!net->ipv6.ip6_null_entry)
6482 goto out_fib6_null_entry;
6483 net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6484 dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
6485 ip6_template_metrics, true);
6486 INIT_LIST_HEAD(&net->ipv6.ip6_null_entry->rt6i_uncached);
6487
6488#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6489 net->ipv6.fib6_has_custom_rules = false;
6490 net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
6491 sizeof(*net->ipv6.ip6_prohibit_entry),
6492 GFP_KERNEL);
6493 if (!net->ipv6.ip6_prohibit_entry)
6494 goto out_ip6_null_entry;
6495 net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6496 dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
6497 ip6_template_metrics, true);
6498 INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached);
6499
6500 net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
6501 sizeof(*net->ipv6.ip6_blk_hole_entry),
6502 GFP_KERNEL);
6503 if (!net->ipv6.ip6_blk_hole_entry)
6504 goto out_ip6_prohibit_entry;
6505 net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6506 dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
6507 ip6_template_metrics, true);
6508 INIT_LIST_HEAD(&net->ipv6.ip6_blk_hole_entry->rt6i_uncached);
6509#ifdef CONFIG_IPV6_SUBTREES
6510 net->ipv6.fib6_routes_require_src = 0;
6511#endif
6512#endif
6513
6514 net->ipv6.sysctl.flush_delay = 0;
6515 net->ipv6.sysctl.ip6_rt_max_size = 4096;
6516 net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
6517 net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
6518 net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
6519 net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
6520 net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
6521 net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
6522 net->ipv6.sysctl.skip_notify_on_dev_down = 0;
6523
6524 atomic_set(&net->ipv6.ip6_rt_gc_expire, 30*HZ);
6525
6526 ret = 0;
6527out:
6528 return ret;
6529
6530#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6531out_ip6_prohibit_entry:
6532 kfree(net->ipv6.ip6_prohibit_entry);
6533out_ip6_null_entry:
6534 kfree(net->ipv6.ip6_null_entry);
6535#endif
6536out_fib6_null_entry:
6537 kfree(net->ipv6.fib6_null_entry);
6538out_ip6_dst_entries:
6539 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
6540out_ip6_dst_ops:
6541 goto out;
6542}
6543
6544static void __net_exit ip6_route_net_exit(struct net *net)
6545{
6546 kfree(net->ipv6.fib6_null_entry);
6547 kfree(net->ipv6.ip6_null_entry);
6548#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6549 kfree(net->ipv6.ip6_prohibit_entry);
6550 kfree(net->ipv6.ip6_blk_hole_entry);
6551#endif
6552 dst_entries_destroy(&net->ipv6.ip6_dst_ops);
6553}
6554
6555static int __net_init ip6_route_net_init_late(struct net *net)
6556{
6557#ifdef CONFIG_PROC_FS
6558 if (!proc_create_net("ipv6_route", 0, net->proc_net,
6559 &ipv6_route_seq_ops,
6560 sizeof(struct ipv6_route_iter)))
6561 return -ENOMEM;
6562
6563 if (!proc_create_net_single("rt6_stats", 0444, net->proc_net,
6564 rt6_stats_seq_show, NULL)) {
6565 remove_proc_entry("ipv6_route", net->proc_net);
6566 return -ENOMEM;
6567 }
6568#endif
6569 return 0;
6570}
6571
6572static void __net_exit ip6_route_net_exit_late(struct net *net)
6573{
6574#ifdef CONFIG_PROC_FS
6575 remove_proc_entry("ipv6_route", net->proc_net);
6576 remove_proc_entry("rt6_stats", net->proc_net);
6577#endif
6578}
6579
6580static struct pernet_operations ip6_route_net_ops = {
6581 .init = ip6_route_net_init,
6582 .exit = ip6_route_net_exit,
6583};
6584
6585static int __net_init ipv6_inetpeer_init(struct net *net)
6586{
6587 struct inet_peer_base *bp = kmalloc(sizeof(*bp), GFP_KERNEL);
6588
6589 if (!bp)
6590 return -ENOMEM;
6591 inet_peer_base_init(bp);
6592 net->ipv6.peers = bp;
6593 return 0;
6594}
6595
6596static void __net_exit ipv6_inetpeer_exit(struct net *net)
6597{
6598 struct inet_peer_base *bp = net->ipv6.peers;
6599
6600 net->ipv6.peers = NULL;
6601 inetpeer_invalidate_tree(bp);
6602 kfree(bp);
6603}
6604
6605static struct pernet_operations ipv6_inetpeer_ops = {
6606 .init = ipv6_inetpeer_init,
6607 .exit = ipv6_inetpeer_exit,
6608};
6609
6610static struct pernet_operations ip6_route_net_late_ops = {
6611 .init = ip6_route_net_init_late,
6612 .exit = ip6_route_net_exit_late,
6613};
6614
6615static struct notifier_block ip6_route_dev_notifier = {
6616 .notifier_call = ip6_route_dev_notify,
6617 .priority = ADDRCONF_NOTIFY_PRIORITY - 10,
6618};
6619
6620void __init ip6_route_init_special_entries(void)
6621{
6622 /* Registering of the loopback is done before this portion of code,
6623 * the loopback reference in rt6_info will not be taken, do it
6624 * manually for init_net */
6625 init_net.ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = init_net.loopback_dev;
6626 init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
6627 init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6628 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
6629 init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
6630 init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6631 init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
6632 init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6633 #endif
6634}
6635
6636#if IS_BUILTIN(CONFIG_IPV6)
6637#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6638DEFINE_BPF_ITER_FUNC(ipv6_route, struct bpf_iter_meta *meta, struct fib6_info *rt)
6639
6640BTF_ID_LIST(btf_fib6_info_id)
6641BTF_ID(struct, fib6_info)
6642
6643static const struct bpf_iter_seq_info ipv6_route_seq_info = {
6644 .seq_ops = &ipv6_route_seq_ops,
6645 .init_seq_private = bpf_iter_init_seq_net,
6646 .fini_seq_private = bpf_iter_fini_seq_net,
6647 .seq_priv_size = sizeof(struct ipv6_route_iter),
6648};
6649
6650static struct bpf_iter_reg ipv6_route_reg_info = {
6651 .target = "ipv6_route",
6652 .ctx_arg_info_size = 1,
6653 .ctx_arg_info = {
6654 { offsetof(struct bpf_iter__ipv6_route, rt),
6655 PTR_TO_BTF_ID_OR_NULL },
6656 },
6657 .seq_info = &ipv6_route_seq_info,
6658};
6659
6660static int __init bpf_iter_register(void)
6661{
6662 ipv6_route_reg_info.ctx_arg_info[0].btf_id = *btf_fib6_info_id;
6663 return bpf_iter_reg_target(&ipv6_route_reg_info);
6664}
6665
6666static void bpf_iter_unregister(void)
6667{
6668 bpf_iter_unreg_target(&ipv6_route_reg_info);
6669}
6670#endif
6671#endif
6672
6673int __init ip6_route_init(void)
6674{
6675 int ret;
6676 int cpu;
6677
6678 ret = -ENOMEM;
6679 ip6_dst_ops_template.kmem_cachep =
6680 kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
6681 SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, NULL);
6682 if (!ip6_dst_ops_template.kmem_cachep)
6683 goto out;
6684
6685 ret = dst_entries_init(&ip6_dst_blackhole_ops);
6686 if (ret)
6687 goto out_kmem_cache;
6688
6689 ret = register_pernet_subsys(&ipv6_inetpeer_ops);
6690 if (ret)
6691 goto out_dst_entries;
6692
6693 ret = register_pernet_subsys(&ip6_route_net_ops);
6694 if (ret)
6695 goto out_register_inetpeer;
6696
6697 ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
6698
6699 ret = fib6_init();
6700 if (ret)
6701 goto out_register_subsys;
6702
6703 ret = xfrm6_init();
6704 if (ret)
6705 goto out_fib6_init;
6706
6707 ret = fib6_rules_init();
6708 if (ret)
6709 goto xfrm6_init;
6710
6711 ret = register_pernet_subsys(&ip6_route_net_late_ops);
6712 if (ret)
6713 goto fib6_rules_init;
6714
6715 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWROUTE,
6716 inet6_rtm_newroute, NULL, 0);
6717 if (ret < 0)
6718 goto out_register_late_subsys;
6719
6720 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELROUTE,
6721 inet6_rtm_delroute, NULL, 0);
6722 if (ret < 0)
6723 goto out_register_late_subsys;
6724
6725 ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE,
6726 inet6_rtm_getroute, NULL,
6727 RTNL_FLAG_DOIT_UNLOCKED);
6728 if (ret < 0)
6729 goto out_register_late_subsys;
6730
6731 ret = register_netdevice_notifier(&ip6_route_dev_notifier);
6732 if (ret)
6733 goto out_register_late_subsys;
6734
6735#if IS_BUILTIN(CONFIG_IPV6)
6736#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6737 ret = bpf_iter_register();
6738 if (ret)
6739 goto out_register_late_subsys;
6740#endif
6741#endif
6742
6743 for_each_possible_cpu(cpu) {
6744 struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
6745
6746 INIT_LIST_HEAD(&ul->head);
6747 INIT_LIST_HEAD(&ul->quarantine);
6748 spin_lock_init(&ul->lock);
6749 }
6750
6751out:
6752 return ret;
6753
6754out_register_late_subsys:
6755 rtnl_unregister_all(PF_INET6);
6756 unregister_pernet_subsys(&ip6_route_net_late_ops);
6757fib6_rules_init:
6758 fib6_rules_cleanup();
6759xfrm6_init:
6760 xfrm6_fini();
6761out_fib6_init:
6762 fib6_gc_cleanup();
6763out_register_subsys:
6764 unregister_pernet_subsys(&ip6_route_net_ops);
6765out_register_inetpeer:
6766 unregister_pernet_subsys(&ipv6_inetpeer_ops);
6767out_dst_entries:
6768 dst_entries_destroy(&ip6_dst_blackhole_ops);
6769out_kmem_cache:
6770 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
6771 goto out;
6772}
6773
6774void ip6_route_cleanup(void)
6775{
6776#if IS_BUILTIN(CONFIG_IPV6)
6777#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6778 bpf_iter_unregister();
6779#endif
6780#endif
6781 unregister_netdevice_notifier(&ip6_route_dev_notifier);
6782 unregister_pernet_subsys(&ip6_route_net_late_ops);
6783 fib6_rules_cleanup();
6784 xfrm6_fini();
6785 fib6_gc_cleanup();
6786 unregister_pernet_subsys(&ipv6_inetpeer_ops);
6787 unregister_pernet_subsys(&ip6_route_net_ops);
6788 dst_entries_destroy(&ip6_dst_blackhole_ops);
6789 kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
6790}