As discussed in the previous thread we can simplify the tdb cleanup
code by removing the TDBF_DELETED flag and instead checking if the
tdb was already unlinked.
ok?
Index: ip_ipsp.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_ipsp.c,v
retrieving revision 1.254
diff -u -p -r1.254 ip_ipsp.c
--- ip_ipsp.c 25 Nov 2021 13:46:02 -0000 1.254
+++ ip_ipsp.c 25 Nov 2021 14:39:03 -0000
@@ -835,15 +835,18 @@ puttdb(struct tdb *tdbp)
mtx_leave(&tdb_sadb_mtx);
}
-void
+int
tdb_unlink(struct tdb *tdbp)
{
+ int r;
+
mtx_enter(&tdb_sadb_mtx);
- tdb_unlink_locked(tdbp);
+ r = tdb_unlink_locked(tdbp);
mtx_leave(&tdb_sadb_mtx);
+ return (r);
}
-void
+int
tdb_unlink_locked(struct tdb *tdbp)
{
struct tdb *tdbpp;
@@ -851,6 +854,9 @@ tdb_unlink_locked(struct tdb *tdbp)
MUTEX_ASSERT_LOCKED(&tdb_sadb_mtx);
+ if (tdbp->tdb_dnext == NULL && tdbp->tdb_snext == NULL)
+ return (0);
+
hashval = tdb_hash(tdbp->tdb_spi, &tdbp->tdb_dst, tdbp->tdb_sproto);
if (tdbh[hashval] == tdbp) {
@@ -907,6 +913,8 @@ tdb_unlink_locked(struct tdb *tdbp)
ipsecstat_inc(ipsec_prevtunnels);
}
#endif /* IPSEC */
+
+ return (1);
}
void
@@ -968,11 +976,8 @@ tdb_delete(struct tdb *tdbp)
/* keep in sync with pfkeyv2_sa_flush() */
NET_ASSERT_LOCKED();
- if (tdbp->tdb_flags & TDBF_DELETED)
+ if (tdb_unlink(tdbp) == 0)
return;
- tdbp->tdb_flags |= TDBF_DELETED;
-
- tdb_unlink(tdbp);
/* release tdb_onext/tdb_inext references */
tdb_unbundle(tdbp);
/* delete timeouts and release references */
Index: ip_ipsp.h
===================================================================
RCS file: /cvs/src/sys/netinet/ip_ipsp.h,v
retrieving revision 1.222
diff -u -p -r1.222 ip_ipsp.h
--- ip_ipsp.h 25 Nov 2021 13:46:02 -0000 1.222
+++ ip_ipsp.h 25 Nov 2021 14:39:03 -0000
@@ -337,7 +337,6 @@ struct tdb { /* tunnel
descriptor blo
#define TDBF_ALLOCATIONS 0x00008 /* Check the flows counters */
#define TDBF_INVALID 0x00010 /* This SPI is not valid
yet/anymore */
#define TDBF_FIRSTUSE 0x00020 /* Expire after first use */
-#define TDBF_DELETED 0x00040 /* This TDB has already been
deleted */
#define TDBF_SOFT_TIMER 0x00080 /* Soft expiration */
#define TDBF_SOFT_BYTES 0x00100 /* Soft expiration */
#define TDBF_SOFT_ALLOCATIONS 0x00200 /* Soft expiration */
@@ -352,7 +351,7 @@ struct tdb { /* tunnel
descriptor blo
#define TDBF_BITS ("\20" \
"\1UNIQUE\2TIMER\3BYTES\4ALLOCATIONS" \
- "\5INVALID\6FIRSTUSE\7DELETED\10SOFT_TIMER" \
+ "\5INVALID\6FIRSTUSE\10SOFT_TIMER" \
"\11SOFT_BYTES\12SOFT_ALLOCATIONS\13SOFT_FIRSTUSE\14PFS" \
"\15TUNNELING" \
"\21USEDTUNNEL\22UDPENCAP\23PFSYNC\24PFSYNC_RPL" \
@@ -571,8 +570,8 @@ struct tdb *tdb_ref(struct tdb *);
void tdb_unref(struct tdb *);
void tdb_free(struct tdb *);
int tdb_init(struct tdb *, u_int16_t, struct ipsecinit *);
-void tdb_unlink(struct tdb *);
-void tdb_unlink_locked(struct tdb *);
+int tdb_unlink(struct tdb *);
+int tdb_unlink_locked(struct tdb *);
void tdb_unbundle(struct tdb *);
void tdb_deltimeouts(struct tdb *);
int tdb_walk(u_int, int (*)(struct tdb *, void *, int), void *);