route.c (0edbf9e55295585bbe9df61b646ca5bf80a8e1eb) | route.c (adc176c5472214971d77c1a61c83db9b01e9cdc7) |
---|---|
1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 513 unchanged lines hidden (view full) --- 522 523static void rt6_probe_deferred(struct work_struct *w) 524{ 525 struct in6_addr mcaddr; 526 struct __rt6_probe_work *work = 527 container_of(w, struct __rt6_probe_work, work); 528 529 addrconf_addr_solict_mult(&work->target, &mcaddr); | 1/* 2 * Linux INET6 implementation 3 * FIB front-end. 4 * 5 * Authors: 6 * Pedro Roque <roque@di.fc.ul.pt> 7 * 8 * This program is free software; you can redistribute it and/or --- 513 unchanged lines hidden (view full) --- 522 523static void rt6_probe_deferred(struct work_struct *w) 524{ 525 struct in6_addr mcaddr; 526 struct __rt6_probe_work *work = 527 container_of(w, struct __rt6_probe_work, work); 528 529 addrconf_addr_solict_mult(&work->target, &mcaddr); |
530 ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL); | 530 ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL, 0); |
531 dev_put(work->dev); 532 kfree(work); 533} 534 535static void rt6_probe(struct rt6_info *rt) 536{ 537 struct __rt6_probe_work *work; 538 struct neighbour *neigh; --- 864 unchanged lines hidden (view full) --- 1403 1404static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, 1405 struct sk_buff *skb, u32 mtu) 1406{ 1407 __ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu); 1408} 1409 1410void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu, | 531 dev_put(work->dev); 532 kfree(work); 533} 534 535static void rt6_probe(struct rt6_info *rt) 536{ 537 struct __rt6_probe_work *work; 538 struct neighbour *neigh; --- 864 unchanged lines hidden (view full) --- 1403 1404static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, 1405 struct sk_buff *skb, u32 mtu) 1406{ 1407 __ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu); 1408} 1409 1410void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu, |
1411 int oif, u32 mark) | 1411 int oif, u32 mark, kuid_t uid) |
1412{ 1413 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data; 1414 struct dst_entry *dst; 1415 struct flowi6 fl6; 1416 1417 memset(&fl6, 0, sizeof(fl6)); 1418 fl6.flowi6_oif = oif; 1419 fl6.flowi6_mark = mark ? mark : IP6_REPLY_MARK(net, skb->mark); 1420 fl6.daddr = iph->daddr; 1421 fl6.saddr = iph->saddr; 1422 fl6.flowlabel = ip6_flowinfo(iph); | 1412{ 1413 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data; 1414 struct dst_entry *dst; 1415 struct flowi6 fl6; 1416 1417 memset(&fl6, 0, sizeof(fl6)); 1418 fl6.flowi6_oif = oif; 1419 fl6.flowi6_mark = mark ? mark : IP6_REPLY_MARK(net, skb->mark); 1420 fl6.daddr = iph->daddr; 1421 fl6.saddr = iph->saddr; 1422 fl6.flowlabel = ip6_flowinfo(iph); |
1423 fl6.flowi6_uid = uid; |
|
1423 1424 dst = ip6_route_output(net, NULL, &fl6); 1425 if (!dst->error) 1426 __ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu)); 1427 dst_release(dst); 1428} 1429EXPORT_SYMBOL_GPL(ip6_update_pmtu); 1430 1431void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu) 1432{ 1433 struct dst_entry *dst; 1434 1435 ip6_update_pmtu(skb, sock_net(sk), mtu, | 1424 1425 dst = ip6_route_output(net, NULL, &fl6); 1426 if (!dst->error) 1427 __ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu)); 1428 dst_release(dst); 1429} 1430EXPORT_SYMBOL_GPL(ip6_update_pmtu); 1431 1432void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu) 1433{ 1434 struct dst_entry *dst; 1435 1436 ip6_update_pmtu(skb, sock_net(sk), mtu, |
1436 sk->sk_bound_dev_if, sk->sk_mark); | 1437 sk->sk_bound_dev_if, sk->sk_mark, sk->sk_uid); |
1437 1438 dst = __sk_dst_get(sk); 1439 if (!dst || !dst->obsolete || 1440 dst->ops->check(dst, inet6_sk(sk)->dst_cookie)) 1441 return; 1442 1443 bh_lock_sock(sk); 1444 if (!sock_owned_by_user(sk) && !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) --- 75 unchanged lines hidden (view full) --- 1520 1521 rdfl.fl6 = *fl6; 1522 rdfl.gateway = *gateway; 1523 1524 return fib6_rule_lookup(net, &rdfl.fl6, 1525 flags, __ip6_route_redirect); 1526} 1527 | 1438 1439 dst = __sk_dst_get(sk); 1440 if (!dst || !dst->obsolete || 1441 dst->ops->check(dst, inet6_sk(sk)->dst_cookie)) 1442 return; 1443 1444 bh_lock_sock(sk); 1445 if (!sock_owned_by_user(sk) && !ipv6_addr_v4mapped(&sk->sk_v6_daddr)) --- 75 unchanged lines hidden (view full) --- 1521 1522 rdfl.fl6 = *fl6; 1523 rdfl.gateway = *gateway; 1524 1525 return fib6_rule_lookup(net, &rdfl.fl6, 1526 flags, __ip6_route_redirect); 1527} 1528 |
1528void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark) | 1529void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark, 1530 kuid_t uid) |
1529{ 1530 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data; 1531 struct dst_entry *dst; 1532 struct flowi6 fl6; 1533 1534 memset(&fl6, 0, sizeof(fl6)); 1535 fl6.flowi6_iif = LOOPBACK_IFINDEX; 1536 fl6.flowi6_oif = oif; 1537 fl6.flowi6_mark = mark; 1538 fl6.daddr = iph->daddr; 1539 fl6.saddr = iph->saddr; 1540 fl6.flowlabel = ip6_flowinfo(iph); | 1531{ 1532 const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data; 1533 struct dst_entry *dst; 1534 struct flowi6 fl6; 1535 1536 memset(&fl6, 0, sizeof(fl6)); 1537 fl6.flowi6_iif = LOOPBACK_IFINDEX; 1538 fl6.flowi6_oif = oif; 1539 fl6.flowi6_mark = mark; 1540 fl6.daddr = iph->daddr; 1541 fl6.saddr = iph->saddr; 1542 fl6.flowlabel = ip6_flowinfo(iph); |
1543 fl6.flowi6_uid = uid; |
|
1541 1542 dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr); 1543 rt6_do_redirect(dst, NULL, skb); 1544 dst_release(dst); 1545} 1546EXPORT_SYMBOL_GPL(ip6_redirect); 1547 1548void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, --- 5 unchanged lines hidden (view full) --- 1554 struct flowi6 fl6; 1555 1556 memset(&fl6, 0, sizeof(fl6)); 1557 fl6.flowi6_iif = LOOPBACK_IFINDEX; 1558 fl6.flowi6_oif = oif; 1559 fl6.flowi6_mark = mark; 1560 fl6.daddr = msg->dest; 1561 fl6.saddr = iph->daddr; | 1544 1545 dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr); 1546 rt6_do_redirect(dst, NULL, skb); 1547 dst_release(dst); 1548} 1549EXPORT_SYMBOL_GPL(ip6_redirect); 1550 1551void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, --- 5 unchanged lines hidden (view full) --- 1557 struct flowi6 fl6; 1558 1559 memset(&fl6, 0, sizeof(fl6)); 1560 fl6.flowi6_iif = LOOPBACK_IFINDEX; 1561 fl6.flowi6_oif = oif; 1562 fl6.flowi6_mark = mark; 1563 fl6.daddr = msg->dest; 1564 fl6.saddr = iph->daddr; |
1565 fl6.flowi6_uid = sock_net_uid(net, NULL); |
|
1562 1563 dst = ip6_route_redirect(net, &fl6, &iph->saddr); 1564 rt6_do_redirect(dst, NULL, skb); 1565 dst_release(dst); 1566} 1567 1568void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk) 1569{ | 1566 1567 dst = ip6_route_redirect(net, &fl6, &iph->saddr); 1568 rt6_do_redirect(dst, NULL, skb); 1569 dst_release(dst); 1570} 1571 1572void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk) 1573{ |
1570 ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark); | 1574 ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark, 1575 sk->sk_uid); |
1571} 1572EXPORT_SYMBOL_GPL(ip6_sk_redirect); 1573 1574static unsigned int ip6_default_advmss(const struct dst_entry *dst) 1575{ 1576 struct net_device *dev = dst->dev; 1577 unsigned int mtu = dst_mtu(dst); 1578 struct net *net = dev_net(dev); --- 1217 unchanged lines hidden (view full) --- 2796 [RTA_IIF] = { .type = NLA_U32 }, 2797 [RTA_PRIORITY] = { .type = NLA_U32 }, 2798 [RTA_METRICS] = { .type = NLA_NESTED }, 2799 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) }, 2800 [RTA_PREF] = { .type = NLA_U8 }, 2801 [RTA_ENCAP_TYPE] = { .type = NLA_U16 }, 2802 [RTA_ENCAP] = { .type = NLA_NESTED }, 2803 [RTA_EXPIRES] = { .type = NLA_U32 }, | 1576} 1577EXPORT_SYMBOL_GPL(ip6_sk_redirect); 1578 1579static unsigned int ip6_default_advmss(const struct dst_entry *dst) 1580{ 1581 struct net_device *dev = dst->dev; 1582 unsigned int mtu = dst_mtu(dst); 1583 struct net *net = dev_net(dev); --- 1217 unchanged lines hidden (view full) --- 2801 [RTA_IIF] = { .type = NLA_U32 }, 2802 [RTA_PRIORITY] = { .type = NLA_U32 }, 2803 [RTA_METRICS] = { .type = NLA_NESTED }, 2804 [RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) }, 2805 [RTA_PREF] = { .type = NLA_U8 }, 2806 [RTA_ENCAP_TYPE] = { .type = NLA_U16 }, 2807 [RTA_ENCAP] = { .type = NLA_NESTED }, 2808 [RTA_EXPIRES] = { .type = NLA_U32 }, |
2809 [RTA_UID] = { .type = NLA_U32 }, |
|
2804}; 2805 2806static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh, 2807 struct fib6_config *cfg) 2808{ 2809 struct rtmsg *rtm; 2810 struct nlattr *tb[RTA_MAX+1]; 2811 unsigned int pref; --- 558 unchanged lines hidden (view full) --- 3370 iif = nla_get_u32(tb[RTA_IIF]); 3371 3372 if (tb[RTA_OIF]) 3373 oif = nla_get_u32(tb[RTA_OIF]); 3374 3375 if (tb[RTA_MARK]) 3376 fl6.flowi6_mark = nla_get_u32(tb[RTA_MARK]); 3377 | 2810}; 2811 2812static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh, 2813 struct fib6_config *cfg) 2814{ 2815 struct rtmsg *rtm; 2816 struct nlattr *tb[RTA_MAX+1]; 2817 unsigned int pref; --- 558 unchanged lines hidden (view full) --- 3376 iif = nla_get_u32(tb[RTA_IIF]); 3377 3378 if (tb[RTA_OIF]) 3379 oif = nla_get_u32(tb[RTA_OIF]); 3380 3381 if (tb[RTA_MARK]) 3382 fl6.flowi6_mark = nla_get_u32(tb[RTA_MARK]); 3383 |
3384 if (tb[RTA_UID]) 3385 fl6.flowi6_uid = make_kuid(current_user_ns(), 3386 nla_get_u32(tb[RTA_UID])); 3387 else 3388 fl6.flowi6_uid = iif ? INVALID_UID : current_uid(); 3389 |
|
3378 if (iif) { 3379 struct net_device *dev; 3380 int flags = 0; 3381 3382 dev = __dev_get_by_index(net, iif); 3383 if (!dev) { 3384 err = -ENODEV; 3385 goto errout; --- 502 unchanged lines hidden --- | 3390 if (iif) { 3391 struct net_device *dev; 3392 int flags = 0; 3393 3394 dev = __dev_get_by_index(net, iif); 3395 if (!dev) { 3396 err = -ENODEV; 3397 goto errout; --- 502 unchanged lines hidden --- |