Branch data Line data Source code
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 : 0 : int xfrm6_extract_header(struct sk_buff *skb) 25 : : { 26 : 0 : struct ipv6hdr *iph = ipv6_hdr(skb); 27 : : 28 : 0 : XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph); 29 : 0 : XFRM_MODE_SKB_CB(skb)->id = 0; 30 : 0 : XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF); 31 : 0 : XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph); 32 : 0 : XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit; 33 : 0 : XFRM_MODE_SKB_CB(skb)->optlen = 0; 34 : 0 : memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl, 35 : : sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl)); 36 : : 37 : 0 : 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 : 11 : int __init xfrm6_state_init(void) 52 : : { 53 : 11 : return xfrm_state_register_afinfo(&xfrm6_state_afinfo); 54 : : } 55 : : 56 : 0 : void xfrm6_state_fini(void) 57 : : { 58 : 0 : xfrm_state_unregister_afinfo(&xfrm6_state_afinfo); 59 : 0 : }