PageRenderTime 18ms CodeModel.GetById 8ms app.highlight 5ms RepoModel.GetById 2ms app.codeStats 0ms

/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
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
24int 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
40static 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
51int __init xfrm6_state_init(void)
52{
53	return xfrm_state_register_afinfo(&xfrm6_state_afinfo);
54}
55
56void xfrm6_state_fini(void)
57{
58	xfrm_state_unregister_afinfo(&xfrm6_state_afinfo);
59}