|
@@ -258,6 +258,19 @@ out:
|
|
|
return pp;
|
|
return pp;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static struct sk_buff **sit_gro_receive(struct sk_buff **head,
|
|
|
|
|
+ struct sk_buff *skb)
|
|
|
|
|
+{
|
|
|
|
|
+ if (NAPI_GRO_CB(skb)->encap_mark) {
|
|
|
|
|
+ NAPI_GRO_CB(skb)->flush = 1;
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ NAPI_GRO_CB(skb)->encap_mark = 1;
|
|
|
|
|
+
|
|
|
|
|
+ return ipv6_gro_receive(head, skb);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static int ipv6_gro_complete(struct sk_buff *skb, int nhoff)
|
|
static int ipv6_gro_complete(struct sk_buff *skb, int nhoff)
|
|
|
{
|
|
{
|
|
|
const struct net_offload *ops;
|
|
const struct net_offload *ops;
|
|
@@ -302,7 +315,7 @@ static struct packet_offload ipv6_packet_offload __read_mostly = {
|
|
|
static const struct net_offload sit_offload = {
|
|
static const struct net_offload sit_offload = {
|
|
|
.callbacks = {
|
|
.callbacks = {
|
|
|
.gso_segment = ipv6_gso_segment,
|
|
.gso_segment = ipv6_gso_segment,
|
|
|
- .gro_receive = ipv6_gro_receive,
|
|
|
|
|
|
|
+ .gro_receive = sit_gro_receive,
|
|
|
.gro_complete = sit_gro_complete,
|
|
.gro_complete = sit_gro_complete,
|
|
|
},
|
|
},
|
|
|
};
|
|
};
|