Page MenuHomeFreeBSD

D17502.diff
No OneTemporary

D17502.diff

Index: head/sys/net/pfvar.h
===================================================================
--- head/sys/net/pfvar.h
+++ head/sys/net/pfvar.h
@@ -824,6 +824,7 @@
typedef void pfsync_delete_state_t(struct pf_state *);
typedef void pfsync_clear_states_t(u_int32_t, const char *);
typedef int pfsync_defer_t(struct pf_state *, struct mbuf *);
+typedef void pfsync_detach_ifnet_t(struct ifnet *);
VNET_DECLARE(pfsync_state_import_t *, pfsync_state_import_ptr);
#define V_pfsync_state_import_ptr VNET(pfsync_state_import_ptr)
@@ -837,6 +838,7 @@
#define V_pfsync_clear_states_ptr VNET(pfsync_clear_states_ptr)
VNET_DECLARE(pfsync_defer_t *, pfsync_defer_ptr);
#define V_pfsync_defer_ptr VNET(pfsync_defer_ptr)
+extern pfsync_detach_ifnet_t *pfsync_detach_ifnet_ptr;
void pfsync_state_export(struct pfsync_state *,
struct pf_state *);
Index: head/sys/netpfil/pf/if_pfsync.c
===================================================================
--- head/sys/netpfil/pf/if_pfsync.c
+++ head/sys/netpfil/pf/if_pfsync.c
@@ -281,6 +281,7 @@
static void pfsync_bulk_update(void *);
static void pfsync_bulk_fail(void *);
+static void pfsync_detach_ifnet(struct ifnet *);
#ifdef IPSEC
static void pfsync_update_net_tdb(struct pfsync_tdb *);
#endif
@@ -2292,6 +2293,29 @@
imo->imo_multicast_ifp = NULL;
}
+void
+pfsync_detach_ifnet(struct ifnet *ifp)
+{
+ struct pfsync_softc *sc = V_pfsyncif;
+
+ if (sc == NULL)
+ return;
+
+ PFSYNC_LOCK(sc);
+
+ if (sc->sc_sync_if == ifp) {
+ /* We don't need mutlicast cleanup here, because the interface
+ * is going away. We do need to ensure we don't try to do
+ * cleanup later.
+ */
+ sc->sc_imo.imo_membership = NULL;
+ sc->sc_imo.imo_multicast_ifp = NULL;
+ sc->sc_sync_if = NULL;
+ }
+
+ PFSYNC_UNLOCK(sc);
+}
+
#ifdef INET
extern struct domain inetdomain;
static struct protosw in_pfsync_protosw = {
@@ -2372,6 +2396,8 @@
#ifdef INET
int error;
+ pfsync_detach_ifnet_ptr = pfsync_detach_ifnet;
+
error = pf_proto_register(PF_INET, &in_pfsync_protosw);
if (error)
return (error);
@@ -2388,6 +2414,7 @@
static void
pfsync_uninit()
{
+ pfsync_detach_ifnet_ptr = NULL;
#ifdef INET
ipproto_unregister(IPPROTO_PFSYNC);
Index: head/sys/netpfil/pf/pf_if.c
===================================================================
--- head/sys/netpfil/pf/pf_if.c
+++ head/sys/netpfil/pf/pf_if.c
@@ -834,6 +834,9 @@
{
struct pfi_kif *kif = (struct pfi_kif *)ifp->if_pf_kif;
+ if (pfsync_detach_ifnet_ptr)
+ pfsync_detach_ifnet_ptr(ifp);
+
if (kif == NULL)
return;
@@ -841,6 +844,7 @@
/* Avoid teardown race in the least expensive way. */
return;
}
+
PF_RULES_WLOCK();
V_pfi_update++;
pfi_kif_update(kif);
Index: head/sys/netpfil/pf/pf_ioctl.c
===================================================================
--- head/sys/netpfil/pf/pf_ioctl.c
+++ head/sys/netpfil/pf/pf_ioctl.c
@@ -218,6 +218,7 @@
VNET_DEFINE(pfsync_delete_state_t *, pfsync_delete_state_ptr);
VNET_DEFINE(pfsync_clear_states_t *, pfsync_clear_states_ptr);
VNET_DEFINE(pfsync_defer_t *, pfsync_defer_ptr);
+pfsync_detach_ifnet_t *pfsync_detach_ifnet_ptr;
/* pflog */
pflog_packet_t *pflog_packet_ptr = NULL;

File Metadata

Mime Type
text/plain
Expires
Sun, Jan 12, 4:53 AM (20 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15761402
Default Alt Text
D17502.diff (3 KB)

Event Timeline