summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2011-10-23 15:15:17 +0000
committerglebius <glebius@FreeBSD.org>2011-10-23 15:15:17 +0000
commit846e388f827fa94be222f55edf419b5c07b6c30b (patch)
tree598e4a83df7ec9498baad6ee6941f82dd17e3e31 /sys/contrib
parentdf3649a33126d9f63612b3c446fde98dbee138ef (diff)
downloadFreeBSD-src-846e388f827fa94be222f55edf419b5c07b6c30b.zip
FreeBSD-src-846e388f827fa94be222f55edf419b5c07b6c30b.tar.gz
Merge several fixes to bulk update processing from OpenBSD. Merged
revisions: 1.148, 1.149, 1.150. This makes number of states on master/slave to be of a sane value.
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/pf/net/if_pfsync.c71
1 files changed, 44 insertions, 27 deletions
diff --git a/sys/contrib/pf/net/if_pfsync.c b/sys/contrib/pf/net/if_pfsync.c
index 69158ab..80714c2 100644
--- a/sys/contrib/pf/net/if_pfsync.c
+++ b/sys/contrib/pf/net/if_pfsync.c
@@ -3004,16 +3004,6 @@ pfsync_bulk_start(void)
struct pfsync_softc *sc = pfsyncif;
#endif
- sc->sc_ureq_received = time_uptime;
-
- if (sc->sc_bulk_next == NULL)
-#ifdef __FreeBSD__
- sc->sc_bulk_next = TAILQ_FIRST(&V_state_list);
-#else
- sc->sc_bulk_next = TAILQ_FIRST(&state_list);
-#endif
- sc->sc_bulk_last = sc->sc_bulk_next;
-
#ifdef __FreeBSD__
if (V_pf_status.debug >= PF_DEBUG_MISC)
#else
@@ -3021,10 +3011,30 @@ pfsync_bulk_start(void)
#endif
printf("pfsync: received bulk update request\n");
+#ifdef __FreeBSD__
PF_LOCK();
- pfsync_bulk_status(PFSYNC_BUS_START);
- pfsync_bulk_update(sc);
+ if (TAILQ_EMPTY(&V_state_list))
+#else
+ if (TAILQ_EMPTY(&state_list))
+#endif
+ pfsync_bulk_status(PFSYNC_BUS_END);
+ else {
+ sc->sc_ureq_received = time_uptime;
+ if (sc->sc_bulk_next == NULL)
+#ifdef __FreeBSD__
+ sc->sc_bulk_next = TAILQ_FIRST(&V_state_list);
+#else
+ sc->sc_bulk_next = TAILQ_FIRST(&state_list);
+#endif
+ sc->sc_bulk_last = sc->sc_bulk_next;
+
+ pfsync_bulk_status(PFSYNC_BUS_START);
+ callout_reset(&sc->sc_bulk_tmo, 1,
+ pfsync_bulk_update, sc);
+ }
+#ifdef __FreeBSD__
PF_UNLOCK();
+#endif
}
void
@@ -3041,7 +3051,7 @@ pfsync_bulk_update(void *arg)
#ifdef __FreeBSD__
CURVNET_SET(sc->sc_ifp->if_vnet);
#endif
- do {
+ for (;;) {
if (st->sync_state == PFSYNC_S_NONE &&
st->timeout < PFTM_MAX &&
st->pfsync_time <= sc->sc_ureq_received) {
@@ -3057,7 +3067,21 @@ pfsync_bulk_update(void *arg)
st = TAILQ_FIRST(&state_list);
#endif
- if (i > 0 && TAILQ_EMPTY(&sc->sc_qs[PFSYNC_S_UPD])) {
+ if (st == sc->sc_bulk_last) {
+ /* we're done */
+ sc->sc_bulk_next = NULL;
+ sc->sc_bulk_last = NULL;
+ pfsync_bulk_status(PFSYNC_BUS_END);
+ break;
+ }
+
+#ifdef __FreeBSD__
+ if (i > 1 && (sc->sc_ifp->if_mtu - sc->sc_len) <
+#else
+ if (i > 1 && (sc->sc_if.if_mtu - sc->sc_len) <
+#endif
+ sizeof(struct pfsync_state)) {
+ /* we've filled a packet */
sc->sc_bulk_next = st;
#ifdef __FreeBSD__
callout_reset(&sc->sc_bulk_tmo, 1,
@@ -3065,16 +3089,10 @@ pfsync_bulk_update(void *arg)
#else
timeout_add(&sc->sc_bulk_tmo, 1);
#endif
- goto out;
+ break;
}
- } while (st != sc->sc_bulk_last);
-
- /* we're done */
- sc->sc_bulk_next = NULL;
- sc->sc_bulk_last = NULL;
- pfsync_bulk_status(PFSYNC_BUS_END);
+ }
-out:
#ifdef __FreeBSD__
CURVNET_RESTORE();
#endif
@@ -3226,13 +3244,12 @@ pfsync_state_in_use(struct pf_state *st)
if (sc == NULL)
return (0);
- if (st->sync_state != PFSYNC_S_NONE)
+ if (st->sync_state != PFSYNC_S_NONE ||
+ st == sc->sc_bulk_next ||
+ st == sc->sc_bulk_last)
return (1);
- if (sc->sc_bulk_next == NULL && sc->sc_bulk_last == NULL)
- return (0);
-
- return (1);
+ return (0);
}
u_int pfsync_ints;
OpenPOWER on IntegriCloud