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 */