diff options
Diffstat (limited to 'net/ipv6/raw.c')
| -rw-r--r-- | net/ipv6/raw.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 554b48b6e993..4a4dcbe4f8b2 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -381,7 +381,7 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) | |||
| 381 | } | 381 | } |
| 382 | 382 | ||
| 383 | /* Charge it to the socket. */ | 383 | /* Charge it to the socket. */ |
| 384 | if (sock_queue_rcv_skb(sk, skb) < 0) { | 384 | if (ip_queue_rcv_skb(sk, skb) < 0) { |
| 385 | kfree_skb(skb); | 385 | kfree_skb(skb); |
| 386 | return NET_RX_DROP; | 386 | return NET_RX_DROP; |
| 387 | } | 387 | } |
| @@ -461,6 +461,9 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk, | |||
| 461 | if (flags & MSG_ERRQUEUE) | 461 | if (flags & MSG_ERRQUEUE) |
| 462 | return ipv6_recv_error(sk, msg, len); | 462 | return ipv6_recv_error(sk, msg, len); |
| 463 | 463 | ||
| 464 | if (np->rxpmtu && np->rxopt.bits.rxpmtu) | ||
| 465 | return ipv6_recv_rxpmtu(sk, msg, len); | ||
| 466 | |||
| 464 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 467 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
| 465 | if (!skb) | 468 | if (!skb) |
| 466 | goto out; | 469 | goto out; |
| @@ -733,6 +736,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 733 | int addr_len = msg->msg_namelen; | 736 | int addr_len = msg->msg_namelen; |
| 734 | int hlimit = -1; | 737 | int hlimit = -1; |
| 735 | int tclass = -1; | 738 | int tclass = -1; |
| 739 | int dontfrag = -1; | ||
| 736 | u16 proto; | 740 | u16 proto; |
| 737 | int err; | 741 | int err; |
| 738 | 742 | ||
| @@ -811,7 +815,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 811 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 815 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
| 812 | opt->tot_len = sizeof(struct ipv6_txoptions); | 816 | opt->tot_len = sizeof(struct ipv6_txoptions); |
| 813 | 817 | ||
| 814 | err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit, &tclass); | 818 | err = datagram_send_ctl(sock_net(sk), msg, &fl, opt, &hlimit, |
| 819 | &tclass, &dontfrag); | ||
| 815 | if (err < 0) { | 820 | if (err < 0) { |
| 816 | fl6_sock_release(flowlabel); | 821 | fl6_sock_release(flowlabel); |
| 817 | return err; | 822 | return err; |
| @@ -880,6 +885,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 880 | if (tclass < 0) | 885 | if (tclass < 0) |
| 881 | tclass = np->tclass; | 886 | tclass = np->tclass; |
| 882 | 887 | ||
| 888 | if (dontfrag < 0) | ||
| 889 | dontfrag = np->dontfrag; | ||
| 890 | |||
| 883 | if (msg->msg_flags&MSG_CONFIRM) | 891 | if (msg->msg_flags&MSG_CONFIRM) |
| 884 | goto do_confirm; | 892 | goto do_confirm; |
| 885 | 893 | ||
| @@ -890,7 +898,7 @@ back_from_confirm: | |||
| 890 | lock_sock(sk); | 898 | lock_sock(sk); |
| 891 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, | 899 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, |
| 892 | len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst, | 900 | len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst, |
| 893 | msg->msg_flags); | 901 | msg->msg_flags, dontfrag); |
| 894 | 902 | ||
| 895 | if (err) | 903 | if (err) |
| 896 | ip6_flush_pending_frames(sk); | 904 | ip6_flush_pending_frames(sk); |
