MFS - Use mmap() instead of malloc().
[dragonfly.git] / sys / netproto / key / keydb.c
blob2f8f580d8703edc101f3b0c739f1588d8d342c2b
1 /* $FreeBSD: src/sys/netkey/keydb.c,v 1.1.2.1 2000/07/15 07:14:42 kris Exp $ */
2 /* $DragonFly: src/sys/netproto/key/keydb.c,v 1.10 2008/01/05 14:02:40 swildner Exp $ */
3 /* $KAME: keydb.c,v 1.64 2000/05/11 17:02:30 itojun Exp $ */
5 /*
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
34 #include "opt_inet.h"
35 #include "opt_inet6.h"
37 #include <sys/param.h>
38 #include <sys/types.h>
39 #include <sys/socket.h>
40 #include <sys/param.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>
46 #include <sys/thread2.h>
48 #include <net/if.h>
49 #include <net/route.h>
51 #include <netinet/in.h>
53 #include <net/pfkeyv2.h>
54 #include "keydb.h"
55 #include <netinet6/ipsec.h>
57 #include <net/net_osdep.h>
59 MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
61 static void keydb_delsecasvar (struct secasvar *);
64 * secpolicy management
66 struct secpolicy *
67 keydb_newsecpolicy(void)
69 return((struct secpolicy *)kmalloc(sizeof(struct secpolicy), M_SECA,
70 M_INTWAIT | M_NULLOK | M_ZERO));
73 void
74 keydb_delsecpolicy(struct secpolicy *p)
77 kfree(p, M_SECA);
81 * secashead management
83 struct secashead *
84 keydb_newsecashead(void)
86 struct secashead *p;
87 int i;
89 p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
90 if (!p)
91 return p;
92 for (i = 0; i < sizeof(p->savtree)/sizeof(p->savtree[0]); i++)
93 LIST_INIT(&p->savtree[i]);
94 return p;
97 void
98 keydb_delsecashead(struct secashead *p)
101 kfree(p, M_SECA);
105 * secasvar management (reference counted)
107 struct secasvar *
108 keydb_newsecasvar(void)
110 struct secasvar *p;
112 p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
113 if (!p)
114 return p;
115 p->refcnt = 1;
116 return p;
119 void
120 keydb_refsecasvar(struct secasvar *p)
122 crit_enter();
123 p->refcnt++;
124 crit_exit();
127 void
128 keydb_freesecasvar(struct secasvar *p)
130 crit_enter();
131 p->refcnt--;
132 /* negative refcnt will cause panic intentionally */
133 if (p->refcnt <= 0)
134 keydb_delsecasvar(p);
135 crit_exit();
138 static void
139 keydb_delsecasvar(struct secasvar *p)
142 if (p->refcnt)
143 panic("keydb_delsecasvar called with refcnt != 0");
145 kfree(p, M_SECA);
149 * secreplay management
151 struct secreplay *
152 keydb_newsecreplay(size_t wsize)
154 struct secreplay *p;
156 p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
157 if (!p)
158 return p;
160 if (wsize != 0) {
161 p->bitmap = (caddr_t)kmalloc(wsize, M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
162 if (!p->bitmap) {
163 kfree(p, M_SECA);
164 return NULL;
167 p->wsize = wsize;
168 return p;
171 void
172 keydb_delsecreplay(struct secreplay *p)
175 if (p->bitmap)
176 kfree(p->bitmap, M_SECA);
177 kfree(p, M_SECA);
181 * secreg management
183 struct secreg *
184 keydb_newsecreg(void)
186 struct secreg *p;
188 p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_ZERO | M_NULLOK);
189 return p;
192 void
193 keydb_delsecreg(struct secreg *p)
196 kfree(p, M_SECA);