network - MP socket free & abort interactions, so_state
[dragonfly.git] / sys / netproto / key / keydb.c
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 $  */
4
5 /*
6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7  * All rights reserved.
8  *
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.
20  *
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.
32  */
33
34 #include "opt_inet.h"
35 #include "opt_inet6.h"
36
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>
47
48 #include <net/if.h>
49 #include <net/route.h>
50
51 #include <netinet/in.h>
52
53 #include <net/pfkeyv2.h>
54 #include "keydb.h"
55 #include "key.h"
56 #include <netinet6/ipsec.h>
57
58 #include <net/net_osdep.h>
59
60 MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
61
62 static void keydb_delsecasvar (struct secasvar *);
63
64 /*
65  * secpolicy management
66  */
67 struct secpolicy *
68 keydb_newsecpolicy(void)
69 {
70         return((struct secpolicy *)kmalloc(sizeof(struct secpolicy), M_SECA,
71                M_INTWAIT | M_NULLOK | M_ZERO));
72 }
73
74 void
75 keydb_delsecpolicy(struct secpolicy *p)
76 {
77
78         kfree(p, M_SECA);
79 }
80
81 /*
82  * secashead management
83  */
84 struct secashead *
85 keydb_newsecashead(void)
86 {
87         struct secashead *p;
88         int i;
89
90         p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
91         if (!p)
92                 return p;
93         for (i = 0; i < sizeof(p->savtree)/sizeof(p->savtree[0]); i++)
94                 LIST_INIT(&p->savtree[i]);
95         return p;
96 }
97
98 void
99 keydb_delsecashead(struct secashead *p)
100 {
101
102         kfree(p, M_SECA);
103 }
104
105 /*
106  * secasvar management (reference counted)
107  */
108 struct secasvar *
109 keydb_newsecasvar(void)
110 {
111         struct secasvar *p;
112
113         p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
114         if (!p)
115                 return p;
116         p->refcnt = 1;
117         return p;
118 }
119
120 void
121 keydb_refsecasvar(struct secasvar *p)
122 {
123         lwkt_gettoken(&key_token);
124         p->refcnt++;
125         lwkt_reltoken(&key_token);
126 }
127
128 void
129 keydb_freesecasvar(struct secasvar *p)
130 {
131         lwkt_gettoken(&key_token);
132         p->refcnt--;
133         /* negative refcnt will cause panic intentionally */
134         if (p->refcnt <= 0)
135                 keydb_delsecasvar(p);
136         lwkt_reltoken(&key_token);
137 }
138
139 static void
140 keydb_delsecasvar(struct secasvar *p)
141 {
142
143         if (p->refcnt)
144                 panic("keydb_delsecasvar called with refcnt != 0");
145
146         kfree(p, M_SECA);
147 }
148
149 /*
150  * secreplay management
151  */
152 struct secreplay *
153 keydb_newsecreplay(size_t wsize)
154 {
155         struct secreplay *p;
156
157         p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
158         if (!p)
159                 return p;
160
161         if (wsize != 0) {
162                 p->bitmap = (caddr_t)kmalloc(wsize, M_SECA, M_INTWAIT | M_NULLOK | M_ZERO);
163                 if (!p->bitmap) {
164                         kfree(p, M_SECA);
165                         return NULL;
166                 }
167         }
168         p->wsize = wsize;
169         return p;
170 }
171
172 void
173 keydb_delsecreplay(struct secreplay *p)
174 {
175
176         if (p->bitmap)
177                 kfree(p->bitmap, M_SECA);
178         kfree(p, M_SECA);
179 }
180
181 /*
182  * secreg management
183  */
184 struct secreg *
185 keydb_newsecreg(void)
186 {
187         struct secreg *p;
188
189         p = kmalloc(sizeof(*p), M_SECA, M_INTWAIT | M_ZERO | M_NULLOK);
190         return p;
191 }
192
193 void
194 keydb_delsecreg(struct secreg *p)
195 {
196
197         kfree(p, M_SECA);
198 }