1 // SPDX-License-Identifier: GPL-2.0
3 * xfrm6_state.c: based on xfrm4_state.c
7 * Kazunori MIYAZAWA @USAGI
8 * Kunihiro Ishiguro <kunihiro@ipinfusion.com>
10 * YOSHIFUJI Hideaki @USAGI
11 * Split up af-specific portion
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>
22 #include <net/addrconf.h>
24 int xfrm6_extract_header(struct sk_buff
*skb
)
26 struct ipv6hdr
*iph
= ipv6_hdr(skb
);
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
));
40 static struct xfrm_state_afinfo xfrm6_state_afinfo
= {
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
,
51 int __init
xfrm6_state_init(void)
53 return xfrm_state_register_afinfo(&xfrm6_state_afinfo
);
56 void xfrm6_state_fini(void)
58 xfrm_state_unregister_afinfo(&xfrm6_state_afinfo
);