Hello,
Diff below changes KASSERT() to if (). We have to prevent
packets to insert state to snapshot queue multiple times.
Hrvoje@ can trigger situation where state updates to pfsync
peer are more frequent than we are able to send out.
OK to go for this simple fix/workaround ?
thanks and
regards
sashan
--------8<---------------8<---------------8<------------------8<--------
diff --git a/sys/net/if_pfsync.c b/sys/net/if_pfsync.c
index d279ede9cd6..fdff3d7a509 100644
--- a/sys/net/if_pfsync.c
+++ b/sys/net/if_pfsync.c
@@ -1362,10 +1362,17 @@ pfsync_grab_snapshot(struct pfsync_snapshot *sn, struct
pfsync_softc *sc)
TAILQ_INIT(&sn->sn_qs[q]);
while ((st = TAILQ_FIRST(&sc->sc_qs[q])) != NULL) {
- KASSERT(st->snapped == 0);
TAILQ_REMOVE(&sc->sc_qs[q], st, sync_list);
- TAILQ_INSERT_TAIL(&sn->sn_qs[q], st, sync_snap);
- st->snapped = 1;
+ if (st->snapped == 0) {
+ TAILQ_INSERT_TAIL(&sn->sn_qs[q], st, sync_snap);
+ st->snapped = 1;
+ } else {
+ /*
+ * item is on snapshot list already, just give
+ * up this attempt to update it.
+ */
+ pf_state_unref(st);
+ }
}
}