Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Mar 2016 15:07:25 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r296409 - projects/vnet/sys/net
Message-ID:  <201603051507.u25F7Pti054682@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Sat Mar  5 15:07:25 2016
New Revision: 296409
URL: https://svnweb.freebsd.org/changeset/base/296409

Log:
  Decompose the protocol hooks and the interface creation as they
  occur (and have to happen) at totally different times.
  Interfaces are created before protocols are attached and protocol
  hooks are removed before protocols are torn down.
  This prevents a panic on boot when enc(4) is compiled into the
  kernel or the module is loaded from loader.
  
  Reported by:	kp
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/vnet/sys/net/if_enc.c

Modified: projects/vnet/sys/net/if_enc.c
==============================================================================
--- projects/vnet/sys/net/if_enc.c	Sat Mar  5 13:17:53 2016	(r296408)
+++ projects/vnet/sys/net/if_enc.c	Sat Mar  5 15:07:25 2016	(r296409)
@@ -136,7 +136,6 @@ enc_clone_destroy(struct ifnet *ifp)
 	sc = ifp->if_softc;
 	KASSERT(sc == V_enc_sc, ("sc != ifp->if_softc"));
 
-	enc_remove_hhooks(sc);
 	bpfdetach(ifp);
 	if_detach(ifp);
 	if_free(ifp);
@@ -170,10 +169,6 @@ enc_clone_create(struct if_clone *ifc, i
 	ifp->if_softc = sc;
 	if_attach(ifp);
 	bpfattach(ifp, DLT_ENC, sizeof(struct enchdr));
-	if (enc_add_hhooks(sc) != 0) {
-		enc_clone_destroy(ifp);
-		return (ENXIO);
-	}
 	return (0);
 }
 
@@ -373,6 +368,17 @@ VNET_SYSINIT(vnet_enc_init, SI_SUB_PSEUD
     vnet_enc_init, NULL);
 
 static void
+vnet_enc_init_proto(void *unused __unused)
+{
+	KASSERT(V_enc_sc != NULL, ("%s: V_enc_sc is %p\n", __func__, V_enc_sc));
+
+	if (enc_add_hhooks(V_enc_sc) != 0)
+		enc_clone_destroy(V_enc_sc->sc_ifp);
+}
+VNET_SYSINIT(vnet_enc_init_proto, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY,
+    vnet_enc_init_proto, NULL);
+
+static void
 vnet_enc_uninit(const void *unused __unused)
 {
 
@@ -381,6 +387,16 @@ vnet_enc_uninit(const void *unused __unu
 VNET_SYSUNINIT(vnet_enc_uninit, SI_SUB_PSEUDO, SI_ORDER_ANY,
     vnet_enc_uninit, NULL);
 
+static void
+vnet_enc_uninit_proto(void *unused __unused)
+{
+	KASSERT(V_enc_sc != NULL, ("%s: V_enc_sc is %p\n", __func__, V_enc_sc));
+
+	enc_remove_hhooks(V_enc_sc);
+}
+VNET_SYSUNINIT(vnet_enc_uninit_proto, SI_SUB_PROTO_IFATTACHDOMAIN,
+    SI_ORDER_ANY, vnet_enc_uninit_proto, NULL);
+
 static int
 enc_modevent(module_t mod, int type, void *data)
 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201603051507.u25F7Pti054682>