diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 4 | ||||
-rw-r--r-- | net/ipv6/datagram.c | 5 | ||||
-rw-r--r-- | net/ipv6/ip6_flowlabel.c | 8 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 2 | ||||
-rw-r--r-- | net/ipv6/mcast.c | 2 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6_queue.c | 12 | ||||
-rw-r--r-- | net/ipv6/raw.c | 4 | ||||
-rw-r--r-- | net/ipv6/route.c | 33 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 31 | ||||
-rw-r--r-- | net/ipv6/udp.c | 4 |
10 files changed, 45 insertions, 60 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f012ebd87b43..12368c586068 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -374,8 +374,8 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
374 | "%s(): cannot allocate memory for statistics; dev=%s.\n", | 374 | "%s(): cannot allocate memory for statistics; dev=%s.\n", |
375 | __func__, dev->name)); | 375 | __func__, dev->name)); |
376 | neigh_parms_release(&nd_tbl, ndev->nd_parms); | 376 | neigh_parms_release(&nd_tbl, ndev->nd_parms); |
377 | ndev->dead = 1; | 377 | dev_put(dev); |
378 | in6_dev_finish_destroy(ndev); | 378 | kfree(ndev); |
379 | return NULL; | 379 | return NULL; |
380 | } | 380 | } |
381 | 381 | ||
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 9ef1831746ef..b46e9f88ce37 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -599,7 +599,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb) | |||
599 | return 0; | 599 | return 0; |
600 | } | 600 | } |
601 | 601 | ||
602 | int datagram_send_ctl(struct net *net, | 602 | int datagram_send_ctl(struct net *net, struct sock *sk, |
603 | struct msghdr *msg, struct flowi6 *fl6, | 603 | struct msghdr *msg, struct flowi6 *fl6, |
604 | struct ipv6_txoptions *opt, | 604 | struct ipv6_txoptions *opt, |
605 | int *hlimit, int *tclass, int *dontfrag) | 605 | int *hlimit, int *tclass, int *dontfrag) |
@@ -658,7 +658,8 @@ int datagram_send_ctl(struct net *net, | |||
658 | 658 | ||
659 | if (addr_type != IPV6_ADDR_ANY) { | 659 | if (addr_type != IPV6_ADDR_ANY) { |
660 | int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; | 660 | int strict = __ipv6_addr_src_scope(addr_type) <= IPV6_ADDR_SCOPE_LINKLOCAL; |
661 | if (!ipv6_chk_addr(net, &src_info->ipi6_addr, | 661 | if (!inet_sk(sk)->transparent && |
662 | !ipv6_chk_addr(net, &src_info->ipi6_addr, | ||
662 | strict ? dev : NULL, 0)) | 663 | strict ? dev : NULL, 0)) |
663 | err = -EINVAL; | 664 | err = -EINVAL; |
664 | else | 665 | else |
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index f3caf1b8d572..543039450193 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
@@ -322,8 +322,8 @@ static int fl6_renew(struct ip6_flowlabel *fl, unsigned long linger, unsigned lo | |||
322 | } | 322 | } |
323 | 323 | ||
324 | static struct ip6_flowlabel * | 324 | static struct ip6_flowlabel * |
325 | fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval, | 325 | fl_create(struct net *net, struct sock *sk, struct in6_flowlabel_req *freq, |
326 | int optlen, int *err_p) | 326 | char __user *optval, int optlen, int *err_p) |
327 | { | 327 | { |
328 | struct ip6_flowlabel *fl = NULL; | 328 | struct ip6_flowlabel *fl = NULL; |
329 | int olen; | 329 | int olen; |
@@ -360,7 +360,7 @@ fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval, | |||
360 | msg.msg_control = (void*)(fl->opt+1); | 360 | msg.msg_control = (void*)(fl->opt+1); |
361 | memset(&flowi6, 0, sizeof(flowi6)); | 361 | memset(&flowi6, 0, sizeof(flowi6)); |
362 | 362 | ||
363 | err = datagram_send_ctl(net, &msg, &flowi6, fl->opt, &junk, | 363 | err = datagram_send_ctl(net, sk, &msg, &flowi6, fl->opt, &junk, |
364 | &junk, &junk); | 364 | &junk, &junk); |
365 | if (err) | 365 | if (err) |
366 | goto done; | 366 | goto done; |
@@ -528,7 +528,7 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen) | |||
528 | if (freq.flr_label & ~IPV6_FLOWLABEL_MASK) | 528 | if (freq.flr_label & ~IPV6_FLOWLABEL_MASK) |
529 | return -EINVAL; | 529 | return -EINVAL; |
530 | 530 | ||
531 | fl = fl_create(net, &freq, optval, optlen, &err); | 531 | fl = fl_create(net, sk, &freq, optval, optlen, &err); |
532 | if (fl == NULL) | 532 | if (fl == NULL) |
533 | return err; | 533 | return err; |
534 | sfl1 = kmalloc(sizeof(*sfl1), GFP_KERNEL); | 534 | sfl1 = kmalloc(sizeof(*sfl1), GFP_KERNEL); |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 147ede38ab48..2fbda5fc4cc4 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -475,7 +475,7 @@ sticky_done: | |||
475 | msg.msg_controllen = optlen; | 475 | msg.msg_controllen = optlen; |
476 | msg.msg_control = (void*)(opt+1); | 476 | msg.msg_control = (void*)(opt+1); |
477 | 477 | ||
478 | retv = datagram_send_ctl(net, &msg, &fl6, opt, &junk, &junk, | 478 | retv = datagram_send_ctl(net, sk, &msg, &fl6, opt, &junk, &junk, |
479 | &junk); | 479 | &junk); |
480 | if (retv) | 480 | if (retv) |
481 | goto done; | 481 | goto done; |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 3e6ebcdb4779..ee7839f4d6e3 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -1059,7 +1059,7 @@ static int mld_xmarksources(struct ifmcaddr6 *pmc, int nsrcs, | |||
1059 | break; | 1059 | break; |
1060 | for (i=0; i<nsrcs; i++) { | 1060 | for (i=0; i<nsrcs; i++) { |
1061 | /* skip inactive filters */ | 1061 | /* skip inactive filters */ |
1062 | if (pmc->mca_sfcount[MCAST_INCLUDE] || | 1062 | if (psf->sf_count[MCAST_INCLUDE] || |
1063 | pmc->mca_sfcount[MCAST_EXCLUDE] != | 1063 | pmc->mca_sfcount[MCAST_EXCLUDE] != |
1064 | psf->sf_count[MCAST_EXCLUDE]) | 1064 | psf->sf_count[MCAST_EXCLUDE]) |
1065 | continue; | 1065 | continue; |
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c index 249394863284..e63c3972a739 100644 --- a/net/ipv6/netfilter/ip6_queue.c +++ b/net/ipv6/netfilter/ip6_queue.c | |||
@@ -218,6 +218,7 @@ ipq_build_packet_message(struct nf_queue_entry *entry, int *errp) | |||
218 | return skb; | 218 | return skb; |
219 | 219 | ||
220 | nlmsg_failure: | 220 | nlmsg_failure: |
221 | kfree_skb(skb); | ||
221 | *errp = -EINVAL; | 222 | *errp = -EINVAL; |
222 | printk(KERN_ERR "ip6_queue: error creating packet message\n"); | 223 | printk(KERN_ERR "ip6_queue: error creating packet message\n"); |
223 | return NULL; | 224 | return NULL; |
@@ -313,7 +314,7 @@ ipq_set_verdict(struct ipq_verdict_msg *vmsg, unsigned int len) | |||
313 | { | 314 | { |
314 | struct nf_queue_entry *entry; | 315 | struct nf_queue_entry *entry; |
315 | 316 | ||
316 | if (vmsg->value > NF_MAX_VERDICT) | 317 | if (vmsg->value > NF_MAX_VERDICT || vmsg->value == NF_STOLEN) |
317 | return -EINVAL; | 318 | return -EINVAL; |
318 | 319 | ||
319 | entry = ipq_find_dequeue_entry(vmsg->id); | 320 | entry = ipq_find_dequeue_entry(vmsg->id); |
@@ -358,12 +359,9 @@ ipq_receive_peer(struct ipq_peer_msg *pmsg, | |||
358 | break; | 359 | break; |
359 | 360 | ||
360 | case IPQM_VERDICT: | 361 | case IPQM_VERDICT: |
361 | if (pmsg->msg.verdict.value > NF_MAX_VERDICT) | 362 | status = ipq_set_verdict(&pmsg->msg.verdict, |
362 | status = -EINVAL; | 363 | len - sizeof(*pmsg)); |
363 | else | 364 | break; |
364 | status = ipq_set_verdict(&pmsg->msg.verdict, | ||
365 | len - sizeof(*pmsg)); | ||
366 | break; | ||
367 | default: | 365 | default: |
368 | status = -EINVAL; | 366 | status = -EINVAL; |
369 | } | 367 | } |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 6a79f3081bdb..343852e5c703 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -817,8 +817,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
817 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 817 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
818 | opt->tot_len = sizeof(struct ipv6_txoptions); | 818 | opt->tot_len = sizeof(struct ipv6_txoptions); |
819 | 819 | ||
820 | err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit, | 820 | err = datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt, |
821 | &tclass, &dontfrag); | 821 | &hlimit, &tclass, &dontfrag); |
822 | if (err < 0) { | 822 | if (err < 0) { |
823 | fl6_sock_release(flowlabel); | 823 | fl6_sock_release(flowlabel); |
824 | return err; | 824 | return err; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 9e69eb0ec6dd..1250f9020670 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -104,6 +104,9 @@ static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old) | |||
104 | struct inet_peer *peer; | 104 | struct inet_peer *peer; |
105 | u32 *p = NULL; | 105 | u32 *p = NULL; |
106 | 106 | ||
107 | if (!(rt->dst.flags & DST_HOST)) | ||
108 | return NULL; | ||
109 | |||
107 | if (!rt->rt6i_peer) | 110 | if (!rt->rt6i_peer) |
108 | rt6_bind_peer(rt, 1); | 111 | rt6_bind_peer(rt, 1); |
109 | 112 | ||
@@ -252,6 +255,9 @@ static void ip6_dst_destroy(struct dst_entry *dst) | |||
252 | struct inet6_dev *idev = rt->rt6i_idev; | 255 | struct inet6_dev *idev = rt->rt6i_idev; |
253 | struct inet_peer *peer = rt->rt6i_peer; | 256 | struct inet_peer *peer = rt->rt6i_peer; |
254 | 257 | ||
258 | if (!(rt->dst.flags & DST_HOST)) | ||
259 | dst_destroy_metrics_generic(dst); | ||
260 | |||
255 | if (idev != NULL) { | 261 | if (idev != NULL) { |
256 | rt->rt6i_idev = NULL; | 262 | rt->rt6i_idev = NULL; |
257 | in6_dev_put(idev); | 263 | in6_dev_put(idev); |
@@ -723,9 +729,7 @@ static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort, | |||
723 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); | 729 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); |
724 | } | 730 | } |
725 | 731 | ||
726 | rt->rt6i_dst.plen = 128; | ||
727 | rt->rt6i_flags |= RTF_CACHE; | 732 | rt->rt6i_flags |= RTF_CACHE; |
728 | rt->dst.flags |= DST_HOST; | ||
729 | 733 | ||
730 | #ifdef CONFIG_IPV6_SUBTREES | 734 | #ifdef CONFIG_IPV6_SUBTREES |
731 | if (rt->rt6i_src.plen && saddr) { | 735 | if (rt->rt6i_src.plen && saddr) { |
@@ -775,9 +779,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, | |||
775 | struct rt6_info *rt = ip6_rt_copy(ort, daddr); | 779 | struct rt6_info *rt = ip6_rt_copy(ort, daddr); |
776 | 780 | ||
777 | if (rt) { | 781 | if (rt) { |
778 | rt->rt6i_dst.plen = 128; | ||
779 | rt->rt6i_flags |= RTF_CACHE; | 782 | rt->rt6i_flags |= RTF_CACHE; |
780 | rt->dst.flags |= DST_HOST; | ||
781 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst))); | 783 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst))); |
782 | } | 784 | } |
783 | return rt; | 785 | return rt; |
@@ -1078,12 +1080,15 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
1078 | neigh = NULL; | 1080 | neigh = NULL; |
1079 | } | 1081 | } |
1080 | 1082 | ||
1081 | rt->rt6i_idev = idev; | 1083 | rt->dst.flags |= DST_HOST; |
1084 | rt->dst.output = ip6_output; | ||
1082 | dst_set_neighbour(&rt->dst, neigh); | 1085 | dst_set_neighbour(&rt->dst, neigh); |
1083 | atomic_set(&rt->dst.__refcnt, 1); | 1086 | atomic_set(&rt->dst.__refcnt, 1); |
1084 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); | ||
1085 | dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); | 1087 | dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); |
1086 | rt->dst.output = ip6_output; | 1088 | |
1089 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); | ||
1090 | rt->rt6i_dst.plen = 128; | ||
1091 | rt->rt6i_idev = idev; | ||
1087 | 1092 | ||
1088 | spin_lock_bh(&icmp6_dst_lock); | 1093 | spin_lock_bh(&icmp6_dst_lock); |
1089 | rt->dst.next = icmp6_dst_gc_list; | 1094 | rt->dst.next = icmp6_dst_gc_list; |
@@ -1261,6 +1266,14 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1261 | if (rt->rt6i_dst.plen == 128) | 1266 | if (rt->rt6i_dst.plen == 128) |
1262 | rt->dst.flags |= DST_HOST; | 1267 | rt->dst.flags |= DST_HOST; |
1263 | 1268 | ||
1269 | if (!(rt->dst.flags & DST_HOST) && cfg->fc_mx) { | ||
1270 | u32 *metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL); | ||
1271 | if (!metrics) { | ||
1272 | err = -ENOMEM; | ||
1273 | goto out; | ||
1274 | } | ||
1275 | dst_init_metrics(&rt->dst, metrics, 0); | ||
1276 | } | ||
1264 | #ifdef CONFIG_IPV6_SUBTREES | 1277 | #ifdef CONFIG_IPV6_SUBTREES |
1265 | ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); | 1278 | ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len); |
1266 | rt->rt6i_src.plen = cfg->fc_src_len; | 1279 | rt->rt6i_src.plen = cfg->fc_src_len; |
@@ -1607,9 +1620,6 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src, | |||
1607 | if (on_link) | 1620 | if (on_link) |
1608 | nrt->rt6i_flags &= ~RTF_GATEWAY; | 1621 | nrt->rt6i_flags &= ~RTF_GATEWAY; |
1609 | 1622 | ||
1610 | nrt->rt6i_dst.plen = 128; | ||
1611 | nrt->dst.flags |= DST_HOST; | ||
1612 | |||
1613 | ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key); | 1623 | ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key); |
1614 | dst_set_neighbour(&nrt->dst, neigh_clone(neigh)); | 1624 | dst_set_neighbour(&nrt->dst, neigh_clone(neigh)); |
1615 | 1625 | ||
@@ -1754,9 +1764,10 @@ static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, | |||
1754 | if (rt) { | 1764 | if (rt) { |
1755 | rt->dst.input = ort->dst.input; | 1765 | rt->dst.input = ort->dst.input; |
1756 | rt->dst.output = ort->dst.output; | 1766 | rt->dst.output = ort->dst.output; |
1767 | rt->dst.flags |= DST_HOST; | ||
1757 | 1768 | ||
1758 | ipv6_addr_copy(&rt->rt6i_dst.addr, dest); | 1769 | ipv6_addr_copy(&rt->rt6i_dst.addr, dest); |
1759 | rt->rt6i_dst.plen = ort->rt6i_dst.plen; | 1770 | rt->rt6i_dst.plen = 128; |
1760 | dst_copy_metrics(&rt->dst, &ort->dst); | 1771 | dst_copy_metrics(&rt->dst, &ort->dst); |
1761 | rt->dst.error = ort->dst.error; | 1772 | rt->dst.error = ort->dst.error; |
1762 | rt->rt6i_idev = ort->rt6i_idev; | 1773 | rt->rt6i_idev = ort->rt6i_idev; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index d1fb63f4aeb7..3c9fa618b69d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -531,20 +531,6 @@ static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req, | |||
531 | return tcp_v6_send_synack(sk, req, rvp); | 531 | return tcp_v6_send_synack(sk, req, rvp); |
532 | } | 532 | } |
533 | 533 | ||
534 | static inline void syn_flood_warning(struct sk_buff *skb) | ||
535 | { | ||
536 | #ifdef CONFIG_SYN_COOKIES | ||
537 | if (sysctl_tcp_syncookies) | ||
538 | printk(KERN_INFO | ||
539 | "TCPv6: Possible SYN flooding on port %d. " | ||
540 | "Sending cookies.\n", ntohs(tcp_hdr(skb)->dest)); | ||
541 | else | ||
542 | #endif | ||
543 | printk(KERN_INFO | ||
544 | "TCPv6: Possible SYN flooding on port %d. " | ||
545 | "Dropping request.\n", ntohs(tcp_hdr(skb)->dest)); | ||
546 | } | ||
547 | |||
548 | static void tcp_v6_reqsk_destructor(struct request_sock *req) | 534 | static void tcp_v6_reqsk_destructor(struct request_sock *req) |
549 | { | 535 | { |
550 | kfree_skb(inet6_rsk(req)->pktopts); | 536 | kfree_skb(inet6_rsk(req)->pktopts); |
@@ -1179,11 +1165,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1179 | struct tcp_sock *tp = tcp_sk(sk); | 1165 | struct tcp_sock *tp = tcp_sk(sk); |
1180 | __u32 isn = TCP_SKB_CB(skb)->when; | 1166 | __u32 isn = TCP_SKB_CB(skb)->when; |
1181 | struct dst_entry *dst = NULL; | 1167 | struct dst_entry *dst = NULL; |
1182 | #ifdef CONFIG_SYN_COOKIES | ||
1183 | int want_cookie = 0; | 1168 | int want_cookie = 0; |
1184 | #else | ||
1185 | #define want_cookie 0 | ||
1186 | #endif | ||
1187 | 1169 | ||
1188 | if (skb->protocol == htons(ETH_P_IP)) | 1170 | if (skb->protocol == htons(ETH_P_IP)) |
1189 | return tcp_v4_conn_request(sk, skb); | 1171 | return tcp_v4_conn_request(sk, skb); |
@@ -1192,14 +1174,9 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1192 | goto drop; | 1174 | goto drop; |
1193 | 1175 | ||
1194 | if (inet_csk_reqsk_queue_is_full(sk) && !isn) { | 1176 | if (inet_csk_reqsk_queue_is_full(sk) && !isn) { |
1195 | if (net_ratelimit()) | 1177 | want_cookie = tcp_syn_flood_action(sk, skb, "TCPv6"); |
1196 | syn_flood_warning(skb); | 1178 | if (!want_cookie) |
1197 | #ifdef CONFIG_SYN_COOKIES | 1179 | goto drop; |
1198 | if (sysctl_tcp_syncookies) | ||
1199 | want_cookie = 1; | ||
1200 | else | ||
1201 | #endif | ||
1202 | goto drop; | ||
1203 | } | 1180 | } |
1204 | 1181 | ||
1205 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) | 1182 | if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) |
@@ -1249,9 +1226,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1249 | while (l-- > 0) | 1226 | while (l-- > 0) |
1250 | *c++ ^= *hash_location++; | 1227 | *c++ ^= *hash_location++; |
1251 | 1228 | ||
1252 | #ifdef CONFIG_SYN_COOKIES | ||
1253 | want_cookie = 0; /* not our kind of cookie */ | 1229 | want_cookie = 0; /* not our kind of cookie */ |
1254 | #endif | ||
1255 | tmp_ext.cookie_out_never = 0; /* false */ | 1230 | tmp_ext.cookie_out_never = 0; /* false */ |
1256 | tmp_ext.cookie_plus = tmp_opt.cookie_plus; | 1231 | tmp_ext.cookie_plus = tmp_opt.cookie_plus; |
1257 | } else if (!tp->rx_opt.cookie_in_always) { | 1232 | } else if (!tp->rx_opt.cookie_in_always) { |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 29213b51c499..bb95e8e1c6f9 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1090,8 +1090,8 @@ do_udp_sendmsg: | |||
1090 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 1090 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
1091 | opt->tot_len = sizeof(*opt); | 1091 | opt->tot_len = sizeof(*opt); |
1092 | 1092 | ||
1093 | err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit, | 1093 | err = datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt, |
1094 | &tclass, &dontfrag); | 1094 | &hlimit, &tclass, &dontfrag); |
1095 | if (err < 0) { | 1095 | if (err < 0) { |
1096 | fl6_sock_release(flowlabel); | 1096 | fl6_sock_release(flowlabel); |
1097 | return err; | 1097 | return err; |