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