Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 815d22e5 authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller
Browse files

ip6ip6: Support for GSO/GRO

parent 51c052d4
Loading
Loading
Loading
Loading
+21 −3
Original line number Original line Diff line number Diff line
@@ -253,9 +253,11 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
	return pp;
	return pp;
}
}


static struct sk_buff **sit_gro_receive(struct sk_buff **head,
static struct sk_buff **sit_ip6ip6_gro_receive(struct sk_buff **head,
					       struct sk_buff *skb)
					       struct sk_buff *skb)
{
{
	/* Common GRO receive for SIT and IP6IP6 */

	if (NAPI_GRO_CB(skb)->encap_mark) {
	if (NAPI_GRO_CB(skb)->encap_mark) {
		NAPI_GRO_CB(skb)->flush = 1;
		NAPI_GRO_CB(skb)->flush = 1;
		return NULL;
		return NULL;
@@ -298,6 +300,13 @@ static int sit_gro_complete(struct sk_buff *skb, int nhoff)
	return ipv6_gro_complete(skb, nhoff);
	return ipv6_gro_complete(skb, nhoff);
}
}


static int ip6ip6_gro_complete(struct sk_buff *skb, int nhoff)
{
	skb->encapsulation = 1;
	skb_shinfo(skb)->gso_type |= SKB_GSO_IPXIP6;
	return ipv6_gro_complete(skb, nhoff);
}

static struct packet_offload ipv6_packet_offload __read_mostly = {
static struct packet_offload ipv6_packet_offload __read_mostly = {
	.type = cpu_to_be16(ETH_P_IPV6),
	.type = cpu_to_be16(ETH_P_IPV6),
	.callbacks = {
	.callbacks = {
@@ -310,11 +319,19 @@ 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    = sit_gro_receive,
		.gro_receive    = sit_ip6ip6_gro_receive,
		.gro_complete   = sit_gro_complete,
		.gro_complete   = sit_gro_complete,
	},
	},
};
};


static const struct net_offload ip6ip6_offload = {
	.callbacks = {
		.gso_segment	= ipv6_gso_segment,
		.gro_receive    = sit_ip6ip6_gro_receive,
		.gro_complete   = ip6ip6_gro_complete,
	},
};

static int __init ipv6_offload_init(void)
static int __init ipv6_offload_init(void)
{
{


@@ -326,6 +343,7 @@ static int __init ipv6_offload_init(void)
	dev_add_offload(&ipv6_packet_offload);
	dev_add_offload(&ipv6_packet_offload);


	inet_add_offload(&sit_offload, IPPROTO_IPV6);
	inet_add_offload(&sit_offload, IPPROTO_IPV6);
	inet6_add_offload(&ip6ip6_offload, IPPROTO_IPV6);


	return 0;
	return 0;
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -1242,6 +1242,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
	if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK)
	if (t->parms.flags & IP6_TNL_F_USE_ORIG_FWMARK)
		fl6.flowi6_mark = skb->mark;
		fl6.flowi6_mark = skb->mark;


	if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
		return -1;

	skb_set_inner_ipproto(skb, IPPROTO_IPV6);

	err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu,
	err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu,
			   IPPROTO_IPV6);
			   IPPROTO_IPV6);
	if (err != 0) {
	if (err != 0) {