udp: add udp gso
Implement generic segmentation offload support for udp datagrams. A follow-up patch adds support to the protocol stack to generate such packets. UDP GSO is not UFO. UFO fragments a single large datagram. GSO splits a large payload into a number of discrete UDP datagrams. The implementation adds a GSO type SKB_UDP_GSO_L4 to differentiate it from UFO (SKB_UDP_GSO). IPPROTO_UDPLITE is excluded, as that protocol has no gso handler registered. [ Export __udp_gso_segment for ipv6. -DaveM ] Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
1cd7884dfd
commit
ee80d1ebe5
@@ -17,6 +17,20 @@
|
||||
#include <net/ip6_checksum.h>
|
||||
#include "ip6_offload.h"
|
||||
|
||||
static struct sk_buff *__udp6_gso_segment(struct sk_buff *gso_skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
const struct ipv6hdr *ip6h = ipv6_hdr(gso_skb);
|
||||
unsigned int mss = skb_shinfo(gso_skb)->gso_size;
|
||||
|
||||
if (!can_checksum_protocol(features, htons(ETH_P_IPV6)))
|
||||
return ERR_PTR(-EIO);
|
||||
|
||||
return __udp_gso_segment(gso_skb, features, mss,
|
||||
udp_v6_check(sizeof(struct udphdr) + mss,
|
||||
&ip6h->saddr, &ip6h->daddr, 0));
|
||||
}
|
||||
|
||||
static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
|
||||
netdev_features_t features)
|
||||
{
|
||||
@@ -42,12 +56,15 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
|
||||
const struct ipv6hdr *ipv6h;
|
||||
struct udphdr *uh;
|
||||
|
||||
if (!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP))
|
||||
if (!(skb_shinfo(skb)->gso_type & (SKB_GSO_UDP | SKB_GSO_UDP_L4)))
|
||||
goto out;
|
||||
|
||||
if (!pskb_may_pull(skb, sizeof(struct udphdr)))
|
||||
goto out;
|
||||
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)
|
||||
return __udp6_gso_segment(skb, features);
|
||||
|
||||
/* Do software UFO. Complete and fill in the UDP checksum as HW cannot
|
||||
* do checksum of UDP packets sent as multiple IP fragments.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user