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