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

Commit 303c5fab authored by Florian Westphal's avatar Florian Westphal Committed by Steffen Klassert
Browse files

xfrm: remove xmit indirection from xfrm_mode



There are only two versions (tunnel and transport). The ip/ipv6 versions
are only differ in sizeof(iphdr) vs ipv6hdr.

Place this in the core and use x->outer_mode->encap type to call the
correct adjustment helper.

Before:
   text   data    bss     dec      filename
15730311  6937008 4046908 26714227 vmlinux

After:
15730428  6937008 4046908 26714344 vmlinux

(about 117 byte increase)

v2: use family from x->outer_mode, not inner

Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Reviewed-by: default avatarSabrina Dubroca <sd@queasysnail.net>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 0c620e97
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -454,11 +454,6 @@ struct xfrm_mode {
	 */
	struct sk_buff *(*gso_segment)(struct xfrm_state *x, struct sk_buff *skb, netdev_features_t features);

	/*
	 * Adjust pointers into the packet when IPsec is done at layer2.
	 */
	void (*xmit)(struct xfrm_state *x, struct sk_buff *skb);

	struct xfrm_state_afinfo *afinfo;
	struct module *owner;
	u8 encap;
+0 −14
Original line number Diff line number Diff line
@@ -30,22 +30,8 @@ static struct sk_buff *xfrm4_transport_gso_segment(struct xfrm_state *x,
	return segs;
}

static void xfrm4_transport_xmit(struct xfrm_state *x, struct sk_buff *skb)
{
	struct xfrm_offload *xo = xfrm_offload(skb);

	skb_reset_mac_len(skb);
	pskb_pull(skb, skb->mac_len + sizeof(struct iphdr) + x->props.header_len);

	if (xo->flags & XFRM_GSO_SEGMENT) {
		 skb_reset_transport_header(skb);
		 skb->transport_header -= x->props.header_len;
	}
}

static struct xfrm_mode xfrm4_transport_mode = {
	.gso_segment = xfrm4_transport_gso_segment,
	.xmit = xfrm4_transport_xmit,
	.owner = THIS_MODULE,
	.encap = XFRM_MODE_TRANSPORT,
	.family = AF_INET,
+0 −13
Original line number Diff line number Diff line
@@ -109,23 +109,10 @@ static struct sk_buff *xfrm4_mode_tunnel_gso_segment(struct xfrm_state *x,
	return skb_mac_gso_segment(skb, features);
}

static void xfrm4_mode_tunnel_xmit(struct xfrm_state *x, struct sk_buff *skb)
{
	struct xfrm_offload *xo = xfrm_offload(skb);

	if (xo->flags & XFRM_GSO_SEGMENT)
		skb->transport_header = skb->network_header +
					sizeof(struct iphdr);

	skb_reset_mac_len(skb);
	pskb_pull(skb, skb->mac_len + x->props.header_len);
}

static struct xfrm_mode xfrm4_tunnel_mode = {
	.input2 = xfrm4_mode_tunnel_input,
	.output2 = xfrm4_mode_tunnel_output,
	.gso_segment = xfrm4_mode_tunnel_gso_segment,
	.xmit = xfrm4_mode_tunnel_xmit,
	.owner = THIS_MODULE,
	.encap = XFRM_MODE_TUNNEL,
	.flags = XFRM_MODE_FLAG_TUNNEL,
+0 −14
Original line number Diff line number Diff line
@@ -31,22 +31,8 @@ static struct sk_buff *xfrm4_transport_gso_segment(struct xfrm_state *x,
	return segs;
}

static void xfrm6_transport_xmit(struct xfrm_state *x, struct sk_buff *skb)
{
	struct xfrm_offload *xo = xfrm_offload(skb);

	skb_reset_mac_len(skb);
	pskb_pull(skb, skb->mac_len + sizeof(struct ipv6hdr) + x->props.header_len);

	if (xo->flags & XFRM_GSO_SEGMENT) {
		 skb_reset_transport_header(skb);
		 skb->transport_header -= x->props.header_len;
	}
}

static struct xfrm_mode xfrm6_transport_mode = {
	.gso_segment = xfrm4_transport_gso_segment,
	.xmit = xfrm6_transport_xmit,
	.owner = THIS_MODULE,
	.encap = XFRM_MODE_TRANSPORT,
	.family = AF_INET6,
+0 −12
Original line number Diff line number Diff line
@@ -109,22 +109,10 @@ static struct sk_buff *xfrm6_mode_tunnel_gso_segment(struct xfrm_state *x,
	return skb_mac_gso_segment(skb, features);
}

static void xfrm6_mode_tunnel_xmit(struct xfrm_state *x, struct sk_buff *skb)
{
	struct xfrm_offload *xo = xfrm_offload(skb);

	if (xo->flags & XFRM_GSO_SEGMENT)
		skb->transport_header = skb->network_header + sizeof(struct ipv6hdr);

	skb_reset_mac_len(skb);
	pskb_pull(skb, skb->mac_len + x->props.header_len);
}

static struct xfrm_mode xfrm6_tunnel_mode = {
	.input2 = xfrm6_mode_tunnel_input,
	.output2 = xfrm6_mode_tunnel_output,
	.gso_segment = xfrm6_mode_tunnel_gso_segment,
	.xmit = xfrm6_mode_tunnel_xmit,
	.owner = THIS_MODULE,
	.encap = XFRM_MODE_TUNNEL,
	.flags = XFRM_MODE_FLAG_TUNNEL,
Loading