diff options
author | David S. Miller <davem@davemloft.net> | 2013-10-19 19:21:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-19 19:21:24 -0400 |
commit | 77d4015ba1ce22987bbf41e6469fa94cd72cb8d7 (patch) | |
tree | 982957514f2e4966c2a817c7615178c459e1fd3a | |
parent | f2e5ddcc0d12f9c4c7b254358ad245c9dddce13b (diff) | |
parent | e93b7d748be887cd7639b113ba7d7ef792a7efb9 (diff) |
Merge branch 'ufo_fixes'
Jiri Pirko says:
====================
UFO fixes
Couple of patches fixing UFO functionality in different situations.
v1->v2:
- minor if{}else{} coding style adjustment suggested by Sergei Shtylyov
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/ip_output.c | 13 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 25 | ||||
-rw-r--r-- | net/ipv6/udp.c | 5 |
3 files changed, 25 insertions, 18 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index a04d872c54f9..3982eabf61e1 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -772,15 +772,20 @@ static inline int ip_ufo_append_data(struct sock *sk, | |||
772 | /* initialize protocol header pointer */ | 772 | /* initialize protocol header pointer */ |
773 | skb->transport_header = skb->network_header + fragheaderlen; | 773 | skb->transport_header = skb->network_header + fragheaderlen; |
774 | 774 | ||
775 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
776 | skb->csum = 0; | 775 | skb->csum = 0; |
777 | 776 | ||
778 | /* specify the length of each IP datagram fragment */ | 777 | |
779 | skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; | ||
780 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
781 | __skb_queue_tail(queue, skb); | 778 | __skb_queue_tail(queue, skb); |
779 | } else if (skb_is_gso(skb)) { | ||
780 | goto append; | ||
782 | } | 781 | } |
783 | 782 | ||
783 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
784 | /* specify the length of each IP datagram fragment */ | ||
785 | skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; | ||
786 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
787 | |||
788 | append: | ||
784 | return skb_append_datato_frags(sk, skb, getfrag, from, | 789 | return skb_append_datato_frags(sk, skb, getfrag, from, |
785 | (length - transhdrlen)); | 790 | (length - transhdrlen)); |
786 | } | 791 | } |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a54c45ce4a48..975624b8d2ea 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1008,6 +1008,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1008 | 1008 | ||
1009 | { | 1009 | { |
1010 | struct sk_buff *skb; | 1010 | struct sk_buff *skb; |
1011 | struct frag_hdr fhdr; | ||
1011 | int err; | 1012 | int err; |
1012 | 1013 | ||
1013 | /* There is support for UDP large send offload by network | 1014 | /* There is support for UDP large send offload by network |
@@ -1015,8 +1016,6 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1015 | * udp datagram | 1016 | * udp datagram |
1016 | */ | 1017 | */ |
1017 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) { | 1018 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) { |
1018 | struct frag_hdr fhdr; | ||
1019 | |||
1020 | skb = sock_alloc_send_skb(sk, | 1019 | skb = sock_alloc_send_skb(sk, |
1021 | hh_len + fragheaderlen + transhdrlen + 20, | 1020 | hh_len + fragheaderlen + transhdrlen + 20, |
1022 | (flags & MSG_DONTWAIT), &err); | 1021 | (flags & MSG_DONTWAIT), &err); |
@@ -1036,20 +1035,24 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1036 | skb->transport_header = skb->network_header + fragheaderlen; | 1035 | skb->transport_header = skb->network_header + fragheaderlen; |
1037 | 1036 | ||
1038 | skb->protocol = htons(ETH_P_IPV6); | 1037 | skb->protocol = htons(ETH_P_IPV6); |
1039 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
1040 | skb->csum = 0; | 1038 | skb->csum = 0; |
1041 | 1039 | ||
1042 | /* Specify the length of each IPv6 datagram fragment. | ||
1043 | * It has to be a multiple of 8. | ||
1044 | */ | ||
1045 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - | ||
1046 | sizeof(struct frag_hdr)) & ~7; | ||
1047 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
1048 | ipv6_select_ident(&fhdr, rt); | ||
1049 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; | ||
1050 | __skb_queue_tail(&sk->sk_write_queue, skb); | 1040 | __skb_queue_tail(&sk->sk_write_queue, skb); |
1041 | } else if (skb_is_gso(skb)) { | ||
1042 | goto append; | ||
1051 | } | 1043 | } |
1052 | 1044 | ||
1045 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
1046 | /* Specify the length of each IPv6 datagram fragment. | ||
1047 | * It has to be a multiple of 8. | ||
1048 | */ | ||
1049 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - | ||
1050 | sizeof(struct frag_hdr)) & ~7; | ||
1051 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
1052 | ipv6_select_ident(&fhdr, rt); | ||
1053 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; | ||
1054 | |||
1055 | append: | ||
1053 | return skb_append_datato_frags(sk, skb, getfrag, from, | 1056 | return skb_append_datato_frags(sk, skb, getfrag, from, |
1054 | (length - transhdrlen)); | 1057 | (length - transhdrlen)); |
1055 | } | 1058 | } |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 72b7eaaf3ca0..18786098fd41 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1225,9 +1225,6 @@ do_udp_sendmsg: | |||
1225 | if (tclass < 0) | 1225 | if (tclass < 0) |
1226 | tclass = np->tclass; | 1226 | tclass = np->tclass; |
1227 | 1227 | ||
1228 | if (dontfrag < 0) | ||
1229 | dontfrag = np->dontfrag; | ||
1230 | |||
1231 | if (msg->msg_flags&MSG_CONFIRM) | 1228 | if (msg->msg_flags&MSG_CONFIRM) |
1232 | goto do_confirm; | 1229 | goto do_confirm; |
1233 | back_from_confirm: | 1230 | back_from_confirm: |
@@ -1246,6 +1243,8 @@ back_from_confirm: | |||
1246 | up->pending = AF_INET6; | 1243 | up->pending = AF_INET6; |
1247 | 1244 | ||
1248 | do_append_data: | 1245 | do_append_data: |
1246 | if (dontfrag < 0) | ||
1247 | dontfrag = np->dontfrag; | ||
1249 | up->len += ulen; | 1248 | up->len += ulen; |
1250 | getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; | 1249 | getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; |
1251 | err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen, | 1250 | err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen, |