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