0001
0002 #include <linux/ipv6.h>
0003 #include <net/dsfield.h>
0004 #include <net/xfrm.h>
0005
0006 #ifndef XFRM_INOUT_H
0007 #define XFRM_INOUT_H 1
0008
0009 static inline void xfrm4_extract_header(struct sk_buff *skb)
0010 {
0011 const struct iphdr *iph = ip_hdr(skb);
0012
0013 XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
0014 XFRM_MODE_SKB_CB(skb)->id = iph->id;
0015 XFRM_MODE_SKB_CB(skb)->frag_off = iph->frag_off;
0016 XFRM_MODE_SKB_CB(skb)->tos = iph->tos;
0017 XFRM_MODE_SKB_CB(skb)->ttl = iph->ttl;
0018 XFRM_MODE_SKB_CB(skb)->optlen = iph->ihl * 4 - sizeof(*iph);
0019 memset(XFRM_MODE_SKB_CB(skb)->flow_lbl, 0,
0020 sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
0021 }
0022
0023 static inline void xfrm6_extract_header(struct sk_buff *skb)
0024 {
0025 #if IS_ENABLED(CONFIG_IPV6)
0026 struct ipv6hdr *iph = ipv6_hdr(skb);
0027
0028 XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
0029 XFRM_MODE_SKB_CB(skb)->id = 0;
0030 XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF);
0031 XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph);
0032 XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit;
0033 XFRM_MODE_SKB_CB(skb)->optlen = 0;
0034 memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl,
0035 sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
0036 #else
0037 WARN_ON_ONCE(1);
0038 #endif
0039 }
0040
0041 static inline void xfrm6_beet_make_header(struct sk_buff *skb)
0042 {
0043 struct ipv6hdr *iph = ipv6_hdr(skb);
0044
0045 iph->version = 6;
0046
0047 memcpy(iph->flow_lbl, XFRM_MODE_SKB_CB(skb)->flow_lbl,
0048 sizeof(iph->flow_lbl));
0049 iph->nexthdr = XFRM_MODE_SKB_CB(skb)->protocol;
0050
0051 ipv6_change_dsfield(iph, 0, XFRM_MODE_SKB_CB(skb)->tos);
0052 iph->hop_limit = XFRM_MODE_SKB_CB(skb)->ttl;
0053 }
0054
0055 static inline void xfrm4_beet_make_header(struct sk_buff *skb)
0056 {
0057 struct iphdr *iph = ip_hdr(skb);
0058
0059 iph->ihl = 5;
0060 iph->version = 4;
0061
0062 iph->protocol = XFRM_MODE_SKB_CB(skb)->protocol;
0063 iph->tos = XFRM_MODE_SKB_CB(skb)->tos;
0064
0065 iph->id = XFRM_MODE_SKB_CB(skb)->id;
0066 iph->frag_off = XFRM_MODE_SKB_CB(skb)->frag_off;
0067 iph->ttl = XFRM_MODE_SKB_CB(skb)->ttl;
0068 }
0069
0070 #endif