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 ---