Module Name: src Committed By: ozaki-r Date: Tue May 9 04:20:11 UTC 2017
Modified Files: src/sys/netipsec: key.c Log Message: Add debugging facilities for refcnt of SA/SP To generate a diff of this commit: cvs rdiff -u -r1.120 -r1.121 src/sys/netipsec/key.c 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.120 src/sys/netipsec/key.c:1.121 --- src/sys/netipsec/key.c:1.120 Tue May 9 04:18:51 2017 +++ src/sys/netipsec/key.c Tue May 9 04:20:11 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: key.c,v 1.120 2017/05/09 04:18:51 ozaki-r Exp $ */ +/* $NetBSD: key.c,v 1.121 2017/05/09 04:20:11 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.120 2017/05/09 04:18:51 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.121 2017/05/09 04:20:11 ozaki-r Exp $"); /* * This code is referd to RFC 2367 @@ -535,22 +535,54 @@ static void key_sp_unlink (struct secpol static struct mbuf *key_alloc_mbuf (int); struct callout key_timehandler_ch; +#ifdef IPSEC_REF_DEBUG +#define REFLOG(label, p, where, tag) \ + ipseclog((LOG_DEBUG, "%s:%d: " label " : refcnt=%d (%p)\n.", \ + (where), (tag), (p)->refcnt, (p))) +#else +#define REFLOG do {} while (0) +#endif + #define SA_ADDREF(p) do { \ (p)->refcnt++; \ + REFLOG("SA_ADDREF", (p), __func__, __LINE__); \ + KASSERTMSG((p)->refcnt != 0, "SA refcnt overflow"); \ +} while (0) +#define SA_ADDREF2(p, where, tag) do { \ + (p)->refcnt++; \ + REFLOG("SA_ADDREF", (p), (where), (tag)); \ KASSERTMSG((p)->refcnt != 0, "SA refcnt overflow"); \ } while (0) #define SA_DELREF(p) do { \ KASSERTMSG((p)->refcnt > 0, "SA refcnt underflow"); \ (p)->refcnt--; \ + REFLOG("SA_DELREF", (p), __func__, __LINE__); \ +} while (0) +#define SA_DELREF2(p, where, tag) do { \ + KASSERTMSG((p)->refcnt > 0, "SA refcnt underflow"); \ + (p)->refcnt--; \ + REFLOG("SA_DELREF", (p), (where), (tag)); \ } while (0) #define SP_ADDREF(p) do { \ (p)->refcnt++; \ + REFLOG("SP_ADDREF", (p), __func__, __LINE__); \ + KASSERTMSG((p)->refcnt != 0, "SP refcnt overflow"); \ +} while (0) +#define SP_ADDREF2(p, where, tag) do { \ + (p)->refcnt++; \ + REFLOG("SP_ADDREF", (p), (where), (tag)); \ KASSERTMSG((p)->refcnt != 0, "SP refcnt overflow"); \ } while (0) #define SP_DELREF(p) do { \ KASSERTMSG((p)->refcnt > 0, "SP refcnt underflow"); \ (p)->refcnt--; \ + REFLOG("SP_DELREF", (p), __func__, __LINE__); \ +} while (0) +#define SP_DELREF2(p, where, tag) do { \ + KASSERTMSG((p)->refcnt > 0, "SP refcnt underflow"); \ + (p)->refcnt--; \ + REFLOG("SP_DELREF", (p), (where), (tag)); \ } while (0) @@ -631,7 +663,7 @@ found: /* found a SPD entry */ sp->lastused = time_uptime; - SP_ADDREF(sp); + SP_ADDREF2(sp, where, tag); } splx(s); @@ -695,7 +727,7 @@ found: /* found a SPD entry */ sp->lastused = time_uptime; - SP_ADDREF(sp); + SP_ADDREF2(sp, where, tag); } splx(s); @@ -771,7 +803,7 @@ key_gettunnel(const struct sockaddr *osr found: if (sp) { sp->lastused = time_uptime; - SP_ADDREF(sp); + SP_ADDREF2(sp, where, tag); } splx(s); done: @@ -1187,7 +1219,7 @@ key_allocsa( /* check dst address */ if (key_sockaddrcmp(&dst->sa, &sav->sah->saidx.dst.sa, chkport) != 0) continue; - SA_ADDREF(sav); + SA_ADDREF2(sav, where, tag); goto done; } } @@ -1212,7 +1244,7 @@ _key_freesp(struct secpolicy **spp, cons KASSERT(sp != NULL); - SP_DELREF(sp); + SP_DELREF2(sp, where, tag); KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP SP:%p (ID=%u) from %s:%u; refcnt now %u\n", @@ -1309,7 +1341,7 @@ key_freesav(struct secasvar **psav, cons KASSERT(sav != NULL); - SA_DELREF(sav); + SA_DELREF2(sav, where, tag); KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP SA:%p (SPI %lu) from %s:%u; refcnt now %u\n",