diff options
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/addrconf.c | 38 | ||||
| -rw-r--r-- | net/ipv6/af_inet6.c | 4 | ||||
| -rw-r--r-- | net/ipv6/ip6_tunnel.c | 18 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 2 | ||||
| -rw-r--r-- | net/ipv6/raw.c | 4 | ||||
| -rw-r--r-- | net/ipv6/sit.c | 18 | ||||
| -rw-r--r-- | net/ipv6/udp.c | 5 |
7 files changed, 41 insertions, 48 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 5658d9d51637..12c97d8aa6bb 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1996,23 +1996,6 @@ static void addrconf_add_mroute(struct net_device *dev) | |||
| 1996 | ip6_route_add(&cfg); | 1996 | ip6_route_add(&cfg); |
| 1997 | } | 1997 | } |
| 1998 | 1998 | ||
| 1999 | #if IS_ENABLED(CONFIG_IPV6_SIT) | ||
| 2000 | static void sit_route_add(struct net_device *dev) | ||
| 2001 | { | ||
| 2002 | struct fib6_config cfg = { | ||
| 2003 | .fc_table = RT6_TABLE_MAIN, | ||
| 2004 | .fc_metric = IP6_RT_PRIO_ADDRCONF, | ||
| 2005 | .fc_ifindex = dev->ifindex, | ||
| 2006 | .fc_dst_len = 96, | ||
| 2007 | .fc_flags = RTF_UP | RTF_NONEXTHOP, | ||
| 2008 | .fc_nlinfo.nl_net = dev_net(dev), | ||
| 2009 | }; | ||
| 2010 | |||
| 2011 | /* prefix length - 96 bits "::d.d.d.d" */ | ||
| 2012 | ip6_route_add(&cfg); | ||
| 2013 | } | ||
| 2014 | #endif | ||
| 2015 | |||
| 2016 | static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | 1999 | static struct inet6_dev *addrconf_add_dev(struct net_device *dev) |
| 2017 | { | 2000 | { |
| 2018 | struct inet6_dev *idev; | 2001 | struct inet6_dev *idev; |
| @@ -2542,7 +2525,8 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
| 2542 | struct in6_addr addr; | 2525 | struct in6_addr addr; |
| 2543 | struct net_device *dev; | 2526 | struct net_device *dev; |
| 2544 | struct net *net = dev_net(idev->dev); | 2527 | struct net *net = dev_net(idev->dev); |
| 2545 | int scope; | 2528 | int scope, plen; |
| 2529 | u32 pflags = 0; | ||
| 2546 | 2530 | ||
| 2547 | ASSERT_RTNL(); | 2531 | ASSERT_RTNL(); |
| 2548 | 2532 | ||
| @@ -2552,12 +2536,16 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
| 2552 | if (idev->dev->flags&IFF_POINTOPOINT) { | 2536 | if (idev->dev->flags&IFF_POINTOPOINT) { |
| 2553 | addr.s6_addr32[0] = htonl(0xfe800000); | 2537 | addr.s6_addr32[0] = htonl(0xfe800000); |
| 2554 | scope = IFA_LINK; | 2538 | scope = IFA_LINK; |
| 2539 | plen = 64; | ||
| 2555 | } else { | 2540 | } else { |
| 2556 | scope = IPV6_ADDR_COMPATv4; | 2541 | scope = IPV6_ADDR_COMPATv4; |
| 2542 | plen = 96; | ||
| 2543 | pflags |= RTF_NONEXTHOP; | ||
| 2557 | } | 2544 | } |
| 2558 | 2545 | ||
| 2559 | if (addr.s6_addr32[3]) { | 2546 | if (addr.s6_addr32[3]) { |
| 2560 | add_addr(idev, &addr, 128, scope); | 2547 | add_addr(idev, &addr, plen, scope); |
| 2548 | addrconf_prefix_route(&addr, plen, idev->dev, 0, pflags); | ||
| 2561 | return; | 2549 | return; |
| 2562 | } | 2550 | } |
| 2563 | 2551 | ||
| @@ -2569,7 +2557,6 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
| 2569 | int flag = scope; | 2557 | int flag = scope; |
| 2570 | 2558 | ||
| 2571 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { | 2559 | for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { |
| 2572 | int plen; | ||
| 2573 | 2560 | ||
| 2574 | addr.s6_addr32[3] = ifa->ifa_local; | 2561 | addr.s6_addr32[3] = ifa->ifa_local; |
| 2575 | 2562 | ||
| @@ -2580,12 +2567,10 @@ static void sit_add_v4_addrs(struct inet6_dev *idev) | |||
| 2580 | continue; | 2567 | continue; |
| 2581 | flag |= IFA_HOST; | 2568 | flag |= IFA_HOST; |
| 2582 | } | 2569 | } |
| 2583 | if (idev->dev->flags&IFF_POINTOPOINT) | ||
| 2584 | plen = 64; | ||
| 2585 | else | ||
| 2586 | plen = 96; | ||
| 2587 | 2570 | ||
| 2588 | add_addr(idev, &addr, plen, flag); | 2571 | add_addr(idev, &addr, plen, flag); |
| 2572 | addrconf_prefix_route(&addr, plen, idev->dev, 0, | ||
| 2573 | pflags); | ||
| 2589 | } | 2574 | } |
| 2590 | } | 2575 | } |
| 2591 | } | 2576 | } |
| @@ -2711,7 +2696,6 @@ static void addrconf_sit_config(struct net_device *dev) | |||
| 2711 | struct in6_addr addr; | 2696 | struct in6_addr addr; |
| 2712 | 2697 | ||
| 2713 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | 2698 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); |
| 2714 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
| 2715 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | 2699 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) |
| 2716 | addrconf_add_linklocal(idev, &addr); | 2700 | addrconf_add_linklocal(idev, &addr); |
| 2717 | return; | 2701 | return; |
| @@ -2721,8 +2705,6 @@ static void addrconf_sit_config(struct net_device *dev) | |||
| 2721 | 2705 | ||
| 2722 | if (dev->flags&IFF_POINTOPOINT) | 2706 | if (dev->flags&IFF_POINTOPOINT) |
| 2723 | addrconf_add_mroute(dev); | 2707 | addrconf_add_mroute(dev); |
| 2724 | else | ||
| 2725 | sit_route_add(dev); | ||
| 2726 | } | 2708 | } |
| 2727 | #endif | 2709 | #endif |
| 2728 | 2710 | ||
| @@ -2740,8 +2722,6 @@ static void addrconf_gre_config(struct net_device *dev) | |||
| 2740 | } | 2722 | } |
| 2741 | 2723 | ||
| 2742 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); | 2724 | ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0); |
| 2743 | addrconf_prefix_route(&addr, 64, dev, 0, 0); | ||
| 2744 | |||
| 2745 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) | 2725 | if (!ipv6_generate_eui64(addr.s6_addr + 8, dev)) |
| 2746 | addrconf_add_linklocal(idev, &addr); | 2726 | addrconf_add_linklocal(idev, &addr); |
| 2747 | } | 2727 | } |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index ff75313f27a8..4fbdb7046d28 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
| @@ -972,10 +972,10 @@ out: | |||
| 972 | 972 | ||
| 973 | #ifdef CONFIG_SYSCTL | 973 | #ifdef CONFIG_SYSCTL |
| 974 | sysctl_fail: | 974 | sysctl_fail: |
| 975 | ipv6_packet_cleanup(); | 975 | pingv6_exit(); |
| 976 | #endif | 976 | #endif |
| 977 | pingv6_fail: | 977 | pingv6_fail: |
| 978 | pingv6_exit(); | 978 | ipv6_packet_cleanup(); |
| 979 | ipv6_packet_fail: | 979 | ipv6_packet_fail: |
| 980 | tcpv6_exit(); | 980 | tcpv6_exit(); |
| 981 | tcpv6_fail: | 981 | tcpv6_fail: |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index df1fa58528c6..d6062325db08 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -1642,6 +1642,15 @@ static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[], | |||
| 1642 | return ip6_tnl_update(t, &p); | 1642 | return ip6_tnl_update(t, &p); |
| 1643 | } | 1643 | } |
| 1644 | 1644 | ||
| 1645 | static void ip6_tnl_dellink(struct net_device *dev, struct list_head *head) | ||
| 1646 | { | ||
| 1647 | struct net *net = dev_net(dev); | ||
| 1648 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); | ||
| 1649 | |||
| 1650 | if (dev != ip6n->fb_tnl_dev) | ||
| 1651 | unregister_netdevice_queue(dev, head); | ||
| 1652 | } | ||
| 1653 | |||
| 1645 | static size_t ip6_tnl_get_size(const struct net_device *dev) | 1654 | static size_t ip6_tnl_get_size(const struct net_device *dev) |
| 1646 | { | 1655 | { |
| 1647 | return | 1656 | return |
| @@ -1706,6 +1715,7 @@ static struct rtnl_link_ops ip6_link_ops __read_mostly = { | |||
| 1706 | .validate = ip6_tnl_validate, | 1715 | .validate = ip6_tnl_validate, |
| 1707 | .newlink = ip6_tnl_newlink, | 1716 | .newlink = ip6_tnl_newlink, |
| 1708 | .changelink = ip6_tnl_changelink, | 1717 | .changelink = ip6_tnl_changelink, |
| 1718 | .dellink = ip6_tnl_dellink, | ||
| 1709 | .get_size = ip6_tnl_get_size, | 1719 | .get_size = ip6_tnl_get_size, |
| 1710 | .fill_info = ip6_tnl_fill_info, | 1720 | .fill_info = ip6_tnl_fill_info, |
| 1711 | }; | 1721 | }; |
| @@ -1722,9 +1732,9 @@ static struct xfrm6_tunnel ip6ip6_handler __read_mostly = { | |||
| 1722 | .priority = 1, | 1732 | .priority = 1, |
| 1723 | }; | 1733 | }; |
| 1724 | 1734 | ||
| 1725 | static void __net_exit ip6_tnl_destroy_tunnels(struct ip6_tnl_net *ip6n) | 1735 | static void __net_exit ip6_tnl_destroy_tunnels(struct net *net) |
| 1726 | { | 1736 | { |
| 1727 | struct net *net = dev_net(ip6n->fb_tnl_dev); | 1737 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); |
| 1728 | struct net_device *dev, *aux; | 1738 | struct net_device *dev, *aux; |
| 1729 | int h; | 1739 | int h; |
| 1730 | struct ip6_tnl *t; | 1740 | struct ip6_tnl *t; |
| @@ -1792,10 +1802,8 @@ err_alloc_dev: | |||
| 1792 | 1802 | ||
| 1793 | static void __net_exit ip6_tnl_exit_net(struct net *net) | 1803 | static void __net_exit ip6_tnl_exit_net(struct net *net) |
| 1794 | { | 1804 | { |
| 1795 | struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); | ||
| 1796 | |||
| 1797 | rtnl_lock(); | 1805 | rtnl_lock(); |
| 1798 | ip6_tnl_destroy_tunnels(ip6n); | 1806 | ip6_tnl_destroy_tunnels(net); |
| 1799 | rtnl_unlock(); | 1807 | rtnl_unlock(); |
| 1800 | } | 1808 | } |
| 1801 | 1809 | ||
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index f8a55ff1971b..3512177deb4d 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -1726,8 +1726,8 @@ int __init ndisc_init(void) | |||
| 1726 | &ndisc_ifinfo_sysctl_change); | 1726 | &ndisc_ifinfo_sysctl_change); |
| 1727 | if (err) | 1727 | if (err) |
| 1728 | goto out_unregister_pernet; | 1728 | goto out_unregister_pernet; |
| 1729 | #endif | ||
| 1730 | out: | 1729 | out: |
| 1730 | #endif | ||
| 1731 | return err; | 1731 | return err; |
| 1732 | 1732 | ||
| 1733 | #ifdef CONFIG_SYSCTL | 1733 | #ifdef CONFIG_SYSCTL |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 3c00842b0079..e24ff1df0401 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -465,9 +465,6 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 465 | if (flags & MSG_OOB) | 465 | if (flags & MSG_OOB) |
| 466 | return -EOPNOTSUPP; | 466 | return -EOPNOTSUPP; |
| 467 | 467 | ||
| 468 | if (addr_len) | ||
| 469 | *addr_len=sizeof(*sin6); | ||
| 470 | |||
| 471 | if (flags & MSG_ERRQUEUE) | 468 | if (flags & MSG_ERRQUEUE) |
| 472 | return ipv6_recv_error(sk, msg, len); | 469 | return ipv6_recv_error(sk, msg, len); |
| 473 | 470 | ||
| @@ -506,6 +503,7 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 506 | sin6->sin6_flowinfo = 0; | 503 | sin6->sin6_flowinfo = 0; |
| 507 | sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, | 504 | sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr, |
| 508 | IP6CB(skb)->iif); | 505 | IP6CB(skb)->iif); |
| 506 | *addr_len = sizeof(*sin6); | ||
| 509 | } | 507 | } |
| 510 | 508 | ||
| 511 | sock_recv_ts_and_drops(msg, sk, skb); | 509 | sock_recv_ts_and_drops(msg, sk, skb); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index bfc6fcea3841..1b4a4a953675 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -1619,6 +1619,15 @@ static const struct nla_policy ipip6_policy[IFLA_IPTUN_MAX + 1] = { | |||
| 1619 | #endif | 1619 | #endif |
| 1620 | }; | 1620 | }; |
| 1621 | 1621 | ||
| 1622 | static void ipip6_dellink(struct net_device *dev, struct list_head *head) | ||
| 1623 | { | ||
| 1624 | struct net *net = dev_net(dev); | ||
| 1625 | struct sit_net *sitn = net_generic(net, sit_net_id); | ||
| 1626 | |||
| 1627 | if (dev != sitn->fb_tunnel_dev) | ||
| 1628 | unregister_netdevice_queue(dev, head); | ||
| 1629 | } | ||
| 1630 | |||
| 1622 | static struct rtnl_link_ops sit_link_ops __read_mostly = { | 1631 | static struct rtnl_link_ops sit_link_ops __read_mostly = { |
| 1623 | .kind = "sit", | 1632 | .kind = "sit", |
| 1624 | .maxtype = IFLA_IPTUN_MAX, | 1633 | .maxtype = IFLA_IPTUN_MAX, |
| @@ -1630,6 +1639,7 @@ static struct rtnl_link_ops sit_link_ops __read_mostly = { | |||
| 1630 | .changelink = ipip6_changelink, | 1639 | .changelink = ipip6_changelink, |
| 1631 | .get_size = ipip6_get_size, | 1640 | .get_size = ipip6_get_size, |
| 1632 | .fill_info = ipip6_fill_info, | 1641 | .fill_info = ipip6_fill_info, |
| 1642 | .dellink = ipip6_dellink, | ||
| 1633 | }; | 1643 | }; |
| 1634 | 1644 | ||
| 1635 | static struct xfrm_tunnel sit_handler __read_mostly = { | 1645 | static struct xfrm_tunnel sit_handler __read_mostly = { |
| @@ -1644,9 +1654,10 @@ static struct xfrm_tunnel ipip_handler __read_mostly = { | |||
| 1644 | .priority = 2, | 1654 | .priority = 2, |
| 1645 | }; | 1655 | }; |
| 1646 | 1656 | ||
| 1647 | static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_head *head) | 1657 | static void __net_exit sit_destroy_tunnels(struct net *net, |
| 1658 | struct list_head *head) | ||
| 1648 | { | 1659 | { |
| 1649 | struct net *net = dev_net(sitn->fb_tunnel_dev); | 1660 | struct sit_net *sitn = net_generic(net, sit_net_id); |
| 1650 | struct net_device *dev, *aux; | 1661 | struct net_device *dev, *aux; |
| 1651 | int prio; | 1662 | int prio; |
| 1652 | 1663 | ||
| @@ -1721,11 +1732,10 @@ err_alloc_dev: | |||
| 1721 | 1732 | ||
| 1722 | static void __net_exit sit_exit_net(struct net *net) | 1733 | static void __net_exit sit_exit_net(struct net *net) |
| 1723 | { | 1734 | { |
| 1724 | struct sit_net *sitn = net_generic(net, sit_net_id); | ||
| 1725 | LIST_HEAD(list); | 1735 | LIST_HEAD(list); |
| 1726 | 1736 | ||
| 1727 | rtnl_lock(); | 1737 | rtnl_lock(); |
| 1728 | sit_destroy_tunnels(sitn, &list); | 1738 | sit_destroy_tunnels(net, &list); |
| 1729 | unregister_netdevice_many(&list); | 1739 | unregister_netdevice_many(&list); |
| 1730 | rtnl_unlock(); | 1740 | rtnl_unlock(); |
| 1731 | } | 1741 | } |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index f3893e897f72..81eb8cf8389b 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -392,9 +392,6 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 392 | int is_udp4; | 392 | int is_udp4; |
| 393 | bool slow; | 393 | bool slow; |
| 394 | 394 | ||
| 395 | if (addr_len) | ||
| 396 | *addr_len = sizeof(struct sockaddr_in6); | ||
| 397 | |||
| 398 | if (flags & MSG_ERRQUEUE) | 395 | if (flags & MSG_ERRQUEUE) |
| 399 | return ipv6_recv_error(sk, msg, len); | 396 | return ipv6_recv_error(sk, msg, len); |
| 400 | 397 | ||
| @@ -480,7 +477,7 @@ try_again: | |||
| 480 | ipv6_iface_scope_id(&sin6->sin6_addr, | 477 | ipv6_iface_scope_id(&sin6->sin6_addr, |
| 481 | IP6CB(skb)->iif); | 478 | IP6CB(skb)->iif); |
| 482 | } | 479 | } |
| 483 | 480 | *addr_len = sizeof(*sin6); | |
| 484 | } | 481 | } |
| 485 | if (is_udp4) { | 482 | if (is_udp4) { |
| 486 | if (inet->cmsg_flags) | 483 | if (inet->cmsg_flags) |
