xref: /openbmc/linux/net/xfrm/xfrm_inout.h (revision a269fbfc)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #include <linux/ipv6.h>
3 #include <net/dsfield.h>
4 #include <net/xfrm.h>
5 
6 #ifndef XFRM_INOUT_H
7 #define XFRM_INOUT_H 1
8 
9 static inline void xfrm6_extract_header(struct sk_buff *skb)
10 {
11 #if IS_ENABLED(CONFIG_IPV6)
12 	struct ipv6hdr *iph = ipv6_hdr(skb);
13 
14 	XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
15 	XFRM_MODE_SKB_CB(skb)->id = 0;
16 	XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF);
17 	XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph);
18 	XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit;
19 	XFRM_MODE_SKB_CB(skb)->optlen = 0;
20 	memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl,
21 	       sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
22 #else
23 	WARN_ON_ONCE(1);
24 #endif
25 }
26 
27 static inline void xfrm6_beet_make_header(struct sk_buff *skb)
28 {
29 	struct ipv6hdr *iph = ipv6_hdr(skb);
30 
31 	iph->version = 6;
32 
33 	memcpy(iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl,
34 	       sizeof(iph->flow_lbl));
35 	iph->nexthdr = XFRM_MODE_SKB_CB(skb)->protocol;
36 
37 	ipv6_change_dsfield(iph, 0, XFRM_MODE_SKB_CB(skb)->tos);
38 	iph->hop_limit = XFRM_MODE_SKB_CB(skb)->ttl;
39 }
40 
41 static inline void xfrm4_beet_make_header(struct sk_buff *skb)
42 {
43 	struct iphdr *iph = ip_hdr(skb);
44 
45 	iph->ihl = 5;
46 	iph->version = 4;
47 
48 	iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;
49 	iph->tos = XFRM_MODE_SKB_CB(skb)->tos;
50 
51 	iph->id = XFRM_MODE_SKB_CB(skb)->id;
52 	iph->frag_off = XFRM_MODE_SKB_CB(skb)->frag_off;
53 	iph->ttl = XFRM_MODE_SKB_CB(skb)->ttl;
54 }
55 
56 #endif
57