/net/ipv6/xfrm6_state.c

http://github.com/mirrors/linux · C · 59 lines · 39 code · 7 blank · 13 comment · 0 complexity · 9cf0a2f0f0cdadfe8741ceecb4140d32 MD5 · raw file

  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * xfrm6_state.c: based on xfrm4_state.c
  4. *
  5. * Authors:
  6. * Mitsuru KANDA @USAGI
  7. * Kazunori MIYAZAWA @USAGI
  8. * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
  9. * IPv6 support
  10. * YOSHIFUJI Hideaki @USAGI
  11. * Split up af-specific portion
  12. *
  13. */
  14. #include <net/xfrm.h>
  15. #include <linux/pfkeyv2.h>
  16. #include <linux/ipsec.h>
  17. #include <linux/netfilter_ipv6.h>
  18. #include <linux/export.h>
  19. #include <net/dsfield.h>
  20. #include <net/ipv6.h>
  21. #include <net/addrconf.h>
  22. int xfrm6_extract_header(struct sk_buff *skb)
  23. {
  24. struct ipv6hdr *iph = ipv6_hdr(skb);
  25. XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
  26. XFRM_MODE_SKB_CB(skb)->id = 0;
  27. XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF);
  28. XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph);
  29. XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit;
  30. XFRM_MODE_SKB_CB(skb)->optlen = 0;
  31. memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl,
  32. sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
  33. return 0;
  34. }
  35. static struct xfrm_state_afinfo xfrm6_state_afinfo = {
  36. .family = AF_INET6,
  37. .proto = IPPROTO_IPV6,
  38. .output = xfrm6_output,
  39. .output_finish = xfrm6_output_finish,
  40. .extract_input = xfrm6_extract_input,
  41. .extract_output = xfrm6_extract_output,
  42. .transport_finish = xfrm6_transport_finish,
  43. .local_error = xfrm6_local_error,
  44. };
  45. int __init xfrm6_state_init(void)
  46. {
  47. return xfrm_state_register_afinfo(&xfrm6_state_afinfo);
  48. }
  49. void xfrm6_state_fini(void)
  50. {
  51. xfrm_state_unregister_afinfo(&xfrm6_state_afinfo);
  52. }