+ bdg_promisc_off( 1 ); /* reset previously used interfaces */
+ flush_table();
+ if (do_bridge) {
+ parse_bdg_cfg();
+ bdg_promisc_on();
+ }
+ }
+ return error ;
+}
+
+static char bridge_cfg[256] = { "" } ;
+
+/*
+ * parse the config string, set IFF_USED, name and cluster_id
+ * for all interfaces found.
+ */
+static void
+parse_bdg_cfg()
+{
+ char *p, *beg ;
+ int i, l, cluster;
+ struct bdg_softc *b;
+
+ for (p= bridge_cfg; *p ; p++) {
+ /* interface names begin with [a-z] and continue up to ':' */
+ if (*p < 'a' || *p > 'z')
+ continue ;
+ for ( beg = p ; *p && *p != ':' ; p++ )
+ ;
+ if (*p == 0) /* end of string, ':' not found */
+ return ;
+ l = p - beg ; /* length of name string */
+ p++ ;
+ DEB(printf("-- match beg(%d) <%s> p <%s>\n", l, beg, p);)
+ for (cluster = 0 ; *p && *p >= '0' && *p <= '9' ; p++)
+ cluster = cluster*10 + (*p -'0');
+ /*
+ * now search in bridge strings
+ */
+ for (i=0, b = ifp2sc ; i < if_index ; i++, b++) {
+ char buf[32];
+ struct ifnet *ifp = b->ifp ;
+
+ if (ifp == NULL)
+ continue;
+ sprintf(buf, "%s%d", ifp->if_name, ifp->if_unit);
+ if (!strncmp(beg, buf, l)) { /* XXX not correct for >10 if! */
+ b->cluster_id = htons(cluster) ;
+ b->flags |= IFF_USED ;
+ sprintf(bdg_stats.s[ifp->if_index].name,
+ "%s%d:%d", ifp->if_name, ifp->if_unit, cluster);
+
+ DEB(printf("--++ found %s\n",
+ bdg_stats.s[ifp->if_index].name);)
+ break ;
+ }
+ }
+ if (*p == '\0')
+ break ;
+ }
+}
+
+static int
+sysctl_bdg_cfg(SYSCTL_HANDLER_ARGS)
+{
+ int error = 0 ;
+ char oldval[256] ;
+
+ strlcpy(oldval, bridge_cfg, sizeof (oldval));
+
+ error = sysctl_handle_string(oidp,
+ bridge_cfg, oidp->oid_arg2, req);
+ DEB(
+ printf("called sysctl for bridge name %s arg2 %d err %d val %s->%s\n",
+ oidp->oid_name, oidp->oid_arg2,
+ error,
+ oldval, bridge_cfg);
+ )
+ if (strcmp(oldval, bridge_cfg)) {
+ bdg_promisc_off( 1 ); /* reset previously-used interfaces */