xfrm_inout.h 1.8 KB

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