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 15 #include <net/xfrm.h> 16 #include <linux/pfkeyv2.h> 17 #include <linux/ipsec.h> 18 #include <linux/netfilter_ipv6.h> 19 #include <linux/export.h> 20 #include <net/dsfield.h> 21 #include <net/ipv6.h> 22 #include <net/addrconf.h> 23 24 int xfrm6_extract_header(struct sk_buff *skb) 25 { 26 struct ipv6hdr *iph = ipv6_hdr(skb); 27 28 XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph); 29 XFRM_MODE_SKB_CB(skb)->id = 0; 30 XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF); 31 XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph); 32 XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit; 33 XFRM_MODE_SKB_CB(skb)->optlen = 0; 34 memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl, 35 sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl)); 36 37 return 0; 38 } 39 40 static struct xfrm_state_afinfo xfrm6_state_afinfo = { 41 .family = AF_INET6, 42 .proto = IPPROTO_IPV6, 43 .output = xfrm6_output, 44 .output_finish = xfrm6_output_finish, 45 .extract_input = xfrm6_extract_input, 46 .extract_output = xfrm6_extract_output, 47 .transport_finish = xfrm6_transport_finish, 48 .local_error = xfrm6_local_error, 49 }; 50 51 int __init xfrm6_state_init(void) 52 { 53 return xfrm_state_register_afinfo(&xfrm6_state_afinfo); 54 } 55 56 void xfrm6_state_fini(void) 57 { 58 xfrm_state_unregister_afinfo(&xfrm6_state_afinfo); 59 } 60