summaryrefslogtreecommitdiffstats
path: root/sys/net/bridge.c
diff options
context:
space:
mode:
authornsayer <nsayer@FreeBSD.org>2000-07-20 17:07:06 +0000
committernsayer <nsayer@FreeBSD.org>2000-07-20 17:07:06 +0000
commit3ba67ad5ec70ef14c958f0f36d06b9a86768d105 (patch)
treee73ba54429d137ee4c02850eba267f85966f3587 /sys/net/bridge.c
parent14503a8247dc9e15f6d248a31949e5e8033da4a0 (diff)
downloadFreeBSD-src-3ba67ad5ec70ef14c958f0f36d06b9a86768d105.zip
FreeBSD-src-3ba67ad5ec70ef14c958f0f36d06b9a86768d105.tar.gz
Add sysctl to perform bridge refresh. This is required if bridged
configurations include loadable interfaces. After loading new interface drivers, perform a 'sysctl -w net.link.ether.bridge_refresh=1' and the bridge code will reinitialize itself. Submitted by: <vsilyaev@mindspring.com>
Diffstat (limited to 'sys/net/bridge.c')
-rw-r--r--sys/net/bridge.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/sys/net/bridge.c b/sys/net/bridge.c
index 7366ebf..4bb4247 100644
--- a/sys/net/bridge.c
+++ b/sys/net/bridge.c
@@ -118,6 +118,7 @@
#define DEB(x)
static void bdginit(void *);
+static void bdgtakeifaces(void);
static void flush_table(void);
static void bdg_promisc_on(void);
static void parse_bdg_cfg(void);
@@ -321,6 +322,16 @@ sysctl_bdg_cfg(SYSCTL_HANDLER_ARGS)
return error ;
}
+static int
+sysctl_refresh SYSCTL_HANDLER_ARGS
+{
+ if (req->newptr)
+ bdgtakeifaces();
+
+ return 0;
+}
+
+
SYSCTL_DECL(_net_link_ether);
SYSCTL_PROC(_net_link_ether, OID_AUTO, bridge_cfg, CTLTYPE_STRING|CTLFLAG_RW,
&bridge_cfg, sizeof(bridge_cfg), &sysctl_bdg_cfg, "A",
@@ -340,6 +351,9 @@ int bdg_ipfw_colls;
SYSCTL_INT(_net_link_ether, OID_AUTO, bridge_ipfw_collisions,
CTLFLAG_RW, &bdg_ipfw_colls,0,"");
+SYSCTL_PROC(_net_link_ether, OID_AUTO, bridge_refresh, CTLTYPE_INT|CTLFLAG_WR,
+ NULL, 0, &sysctl_refresh, "I", "iface refresh");
+
#if 1 /* diagnostic vars */
int bdg_in_count = 0 , bdg_in_ticks = 0 , bdg_fw_count = 0, bdg_fw_ticks = 0 ;
SYSCTL_INT(_net_link_ether, OID_AUTO, bdginc, CTLFLAG_RW, &bdg_in_count,0,"");
@@ -419,11 +433,6 @@ int bdg_ports ;
static void
bdginit(void *dummy)
{
- int i ;
- struct ifnet *ifp;
- struct arpcom *ac ;
- u_char *eth_addr ;
- struct bdg_softc *bp;
if (bdg_table == NULL)
bdg_table = (struct hash_table *)
@@ -436,8 +445,23 @@ bdginit(void *dummy)
bzero(ifp2sc, BDG_MAX_PORTS * sizeof(struct bdg_softc) );
bzero(&bdg_stats, sizeof(bdg_stats) );
+ bdgtakeifaces();
+ bdg_timeout(0);
+ do_bridge=0;
+}
+
+void
+bdgtakeifaces(void)
+{
+ int i ;
+ struct ifnet *ifp;
+ struct arpcom *ac ;
+ u_char *eth_addr ;
+ struct bdg_softc *bp;
+
bdg_ports = 0 ;
eth_addr = bdg_addresses ;
+ *bridge_cfg = '\0';
printf("BRIDGE 990810, have %d interfaces\n", if_index);
for (i = 0 , ifp = ifnet.tqh_first ; i < if_index ;
@@ -466,8 +490,6 @@ bdginit(void *dummy)
bdg_ports ++ ;
}
- bdg_timeout(0);
- do_bridge=0;
}
/*
OpenPOWER on IntegriCloud