diff options
author | glebius <glebius@FreeBSD.org> | 2012-09-29 20:11:00 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2012-09-29 20:11:00 +0000 |
commit | 2c4db2ae64f6132722e7decded077d823661ee4e (patch) | |
tree | 7d4445707eae8d181f136a447c15dae08ad85dd3 /sys | |
parent | ad137f3f932d9e42519aae42256441c0563a5891 (diff) | |
download | FreeBSD-src-2c4db2ae64f6132722e7decded077d823661ee4e.zip FreeBSD-src-2c4db2ae64f6132722e7decded077d823661ee4e.tar.gz |
Clear and re-setup all function pointers that glue pf(4) and pfsync(4)
together whenever the pfsync0 is brought down or up respectively.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netpfil/pf/if_pfsync.c | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/sys/netpfil/pf/if_pfsync.c b/sys/netpfil/pf/if_pfsync.c index c9988ba..fabc1ab 100644 --- a/sys/netpfil/pf/if_pfsync.c +++ b/sys/netpfil/pf/if_pfsync.c @@ -236,6 +236,8 @@ static void pfsyncintr(void *); static int pfsync_multicast_setup(struct pfsync_softc *, struct ifnet *, void *); static void pfsync_multicast_cleanup(struct pfsync_softc *); +static void pfsync_pointers_init(void); +static void pfsync_pointers_uninit(void); static int pfsync_init(void); static void pfsync_uninit(void); @@ -1267,11 +1269,15 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data) switch (cmd) { case SIOCSIFFLAGS: PFSYNC_LOCK(sc); - if (ifp->if_flags & IFF_UP) + if (ifp->if_flags & IFF_UP) { ifp->if_drv_flags |= IFF_DRV_RUNNING; - else + PFSYNC_UNLOCK(sc); + pfsync_pointers_init(); + } else { ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - PFSYNC_UNLOCK(sc); + PFSYNC_UNLOCK(sc); + pfsync_pointers_uninit(); + } break; case SIOCSIFMTU: if (!sc->sc_sync_if || @@ -2266,6 +2272,34 @@ static struct protosw in_pfsync_protosw = { }; #endif +static void +pfsync_pointers_init() +{ + + PF_RULES_WLOCK(); + pfsync_state_import_ptr = pfsync_state_import; + pfsync_insert_state_ptr = pfsync_insert_state; + pfsync_update_state_ptr = pfsync_update_state; + pfsync_delete_state_ptr = pfsync_delete_state; + pfsync_clear_states_ptr = pfsync_clear_states; + pfsync_defer_ptr = pfsync_defer; + PF_RULES_WUNLOCK(); +} + +static void +pfsync_pointers_uninit() +{ + + PF_RULES_WLOCK(); + pfsync_state_import_ptr = NULL; + pfsync_insert_state_ptr = NULL; + pfsync_update_state_ptr = NULL; + pfsync_delete_state_ptr = NULL; + pfsync_clear_states_ptr = NULL; + pfsync_defer_ptr = NULL; + PF_RULES_WUNLOCK(); +} + static int pfsync_init() { @@ -2296,14 +2330,7 @@ pfsync_init() goto fail; } #endif - PF_RULES_WLOCK(); - pfsync_state_import_ptr = pfsync_state_import; - pfsync_insert_state_ptr = pfsync_insert_state; - pfsync_update_state_ptr = pfsync_update_state; - pfsync_delete_state_ptr = pfsync_delete_state; - pfsync_clear_states_ptr = pfsync_clear_states; - pfsync_defer_ptr = pfsync_defer; - PF_RULES_WUNLOCK(); + pfsync_pointers_init(); return (0); @@ -2328,14 +2355,7 @@ pfsync_uninit() { VNET_ITERATOR_DECL(vnet_iter); - PF_RULES_WLOCK(); - pfsync_state_import_ptr = NULL; - pfsync_insert_state_ptr = NULL; - pfsync_update_state_ptr = NULL; - pfsync_delete_state_ptr = NULL; - pfsync_clear_states_ptr = NULL; - pfsync_defer_ptr = NULL; - PF_RULES_WUNLOCK(); + pfsync_pointers_uninit(); ipproto_unregister(IPPROTO_PFSYNC); pf_proto_unregister(PF_INET, IPPROTO_PFSYNC, SOCK_RAW); |