diff options
author | Florian Westphal <fw@strlen.de> | 2019-03-29 16:16:28 -0400 |
---|---|---|
committer | Steffen Klassert <steffen.klassert@secunet.com> | 2019-04-08 03:14:55 -0400 |
commit | b3284df1c86f7ac078dcb8fb250fe3d6437e740c (patch) | |
tree | 116d8518d917cc43bf0e3954b8aafa16db93e5c6 /net/ipv6 | |
parent | 7613b92b1ae37141704948b77e8762c5de896510 (diff) |
xfrm: remove input2 indirection from xfrm_mode
No external dependencies on any module, place this in the core.
Increase is about 1800 byte for xfrm_input.o.
The beet helpers get added to internal header, as they can be reused
from xfrm_output.c in the next patch (kernel contains several
copies of them in the xfrm{4,6}_mode_beet.c files).
Before:
text data bss dec filename
5578 176 2364 8118 net/xfrm/xfrm_input.o
1180 64 0 1244 net/ipv4/xfrm4_mode_beet.o
171 40 0 211 net/ipv4/xfrm4_mode_transport.o
1163 40 0 1203 net/ipv4/xfrm4_mode_tunnel.o
1083 52 0 1135 net/ipv6/xfrm6_mode_beet.o
172 40 0 212 net/ipv6/xfrm6_mode_ro.o
172 40 0 212 net/ipv6/xfrm6_mode_transport.o
1056 40 0 1096 net/ipv6/xfrm6_mode_tunnel.o
After:
text data bss dec filename
7373 200 2364 9937 net/xfrm/xfrm_input.o
587 44 0 631 net/ipv4/xfrm4_mode_beet.o
171 32 0 203 net/ipv4/xfrm4_mode_transport.o
649 32 0 681 net/ipv4/xfrm4_mode_tunnel.o
625 44 0 669 net/ipv6/xfrm6_mode_beet.o
172 32 0 204 net/ipv6/xfrm6_mode_ro.o
172 32 0 204 net/ipv6/xfrm6_mode_transport.o
599 32 0 631 net/ipv6/xfrm6_mode_tunnel.o
v2: pass inner_mode to xfrm_inner_mode_encap_remove to fix
AF_UNSPEC selector breakage (bisected by Benedict Wong)
Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/xfrm6_mode_beet.c | 27 | ||||
-rw-r--r-- | net/ipv6/xfrm6_mode_tunnel.c | 46 |
2 files changed, 0 insertions, 73 deletions
diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c index 6f35e24f0077..a0537b4f62f8 100644 --- a/net/ipv6/xfrm6_mode_beet.c +++ b/net/ipv6/xfrm6_mode_beet.c | |||
@@ -76,34 +76,7 @@ static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb) | |||
76 | top_iph->daddr = *(struct in6_addr *)&x->id.daddr; | 76 | top_iph->daddr = *(struct in6_addr *)&x->id.daddr; |
77 | return 0; | 77 | return 0; |
78 | } | 78 | } |
79 | |||
80 | static int xfrm6_beet_input(struct xfrm_state *x, struct sk_buff *skb) | ||
81 | { | ||
82 | struct ipv6hdr *ip6h; | ||
83 | int size = sizeof(struct ipv6hdr); | ||
84 | int err; | ||
85 | |||
86 | err = skb_cow_head(skb, size + skb->mac_len); | ||
87 | if (err) | ||
88 | goto out; | ||
89 | |||
90 | __skb_push(skb, size); | ||
91 | skb_reset_network_header(skb); | ||
92 | skb_mac_header_rebuild(skb); | ||
93 | |||
94 | xfrm6_beet_make_header(skb); | ||
95 | |||
96 | ip6h = ipv6_hdr(skb); | ||
97 | ip6h->payload_len = htons(skb->len - size); | ||
98 | ip6h->daddr = x->sel.daddr.in6; | ||
99 | ip6h->saddr = x->sel.saddr.in6; | ||
100 | err = 0; | ||
101 | out: | ||
102 | return err; | ||
103 | } | ||
104 | |||
105 | static struct xfrm_mode xfrm6_beet_mode = { | 79 | static struct xfrm_mode xfrm6_beet_mode = { |
106 | .input2 = xfrm6_beet_input, | ||
107 | .output2 = xfrm6_beet_output, | 80 | .output2 = xfrm6_beet_output, |
108 | .owner = THIS_MODULE, | 81 | .owner = THIS_MODULE, |
109 | .encap = XFRM_MODE_BEET, | 82 | .encap = XFRM_MODE_BEET, |
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index 8e23a2fba617..79c57decb472 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c | |||
@@ -18,14 +18,6 @@ | |||
18 | #include <net/ipv6.h> | 18 | #include <net/ipv6.h> |
19 | #include <net/xfrm.h> | 19 | #include <net/xfrm.h> |
20 | 20 | ||
21 | static inline void ipip6_ecn_decapsulate(struct sk_buff *skb) | ||
22 | { | ||
23 | struct ipv6hdr *inner_iph = ipipv6_hdr(skb); | ||
24 | |||
25 | if (INET_ECN_is_ce(XFRM_MODE_SKB_CB(skb)->tos)) | ||
26 | IP6_ECN_set_ce(skb, inner_iph); | ||
27 | } | ||
28 | |||
29 | /* Add encapsulation header. | 21 | /* Add encapsulation header. |
30 | * | 22 | * |
31 | * The top IP header will be constructed per RFC 2401. | 23 | * The top IP header will be constructed per RFC 2401. |
@@ -65,45 +57,7 @@ static int xfrm6_mode_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
65 | return 0; | 57 | return 0; |
66 | } | 58 | } |
67 | 59 | ||
68 | #define for_each_input_rcu(head, handler) \ | ||
69 | for (handler = rcu_dereference(head); \ | ||
70 | handler != NULL; \ | ||
71 | handler = rcu_dereference(handler->next)) | ||
72 | |||
73 | |||
74 | static int xfrm6_mode_tunnel_input(struct xfrm_state *x, struct sk_buff *skb) | ||
75 | { | ||
76 | int err = -EINVAL; | ||
77 | |||
78 | if (XFRM_MODE_SKB_CB(skb)->protocol != IPPROTO_IPV6) | ||
79 | goto out; | ||
80 | if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) | ||
81 | goto out; | ||
82 | |||
83 | err = skb_unclone(skb, GFP_ATOMIC); | ||
84 | if (err) | ||
85 | goto out; | ||
86 | |||
87 | if (x->props.flags & XFRM_STATE_DECAP_DSCP) | ||
88 | ipv6_copy_dscp(ipv6_get_dsfield(ipv6_hdr(skb)), | ||
89 | ipipv6_hdr(skb)); | ||
90 | if (!(x->props.flags & XFRM_STATE_NOECN)) | ||
91 | ipip6_ecn_decapsulate(skb); | ||
92 | |||
93 | skb_reset_network_header(skb); | ||
94 | skb_mac_header_rebuild(skb); | ||
95 | if (skb->mac_len) | ||
96 | eth_hdr(skb)->h_proto = skb->protocol; | ||
97 | |||
98 | err = 0; | ||
99 | |||
100 | out: | ||
101 | return err; | ||
102 | } | ||
103 | |||
104 | |||
105 | static struct xfrm_mode xfrm6_tunnel_mode = { | 60 | static struct xfrm_mode xfrm6_tunnel_mode = { |
106 | .input2 = xfrm6_mode_tunnel_input, | ||
107 | .output2 = xfrm6_mode_tunnel_output, | 61 | .output2 = xfrm6_mode_tunnel_output, |
108 | .owner = THIS_MODULE, | 62 | .owner = THIS_MODULE, |
109 | .encap = XFRM_MODE_TUNNEL, | 63 | .encap = XFRM_MODE_TUNNEL, |