Module Name: src
Committed By: ozaki-r
Date: Thu Aug 3 06:30:40 UTC 2017
Modified Files:
src/sys/netipsec: key.c keydb.h
Log Message:
Use pslist(9) for sah->savtree
To generate a diff of this commit:
cvs rdiff -u -r1.202 -r1.203 src/sys/netipsec/key.c
cvs rdiff -u -r1.16 -r1.17 src/sys/netipsec/keydb.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.202 src/sys/netipsec/key.c:1.203
--- src/sys/netipsec/key.c:1.202 Thu Aug 3 06:30:04 2017
+++ src/sys/netipsec/key.c Thu Aug 3 06:30:40 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: key.c,v 1.202 2017/08/03 06:30:04 ozaki-r Exp $ */
+/* $NetBSD: key.c,v 1.203 2017/08/03 06:30:40 ozaki-r Exp $ */
/* $FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */
/* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.202 2017/08/03 06:30:04 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.203 2017/08/03 06:30:40 ozaki-r Exp $");
/*
* This code is referd to RFC 2367
@@ -258,6 +258,51 @@ static LIST_HEAD(_spacqtree, secspacq) s
#define SAHLIST_WRITER_INSERT_HEAD(sah) \
PSLIST_WRITER_INSERT_HEAD(&sahtree, (sah), pslist_entry)
+#define SAVLIST_ENTRY_INIT(sav) \
+ PSLIST_ENTRY_INIT((sav), pslist_entry)
+#define SAVLIST_ENTRY_DESTROY(sav) \
+ PSLIST_ENTRY_DESTROY((sav), pslist_entry)
+#define SAVLIST_READER_FIRST(sah, state) \
+ PSLIST_READER_FIRST(&(sah)->savtree[(state)], struct secasvar, \
+ pslist_entry)
+#define SAVLIST_WRITER_REMOVE(sav) \
+ PSLIST_WRITER_REMOVE((sav), pslist_entry)
+#define SAVLIST_READER_FOREACH(sav, sah, state) \
+ PSLIST_READER_FOREACH((sav), &(sah)->savtree[(state)], \
+ struct secasvar, pslist_entry)
+#define SAVLIST_WRITER_FOREACH(sav, sah, state) \
+ PSLIST_WRITER_FOREACH((sav), &(sah)->savtree[(state)], \
+ struct secasvar, pslist_entry)
+#define SAVLIST_WRITER_INSERT_BEFORE(sav, new) \
+ PSLIST_WRITER_INSERT_BEFORE((sav), (new), pslist_entry)
+#define SAVLIST_WRITER_INSERT_AFTER(sav, new) \
+ PSLIST_WRITER_INSERT_AFTER((sav), (new), pslist_entry)
+#define SAVLIST_WRITER_EMPTY(sah, state) \
+ (PSLIST_WRITER_FIRST(&(sah)->savtree[(state)], struct secasvar, \
+ pslist_entry) == NULL)
+#define SAVLIST_WRITER_INSERT_HEAD(sah, state, sav) \
+ PSLIST_WRITER_INSERT_HEAD(&(sah)->savtree[(state)], (sav), \
+ pslist_entry)
+#define SAVLIST_WRITER_NEXT(sav) \
+ PSLIST_WRITER_NEXT((sav), struct secasvar, pslist_entry)
+#define SAVLIST_WRITER_INSERT_TAIL(sah, state, new) \
+ do { \
+ if (SAVLIST_WRITER_EMPTY((sah), (state))) { \
+ SAVLIST_WRITER_INSERT_HEAD((sah), (state), (new));\
+ } else { \
+ struct secasvar *__sav; \
+ SAVLIST_WRITER_FOREACH(__sav, (sah), (state)) { \
+ if (SAVLIST_WRITER_NEXT(__sav) == NULL) {\
+ SAVLIST_WRITER_INSERT_AFTER(__sav,\
+ (new)); \
+ break; \
+ } \
+ } \
+ } \
+ } while (0)
+#define SAVLIST_READER_NEXT(sav) \
+ PSLIST_READER_NEXT((sav), struct secasvar, pslist_entry)
+
/*
* The list has SPs that are set to a socket via setsockopt(IP_IPSEC_POLICY)
* from userland. See ipsec_set_policy.
@@ -970,12 +1015,12 @@ key_lookup_sa_bysaidx(const struct secas
state = saorder_state_valid[stateidx];
if (key_prefered_oldsa)
- sav = LIST_FIRST(&sah->savtree[state]);
+ sav = SAVLIST_READER_FIRST(sah, state);
else {
/* XXX need O(1) lookup */
struct secasvar *last = NULL;
- LIST_FOREACH(sav, &sah->savtree[state], chain)
+ SAVLIST_READER_FOREACH(sav, sah, state)
last = sav;
sav = last;
}
@@ -1133,7 +1178,7 @@ key_lookup_sa(
/* search valid state */
for (stateidx = 0; stateidx < arraysize; stateidx++) {
state = saorder_state_valid[stateidx];
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
"try match spi %#x, %#x\n",
ntohl(spi), ntohl(sav->spi));
@@ -1201,7 +1246,8 @@ key_validate_savlist(const struct secash
* The list should be sorted by lft_c->sadb_lifetime_addtime
* in ascending order.
*/
- LIST_FOREACH_SAFE(sav, &sah->savtree[state], chain, next) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
+ next = SAVLIST_READER_NEXT(sav);
if (next != NULL &&
sav->lft_c != NULL && next->lft_c != NULL) {
KDASSERTMSG(sav->lft_c->sadb_lifetime_addtime <=
@@ -1361,8 +1407,7 @@ key_freesav(struct secasvar **psav, cons
*psav = NULL;
/* remove from SA header */
- KASSERT(__LIST_CHAINED(sav));
- LIST_REMOVE(sav, chain);
+ SAVLIST_WRITER_REMOVE(sav);
key_delsav(sav);
}
@@ -2864,7 +2909,7 @@ key_newsah(const struct secasindex *said
newsah = kmem_zalloc(sizeof(struct secashead), KM_SLEEP);
for (i = 0; i < __arraycount(newsah->savtree); i++)
- LIST_INIT(&newsah->savtree[i]);
+ PSLIST_INIT(&newsah->savtree[i]);
newsah->saidx = *saidx;
/* add to saidxtree */
@@ -2893,7 +2938,7 @@ key_delsah(struct secashead *sah)
/* searching all SA registerd in the secindex. */
SASTATE_ANY_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
/* give up to delete this sa */
zombie++;
}
@@ -3040,6 +3085,7 @@ key_delsav(struct secasvar *sav)
key_clear_xform(sav);
key_freesaval(sav);
+ SAVLIST_ENTRY_DESTROY(sav);
kmem_intr_free(sav, sizeof(*sav));
return;
@@ -3113,8 +3159,7 @@ key_getsavbyspi(struct secashead *sah, u
/* search all status */
SASTATE_ALIVE_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
-
+ SAVLIST_READER_FOREACH(sav, sah, state) {
/* sanity check */
if (sav->state != state) {
IPSECLOG(LOG_DEBUG,
@@ -4501,7 +4546,7 @@ static void
key_timehandler_sad(time_t now)
{
struct secashead *sah;
- struct secasvar *sav, *nextsav;
+ struct secasvar *sav;
restart:
SAHLIST_WRITER_FOREACH(sah) {
@@ -4512,10 +4557,11 @@ restart:
}
/* if LARVAL entry doesn't become MATURE, delete it. */
- LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_LARVAL],
- chain, nextsav) {
+ restart_sav_LARVAL:
+ SAVLIST_READER_FOREACH(sav, sah, SADB_SASTATE_LARVAL) {
if (now - sav->created > key_larval_lifetime) {
KEY_FREESAV(&sav);
+ goto restart_sav_LARVAL;
}
}
@@ -4523,8 +4569,8 @@ restart:
* check MATURE entry to start to send expire message
* whether or not.
*/
- LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_MATURE],
- chain, nextsav) {
+ restart_sav_MATURE:
+ SAVLIST_READER_FOREACH(sav, sah, SADB_SASTATE_MATURE) {
/* we don't need to check. */
if (sav->lft_s == NULL)
continue;
@@ -4551,6 +4597,7 @@ restart:
*/
key_expire(sav);
}
+ goto restart_sav_MATURE;
}
/* check SOFT lifetime by bytes */
/*
@@ -4569,12 +4616,13 @@ restart:
* DYING. Do remove below code.
*/
key_expire(sav);
+ goto restart_sav_MATURE;
}
}
/* check DYING entry to change status to DEAD. */
- LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_DYING],
- chain, nextsav) {
+ restart_sav_DYING:
+ SAVLIST_READER_FOREACH(sav, sah, SADB_SASTATE_DYING) {
/* we don't need to check. */
if (sav->lft_h == NULL)
continue;
@@ -4586,6 +4634,7 @@ restart:
now - sav->created > sav->lft_h->sadb_lifetime_addtime) {
key_sa_chgstate(sav, SADB_SASTATE_DEAD);
KEY_FREESAV(&sav);
+ goto restart_sav_DYING;
}
#if 0 /* XXX Should we keep to send expire message until HARD lifetime ? */
else if (sav->lft_s != NULL
@@ -4609,12 +4658,12 @@ restart:
sav->lft_c->sadb_lifetime_bytes) {
key_sa_chgstate(sav, SADB_SASTATE_DEAD);
KEY_FREESAV(&sav);
+ goto restart_sav_DYING;
}
}
/* delete entry in DEAD */
- LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_DEAD],
- chain, nextsav) {
+ SAVLIST_READER_FOREACH(sav, sah, SADB_SASTATE_DEAD) {
/* sanity check */
if (sav->state != SADB_SASTATE_DEAD) {
IPSECLOG(LOG_DEBUG,
@@ -4912,8 +4961,8 @@ key_api_getspi(struct socket *so, struct
newsav->refcnt = 1;
newsav->sah = newsah;
newsav->state = SADB_SASTATE_LARVAL;
- LIST_INSERT_TAIL(&newsah->savtree[SADB_SASTATE_LARVAL], newsav,
- secasvar, chain);
+ SAVLIST_ENTRY_INIT(newsav);
+ SAVLIST_WRITER_INSERT_TAIL(newsah, SADB_SASTATE_LARVAL, newsav);
key_validate_savlist(newsah, SADB_SASTATE_LARVAL);
#ifndef IPSEC_NONBLOCK_ACQUIRE
@@ -5352,8 +5401,8 @@ key_api_update(struct socket *so, struct
/* add to satree */
newsav->refcnt = 1;
newsav->state = SADB_SASTATE_MATURE;
- LIST_INSERT_TAIL(&sah->savtree[SADB_SASTATE_MATURE], newsav,
- secasvar, chain);
+ SAVLIST_ENTRY_INIT(newsav);
+ SAVLIST_WRITER_INSERT_TAIL(sah, SADB_SASTATE_MATURE, newsav);
key_validate_savlist(sah, SADB_SASTATE_MATURE);
key_sa_chgstate(sav, SADB_SASTATE_DEAD);
@@ -5395,8 +5444,7 @@ key_getsavbyseq(struct secashead *sah, u
state = SADB_SASTATE_LARVAL;
/* search SAD with sequence number ? */
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
-
+ SAVLIST_READER_FOREACH(sav, sah, state) {
KEY_CHKSASTATE(state, sav->state);
if (sav->seq == seq) {
@@ -5541,8 +5589,8 @@ key_api_add(struct socket *so, struct mb
/* add to satree */
newsav->refcnt = 1;
newsav->state = SADB_SASTATE_MATURE;
- LIST_INSERT_TAIL(&newsah->savtree[SADB_SASTATE_MATURE], newsav,
- secasvar, chain);
+ SAVLIST_ENTRY_INIT(newsav);
+ SAVLIST_WRITER_INSERT_TAIL(newsah, SADB_SASTATE_MATURE, newsav);
key_validate_savlist(newsah, SADB_SASTATE_MATURE);
/*
@@ -5791,7 +5839,7 @@ key_delete_all(struct socket *so, struct
const struct sockaddr *src, *dst;
struct secasindex saidx;
struct secashead *sah;
- struct secasvar *sav, *nextsav;
+ struct secasvar *sav;
u_int state;
int error;
@@ -5812,8 +5860,8 @@ key_delete_all(struct socket *so, struct
SASTATE_ALIVE_FOREACH(state) {
if (state == SADB_SASTATE_LARVAL)
continue;
- LIST_FOREACH_SAFE(sav, &sah->savtree[state], chain,
- nextsav) {
+ restart:
+ SAVLIST_WRITER_FOREACH(sav, sah, state) {
/* sanity check */
if (sav->state != state) {
IPSECLOG(LOG_DEBUG,
@@ -5825,6 +5873,7 @@ key_delete_all(struct socket *so, struct
key_sa_chgstate(sav, SADB_SASTATE_DEAD);
KEY_FREESAV(&sav);
+ goto restart;
}
}
}
@@ -6940,7 +6989,7 @@ key_api_flush(struct socket *so, struct
{
struct sadb_msg *newmsg;
struct secashead *sah;
- struct secasvar *sav, *nextsav;
+ struct secasvar *sav;
u_int16_t proto;
u_int8_t state;
@@ -6958,10 +7007,11 @@ key_api_flush(struct socket *so, struct
continue;
SASTATE_ALIVE_FOREACH(state) {
- LIST_FOREACH_SAFE(sav, &sah->savtree[state], chain,
- nextsav) {
+ restart:
+ SAVLIST_WRITER_FOREACH(sav, sah, state) {
key_sa_chgstate(sav, SADB_SASTATE_DEAD);
KEY_FREESAV(&sav);
+ goto restart;
}
}
@@ -7014,7 +7064,7 @@ key_setdump_chain(u_int8_t req_satype, i
continue;
SASTATE_ANY_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
cnt++;
}
}
@@ -7042,7 +7092,7 @@ key_setdump_chain(u_int8_t req_satype, i
}
SASTATE_ANY_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
n = key_setdumpsa(sav, SADB_DUMP, satype,
--cnt, pid);
if (!n) {
@@ -7895,29 +7945,29 @@ key_sa_chgstate(struct secasvar *sav, u_
if (sav->state == state)
return;
- KASSERT(__LIST_CHAINED(sav));
- LIST_REMOVE(sav, chain);
+ SAVLIST_WRITER_REMOVE(sav);
+ SAVLIST_ENTRY_DESTROY(sav);
+ SAVLIST_ENTRY_INIT(sav);
sav->state = state;
if (!SADB_SASTATE_USABLE_P(sav)) {
/* We don't need to care about the order */
- LIST_INSERT_HEAD(&sav->sah->savtree[state], sav, chain);
+ SAVLIST_WRITER_INSERT_HEAD(sav->sah, state, sav);
return;
}
/*
* Sort the list by lft_c->sadb_lifetime_addtime
* in ascending order.
*/
- LIST_FOREACH(_sav, &sav->sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(_sav, sav->sah, state) {
if (_sav->lft_c->sadb_lifetime_addtime >
sav->lft_c->sadb_lifetime_addtime) {
- LIST_INSERT_BEFORE(_sav, sav, chain);
+ SAVLIST_WRITER_INSERT_BEFORE(_sav, sav);
break;
}
}
if (_sav == NULL) {
- LIST_INSERT_TAIL(&sav->sah->savtree[state], sav, secasvar,
- chain);
+ SAVLIST_WRITER_INSERT_TAIL(sav->sah, state, sav);
}
key_validate_savlist(sav->sah, state);
}
@@ -7986,7 +8036,7 @@ key_setdump(u_int8_t req_satype, int *er
continue;
SASTATE_ANY_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
cnt++;
}
}
@@ -8013,7 +8063,7 @@ key_setdump(u_int8_t req_satype, int *er
}
SASTATE_ANY_FOREACH(state) {
- LIST_FOREACH(sav, &sah->savtree[state], chain) {
+ SAVLIST_READER_FOREACH(sav, sah, state) {
n = key_setdumpsa(sav, SADB_DUMP, satype,
--cnt, pid);
if (!n) {
Index: src/sys/netipsec/keydb.h
diff -u src/sys/netipsec/keydb.h:1.16 src/sys/netipsec/keydb.h:1.17
--- src/sys/netipsec/keydb.h:1.16 Thu Aug 3 06:30:04 2017
+++ src/sys/netipsec/keydb.h Thu Aug 3 06:30:40 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: keydb.h,v 1.16 2017/08/03 06:30:04 ozaki-r Exp $ */
+/* $NetBSD: keydb.h,v 1.17 2017/08/03 06:30:40 ozaki-r Exp $ */
/* $FreeBSD: src/sys/netipsec/keydb.h,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $ */
/* $KAME: keydb.h,v 1.14 2000/08/02 17:58:26 sakane Exp $ */
@@ -76,7 +76,7 @@ struct secashead {
size_t identd_len; /* length of identd */
u_int8_t state; /* MATURE or DEAD. */
- LIST_HEAD(_satree, secasvar) savtree[SADB_SASTATE_MAX+1];
+ struct pslist_head savtree[SADB_SASTATE_MAX+1];
/* SA chain */
/* The first of this list is newer SA */
@@ -90,7 +90,7 @@ struct comp_algo;
/* Security Association */
struct secasvar {
- LIST_ENTRY(secasvar) chain;
+ struct pslist_entry pslist_entry;
u_int refcnt; /* reference count */
u_int8_t state; /* Status of this Association */