From owner-svn-src-head@FreeBSD.ORG Sat Sep 29 20:11:02 2012 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C98BE1065670; Sat, 29 Sep 2012 20:11:01 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 143328FC14; Sat, 29 Sep 2012 20:11:01 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q8TKB0qU086413; Sat, 29 Sep 2012 20:11:00 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q8TKB0up086411; Sat, 29 Sep 2012 20:11:00 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201209292011.q8TKB0up086411@svn.freebsd.org> From: Gleb Smirnoff Date: Sat, 29 Sep 2012 20:11:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r241057 - head/sys/netpfil/pf X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 29 Sep 2012 20:11:03 -0000 Author: glebius Date: Sat Sep 29 20:11:00 2012 New Revision: 241057 URL: http://svn.freebsd.org/changeset/base/241057 Log: Clear and re-setup all function pointers that glue pf(4) and pfsync(4) together whenever the pfsync0 is brought down or up respectively. Modified: head/sys/netpfil/pf/if_pfsync.c Modified: head/sys/netpfil/pf/if_pfsync.c ============================================================================== --- head/sys/netpfil/pf/if_pfsync.c Sat Sep 29 20:02:26 2012 (r241056) +++ head/sys/netpfil/pf/if_pfsync.c Sat Sep 29 20:11:00 2012 (r241057) @@ -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 cm 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);