11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * xfrm6_state.c: based on xfrm4_state.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Authors:
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Mitsuru KANDA @USAGI
667ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris *	Kazunori MIYAZAWA @USAGI
767ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris *	Kunihiro Ishiguro <kunihiro@ipinfusion.com>
867ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris *		IPv6 support
967ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris *	YOSHIFUJI Hideaki @USAGI
1067ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris *		Split up af-specific portion
111ab1457c42bc078e5a9becd82a7f9f940b55c53aYOSHIFUJI Hideaki *
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/xfrm.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pfkeyv2.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ipsec.h>
17862b82c6f960cc61274d370aa78ce1112f92a83eHerbert Xu#include <linux/netfilter_ipv6.h>
18bc3b2d7fb9b014d75ebb79ba371a763dbab5e8cfPaul Gortmaker#include <linux/export.h>
1936cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu#include <net/dsfield.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/ipv6.h>
21ee51b1b6cece4dad408feeb0c3c9adb9cbd9f7d9Patrick McHardy#include <net/addrconf.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
2473e5ebb20f2809e2eb0b904448481e010c2599d7David S. Miller__xfrm6_init_tempsel(struct xfrm_selector *sel, const struct flowi *fl)
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
267e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller	const struct flowi6 *fl6 = &fl->u.ip6;
277e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Initialize temporary selector matching only
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 * to current session. */
304e3fd7a06dc20b2d8ec6892233ad2012968fe7b6Alexey Dobriyan	*(struct in6_addr *)&sel->daddr = fl6->daddr;
314e3fd7a06dc20b2d8ec6892233ad2012968fe7b6Alexey Dobriyan	*(struct in6_addr *)&sel->saddr = fl6->saddr;
327e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller	sel->dport = xfrm_flowi_dport(fl, &fl6->uli);
338444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	sel->dport_mask = htons(0xffff);
347e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller	sel->sport = xfrm_flowi_sport(fl, &fl6->uli);
358444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	sel->sport_mask = htons(0xffff);
368444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	sel->family = AF_INET6;
378444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	sel->prefixlen_d = 128;
388444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	sel->prefixlen_s = 128;
397e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller	sel->proto = fl6->flowi6_proto;
407e1dc7b6f709dfc1a9ab4b320dbe723f45992693David S. Miller	sel->ifindex = fl6->flowi6_oif;
418444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer}
428444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer
438444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egererstatic void
4419bd62441c36279ab33e311faebd357ef04ba344David S. Millerxfrm6_init_temprop(struct xfrm_state *x, const struct xfrm_tmpl *tmpl,
4519bd62441c36279ab33e311faebd357ef04ba344David S. Miller		   const xfrm_address_t *daddr, const xfrm_address_t *saddr)
468444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer{
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->id = tmpl->id;
4867ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris	if (ipv6_addr_any((struct in6_addr *)&x->id.daddr))
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memcpy(&x->id.daddr, daddr, sizeof(x->sel.daddr));
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memcpy(&x->props.saddr, &tmpl->saddr, sizeof(x->props.saddr));
5167ba4152e8b77eada6a9c64e3c2c84d6112794fcIan Morris	if (ipv6_addr_any((struct in6_addr *)&x->props.saddr))
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		memcpy(&x->props.saddr, saddr, sizeof(x->props.saddr));
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.mode = tmpl->mode;
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.reqid = tmpl->reqid;
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.family = AF_INET6;
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
583b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki/* distribution counting sort function for xfrm_state and xfrm_tmpl */
5958c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURAstatic int
603b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki__xfrm6_sort(void **dst, void **src, int n, int (*cmp)(void *p), int maxclass)
6158c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA{
6258c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	int i;
633b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	int class[XFRM_MAX_DEPTH];
643b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	int count[maxclass];
6558c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
663b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	memset(count, 0, sizeof(count));
6758c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
6864d9fdda8e1bdf416b2d9203c3ad9c249ea301beMasahide NAKAMURA	for (i = 0; i < n; i++) {
693b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		int c;
703b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		class[i] = c = cmp(src[i]);
713b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		count[c]++;
7264d9fdda8e1bdf416b2d9203c3ad9c249ea301beMasahide NAKAMURA	}
7358c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
743b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	for (i = 2; i < maxclass; i++)
753b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		count[i] += count[i - 1];
7658c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
7758c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	for (i = 0; i < n; i++) {
783b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		dst[count[class[i] - 1]++] = src[i];
7966da8c529ad4d330a268ac08aa101b87c5c911ffHannes Eder		src[i] = NULL;
8058c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	}
8158c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
8258c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	return 0;
8358c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA}
8458c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
853b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki/*
863b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * Rule for xfrm_state:
873b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki *
883b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 1: select IPsec transport except AH
893b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 2: select MIPv6 RO or inbound trigger
903b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 3: select IPsec transport AH
913b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 4: select IPsec tunnel
923b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 5: others
933b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki */
943b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideakistatic int __xfrm6_state_sort_cmp(void *p)
9558c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA{
963b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	struct xfrm_state *v = p;
973b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki
983b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	switch (v->props.mode) {
993b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_TRANSPORT:
1003b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		if (v->id.proto != IPPROTO_AH)
1013b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki			return 1;
1023b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		else
1033b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki			return 3;
10407a936260a94ae4798527ce8f79d4f3b589ab8a3Amerigo Wang#if IS_ENABLED(CONFIG_IPV6_MIP6)
1053b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_ROUTEOPTIMIZATION:
1063b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_IN_TRIGGER:
1073b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		return 2;
10864d9fdda8e1bdf416b2d9203c3ad9c249ea301beMasahide NAKAMURA#endif
1093b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_TUNNEL:
1103b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_BEET:
1113b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		return 4;
11258c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	}
1133b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	return 5;
1143b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki}
11558c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
1163b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideakistatic int
1173b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki__xfrm6_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n)
1183b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki{
1193b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	return __xfrm6_sort((void **)dst, (void **)src, n,
1203b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki			    __xfrm6_state_sort_cmp, 6);
1213b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki}
1223b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki
1233b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki/*
1243b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * Rule for xfrm_tmpl:
1253b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki *
1263b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 1: select IPsec transport
1273b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 2: select MIPv6 RO or inbound trigger
1283b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 3: select IPsec tunnel
1293b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki * rule 4: others
1303b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki */
1313b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideakistatic int __xfrm6_tmpl_sort_cmp(void *p)
1323b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki{
1333b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	struct xfrm_tmpl *v = p;
1343b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	switch (v->mode) {
1353b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_TRANSPORT:
1363b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		return 1;
13707a936260a94ae4798527ce8f79d4f3b589ab8a3Amerigo Wang#if IS_ENABLED(CONFIG_IPV6_MIP6)
1383b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_ROUTEOPTIMIZATION:
1393b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_IN_TRIGGER:
1403b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		return 2;
1413b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki#endif
1423b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_TUNNEL:
1433b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	case XFRM_MODE_BEET:
1443b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki		return 3;
14558c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	}
1463b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	return 4;
1473b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki}
14858c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
1493b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideakistatic int
1503b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki__xfrm6_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n)
1513b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki{
1523b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki	return __xfrm6_sort((void **)dst, (void **)src, n,
1533b6cdf94cd6dd0b64cc8646cf067a1ae0203276dYOSHIFUJI Hideaki			    __xfrm6_tmpl_sort_cmp, 5);
15458c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA}
15558c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA
15636cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xuint xfrm6_extract_header(struct sk_buff *skb)
15736cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu{
15836cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	struct ipv6hdr *iph = ipv6_hdr(skb);
15936cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
160732c8bd590625e8bc0b88313b82930e336b2bec4Herbert Xu	XFRM_MODE_SKB_CB(skb)->ihl = sizeof(*iph);
16136cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->id = 0;
16236cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->frag_off = htons(IP_DF);
16336cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->tos = ipv6_get_dsfield(iph);
16436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->ttl = iph->hop_limit;
165732c8bd590625e8bc0b88313b82930e336b2bec4Herbert Xu	XFRM_MODE_SKB_CB(skb)->optlen = 0;
16636cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	memcpy(XFRM_MODE_SKB_CB(skb)->flow_lbl, iph->flow_lbl,
16736cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	       sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
16836cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
16936cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	return 0;
17036cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu}
17136cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct xfrm_state_afinfo xfrm6_state_afinfo = {
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.family			= AF_INET6,
17436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	.proto			= IPPROTO_IPV6,
175227620e295090629fcb2c46ad3828222ab65438dHerbert Xu	.eth_proto		= htons(ETH_P_IPV6),
17617c2a42a24e1e8dd6aa7cea4f84e034ab1bfff31Herbert Xu	.owner			= THIS_MODULE,
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_tempsel		= __xfrm6_init_tempsel,
1788444cf712c5f71845cba9dc30d8f530ff0d5ff83Thomas Egerer	.init_temprop		= xfrm6_init_temprop,
17958c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	.tmpl_sort		= __xfrm6_tmpl_sort,
18058c949d1b9551f3e4ba9dde4aeda341ecf5e42b5Masahide NAKAMURA	.state_sort		= __xfrm6_state_sort,
181cdca72652adf597f7fef821a27595fd0dd5eea19Miika Komu	.output			= xfrm6_output,
18243a4dea4c9d44baae38ddc14b9b6d86fde4c8b88Steffen Klassert	.output_finish		= xfrm6_output_finish,
183227620e295090629fcb2c46ad3828222ab65438dHerbert Xu	.extract_input		= xfrm6_extract_input,
18436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	.extract_output		= xfrm6_extract_output,
185716062fd4c2f88a33ab409f62a1e7397ad0a7e33Herbert Xu	.transport_finish	= xfrm6_transport_finish,
186628e341f319f1a64a4639088faba952e4ec8f0a8Hannes Frederic Sowa	.local_error		= xfrm6_local_error,
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1890013cabab30ec55830ce63d34c0bdd887eb87644Daniel Lezcanoint __init xfrm6_state_init(void)
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1910013cabab30ec55830ce63d34c0bdd887eb87644Daniel Lezcano	return xfrm_state_register_afinfo(&xfrm6_state_afinfo);
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid xfrm6_state_fini(void)
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	xfrm_state_unregister_afinfo(&xfrm6_state_afinfo);
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
199