summaryrefslogtreecommitdiffstats
path: root/sys/netkey/keydb.c
diff options
context:
space:
mode:
authoritojun <itojun@FreeBSD.org>2000-07-04 16:35:15 +0000
committeritojun <itojun@FreeBSD.org>2000-07-04 16:35:15 +0000
commit5f4e854de19331a53788d6100bbcd42845056bc1 (patch)
tree3ff8c876a5868b103fb8713055d83e29a3fa38d5 /sys/netkey/keydb.c
parentbdc16885232d771a99d7dfc247cd27a44cd061f9 (diff)
downloadFreeBSD-src-5f4e854de19331a53788d6100bbcd42845056bc1.zip
FreeBSD-src-5f4e854de19331a53788d6100bbcd42845056bc1.tar.gz
sync with kame tree as of july00. tons of bug fixes/improvements.
API changes: - additional IPv6 ioctls - IPsec PF_KEY API was changed, it is mandatory to upgrade setkey(8). (also syntax change)
Diffstat (limited to 'sys/netkey/keydb.c')
-rw-r--r--sys/netkey/keydb.c217
1 files changed, 217 insertions, 0 deletions
diff --git a/sys/netkey/keydb.c b/sys/netkey/keydb.c
new file mode 100644
index 0000000..dd1fb17
--- /dev/null
+++ b/sys/netkey/keydb.c
@@ -0,0 +1,217 @@
+/* $FreeBSD$ */
+/* $KAME: keydb.c,v 1.64 2000/05/11 17:02:30 itojun Exp $ */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "opt_inet.h"
+#include "opt_inet6.h"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/errno.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <netinet/in.h>
+
+#include <net/pfkeyv2.h>
+#include <netkey/keydb.h>
+#include <netinet6/ipsec.h>
+
+#include <net/net_osdep.h>
+
+MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
+
+static void keydb_delsecasvar __P((struct secasvar *));
+
+/*
+ * secpolicy management
+ */
+struct secpolicy *
+keydb_newsecpolicy()
+{
+ struct secpolicy *p;
+
+ p = (struct secpolicy *)malloc(sizeof(*p), M_SECA, M_NOWAIT);
+ if (!p)
+ return p;
+ bzero(p, sizeof(*p));
+ return p;
+}
+
+void
+keydb_delsecpolicy(p)
+ struct secpolicy *p;
+{
+
+ free(p, M_SECA);
+}
+
+/*
+ * secashead management
+ */
+struct secashead *
+keydb_newsecashead()
+{
+ struct secashead *p;
+ int i;
+
+ p = (struct secashead *)malloc(sizeof(*p), M_SECA, M_NOWAIT);
+ if (!p)
+ return p;
+ bzero(p, sizeof(*p));
+ for (i = 0; i < sizeof(p->savtree)/sizeof(p->savtree[0]); i++)
+ LIST_INIT(&p->savtree[i]);
+ return p;
+}
+
+void
+keydb_delsecashead(p)
+ struct secashead *p;
+{
+
+ free(p, M_SECA);
+}
+
+/*
+ * secasvar management (reference counted)
+ */
+struct secasvar *
+keydb_newsecasvar()
+{
+ struct secasvar *p;
+
+ p = (struct secasvar *)malloc(sizeof(*p), M_SECA, M_NOWAIT);
+ if (!p)
+ return p;
+ bzero(p, sizeof(*p));
+ p->refcnt = 1;
+ return p;
+}
+
+void
+keydb_refsecasvar(p)
+ struct secasvar *p;
+{
+ int s;
+
+ s = splnet();
+ p->refcnt++;
+ splx(s);
+}
+
+void
+keydb_freesecasvar(p)
+ struct secasvar *p;
+{
+ int s;
+
+ s = splnet();
+ p->refcnt--;
+ /* negative refcnt will cause panic intentionally */
+ if (p->refcnt <= 0)
+ keydb_delsecasvar(p);
+ splx(s);
+}
+
+static void
+keydb_delsecasvar(p)
+ struct secasvar *p;
+{
+
+ if (p->refcnt)
+ panic("keydb_delsecasvar called with refcnt != 0");
+
+ free(p, M_SECA);
+}
+
+/*
+ * secreplay management
+ */
+struct secreplay *
+keydb_newsecreplay(wsize)
+ size_t wsize;
+{
+ struct secreplay *p;
+
+ p = (struct secreplay *)malloc(sizeof(*p), M_SECA, M_NOWAIT);
+ if (!p)
+ return p;
+
+ bzero(p, sizeof(*p));
+ if (wsize != 0) {
+ p->bitmap = (caddr_t)malloc(wsize, M_SECA, M_NOWAIT);
+ if (!p->bitmap) {
+ free(p, M_SECA);
+ return NULL;
+ }
+ bzero(p->bitmap, wsize);
+ }
+ p->wsize = wsize;
+ return p;
+}
+
+void
+keydb_delsecreplay(p)
+ struct secreplay *p;
+{
+
+ if (p->bitmap)
+ free(p->bitmap, M_SECA);
+ free(p, M_SECA);
+}
+
+/*
+ * secreg management
+ */
+struct secreg *
+keydb_newsecreg()
+{
+ struct secreg *p;
+
+ p = (struct secreg *)malloc(sizeof(*p), M_SECA, M_NOWAIT);
+ if (p)
+ bzero(p, sizeof(*p));
+ return p;
+}
+
+void
+keydb_delsecreg(p)
+ struct secreg *p;
+{
+
+ free(p, M_SECA);
+}
OpenPOWER on IntegriCloud