3 # This script sets up an Ethernet bridging network across multiple
4 # Ethernet interfaces using the ng_bridge(4) and ng_ether(4) netgraph
9 # 0. Make your own copy of this example script.
11 # 1. Give your bridging network a name by editing the definition of
12 # ${BRIDGE_NAME} below. It must be a valid netgraph node name.
14 # 2. Edit the definitions of ${BRIDGE_IFACES} and ${LOCAL_IFACES}
15 # as described below to define your bridging interfaces.
17 # 3. Run this script with "start" as the command line argument.
19 # 4. Examine bridging statistics by running this script with "stats"
20 # as the command line argument.
22 # 5. Stop bridging by running this script with "stop" as the
23 # command line argument.
25 # To run multiple independent bridging networks, create multiple
26 # copies of this script with different variable definitions.
28 # To make a "brouted" network, with IP being routed and other protocols being
29 # bridged, add all the interface in the BRIDGE_IFACES to the LOCAL_IFACES.
30 # If you just want a normal bridge, just one will be enough.
31 # In some cases you may want some combination.
34 # Give each bridging network a unique name here.
38 # List the names of the interfaces that you want to bridge across
39 # here in ${BRIDGE_IFACES}. If you want to include the local host
40 # machine as well then set ${LOCAL_IFACES} as well (they may also be
41 # listed in ${BRIDGE_IFACES}). Of course, any ${LOCAL_IFACE} must
42 # be ifconfig(8)ured separately. If you don't want a ${LOCAL_IFACE}
43 # then assign it the emtpy string.
45 BRIDGE_IFACES
="de0 fxp0 fxp1"
46 LOCAL_IFACES
="fxp0 fxp1"
48 #####################################################################
49 #### Everything below this point should not need to be modified. ####
50 #####################################################################
52 # Routine to verify node's existence.
54 ngctl info
${BRIDGE_NAME}: >/dev
/null
2>&1
56 echo "${BRIDGE_NAME}: bridge network not found"
61 # Routine to get and display link stats.
63 STATS
=`ngctl msg ${BRIDGE_NAME}: getstats $1`
67 echo "${STATS}" |
fmt 2 |
awk '/=/ { fl=index($0, "="); \
68 printf "%20s = %s\n", substr($0, 0, fl - 1), substr($0, fl + 1); }'
71 # Start/restart routine.
74 # Load netgraph KLD's as necessary.
75 for KLD
in ng_ether ng_bridge
; do
76 if ! kldstat
-v |
grep -qw ${KLD}; then
77 echo -n "Loading ${KLD}.ko... "
78 kldload
${KLD} ||
exit 1
83 # Reset all interfaces.
86 # Verify all interfaces exist.
87 for ETHER
in ${BRIDGE_IFACES} ${LOCAL_IFACES}; do
88 if ! ngctl info
${ETHER}: >/dev
/null
2>&1; then
89 echo "Error: interface ${ETHER} does not exist"
92 ifconfig
${ETHER} up ||
exit 1
95 # Create new ng_bridge(4) node, attached to the first interface.
96 FIRSTIF
=`echo ${BRIDGE_IFACES} | awk '{ print $1 }'`
97 ngctl mkpeer
${FIRSTIF}: bridge lower link0 ||
exit 1
98 ngctl name
${FIRSTIF}:lower
${BRIDGE_NAME} ||
exit 1
100 # Attach other interfaces as well.
102 for ETHER
in ${BRIDGE_IFACES}; do
103 if [ ${LINKNUM} != 0 ]; then
104 ngctl connect
${ETHER}: ${BRIDGE_NAME}: \
105 lower link
${LINKNUM} ||
exit 1
107 LINKNUM
=`expr ${LINKNUM} + 1`
110 # Hook up local interface, if any.
111 for LOCAL_IFACE
in ${LOCAL_IFACES}; do
112 ngctl connect
${LOCAL_IFACE}: ${BRIDGE_NAME}: \
113 upper link
${LINKNUM} ||
exit 1
114 LINKNUM
=`expr ${LINKNUM} + 1`
117 # Set all interfaces in promiscuous mode and don't overwrite src addr.
118 for ETHER
in ${BRIDGE_IFACES}; do
119 ngctl msg
${ETHER}: setpromisc
1 ||
exit 1
120 ngctl msg
${ETHER}: setautosrc
0 ||
exit 1
126 ngctl
kill ${BRIDGE_NAME}: >/dev
/null
2>&1
127 for ETHER
in ${BRIDGE_IFACES} ${LOCAL_IFACES}; do
128 ngctl
kill ${ETHER}: >/dev
/null
2>&1
135 # Make sure node exists.
139 echo "Statistics for bridging network ${BRIDGE_NAME}:"
142 for ETHER
in ${BRIDGE_IFACES}; do
143 echo "Network interface ${ETHER}:"
144 bridge_linkstats
${LINKNUM}
145 LINKNUM
=`expr ${LINKNUM} + 1`
147 for LOCAL_IFACE
in ${LOCAL_IFACES}; do
148 echo "Local host interface ${LOCAL_IFACE}:"
149 bridge_linkstats
${LINKNUM}
150 LINKNUM
=`expr ${LINKNUM} + 1`
168 echo "usage: $0 [ start | stop | stats ]"