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>
This commit is contained in:
@@ -772,15 +772,20 @@ static inline int ip_ufo_append_data(struct sock *sk,
|
|||||||
/* initialize protocol header pointer */
|
/* initialize protocol header pointer */
|
||||||
skb->transport_header = skb->network_header + fragheaderlen;
|
skb->transport_header = skb->network_header + fragheaderlen;
|
||||||
|
|
||||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
|
||||||
skb->csum = 0;
|
skb->csum = 0;
|
||||||
|
|
||||||
/* specify the length of each IP datagram fragment */
|
|
||||||
skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen;
|
|
||||||
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
||||||
__skb_queue_tail(queue, skb);
|
__skb_queue_tail(queue, skb);
|
||||||
|
} else if (skb_is_gso(skb)) {
|
||||||
|
goto append;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||||
|
/* specify the length of each IP datagram fragment */
|
||||||
|
skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen;
|
||||||
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
||||||
|
|
||||||
|
append:
|
||||||
return skb_append_datato_frags(sk, skb, getfrag, from,
|
return skb_append_datato_frags(sk, skb, getfrag, from,
|
||||||
(length - transhdrlen));
|
(length - transhdrlen));
|
||||||
}
|
}
|
||||||
|
@@ -1008,6 +1008,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|||||||
|
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
struct frag_hdr fhdr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* There is support for UDP large send offload by network
|
/* There is support for UDP large send offload by network
|
||||||
@@ -1015,8 +1016,6 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|||||||
* udp datagram
|
* udp datagram
|
||||||
*/
|
*/
|
||||||
if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
|
if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) {
|
||||||
struct frag_hdr fhdr;
|
|
||||||
|
|
||||||
skb = sock_alloc_send_skb(sk,
|
skb = sock_alloc_send_skb(sk,
|
||||||
hh_len + fragheaderlen + transhdrlen + 20,
|
hh_len + fragheaderlen + transhdrlen + 20,
|
||||||
(flags & MSG_DONTWAIT), &err);
|
(flags & MSG_DONTWAIT), &err);
|
||||||
@@ -1036,20 +1035,24 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|||||||
skb->transport_header = skb->network_header + fragheaderlen;
|
skb->transport_header = skb->network_header + fragheaderlen;
|
||||||
|
|
||||||
skb->protocol = htons(ETH_P_IPV6);
|
skb->protocol = htons(ETH_P_IPV6);
|
||||||
skb->ip_summed = CHECKSUM_PARTIAL;
|
|
||||||
skb->csum = 0;
|
skb->csum = 0;
|
||||||
|
|
||||||
/* Specify the length of each IPv6 datagram fragment.
|
|
||||||
* It has to be a multiple of 8.
|
|
||||||
*/
|
|
||||||
skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
|
|
||||||
sizeof(struct frag_hdr)) & ~7;
|
|
||||||
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
||||||
ipv6_select_ident(&fhdr, rt);
|
|
||||||
skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
|
|
||||||
__skb_queue_tail(&sk->sk_write_queue, skb);
|
__skb_queue_tail(&sk->sk_write_queue, skb);
|
||||||
|
} else if (skb_is_gso(skb)) {
|
||||||
|
goto append;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skb->ip_summed = CHECKSUM_PARTIAL;
|
||||||
|
/* Specify the length of each IPv6 datagram fragment.
|
||||||
|
* It has to be a multiple of 8.
|
||||||
|
*/
|
||||||
|
skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
|
||||||
|
sizeof(struct frag_hdr)) & ~7;
|
||||||
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
||||||
|
ipv6_select_ident(&fhdr, rt);
|
||||||
|
skb_shinfo(skb)->ip6_frag_id = fhdr.identification;
|
||||||
|
|
||||||
|
append:
|
||||||
return skb_append_datato_frags(sk, skb, getfrag, from,
|
return skb_append_datato_frags(sk, skb, getfrag, from,
|
||||||
(length - transhdrlen));
|
(length - transhdrlen));
|
||||||
}
|
}
|
||||||
|
@@ -1225,9 +1225,6 @@ do_udp_sendmsg:
|
|||||||
if (tclass < 0)
|
if (tclass < 0)
|
||||||
tclass = np->tclass;
|
tclass = np->tclass;
|
||||||
|
|
||||||
if (dontfrag < 0)
|
|
||||||
dontfrag = np->dontfrag;
|
|
||||||
|
|
||||||
if (msg->msg_flags&MSG_CONFIRM)
|
if (msg->msg_flags&MSG_CONFIRM)
|
||||||
goto do_confirm;
|
goto do_confirm;
|
||||||
back_from_confirm:
|
back_from_confirm:
|
||||||
@@ -1246,6 +1243,8 @@ back_from_confirm:
|
|||||||
up->pending = AF_INET6;
|
up->pending = AF_INET6;
|
||||||
|
|
||||||
do_append_data:
|
do_append_data:
|
||||||
|
if (dontfrag < 0)
|
||||||
|
dontfrag = np->dontfrag;
|
||||||
up->len += ulen;
|
up->len += ulen;
|
||||||
getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag;
|
||||||
err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen,
|
err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen,
|
||||||
|
Reference in New Issue
Block a user