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