|
@@ -29,6 +29,28 @@ static void tcp_gso_tstamp(struct sk_buff *skb, unsigned int ts_seq,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+struct sk_buff *tcp4_gso_segment(struct sk_buff *skb,
|
|
|
|
+ netdev_features_t features)
|
|
|
|
+{
|
|
|
|
+ if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
|
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
|
+
|
|
|
|
+ if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
|
|
|
|
+ const struct iphdr *iph = ip_hdr(skb);
|
|
|
|
+ struct tcphdr *th = tcp_hdr(skb);
|
|
|
|
+
|
|
|
|
+ /* Set up checksum pseudo header, usually expect stack to
|
|
|
|
+ * have done this already.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ th->check = 0;
|
|
|
|
+ skb->ip_summed = CHECKSUM_PARTIAL;
|
|
|
|
+ __tcp_v4_send_check(skb, iph->saddr, iph->daddr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return tcp_gso_segment(skb, features);
|
|
|
|
+}
|
|
|
|
+
|
|
struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|
struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|
netdev_features_t features)
|
|
netdev_features_t features)
|
|
{
|
|
{
|
|
@@ -44,9 +66,6 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
|
__sum16 newcheck;
|
|
__sum16 newcheck;
|
|
bool ooo_okay, copy_destructor;
|
|
bool ooo_okay, copy_destructor;
|
|
|
|
|
|
- if (!pskb_may_pull(skb, sizeof(*th)))
|
|
|
|
- goto out;
|
|
|
|
-
|
|
|
|
th = tcp_hdr(skb);
|
|
th = tcp_hdr(skb);
|
|
thlen = th->doff * 4;
|
|
thlen = th->doff * 4;
|
|
if (thlen < sizeof(*th))
|
|
if (thlen < sizeof(*th))
|
|
@@ -271,18 +290,6 @@ EXPORT_SYMBOL(tcp_gro_complete);
|
|
|
|
|
|
static int tcp_v4_gso_send_check(struct sk_buff *skb)
|
|
static int tcp_v4_gso_send_check(struct sk_buff *skb)
|
|
{
|
|
{
|
|
- const struct iphdr *iph;
|
|
|
|
- struct tcphdr *th;
|
|
|
|
-
|
|
|
|
- if (!pskb_may_pull(skb, sizeof(*th)))
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
- iph = ip_hdr(skb);
|
|
|
|
- th = tcp_hdr(skb);
|
|
|
|
-
|
|
|
|
- th->check = 0;
|
|
|
|
- skb->ip_summed = CHECKSUM_PARTIAL;
|
|
|
|
- __tcp_v4_send_check(skb, iph->saddr, iph->daddr);
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -314,7 +321,7 @@ static int tcp4_gro_complete(struct sk_buff *skb, int thoff)
|
|
static const struct net_offload tcpv4_offload = {
|
|
static const struct net_offload tcpv4_offload = {
|
|
.callbacks = {
|
|
.callbacks = {
|
|
.gso_send_check = tcp_v4_gso_send_check,
|
|
.gso_send_check = tcp_v4_gso_send_check,
|
|
- .gso_segment = tcp_gso_segment,
|
|
|
|
|
|
+ .gso_segment = tcp4_gso_segment,
|
|
.gro_receive = tcp4_gro_receive,
|
|
.gro_receive = tcp4_gro_receive,
|
|
.gro_complete = tcp4_gro_complete,
|
|
.gro_complete = tcp4_gro_complete,
|
|
},
|
|
},
|