diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 57 | ||||
-rw-r--r-- | net/ipv6/datagram.c | 6 | ||||
-rw-r--r-- | net/ipv6/raw.c | 8 | ||||
-rw-r--r-- | net/ipv6/route.c | 11 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 148 | ||||
-rw-r--r-- | net/ipv6/udp.c | 4 |
6 files changed, 115 insertions, 119 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 2720899d516c..47a30c3188ea 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -131,7 +131,7 @@ static void addrconf_leave_anycast(struct inet6_ifaddr *ifp); | |||
131 | 131 | ||
132 | static int addrconf_ifdown(struct net_device *dev, int how); | 132 | static int addrconf_ifdown(struct net_device *dev, int how); |
133 | 133 | ||
134 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags); | 134 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags); |
135 | static void addrconf_dad_timer(unsigned long data); | 135 | static void addrconf_dad_timer(unsigned long data); |
136 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp); | 136 | static void addrconf_dad_completed(struct inet6_ifaddr *ifp); |
137 | static void addrconf_rs_timer(unsigned long data); | 137 | static void addrconf_rs_timer(unsigned long data); |
@@ -492,7 +492,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) | |||
492 | 492 | ||
493 | static struct inet6_ifaddr * | 493 | static struct inet6_ifaddr * |
494 | ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | 494 | ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, |
495 | int scope, unsigned flags) | 495 | int scope, u32 flags) |
496 | { | 496 | { |
497 | struct inet6_ifaddr *ifa = NULL; | 497 | struct inet6_ifaddr *ifa = NULL; |
498 | struct rt6_info *rt; | 498 | struct rt6_info *rt; |
@@ -1320,7 +1320,7 @@ static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpad | |||
1320 | 1320 | ||
1321 | static void | 1321 | static void |
1322 | addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev, | 1322 | addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev, |
1323 | unsigned long expires, unsigned flags) | 1323 | unsigned long expires, u32 flags) |
1324 | { | 1324 | { |
1325 | struct in6_rtmsg rtmsg; | 1325 | struct in6_rtmsg rtmsg; |
1326 | 1326 | ||
@@ -2229,7 +2229,7 @@ out: | |||
2229 | /* | 2229 | /* |
2230 | * Duplicate Address Detection | 2230 | * Duplicate Address Detection |
2231 | */ | 2231 | */ |
2232 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, int flags) | 2232 | static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags) |
2233 | { | 2233 | { |
2234 | struct inet6_dev *idev = ifp->idev; | 2234 | struct inet6_dev *idev = ifp->idev; |
2235 | struct net_device *dev = idev->dev; | 2235 | struct net_device *dev = idev->dev; |
@@ -2622,15 +2622,14 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg) | |||
2622 | } | 2622 | } |
2623 | 2623 | ||
2624 | static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, | 2624 | static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa, |
2625 | u32 pid, u32 seq, int event) | 2625 | u32 pid, u32 seq, int event, unsigned int flags) |
2626 | { | 2626 | { |
2627 | struct ifaddrmsg *ifm; | 2627 | struct ifaddrmsg *ifm; |
2628 | struct nlmsghdr *nlh; | 2628 | struct nlmsghdr *nlh; |
2629 | struct ifa_cacheinfo ci; | 2629 | struct ifa_cacheinfo ci; |
2630 | unsigned char *b = skb->tail; | 2630 | unsigned char *b = skb->tail; |
2631 | 2631 | ||
2632 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2632 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2633 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2634 | ifm = NLMSG_DATA(nlh); | 2633 | ifm = NLMSG_DATA(nlh); |
2635 | ifm->ifa_family = AF_INET6; | 2634 | ifm->ifa_family = AF_INET6; |
2636 | ifm->ifa_prefixlen = ifa->prefix_len; | 2635 | ifm->ifa_prefixlen = ifa->prefix_len; |
@@ -2672,15 +2671,14 @@ rtattr_failure: | |||
2672 | } | 2671 | } |
2673 | 2672 | ||
2674 | static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca, | 2673 | static int inet6_fill_ifmcaddr(struct sk_buff *skb, struct ifmcaddr6 *ifmca, |
2675 | u32 pid, u32 seq, int event) | 2674 | u32 pid, u32 seq, int event, u16 flags) |
2676 | { | 2675 | { |
2677 | struct ifaddrmsg *ifm; | 2676 | struct ifaddrmsg *ifm; |
2678 | struct nlmsghdr *nlh; | 2677 | struct nlmsghdr *nlh; |
2679 | struct ifa_cacheinfo ci; | 2678 | struct ifa_cacheinfo ci; |
2680 | unsigned char *b = skb->tail; | 2679 | unsigned char *b = skb->tail; |
2681 | 2680 | ||
2682 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2681 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2683 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2684 | ifm = NLMSG_DATA(nlh); | 2682 | ifm = NLMSG_DATA(nlh); |
2685 | ifm->ifa_family = AF_INET6; | 2683 | ifm->ifa_family = AF_INET6; |
2686 | ifm->ifa_prefixlen = 128; | 2684 | ifm->ifa_prefixlen = 128; |
@@ -2709,15 +2707,14 @@ rtattr_failure: | |||
2709 | } | 2707 | } |
2710 | 2708 | ||
2711 | static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca, | 2709 | static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca, |
2712 | u32 pid, u32 seq, int event) | 2710 | u32 pid, u32 seq, int event, unsigned int flags) |
2713 | { | 2711 | { |
2714 | struct ifaddrmsg *ifm; | 2712 | struct ifaddrmsg *ifm; |
2715 | struct nlmsghdr *nlh; | 2713 | struct nlmsghdr *nlh; |
2716 | struct ifa_cacheinfo ci; | 2714 | struct ifa_cacheinfo ci; |
2717 | unsigned char *b = skb->tail; | 2715 | unsigned char *b = skb->tail; |
2718 | 2716 | ||
2719 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*ifm)); | 2717 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*ifm), flags); |
2720 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2721 | ifm = NLMSG_DATA(nlh); | 2718 | ifm = NLMSG_DATA(nlh); |
2722 | ifm->ifa_family = AF_INET6; | 2719 | ifm->ifa_family = AF_INET6; |
2723 | ifm->ifa_prefixlen = 128; | 2720 | ifm->ifa_prefixlen = 128; |
@@ -2786,7 +2783,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2786 | continue; | 2783 | continue; |
2787 | if ((err = inet6_fill_ifaddr(skb, ifa, | 2784 | if ((err = inet6_fill_ifaddr(skb, ifa, |
2788 | NETLINK_CB(cb->skb).pid, | 2785 | NETLINK_CB(cb->skb).pid, |
2789 | cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) | 2786 | cb->nlh->nlmsg_seq, RTM_NEWADDR, |
2787 | NLM_F_MULTI)) <= 0) | ||
2790 | goto done; | 2788 | goto done; |
2791 | } | 2789 | } |
2792 | /* temp addr */ | 2790 | /* temp addr */ |
@@ -2797,7 +2795,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2797 | continue; | 2795 | continue; |
2798 | if ((err = inet6_fill_ifaddr(skb, ifa, | 2796 | if ((err = inet6_fill_ifaddr(skb, ifa, |
2799 | NETLINK_CB(cb->skb).pid, | 2797 | NETLINK_CB(cb->skb).pid, |
2800 | cb->nlh->nlmsg_seq, RTM_NEWADDR)) <= 0) | 2798 | cb->nlh->nlmsg_seq, RTM_NEWADDR, |
2799 | NLM_F_MULTI)) <= 0) | ||
2801 | goto done; | 2800 | goto done; |
2802 | } | 2801 | } |
2803 | #endif | 2802 | #endif |
@@ -2810,7 +2809,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2810 | continue; | 2809 | continue; |
2811 | if ((err = inet6_fill_ifmcaddr(skb, ifmca, | 2810 | if ((err = inet6_fill_ifmcaddr(skb, ifmca, |
2812 | NETLINK_CB(cb->skb).pid, | 2811 | NETLINK_CB(cb->skb).pid, |
2813 | cb->nlh->nlmsg_seq, RTM_GETMULTICAST)) <= 0) | 2812 | cb->nlh->nlmsg_seq, RTM_GETMULTICAST, |
2813 | NLM_F_MULTI)) <= 0) | ||
2814 | goto done; | 2814 | goto done; |
2815 | } | 2815 | } |
2816 | break; | 2816 | break; |
@@ -2822,7 +2822,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb, | |||
2822 | continue; | 2822 | continue; |
2823 | if ((err = inet6_fill_ifacaddr(skb, ifaca, | 2823 | if ((err = inet6_fill_ifacaddr(skb, ifaca, |
2824 | NETLINK_CB(cb->skb).pid, | 2824 | NETLINK_CB(cb->skb).pid, |
2825 | cb->nlh->nlmsg_seq, RTM_GETANYCAST)) <= 0) | 2825 | cb->nlh->nlmsg_seq, RTM_GETANYCAST, |
2826 | NLM_F_MULTI)) <= 0) | ||
2826 | goto done; | 2827 | goto done; |
2827 | } | 2828 | } |
2828 | break; | 2829 | break; |
@@ -2872,7 +2873,7 @@ static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa) | |||
2872 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS); | 2873 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, ENOBUFS); |
2873 | return; | 2874 | return; |
2874 | } | 2875 | } |
2875 | if (inet6_fill_ifaddr(skb, ifa, 0, 0, event) < 0) { | 2876 | if (inet6_fill_ifaddr(skb, ifa, current->pid, 0, event, 0) < 0) { |
2876 | kfree_skb(skb); | 2877 | kfree_skb(skb); |
2877 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL); | 2878 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFADDR, EINVAL); |
2878 | return; | 2879 | return; |
@@ -2907,7 +2908,7 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, | |||
2907 | } | 2908 | } |
2908 | 2909 | ||
2909 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, | 2910 | static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, |
2910 | u32 pid, u32 seq, int event) | 2911 | u32 pid, u32 seq, int event, unsigned int flags) |
2911 | { | 2912 | { |
2912 | struct net_device *dev = idev->dev; | 2913 | struct net_device *dev = idev->dev; |
2913 | __s32 *array = NULL; | 2914 | __s32 *array = NULL; |
@@ -2918,8 +2919,7 @@ static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, | |||
2918 | __u32 mtu = dev->mtu; | 2919 | __u32 mtu = dev->mtu; |
2919 | struct ifla_cacheinfo ci; | 2920 | struct ifla_cacheinfo ci; |
2920 | 2921 | ||
2921 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r)); | 2922 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags); |
2922 | if (pid) nlh->nlmsg_flags |= NLM_F_MULTI; | ||
2923 | r = NLMSG_DATA(nlh); | 2923 | r = NLMSG_DATA(nlh); |
2924 | r->ifi_family = AF_INET6; | 2924 | r->ifi_family = AF_INET6; |
2925 | r->ifi_type = dev->type; | 2925 | r->ifi_type = dev->type; |
@@ -2986,7 +2986,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
2986 | if ((idev = in6_dev_get(dev)) == NULL) | 2986 | if ((idev = in6_dev_get(dev)) == NULL) |
2987 | continue; | 2987 | continue; |
2988 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, | 2988 | err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, |
2989 | cb->nlh->nlmsg_seq, RTM_NEWLINK); | 2989 | cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI); |
2990 | in6_dev_put(idev); | 2990 | in6_dev_put(idev); |
2991 | if (err <= 0) | 2991 | if (err <= 0) |
2992 | break; | 2992 | break; |
@@ -3008,7 +3008,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
3008 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS); | 3008 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, ENOBUFS); |
3009 | return; | 3009 | return; |
3010 | } | 3010 | } |
3011 | if (inet6_fill_ifinfo(skb, idev, 0, 0, event) < 0) { | 3011 | if (inet6_fill_ifinfo(skb, idev, current->pid, 0, event, 0) < 0) { |
3012 | kfree_skb(skb); | 3012 | kfree_skb(skb); |
3013 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL); | 3013 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_IFINFO, EINVAL); |
3014 | return; | 3014 | return; |
@@ -3018,18 +3018,15 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev) | |||
3018 | } | 3018 | } |
3019 | 3019 | ||
3020 | static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, | 3020 | static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev, |
3021 | struct prefix_info *pinfo, u32 pid, u32 seq, int event) | 3021 | struct prefix_info *pinfo, u32 pid, u32 seq, |
3022 | int event, unsigned int flags) | ||
3022 | { | 3023 | { |
3023 | struct prefixmsg *pmsg; | 3024 | struct prefixmsg *pmsg; |
3024 | struct nlmsghdr *nlh; | 3025 | struct nlmsghdr *nlh; |
3025 | unsigned char *b = skb->tail; | 3026 | unsigned char *b = skb->tail; |
3026 | struct prefix_cacheinfo ci; | 3027 | struct prefix_cacheinfo ci; |
3027 | 3028 | ||
3028 | nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*pmsg)); | 3029 | nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*pmsg), flags); |
3029 | |||
3030 | if (pid) | ||
3031 | nlh->nlmsg_flags |= NLM_F_MULTI; | ||
3032 | |||
3033 | pmsg = NLMSG_DATA(nlh); | 3030 | pmsg = NLMSG_DATA(nlh); |
3034 | pmsg->prefix_family = AF_INET6; | 3031 | pmsg->prefix_family = AF_INET6; |
3035 | pmsg->prefix_ifindex = idev->dev->ifindex; | 3032 | pmsg->prefix_ifindex = idev->dev->ifindex; |
@@ -3068,7 +3065,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev, | |||
3068 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS); | 3065 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, ENOBUFS); |
3069 | return; | 3066 | return; |
3070 | } | 3067 | } |
3071 | if (inet6_fill_prefix(skb, idev, pinfo, 0, 0, event) < 0) { | 3068 | if (inet6_fill_prefix(skb, idev, pinfo, current->pid, 0, event, 0) < 0) { |
3072 | kfree_skb(skb); | 3069 | kfree_skb(skb); |
3073 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL); | 3070 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_PREFIX, EINVAL); |
3074 | return; | 3071 | return; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 65b9375df57d..5229365cd8b4 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -353,14 +353,14 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len) | |||
353 | err = copied; | 353 | err = copied; |
354 | 354 | ||
355 | /* Reset and regenerate socket error */ | 355 | /* Reset and regenerate socket error */ |
356 | spin_lock_irq(&sk->sk_error_queue.lock); | 356 | spin_lock_bh(&sk->sk_error_queue.lock); |
357 | sk->sk_err = 0; | 357 | sk->sk_err = 0; |
358 | if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) { | 358 | if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) { |
359 | sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; | 359 | sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; |
360 | spin_unlock_irq(&sk->sk_error_queue.lock); | 360 | spin_unlock_bh(&sk->sk_error_queue.lock); |
361 | sk->sk_error_report(sk); | 361 | sk->sk_error_report(sk); |
362 | } else { | 362 | } else { |
363 | spin_unlock_irq(&sk->sk_error_queue.lock); | 363 | spin_unlock_bh(&sk->sk_error_queue.lock); |
364 | } | 364 | } |
365 | 365 | ||
366 | out_free_skb: | 366 | out_free_skb: |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 617645bc5ed6..e2b848ec9851 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -434,12 +434,12 @@ csum_copy_err: | |||
434 | /* Clear queue. */ | 434 | /* Clear queue. */ |
435 | if (flags&MSG_PEEK) { | 435 | if (flags&MSG_PEEK) { |
436 | int clear = 0; | 436 | int clear = 0; |
437 | spin_lock_irq(&sk->sk_receive_queue.lock); | 437 | spin_lock_bh(&sk->sk_receive_queue.lock); |
438 | if (skb == skb_peek(&sk->sk_receive_queue)) { | 438 | if (skb == skb_peek(&sk->sk_receive_queue)) { |
439 | __skb_unlink(skb, &sk->sk_receive_queue); | 439 | __skb_unlink(skb, &sk->sk_receive_queue); |
440 | clear = 1; | 440 | clear = 1; |
441 | } | 441 | } |
442 | spin_unlock_irq(&sk->sk_receive_queue.lock); | 442 | spin_unlock_bh(&sk->sk_receive_queue.lock); |
443 | if (clear) | 443 | if (clear) |
444 | kfree_skb(skb); | 444 | kfree_skb(skb); |
445 | } | 445 | } |
@@ -971,11 +971,11 @@ static int rawv6_ioctl(struct sock *sk, int cmd, unsigned long arg) | |||
971 | struct sk_buff *skb; | 971 | struct sk_buff *skb; |
972 | int amount = 0; | 972 | int amount = 0; |
973 | 973 | ||
974 | spin_lock_irq(&sk->sk_receive_queue.lock); | 974 | spin_lock_bh(&sk->sk_receive_queue.lock); |
975 | skb = skb_peek(&sk->sk_receive_queue); | 975 | skb = skb_peek(&sk->sk_receive_queue); |
976 | if (skb != NULL) | 976 | if (skb != NULL) |
977 | amount = skb->tail - skb->h.raw; | 977 | amount = skb->tail - skb->h.raw; |
978 | spin_unlock_irq(&sk->sk_receive_queue.lock); | 978 | spin_unlock_bh(&sk->sk_receive_queue.lock); |
979 | return put_user(amount, (int __user *)arg); | 979 | return put_user(amount, (int __user *)arg); |
980 | } | 980 | } |
981 | 981 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3bf8a0254f81..1f5b226c3573 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1570,7 +1570,8 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
1570 | struct in6_addr *src, | 1570 | struct in6_addr *src, |
1571 | int iif, | 1571 | int iif, |
1572 | int type, u32 pid, u32 seq, | 1572 | int type, u32 pid, u32 seq, |
1573 | struct nlmsghdr *in_nlh, int prefix) | 1573 | struct nlmsghdr *in_nlh, int prefix, |
1574 | unsigned int flags) | ||
1574 | { | 1575 | { |
1575 | struct rtmsg *rtm; | 1576 | struct rtmsg *rtm; |
1576 | struct nlmsghdr *nlh; | 1577 | struct nlmsghdr *nlh; |
@@ -1588,7 +1589,7 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
1588 | pid = in_nlh->nlmsg_pid; | 1589 | pid = in_nlh->nlmsg_pid; |
1589 | } | 1590 | } |
1590 | 1591 | ||
1591 | nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*rtm)); | 1592 | nlh = NLMSG_NEW(skb, pid, seq, type, sizeof(*rtm), flags); |
1592 | rtm = NLMSG_DATA(nlh); | 1593 | rtm = NLMSG_DATA(nlh); |
1593 | rtm->rtm_family = AF_INET6; | 1594 | rtm->rtm_family = AF_INET6; |
1594 | rtm->rtm_dst_len = rt->rt6i_dst.plen; | 1595 | rtm->rtm_dst_len = rt->rt6i_dst.plen; |
@@ -1674,7 +1675,7 @@ static int rt6_dump_route(struct rt6_info *rt, void *p_arg) | |||
1674 | 1675 | ||
1675 | return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, | 1676 | return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, |
1676 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, | 1677 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, |
1677 | NULL, prefix); | 1678 | NULL, prefix, NLM_F_MULTI); |
1678 | } | 1679 | } |
1679 | 1680 | ||
1680 | static int fib6_dump_node(struct fib6_walker_t *w) | 1681 | static int fib6_dump_node(struct fib6_walker_t *w) |
@@ -1822,7 +1823,7 @@ int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void *arg) | |||
1822 | &fl.fl6_dst, &fl.fl6_src, | 1823 | &fl.fl6_dst, &fl.fl6_src, |
1823 | iif, | 1824 | iif, |
1824 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, | 1825 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, |
1825 | nlh->nlmsg_seq, nlh, 0); | 1826 | nlh->nlmsg_seq, nlh, 0, 0); |
1826 | if (err < 0) { | 1827 | if (err < 0) { |
1827 | err = -EMSGSIZE; | 1828 | err = -EMSGSIZE; |
1828 | goto out_free; | 1829 | goto out_free; |
@@ -1848,7 +1849,7 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nlmsghdr *nlh) | |||
1848 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS); | 1849 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS); |
1849 | return; | 1850 | return; |
1850 | } | 1851 | } |
1851 | if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0) < 0) { | 1852 | if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh, 0, 0) < 0) { |
1852 | kfree_skb(skb); | 1853 | kfree_skb(skb); |
1853 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL); | 1854 | netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL); |
1854 | return; | 1855 | return; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 0f69e800a0ad..2414937f2a83 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -65,7 +65,7 @@ | |||
65 | #include <linux/seq_file.h> | 65 | #include <linux/seq_file.h> |
66 | 66 | ||
67 | static void tcp_v6_send_reset(struct sk_buff *skb); | 67 | static void tcp_v6_send_reset(struct sk_buff *skb); |
68 | static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req); | 68 | static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req); |
69 | static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, | 69 | static void tcp_v6_send_check(struct sock *sk, struct tcphdr *th, int len, |
70 | struct sk_buff *skb); | 70 | struct sk_buff *skb); |
71 | 71 | ||
@@ -394,24 +394,26 @@ static u32 tcp_v6_synq_hash(struct in6_addr *raddr, u16 rport, u32 rnd) | |||
394 | return c & (TCP_SYNQ_HSIZE - 1); | 394 | return c & (TCP_SYNQ_HSIZE - 1); |
395 | } | 395 | } |
396 | 396 | ||
397 | static struct open_request *tcp_v6_search_req(struct tcp_sock *tp, | 397 | static struct request_sock *tcp_v6_search_req(struct tcp_sock *tp, |
398 | struct open_request ***prevp, | 398 | struct request_sock ***prevp, |
399 | __u16 rport, | 399 | __u16 rport, |
400 | struct in6_addr *raddr, | 400 | struct in6_addr *raddr, |
401 | struct in6_addr *laddr, | 401 | struct in6_addr *laddr, |
402 | int iif) | 402 | int iif) |
403 | { | 403 | { |
404 | struct tcp_listen_opt *lopt = tp->listen_opt; | 404 | struct listen_sock *lopt = tp->accept_queue.listen_opt; |
405 | struct open_request *req, **prev; | 405 | struct request_sock *req, **prev; |
406 | 406 | ||
407 | for (prev = &lopt->syn_table[tcp_v6_synq_hash(raddr, rport, lopt->hash_rnd)]; | 407 | for (prev = &lopt->syn_table[tcp_v6_synq_hash(raddr, rport, lopt->hash_rnd)]; |
408 | (req = *prev) != NULL; | 408 | (req = *prev) != NULL; |
409 | prev = &req->dl_next) { | 409 | prev = &req->dl_next) { |
410 | if (req->rmt_port == rport && | 410 | const struct tcp6_request_sock *treq = tcp6_rsk(req); |
411 | req->class->family == AF_INET6 && | 411 | |
412 | ipv6_addr_equal(&req->af.v6_req.rmt_addr, raddr) && | 412 | if (inet_rsk(req)->rmt_port == rport && |
413 | ipv6_addr_equal(&req->af.v6_req.loc_addr, laddr) && | 413 | req->rsk_ops->family == AF_INET6 && |
414 | (!req->af.v6_req.iif || req->af.v6_req.iif == iif)) { | 414 | ipv6_addr_equal(&treq->rmt_addr, raddr) && |
415 | ipv6_addr_equal(&treq->loc_addr, laddr) && | ||
416 | (!treq->iif || treq->iif == iif)) { | ||
415 | BUG_TRAP(req->sk == NULL); | 417 | BUG_TRAP(req->sk == NULL); |
416 | *prevp = prev; | 418 | *prevp = prev; |
417 | return req; | 419 | return req; |
@@ -906,9 +908,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
906 | 908 | ||
907 | icmpv6_err_convert(type, code, &err); | 909 | icmpv6_err_convert(type, code, &err); |
908 | 910 | ||
909 | /* Might be for an open_request */ | 911 | /* Might be for an request_sock */ |
910 | switch (sk->sk_state) { | 912 | switch (sk->sk_state) { |
911 | struct open_request *req, **prev; | 913 | struct request_sock *req, **prev; |
912 | case TCP_LISTEN: | 914 | case TCP_LISTEN: |
913 | if (sock_owned_by_user(sk)) | 915 | if (sock_owned_by_user(sk)) |
914 | goto out; | 916 | goto out; |
@@ -923,7 +925,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
923 | */ | 925 | */ |
924 | BUG_TRAP(req->sk == NULL); | 926 | BUG_TRAP(req->sk == NULL); |
925 | 927 | ||
926 | if (seq != req->snt_isn) { | 928 | if (seq != tcp_rsk(req)->snt_isn) { |
927 | NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS); | 929 | NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS); |
928 | goto out; | 930 | goto out; |
929 | } | 931 | } |
@@ -957,9 +959,10 @@ out: | |||
957 | } | 959 | } |
958 | 960 | ||
959 | 961 | ||
960 | static int tcp_v6_send_synack(struct sock *sk, struct open_request *req, | 962 | static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, |
961 | struct dst_entry *dst) | 963 | struct dst_entry *dst) |
962 | { | 964 | { |
965 | struct tcp6_request_sock *treq = tcp6_rsk(req); | ||
963 | struct ipv6_pinfo *np = inet6_sk(sk); | 966 | struct ipv6_pinfo *np = inet6_sk(sk); |
964 | struct sk_buff * skb; | 967 | struct sk_buff * skb; |
965 | struct ipv6_txoptions *opt = NULL; | 968 | struct ipv6_txoptions *opt = NULL; |
@@ -969,19 +972,19 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req, | |||
969 | 972 | ||
970 | memset(&fl, 0, sizeof(fl)); | 973 | memset(&fl, 0, sizeof(fl)); |
971 | fl.proto = IPPROTO_TCP; | 974 | fl.proto = IPPROTO_TCP; |
972 | ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr); | 975 | ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr); |
973 | ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr); | 976 | ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr); |
974 | fl.fl6_flowlabel = 0; | 977 | fl.fl6_flowlabel = 0; |
975 | fl.oif = req->af.v6_req.iif; | 978 | fl.oif = treq->iif; |
976 | fl.fl_ip_dport = req->rmt_port; | 979 | fl.fl_ip_dport = inet_rsk(req)->rmt_port; |
977 | fl.fl_ip_sport = inet_sk(sk)->sport; | 980 | fl.fl_ip_sport = inet_sk(sk)->sport; |
978 | 981 | ||
979 | if (dst == NULL) { | 982 | if (dst == NULL) { |
980 | opt = np->opt; | 983 | opt = np->opt; |
981 | if (opt == NULL && | 984 | if (opt == NULL && |
982 | np->rxopt.bits.srcrt == 2 && | 985 | np->rxopt.bits.srcrt == 2 && |
983 | req->af.v6_req.pktopts) { | 986 | treq->pktopts) { |
984 | struct sk_buff *pktopts = req->af.v6_req.pktopts; | 987 | struct sk_buff *pktopts = treq->pktopts; |
985 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); | 988 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); |
986 | if (rxopt->srcrt) | 989 | if (rxopt->srcrt) |
987 | opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt)); | 990 | opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(pktopts->nh.raw + rxopt->srcrt)); |
@@ -1008,10 +1011,10 @@ static int tcp_v6_send_synack(struct sock *sk, struct open_request *req, | |||
1008 | struct tcphdr *th = skb->h.th; | 1011 | struct tcphdr *th = skb->h.th; |
1009 | 1012 | ||
1010 | th->check = tcp_v6_check(th, skb->len, | 1013 | th->check = tcp_v6_check(th, skb->len, |
1011 | &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr, | 1014 | &treq->loc_addr, &treq->rmt_addr, |
1012 | csum_partial((char *)th, skb->len, skb->csum)); | 1015 | csum_partial((char *)th, skb->len, skb->csum)); |
1013 | 1016 | ||
1014 | ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr); | 1017 | ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr); |
1015 | err = ip6_xmit(sk, skb, &fl, opt, 0); | 1018 | err = ip6_xmit(sk, skb, &fl, opt, 0); |
1016 | if (err == NET_XMIT_CN) | 1019 | if (err == NET_XMIT_CN) |
1017 | err = 0; | 1020 | err = 0; |
@@ -1024,17 +1027,18 @@ done: | |||
1024 | return err; | 1027 | return err; |
1025 | } | 1028 | } |
1026 | 1029 | ||
1027 | static void tcp_v6_or_free(struct open_request *req) | 1030 | static void tcp_v6_reqsk_destructor(struct request_sock *req) |
1028 | { | 1031 | { |
1029 | if (req->af.v6_req.pktopts) | 1032 | if (tcp6_rsk(req)->pktopts) |
1030 | kfree_skb(req->af.v6_req.pktopts); | 1033 | kfree_skb(tcp6_rsk(req)->pktopts); |
1031 | } | 1034 | } |
1032 | 1035 | ||
1033 | static struct or_calltable or_ipv6 = { | 1036 | static struct request_sock_ops tcp6_request_sock_ops = { |
1034 | .family = AF_INET6, | 1037 | .family = AF_INET6, |
1038 | .obj_size = sizeof(struct tcp6_request_sock), | ||
1035 | .rtx_syn_ack = tcp_v6_send_synack, | 1039 | .rtx_syn_ack = tcp_v6_send_synack, |
1036 | .send_ack = tcp_v6_or_send_ack, | 1040 | .send_ack = tcp_v6_reqsk_send_ack, |
1037 | .destructor = tcp_v6_or_free, | 1041 | .destructor = tcp_v6_reqsk_destructor, |
1038 | .send_reset = tcp_v6_send_reset | 1042 | .send_reset = tcp_v6_send_reset |
1039 | }; | 1043 | }; |
1040 | 1044 | ||
@@ -1219,15 +1223,15 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) | |||
1219 | tcp_tw_put(tw); | 1223 | tcp_tw_put(tw); |
1220 | } | 1224 | } |
1221 | 1225 | ||
1222 | static void tcp_v6_or_send_ack(struct sk_buff *skb, struct open_request *req) | 1226 | static void tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req) |
1223 | { | 1227 | { |
1224 | tcp_v6_send_ack(skb, req->snt_isn+1, req->rcv_isn+1, req->rcv_wnd, req->ts_recent); | 1228 | tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent); |
1225 | } | 1229 | } |
1226 | 1230 | ||
1227 | 1231 | ||
1228 | static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) | 1232 | static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) |
1229 | { | 1233 | { |
1230 | struct open_request *req, **prev; | 1234 | struct request_sock *req, **prev; |
1231 | struct tcphdr *th = skb->h.th; | 1235 | struct tcphdr *th = skb->h.th; |
1232 | struct tcp_sock *tp = tcp_sk(sk); | 1236 | struct tcp_sock *tp = tcp_sk(sk); |
1233 | struct sock *nsk; | 1237 | struct sock *nsk; |
@@ -1260,21 +1264,13 @@ static struct sock *tcp_v6_hnd_req(struct sock *sk,struct sk_buff *skb) | |||
1260 | return sk; | 1264 | return sk; |
1261 | } | 1265 | } |
1262 | 1266 | ||
1263 | static void tcp_v6_synq_add(struct sock *sk, struct open_request *req) | 1267 | static void tcp_v6_synq_add(struct sock *sk, struct request_sock *req) |
1264 | { | 1268 | { |
1265 | struct tcp_sock *tp = tcp_sk(sk); | 1269 | struct tcp_sock *tp = tcp_sk(sk); |
1266 | struct tcp_listen_opt *lopt = tp->listen_opt; | 1270 | struct listen_sock *lopt = tp->accept_queue.listen_opt; |
1267 | u32 h = tcp_v6_synq_hash(&req->af.v6_req.rmt_addr, req->rmt_port, lopt->hash_rnd); | 1271 | u32 h = tcp_v6_synq_hash(&tcp6_rsk(req)->rmt_addr, inet_rsk(req)->rmt_port, lopt->hash_rnd); |
1268 | |||
1269 | req->sk = NULL; | ||
1270 | req->expires = jiffies + TCP_TIMEOUT_INIT; | ||
1271 | req->retrans = 0; | ||
1272 | req->dl_next = lopt->syn_table[h]; | ||
1273 | |||
1274 | write_lock(&tp->syn_wait_lock); | ||
1275 | lopt->syn_table[h] = req; | ||
1276 | write_unlock(&tp->syn_wait_lock); | ||
1277 | 1272 | ||
1273 | reqsk_queue_hash_req(&tp->accept_queue, h, req, TCP_TIMEOUT_INIT); | ||
1278 | tcp_synq_added(sk); | 1274 | tcp_synq_added(sk); |
1279 | } | 1275 | } |
1280 | 1276 | ||
@@ -1284,10 +1280,11 @@ static void tcp_v6_synq_add(struct sock *sk, struct open_request *req) | |||
1284 | */ | 1280 | */ |
1285 | static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | 1281 | static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) |
1286 | { | 1282 | { |
1283 | struct tcp6_request_sock *treq; | ||
1287 | struct ipv6_pinfo *np = inet6_sk(sk); | 1284 | struct ipv6_pinfo *np = inet6_sk(sk); |
1288 | struct tcp_options_received tmp_opt; | 1285 | struct tcp_options_received tmp_opt; |
1289 | struct tcp_sock *tp = tcp_sk(sk); | 1286 | struct tcp_sock *tp = tcp_sk(sk); |
1290 | struct open_request *req = NULL; | 1287 | struct request_sock *req = NULL; |
1291 | __u32 isn = TCP_SKB_CB(skb)->when; | 1288 | __u32 isn = TCP_SKB_CB(skb)->when; |
1292 | 1289 | ||
1293 | if (skb->protocol == htons(ETH_P_IP)) | 1290 | if (skb->protocol == htons(ETH_P_IP)) |
@@ -1308,7 +1305,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1308 | if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) | 1305 | if (sk_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) |
1309 | goto drop; | 1306 | goto drop; |
1310 | 1307 | ||
1311 | req = tcp_openreq_alloc(); | 1308 | req = reqsk_alloc(&tcp6_request_sock_ops); |
1312 | if (req == NULL) | 1309 | if (req == NULL) |
1313 | goto drop; | 1310 | goto drop; |
1314 | 1311 | ||
@@ -1321,28 +1318,28 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1321 | tmp_opt.tstamp_ok = tmp_opt.saw_tstamp; | 1318 | tmp_opt.tstamp_ok = tmp_opt.saw_tstamp; |
1322 | tcp_openreq_init(req, &tmp_opt, skb); | 1319 | tcp_openreq_init(req, &tmp_opt, skb); |
1323 | 1320 | ||
1324 | req->class = &or_ipv6; | 1321 | treq = tcp6_rsk(req); |
1325 | ipv6_addr_copy(&req->af.v6_req.rmt_addr, &skb->nh.ipv6h->saddr); | 1322 | ipv6_addr_copy(&treq->rmt_addr, &skb->nh.ipv6h->saddr); |
1326 | ipv6_addr_copy(&req->af.v6_req.loc_addr, &skb->nh.ipv6h->daddr); | 1323 | ipv6_addr_copy(&treq->loc_addr, &skb->nh.ipv6h->daddr); |
1327 | TCP_ECN_create_request(req, skb->h.th); | 1324 | TCP_ECN_create_request(req, skb->h.th); |
1328 | req->af.v6_req.pktopts = NULL; | 1325 | treq->pktopts = NULL; |
1329 | if (ipv6_opt_accepted(sk, skb) || | 1326 | if (ipv6_opt_accepted(sk, skb) || |
1330 | np->rxopt.bits.rxinfo || | 1327 | np->rxopt.bits.rxinfo || |
1331 | np->rxopt.bits.rxhlim) { | 1328 | np->rxopt.bits.rxhlim) { |
1332 | atomic_inc(&skb->users); | 1329 | atomic_inc(&skb->users); |
1333 | req->af.v6_req.pktopts = skb; | 1330 | treq->pktopts = skb; |
1334 | } | 1331 | } |
1335 | req->af.v6_req.iif = sk->sk_bound_dev_if; | 1332 | treq->iif = sk->sk_bound_dev_if; |
1336 | 1333 | ||
1337 | /* So that link locals have meaning */ | 1334 | /* So that link locals have meaning */ |
1338 | if (!sk->sk_bound_dev_if && | 1335 | if (!sk->sk_bound_dev_if && |
1339 | ipv6_addr_type(&req->af.v6_req.rmt_addr) & IPV6_ADDR_LINKLOCAL) | 1336 | ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL) |
1340 | req->af.v6_req.iif = tcp_v6_iif(skb); | 1337 | treq->iif = tcp_v6_iif(skb); |
1341 | 1338 | ||
1342 | if (isn == 0) | 1339 | if (isn == 0) |
1343 | isn = tcp_v6_init_sequence(sk,skb); | 1340 | isn = tcp_v6_init_sequence(sk,skb); |
1344 | 1341 | ||
1345 | req->snt_isn = isn; | 1342 | tcp_rsk(req)->snt_isn = isn; |
1346 | 1343 | ||
1347 | if (tcp_v6_send_synack(sk, req, NULL)) | 1344 | if (tcp_v6_send_synack(sk, req, NULL)) |
1348 | goto drop; | 1345 | goto drop; |
@@ -1353,16 +1350,17 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1353 | 1350 | ||
1354 | drop: | 1351 | drop: |
1355 | if (req) | 1352 | if (req) |
1356 | tcp_openreq_free(req); | 1353 | reqsk_free(req); |
1357 | 1354 | ||
1358 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); | 1355 | TCP_INC_STATS_BH(TCP_MIB_ATTEMPTFAILS); |
1359 | return 0; /* don't send reset */ | 1356 | return 0; /* don't send reset */ |
1360 | } | 1357 | } |
1361 | 1358 | ||
1362 | static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | 1359 | static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, |
1363 | struct open_request *req, | 1360 | struct request_sock *req, |
1364 | struct dst_entry *dst) | 1361 | struct dst_entry *dst) |
1365 | { | 1362 | { |
1363 | struct tcp6_request_sock *treq = tcp6_rsk(req); | ||
1366 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); | 1364 | struct ipv6_pinfo *newnp, *np = inet6_sk(sk); |
1367 | struct tcp6_sock *newtcp6sk; | 1365 | struct tcp6_sock *newtcp6sk; |
1368 | struct inet_sock *newinet; | 1366 | struct inet_sock *newinet; |
@@ -1426,10 +1424,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1426 | goto out_overflow; | 1424 | goto out_overflow; |
1427 | 1425 | ||
1428 | if (np->rxopt.bits.srcrt == 2 && | 1426 | if (np->rxopt.bits.srcrt == 2 && |
1429 | opt == NULL && req->af.v6_req.pktopts) { | 1427 | opt == NULL && treq->pktopts) { |
1430 | struct inet6_skb_parm *rxopt = IP6CB(req->af.v6_req.pktopts); | 1428 | struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); |
1431 | if (rxopt->srcrt) | 1429 | if (rxopt->srcrt) |
1432 | opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr*)(req->af.v6_req.pktopts->nh.raw+rxopt->srcrt)); | 1430 | opt = ipv6_invert_rthdr(sk, (struct ipv6_rt_hdr *)(treq->pktopts->nh.raw + rxopt->srcrt)); |
1433 | } | 1431 | } |
1434 | 1432 | ||
1435 | if (dst == NULL) { | 1433 | if (dst == NULL) { |
@@ -1438,16 +1436,16 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1438 | 1436 | ||
1439 | memset(&fl, 0, sizeof(fl)); | 1437 | memset(&fl, 0, sizeof(fl)); |
1440 | fl.proto = IPPROTO_TCP; | 1438 | fl.proto = IPPROTO_TCP; |
1441 | ipv6_addr_copy(&fl.fl6_dst, &req->af.v6_req.rmt_addr); | 1439 | ipv6_addr_copy(&fl.fl6_dst, &treq->rmt_addr); |
1442 | if (opt && opt->srcrt) { | 1440 | if (opt && opt->srcrt) { |
1443 | struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; | 1441 | struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt; |
1444 | ipv6_addr_copy(&final, &fl.fl6_dst); | 1442 | ipv6_addr_copy(&final, &fl.fl6_dst); |
1445 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); | 1443 | ipv6_addr_copy(&fl.fl6_dst, rt0->addr); |
1446 | final_p = &final; | 1444 | final_p = &final; |
1447 | } | 1445 | } |
1448 | ipv6_addr_copy(&fl.fl6_src, &req->af.v6_req.loc_addr); | 1446 | ipv6_addr_copy(&fl.fl6_src, &treq->loc_addr); |
1449 | fl.oif = sk->sk_bound_dev_if; | 1447 | fl.oif = sk->sk_bound_dev_if; |
1450 | fl.fl_ip_dport = req->rmt_port; | 1448 | fl.fl_ip_dport = inet_rsk(req)->rmt_port; |
1451 | fl.fl_ip_sport = inet_sk(sk)->sport; | 1449 | fl.fl_ip_sport = inet_sk(sk)->sport; |
1452 | 1450 | ||
1453 | if (ip6_dst_lookup(sk, &dst, &fl)) | 1451 | if (ip6_dst_lookup(sk, &dst, &fl)) |
@@ -1482,10 +1480,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1482 | 1480 | ||
1483 | memcpy(newnp, np, sizeof(struct ipv6_pinfo)); | 1481 | memcpy(newnp, np, sizeof(struct ipv6_pinfo)); |
1484 | 1482 | ||
1485 | ipv6_addr_copy(&newnp->daddr, &req->af.v6_req.rmt_addr); | 1483 | ipv6_addr_copy(&newnp->daddr, &treq->rmt_addr); |
1486 | ipv6_addr_copy(&newnp->saddr, &req->af.v6_req.loc_addr); | 1484 | ipv6_addr_copy(&newnp->saddr, &treq->loc_addr); |
1487 | ipv6_addr_copy(&newnp->rcv_saddr, &req->af.v6_req.loc_addr); | 1485 | ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr); |
1488 | newsk->sk_bound_dev_if = req->af.v6_req.iif; | 1486 | newsk->sk_bound_dev_if = treq->iif; |
1489 | 1487 | ||
1490 | /* Now IPv6 options... | 1488 | /* Now IPv6 options... |
1491 | 1489 | ||
@@ -1498,11 +1496,10 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1498 | 1496 | ||
1499 | /* Clone pktoptions received with SYN */ | 1497 | /* Clone pktoptions received with SYN */ |
1500 | newnp->pktoptions = NULL; | 1498 | newnp->pktoptions = NULL; |
1501 | if (req->af.v6_req.pktopts) { | 1499 | if (treq->pktopts != NULL) { |
1502 | newnp->pktoptions = skb_clone(req->af.v6_req.pktopts, | 1500 | newnp->pktoptions = skb_clone(treq->pktopts, GFP_ATOMIC); |
1503 | GFP_ATOMIC); | 1501 | kfree_skb(treq->pktopts); |
1504 | kfree_skb(req->af.v6_req.pktopts); | 1502 | treq->pktopts = NULL; |
1505 | req->af.v6_req.pktopts = NULL; | ||
1506 | if (newnp->pktoptions) | 1503 | if (newnp->pktoptions) |
1507 | skb_set_owner_r(newnp->pktoptions, newsk); | 1504 | skb_set_owner_r(newnp->pktoptions, newsk); |
1508 | } | 1505 | } |
@@ -2050,7 +2047,7 @@ static int tcp_v6_destroy_sock(struct sock *sk) | |||
2050 | 2047 | ||
2051 | /* Proc filesystem TCPv6 sock list dumping. */ | 2048 | /* Proc filesystem TCPv6 sock list dumping. */ |
2052 | static void get_openreq6(struct seq_file *seq, | 2049 | static void get_openreq6(struct seq_file *seq, |
2053 | struct sock *sk, struct open_request *req, int i, int uid) | 2050 | struct sock *sk, struct request_sock *req, int i, int uid) |
2054 | { | 2051 | { |
2055 | struct in6_addr *dest, *src; | 2052 | struct in6_addr *dest, *src; |
2056 | int ttd = req->expires - jiffies; | 2053 | int ttd = req->expires - jiffies; |
@@ -2058,8 +2055,8 @@ static void get_openreq6(struct seq_file *seq, | |||
2058 | if (ttd < 0) | 2055 | if (ttd < 0) |
2059 | ttd = 0; | 2056 | ttd = 0; |
2060 | 2057 | ||
2061 | src = &req->af.v6_req.loc_addr; | 2058 | src = &tcp6_rsk(req)->loc_addr; |
2062 | dest = &req->af.v6_req.rmt_addr; | 2059 | dest = &tcp6_rsk(req)->rmt_addr; |
2063 | seq_printf(seq, | 2060 | seq_printf(seq, |
2064 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " | 2061 | "%4d: %08X%08X%08X%08X:%04X %08X%08X%08X%08X:%04X " |
2065 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n", | 2062 | "%02X %08X:%08X %02X:%08lX %08X %5d %8d %d %d %p\n", |
@@ -2069,7 +2066,7 @@ static void get_openreq6(struct seq_file *seq, | |||
2069 | ntohs(inet_sk(sk)->sport), | 2066 | ntohs(inet_sk(sk)->sport), |
2070 | dest->s6_addr32[0], dest->s6_addr32[1], | 2067 | dest->s6_addr32[0], dest->s6_addr32[1], |
2071 | dest->s6_addr32[2], dest->s6_addr32[3], | 2068 | dest->s6_addr32[2], dest->s6_addr32[3], |
2072 | ntohs(req->rmt_port), | 2069 | ntohs(inet_rsk(req)->rmt_port), |
2073 | TCP_SYN_RECV, | 2070 | TCP_SYN_RECV, |
2074 | 0,0, /* could print option size, but that is af dependent. */ | 2071 | 0,0, /* could print option size, but that is af dependent. */ |
2075 | 1, /* timers active (only the expire timer) */ | 2072 | 1, /* timers active (only the expire timer) */ |
@@ -2239,6 +2236,7 @@ struct proto tcpv6_prot = { | |||
2239 | .sysctl_rmem = sysctl_tcp_rmem, | 2236 | .sysctl_rmem = sysctl_tcp_rmem, |
2240 | .max_header = MAX_TCP_HEADER, | 2237 | .max_header = MAX_TCP_HEADER, |
2241 | .obj_size = sizeof(struct tcp6_sock), | 2238 | .obj_size = sizeof(struct tcp6_sock), |
2239 | .rsk_prot = &tcp6_request_sock_ops, | ||
2242 | }; | 2240 | }; |
2243 | 2241 | ||
2244 | static struct inet6_protocol tcpv6_protocol = { | 2242 | static struct inet6_protocol tcpv6_protocol = { |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e251d0ba4f39..eff050ac7049 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -300,12 +300,12 @@ csum_copy_err: | |||
300 | /* Clear queue. */ | 300 | /* Clear queue. */ |
301 | if (flags&MSG_PEEK) { | 301 | if (flags&MSG_PEEK) { |
302 | int clear = 0; | 302 | int clear = 0; |
303 | spin_lock_irq(&sk->sk_receive_queue.lock); | 303 | spin_lock_bh(&sk->sk_receive_queue.lock); |
304 | if (skb == skb_peek(&sk->sk_receive_queue)) { | 304 | if (skb == skb_peek(&sk->sk_receive_queue)) { |
305 | __skb_unlink(skb, &sk->sk_receive_queue); | 305 | __skb_unlink(skb, &sk->sk_receive_queue); |
306 | clear = 1; | 306 | clear = 1; |
307 | } | 307 | } |
308 | spin_unlock_irq(&sk->sk_receive_queue.lock); | 308 | spin_unlock_bh(&sk->sk_receive_queue.lock); |
309 | if (clear) | 309 | if (clear) |
310 | kfree_skb(skb); | 310 | kfree_skb(skb); |
311 | } | 311 | } |