netgraph panics

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Sat Aug 27 00:26:12 PDT 2005


On Sat, Aug 27, 2005 at 01:35:48PM +0900, YONETANI Tomokazu wrote:
> Please find attached the reworked workaround and see if you like it;

Ugh, please disregard the previous one, wrong function and an extra patch.
Index: netgraph/ng_base.c
===================================================================
RCS file: /home/source/dragonfly/cvs/src/sys/netgraph/netgraph/ng_base.c,v
retrieving revision 1.15
diff -u -p -r1.15 ng_base.c
--- netgraph/ng_base.c	2 Jun 2005 22:11:46 -0000	1.15
+++ netgraph/ng_base.c	27 Aug 2005 06:36:38 -0000
@@ -88,6 +88,8 @@ static int	ng_generic_msg(node_p here, s
 static ng_ID_t	ng_decodeidname(const char *name);
 static int	ngb_mod_event(module_t mod, int event, void *data);
 static int	ngintr(struct netmsg *);
+static int	ng_load_module(const char *);
+static int	ng_unload_module(const char *);
 
 /* Our own netgraph malloc type */
 MALLOC_DEFINE(M_NETGRAPH, "netgraph", "netgraph structures and ctrl messages");
@@ -302,6 +304,50 @@ static const struct ng_cmdlist ng_generi
 			Node routines
 ************************************************************************/
 
+static int
+ng_load_module(const char *name)
+{
+	char *path, filename[NG_TYPELEN + 4];
+	linker_file_t lf;
+	int error;
+
+	/* linker_* API won't work without a process context */
+	if (curproc == NULL)
+		return (ENXIO);
+
+	/* Not found, try to load it as a loadable module */
+	snprintf(filename, sizeof(filename), "ng_%s.ko", name);
+	if ((path = linker_search_path(filename)) == NULL)
+		return (ENXIO);
+	error = linker_load_file(path, &lf);
+	FREE(path, M_LINKER);
+	if (error == 0)
+		lf->userrefs++;		/* pretend kldload'ed */
+	return (error);
+}
+
+static int
+ng_unload_module(const char *name)
+{
+	char filename[NG_TYPELEN + 4];
+	linker_file_t lf;
+	int error;
+
+	/* linker_* API won't work without a process context */
+	if (curproc == NULL)
+		return (ENXIO);
+
+	/* Not found, try to load it as a loadable module */
+	snprintf(filename, sizeof(filename), "ng_%s.ko", name);
+	if ((lf = linker_find_file_by_name(filename)) == NULL)
+		return (ENXIO);
+	error = linker_file_unload(lf);
+
+	if (error == 0)
+		lf->userrefs--;		/* pretend kldunload'ed */
+	return (error);
+}
+
 /*
  * Instantiate a node of the requested type
  */
@@ -317,25 +363,8 @@ ng_make_node(const char *typename, node_
 	}
 
 	/* Locate the node type */
-	if ((type = ng_findtype(typename)) == NULL) {
-		char *path, filename[NG_TYPELEN + 4];
-		linker_file_t lf;
-		int error;
-
-		/* Not found, try to load it as a loadable module */
-		snprintf(filename, sizeof(filename), "ng_%s.ko", typename);
-		if ((path = linker_search_path(filename)) == NULL)
-			return (ENXIO);
-		error = linker_load_file(path, &lf);
-		FREE(path, M_LINKER);
-		if (error != 0)
-			return (error);
-		lf->userrefs++;		/* pretend loaded by the syscall */
-
-		/* Try again, as now the type should have linked itself in */
-		if ((type = ng_findtype(typename)) == NULL)
-			return (ENXIO);
-	}
+	if ((type = ng_findtype(typename)) == NULL)
+		return (ENXIO);
 
 	/* Call the constructor */
 	if (type->constructor != NULL)
@@ -911,6 +940,17 @@ ng_mkpeer(node_p node, const char *name,
 
 	if ((error = ng_add_hook(node, name, &hook)))
 		return (error);
+
+	/* make sure we have the module needed */
+	if (ng_findtype(type) == NULL) {
+		/* Not found, try to load it as a loadable module */
+		error = ng_load_module(type);
+		if (error != 0) {
+			printf("required netgraph module ng_%s not loaded\n",
+			    type);
+			return (error);
+		}
+	}
 	if ((error = ng_make_node(type, &node2))) {
 		ng_destroy_hook(hook);
 		return (error);
@@ -1782,11 +1822,17 @@ ngb_mod_event(module_t mod, int event, v
 	case MOD_LOAD:
 		/* Register line discipline */
 		crit_enter();
+		error = ng_load_module("ksocket");
+		if (error != 0) {
+			crit_exit();
+			break;
+		}
 		netisr_register(NETISR_NETGRAPH, cpu0_portfn, ngintr);
 		error = 0;
 		crit_exit();
 		break;
 	case MOD_UNLOAD:
+		ng_unload_module("ksocket");
 		/* You cant unload it because an interface may be using it.  */
 		error = EBUSY;
 		break;




More information about the Bugs mailing list