1 /* $NetBSD: keydb.c,v 1.18 2009/03/14 15:36:24 dsl Exp $ */
2 /* $KAME: keydb.c,v 1.81 2003/09/07 05:25:20 itojun Exp $ */
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the project nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 #include <sys/cdefs.h>
34 __KERNEL_RCSID(0, "$NetBSD: keydb.c,v 1.18 2009/03/14 15:36:24 dsl Exp $");
37 #include "opt_ipsec.h"
39 #include <sys/param.h>
40 #include <sys/socket.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/malloc.h>
44 #include <sys/errno.h>
45 #include <sys/queue.h>
49 #include <net/route.h>
51 #include <netinet/in.h>
53 #include <net/pfkeyv2.h>
54 #include <netkey/keydb.h>
55 #include <netkey/key.h>
56 #include <netinet6/ipsec.h>
58 #include <net/net_osdep.h>
60 MALLOC_DEFINE(M_SECA
, "key mgmt", "security associations, key management");
63 * secpolicy management
66 keydb_newsecpolicy(void)
70 p
= (struct secpolicy
*)malloc(sizeof(*p
), M_SECA
, M_NOWAIT
|M_ZERO
);
73 TAILQ_INSERT_TAIL(&sptailq
, p
, tailq
);
82 static u_int32_t lastalloc
= IPSEC_MANUAL_POLICYID_MAX
;
85 newid
= lastalloc
+ 1;
86 /* XXX possible infinite loop */
88 TAILQ_FOREACH(sp
, &sptailq
, tailq
) {
93 if (newid
+ 1 < newid
) /* wraparound */
94 newid
= IPSEC_MANUAL_POLICYID_MAX
+ 1;
105 keydb_delsecpolicy(struct secpolicy
*p
)
108 TAILQ_REMOVE(&sptailq
, p
, tailq
);
110 free(p
->spidx
, M_SECA
);
111 #ifdef SADB_X_EXT_TAG
113 m_nametag_unref(p
->tag
);
119 keydb_setsecpolicyindex(struct secpolicy
*p
, struct secpolicyindex
*idx
)
123 p
->spidx
= (struct secpolicyindex
*)malloc(sizeof(*p
->spidx
),
132 * secashead management
135 keydb_newsecashead(void)
140 p
= (struct secashead
*)malloc(sizeof(*p
), M_SECA
, M_NOWAIT
|M_ZERO
);
143 for (i
= 0; i
< sizeof(p
->savtree
)/sizeof(p
->savtree
[0]); i
++)
144 LIST_INIT(&p
->savtree
[i
]);
149 keydb_delsecashead(struct secashead
*p
)
156 * secasvar management (reference counted)
159 keydb_newsecasvar(void)
161 struct secasvar
*p
, *q
;
162 static u_int32_t said
= 0;
164 p
= (struct secasvar
*)malloc(sizeof(*p
), M_SECA
, M_NOWAIT
|M_ZERO
);
172 TAILQ_FOREACH(q
, &satailq
, tailq
) {
175 if (TAILQ_NEXT(q
, tailq
)) {
176 if (q
->id
< said
&& said
< TAILQ_NEXT(q
, tailq
)->id
)
178 if (q
->id
+ 1 < TAILQ_NEXT(q
, tailq
)->id
) {
187 TAILQ_INSERT_AFTER(&satailq
, q
, p
, tailq
);
189 TAILQ_INSERT_TAIL(&satailq
, p
, tailq
);
194 keydb_delsecasvar(struct secasvar
*p
)
197 TAILQ_REMOVE(&satailq
, p
, tailq
);
203 * secreplay management
206 keydb_newsecreplay(size_t wsize
)
210 p
= (struct secreplay
*)malloc(sizeof(*p
), M_SECA
, M_NOWAIT
|M_ZERO
);
215 p
->bitmap
= malloc(wsize
, M_SECA
, M_NOWAIT
|M_ZERO
);
226 keydb_delsecreplay(struct secreplay
*p
)
230 free(p
->bitmap
, M_SECA
);
238 keydb_newsecreg(void)
242 p
= (struct secreg
*)malloc(sizeof(*p
), M_SECA
, M_NOWAIT
|M_ZERO
);
247 keydb_delsecreg(struct secreg
*p
)