Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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