xref: /freebsd/share/examples/netgraph/virtual.lan (revision fa212bfbe6d904d8cc6008a04c50307e8fbde6d6)
1*fa212bfbSJulian Elischer#!/bin/sh
2*fa212bfbSJulian Elischer#
3*fa212bfbSJulian Elischer# Copyright (c) 2010, Yavuz Gokirmak
4*fa212bfbSJulian Elischer#
5*fa212bfbSJulian Elischer# All rights reserved.
6*fa212bfbSJulian Elischer#
7*fa212bfbSJulian Elischer# This source code may be used, modified, copied, distributed, and
8*fa212bfbSJulian Elischer# sold, in both source and binary form provided that the above
9*fa212bfbSJulian Elischer# copyright and these terms are retained, verbatim, as the first
10*fa212bfbSJulian Elischer# lines of this file.  Under no circumstances is the author
11*fa212bfbSJulian Elischer# responsible for the proper functioning of the software nor does
12*fa212bfbSJulian Elischer# the author assume any responsibility for damages incurred with
13*fa212bfbSJulian Elischer# its use.
14*fa212bfbSJulian Elischer#
15*fa212bfbSJulian Elischer# $FreeBSD$
16*fa212bfbSJulian Elischer
17*fa212bfbSJulian Elischer#
18*fa212bfbSJulian Elischer# This script adds virtual nodes to one of the physical interfaces
19*fa212bfbSJulian Elischer# visible on your local area network (LAN). Virtual nodes seems real
20*fa212bfbSJulian Elischer# to external observers.
21*fa212bfbSJulian Elischer# If traceroute is executed to one of virtual nodes, the IP
22*fa212bfbSJulian Elischer# address of the physical interface will not be seen in the output.
23*fa212bfbSJulian Elischer# Virtual nodes are generated via jails and network connections are
24*fa212bfbSJulian Elischer# established using ng_bridge(4) and ng_eiface(4) node types.
25*fa212bfbSJulian Elischer#
26*fa212bfbSJulian Elischer# To use this script:
27*fa212bfbSJulian Elischer#
28*fa212bfbSJulian Elischer# 0. Make your own copy of this example script.
29*fa212bfbSJulian Elischer#
30*fa212bfbSJulian Elischer# 1. Edit the definition of ${ETHER_INTF} as described below
31*fa212bfbSJulian Elischer#    to define your real interface connected to the LAN. Virtual nodes
32*fa212bfbSJulian Elischer#    will placed on the same physical network as this interface.
33*fa212bfbSJulian Elischer#
34*fa212bfbSJulian Elischer# 2. Edit the definition of ${TARGET_TOPOLOGY} to define your virtual
35*fa212bfbSJulian Elischer#    nodes. Virtual topology definition includes node names and their
36*fa212bfbSJulian Elischer#    IP address. Target top. sytax: ( node1|ip1/24 node2|ip2/24 ... )
37*fa212bfbSJulian Elischer#    Example 1: ( n1|122.122.122.12/24, n2|122.122.122.13/24 ...)
38*fa212bfbSJulian Elischer#    Example 2: ( n1|2001:b90::14a/125, n1|2001:b90::14b/125 ...)
39*fa212bfbSJulian Elischer#
40*fa212bfbSJulian Elischer# 3. Run this script with "start" as the command line argument.
41*fa212bfbSJulian Elischer#
42*fa212bfbSJulian Elischer# 4. Stop bridging by running this script with "stop" as the
43*fa212bfbSJulian Elischer#    command line argument.
44*fa212bfbSJulian Elischer#
45*fa212bfbSJulian Elischer# 5. This cript uses a template file in order to carry information
46*fa212bfbSJulian Elischer#    between start and stop calls.
47*fa212bfbSJulian Elischer#      In the start call, the netgraph interfaces and jails are created.
48*fa212bfbSJulian Elischer#      At the stop phase, all created objects should be removed.
49*fa212bfbSJulian Elischer#    DO NOT delete the temporary file between the start and stop phases.
50*fa212bfbSJulian Elischer#
51*fa212bfbSJulian Elischer# To add virtual nodes for multiple independent LANs, create multiple
52*fa212bfbSJulian Elischer# copies of this script with different variable definitions.
53*fa212bfbSJulian Elischer#
54*fa212bfbSJulian Elischer# Target Topology:
55*fa212bfbSJulian Elischer#
56*fa212bfbSJulian Elischer#
57*fa212bfbSJulian Elischer#                 +---------------+ +---------------+ +---------------+
58*fa212bfbSJulian Elischer#                 |  n0 (vimage)  | |  n1 (vimage)  | |  nk (vimage)  |
59*fa212bfbSJulian Elischer#                 |               | |               | |               |
60*fa212bfbSJulian Elischer#                 | +-----------+ | | +-----------+ | | +-----------+ |
61*fa212bfbSJulian Elischer#                 | |  ngeth0   | | | |  ngeth1   | | | |  ngethk   | |
62*fa212bfbSJulian Elischer#                 | |(ng_eiface)| | | |(ng_eiface)| | | |(ng_eiface)| |
63*fa212bfbSJulian Elischer#                 | +--+-----+--+ | | +--+-----+--+ | | +--+-----+--+ |
64*fa212bfbSJulian Elischer#                 |    |ether|    | |    |ether|    | |    |ether|    |
65*fa212bfbSJulian Elischer#                 |    +--X--+    | |    +--X--+    | |    +---X-+    |
66*fa212bfbSJulian Elischer#   +-----+       +--------\------+ +--------\------+ +-------/-------+
67*fa212bfbSJulian Elischer#   |upper|----\            \ip_addr          \ip_addr       /ip_addr
68*fa212bfbSJulian Elischer# +-+-----+--+  \            \                 \             \
69*fa212bfbSJulian Elischer# |   em0    |   \            +--------+        +-+           \
70*fa212bfbSJulian Elischer# |(ng_ether)|    +-----------+         \          \           \
71*fa212bfbSJulian Elischer# +-+-----+--+                 \         \          /           \
72*fa212bfbSJulian Elischer#   |lower|    +---------\      \         \        /            /
73*fa212bfbSJulian Elischer#   +--X--+   /        O--X--O O-X---O O---X-O O--X--O     O---X---O
74*fa212bfbSJulian Elischer#      \      |        |link0| |link1| |link2| |link3|     |linkk+2|
75*fa212bfbSJulian Elischer#       \     /      +-O-----O-O-----O-O-----O-O-----O-----O-------O-+
76*fa212bfbSJulian Elischer#        +---+       |                                               |
77*fa212bfbSJulian Elischer#                    |          bridge (ng_bridge)                   |
78*fa212bfbSJulian Elischer#                    +-----------------------------------------------+
79*fa212bfbSJulian Elischer#
80*fa212bfbSJulian Elischer#
81*fa212bfbSJulian Elischer
82*fa212bfbSJulian Elischer# Give the name of ethernet interface. Virtual nodes will be seen as
83*fa212bfbSJulian Elischer# local neighbours of this interface.
84*fa212bfbSJulian Elischer
85*fa212bfbSJulian ElischerETHER_INTF="em0"
86*fa212bfbSJulian Elischer
87*fa212bfbSJulian Elischer# List the names of virtual nodes and their IP addresses. Use ':'
88*fa212bfbSJulian Elischer# character to seperate node name from node IP address and netmask.
89*fa212bfbSJulian Elischer
90*fa212bfbSJulian ElischerTARGET_TOPOLOGY="c1|10.0.2.20/24 c2|10.0.2.21/24 c3|10.0.2.22/24"
91*fa212bfbSJulian Elischer
92*fa212bfbSJulian Elischer# MAC manifacturer prefix. This can be modified according to needs.
93*fa212bfbSJulian ElischerMAC_PREFIX="00:1d:92"
94*fa212bfbSJulian Elischer
95*fa212bfbSJulian Elischer# Temporary file is important for proper execution of script.
96*fa212bfbSJulian ElischerTEMP_FILE="/var/tmp/.virtual.lan.tmp"
97*fa212bfbSJulian Elischer
98*fa212bfbSJulian Elischer# Set root directory for jails to be created.
99*fa212bfbSJulian ElischerJAIL_PATH="/usr/jails/node"
100*fa212bfbSJulian Elischer
101*fa212bfbSJulian Elischer
102*fa212bfbSJulian Elischer####################################################################
103*fa212bfbSJulian Elischer####    Nothing below this point should need to be modified.    ####
104*fa212bfbSJulian Elischer####################################################################
105*fa212bfbSJulian Elischer
106*fa212bfbSJulian Elischer
107*fa212bfbSJulian Elischer# Start/restart routine.
108*fa212bfbSJulian Elischervirtual_lan_start() {
109*fa212bfbSJulian Elischer
110*fa212bfbSJulian Elischer	# Load netgraph KLD's as necessary.
111*fa212bfbSJulian Elischer
112*fa212bfbSJulian Elischer	for KLD in ng_ether ng_bridge ng_eiface; do
113*fa212bfbSJulian Elischer		if ! kldstat -v | grep -qw ${KLD}; then
114*fa212bfbSJulian Elischer			echo -n "Loading ${KLD}.ko... "
115*fa212bfbSJulian Elischer			kldload ${KLD} || exit 1
116*fa212bfbSJulian Elischer			echo "done"
117*fa212bfbSJulian Elischer		fi
118*fa212bfbSJulian Elischer	done
119*fa212bfbSJulian Elischer
120*fa212bfbSJulian Elischer	# Reset all interfaces and jails. If temporary file can not be found
121*fa212bfbSJulian Elischer	# script assumes that there is no previous configuration.
122*fa212bfbSJulian Elischer
123*fa212bfbSJulian Elischer	if [ ! -e ${TEMP_FILE} ]; then
124*fa212bfbSJulian Elischer		echo "No previous configuration(${TEMP_FILE}) found to clean-up."
125*fa212bfbSJulian Elischer	else
126*fa212bfbSJulian Elischer		echo -n "Cleaning previous configuration..."
127*fa212bfbSJulian Elischer		virtual_lan_stop
128*fa212bfbSJulian Elischer		echo "done"
129*fa212bfbSJulian Elischer	fi
130*fa212bfbSJulian Elischer
131*fa212bfbSJulian Elischer	# Create temporary file for usage. This file includes generated
132*fa212bfbSJulian Elischer	# interface names and jail names. All bridges, interfaces and jails
133*fa212bfbSJulian Elischer	# are written to file while created. In clean-up process written
134*fa212bfbSJulian Elischer	# objects are cleaned (i.e removed) from system.
135*fa212bfbSJulian Elischer
136*fa212bfbSJulian Elischer	if [ -e ${TEMP_FILE} ]; then
137*fa212bfbSJulian Elischer		touch ${TEMP_FILE}
138*fa212bfbSJulian Elischer	fi
139*fa212bfbSJulian Elischer
140*fa212bfbSJulian Elischer	echo -n "Verifying ethernet interface existence..."
141*fa212bfbSJulian Elischer	# Verify ethernet interface exist.
142*fa212bfbSJulian Elischer	if ! ngctl info ${ETHER_INTF}: >/dev/null 2>&1; then
143*fa212bfbSJulian Elischer		echo "Error: interface ${ETHER_INTF} does not exist"
144*fa212bfbSJulian Elischer		exit 1
145*fa212bfbSJulian Elischer	fi
146*fa212bfbSJulian Elischer	ifconfig ${ETHER_INTF} up || exit 1
147*fa212bfbSJulian Elischer	echo "done"
148*fa212bfbSJulian Elischer
149*fa212bfbSJulian Elischer	# Get current number of bridge interfaces in the system. This number
150*fa212bfbSJulian Elischer	# is used to create a name for new bridge.
151*fa212bfbSJulian Elischer	BRIDGE_COUNT=`ngctl l | grep bridge | wc -l | sed -e "s/ //g"`
152*fa212bfbSJulian Elischer	BRIDGE_NAME="bridge${BRIDGE_COUNT}"
153*fa212bfbSJulian Elischer
154*fa212bfbSJulian Elischer	# Create new ng_bridge(4) node and attach it to the ethernet interface.
155*fa212bfbSJulian Elischer	# Connect ng_ether:lower hook to bridge:link0 when creating bridge and
156*fa212bfbSJulian Elischer	# connect ng_ether:upper hook to bridge:link1 after bridge name is set.
157*fa212bfbSJulian Elischer
158*fa212bfbSJulian Elischer	echo "Creating bridge interface: ${BRIDGE_NAME}..."
159*fa212bfbSJulian Elischer	ngctl mkpeer ${ETHER_INTF}: bridge lower link0 || exit 1
160*fa212bfbSJulian Elischer	ngctl name ${ETHER_INTF}:lower ${BRIDGE_NAME} || exit 1
161*fa212bfbSJulian Elischer	ngctl connect ${ETHER_INTF}: ${BRIDGE_NAME}: upper link1 || exit 1
162*fa212bfbSJulian Elischer	echo "Bridge ${BRIDGE_NAME} is created and ${ETHER_INTF} is connected."
163*fa212bfbSJulian Elischer
164*fa212bfbSJulian Elischer	# In the above code block two hooks are connected to bridge interface,
165*fa212bfbSJulian Elischer	# therefore LINKNUM is set to 2 indicating total number of connected
166*fa212bfbSJulian Elischer	# hooks on the bridge interface.
167*fa212bfbSJulian Elischer	LINKNUM=2
168*fa212bfbSJulian Elischer
169*fa212bfbSJulian Elischer	# Write name of the bridge to temp file. Clean-up procedure will use
170*fa212bfbSJulian Elischer	# this name to shutdown bridge interface.
171*fa212bfbSJulian Elischer	echo "bridge ${BRIDGE_NAME}" > ${TEMP_FILE}
172*fa212bfbSJulian Elischer
173*fa212bfbSJulian Elischer
174*fa212bfbSJulian Elischer	# Attach other interfaces as well.
175*fa212bfbSJulian Elischer	for NODE in ${TARGET_TOPOLOGY}; do
176*fa212bfbSJulian Elischer
177*fa212bfbSJulian Elischer		# Virtual nodes are defined in TARGET_TOPOLOGY variable. They
178*fa212bfbSJulian Elischer		# have the form of 'nodeName|IPaddr'. Below two lines split
179*fa212bfbSJulian Elischer		# node definition to get node name and node IP.
180*fa212bfbSJulian Elischer
181*fa212bfbSJulian Elischer		NODE_NAME=`echo ${NODE} | awk -F"|" '{print $1}'`
182*fa212bfbSJulian Elischer		NODE_IP=`echo ${NODE} | awk -F"|" '{print $2}'`
183*fa212bfbSJulian Elischer
184*fa212bfbSJulian Elischer		# Create virtual node (jail) with given name and using
185*fa212bfbSJulian Elischer		# JAIL_PATH as root directory for jail.
186*fa212bfbSJulian Elischer
187*fa212bfbSJulian Elischer		echo -n "Creating virtual node (jail) ${NODE_NAME}..."
188*fa212bfbSJulian Elischer		jail -c vnet name=${NODE_NAME} host.hostname=${NODE_NAME} \
189*fa212bfbSJulian Elischer			path=${JAIL_PATH} persist
190*fa212bfbSJulian Elischer		echo "done"
191*fa212bfbSJulian Elischer
192*fa212bfbSJulian Elischer		# Write name of the jail to temp file. Clean-up procedure will
193*fa212bfbSJulian Elischer		# use this name to remove jail.
194*fa212bfbSJulian Elischer
195*fa212bfbSJulian Elischer		echo "node ${NODE_NAME}" >> ${TEMP_FILE}
196*fa212bfbSJulian Elischer
197*fa212bfbSJulian Elischer		# Create a ng_eiface object for virtual node. ng_eiface
198*fa212bfbSJulian Elischer		# object has a hook that can be connected to one of bridge
199*fa212bfbSJulian Elischer		# links. After creating interface get its automatically
200*fa212bfbSJulian Elischer		# generated name for further usage.
201*fa212bfbSJulian Elischer
202*fa212bfbSJulian Elischer		echo "Creating eiface interface for virtual node ${NODE_NAME}."
203*fa212bfbSJulian Elischer		ngctl mkpeer eiface ether ether
204*fa212bfbSJulian Elischer		EIFACE=`ngctl l | grep ngeth | tail -n 1| awk '{print $2}'`
205*fa212bfbSJulian Elischer		echo "Interface ${EIFACE} is created."
206*fa212bfbSJulian Elischer
207*fa212bfbSJulian Elischer		# Write name of the interface to temp file. Clean-up procedure
208*fa212bfbSJulian Elischer		# will use this name to shutdown interface.
209*fa212bfbSJulian Elischer
210*fa212bfbSJulian Elischer		echo "interface ${EIFACE}" >> ${TEMP_FILE}
211*fa212bfbSJulian Elischer
212*fa212bfbSJulian Elischer		# Move virtual interface to virtual node. Note that Interface
213*fa212bfbSJulian Elischer		# name will not be changed at the end of this movement. Moved
214*fa212bfbSJulian Elischer		# interface can be seen at the output of ifconfig command in
215*fa212bfbSJulian Elischer		# jail: 'jexec jailname ifconfig'
216*fa212bfbSJulian Elischer
217*fa212bfbSJulian Elischer		echo "Moving ${EIFACE} to ${NODE_NAME}"
218*fa212bfbSJulian Elischer		ifconfig ${EIFACE} vnet ${NODE_NAME}
219*fa212bfbSJulian Elischer
220*fa212bfbSJulian Elischer		# Make lo0 interface localhost.
221*fa212bfbSJulian Elischer		jexec ${NODE_NAME} ifconfig lo0 localhost
222*fa212bfbSJulian Elischer
223*fa212bfbSJulian Elischer		# Generate a random mac address for virtual interface. First
224*fa212bfbSJulian Elischer		# three octets can be changed by user. Last three octets are
225*fa212bfbSJulian Elischer		# generated randomly.
226*fa212bfbSJulian Elischer		M4=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
227*fa212bfbSJulian Elischer				awk '{ print $1 % 256 }'`
228*fa212bfbSJulian Elischer		M5=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
229*fa212bfbSJulian Elischer				awk '{ print $1 % 256 }'`
230*fa212bfbSJulian Elischer		M6=`od -An -N2 -i /dev/random | sed -e 's/ //g' | \
231*fa212bfbSJulian Elischer				awk '{ print $1 % 256 }'`
232*fa212bfbSJulian Elischer
233*fa212bfbSJulian Elischer		MAC=`printf ${MAC_PREFIX}:%02x:%02x:%02x ${M4} ${M5} ${M6}`
234*fa212bfbSJulian Elischer
235*fa212bfbSJulian Elischer		# Set the link address (mac address) of virtual interface in
236*fa212bfbSJulian Elischer		# virtual node to randomly generated MAC.
237*fa212bfbSJulian Elischer		echo "Setting MAC address of ${EIFACE} to '${MAC}'"
238*fa212bfbSJulian Elischer		jexec ${NODE_NAME} ifconfig ${EIFACE} link $MAC
239*fa212bfbSJulian Elischer
240*fa212bfbSJulian Elischer		# Either IPv4 or IPv6 can be used in this script. Ifconfig
241*fa212bfbSJulian Elischer		# IP setting syntax differs slightly for two IP versions.
242*fa212bfbSJulian Elischer		# For version 4 'inet' keyword is used whereas for version 6
243*fa212bfbSJulian Elischer		# 'inet6' is used. Below line tries to decide which IP version
244*fa212bfbSJulian Elischer		# is given and sets IPVER to 'inet' or 'inet6'.
245*fa212bfbSJulian Elischer
246*fa212bfbSJulian Elischer		IPVER=`echo ${NODE_IP} | awk -F"." '{ split($4,last,"/"); \
247*fa212bfbSJulian Elischer			if( NF==4 && $1>0 && $1<256 && $2<256 && $3<256 && \
248*fa212bfbSJulian Elischer			last[1]<256) print "inet"; else print "inet6"}'`
249*fa212bfbSJulian Elischer
250*fa212bfbSJulian Elischer		# Set IP address of virtual interface in virtual node.
251*fa212bfbSJulian Elischer		echo "Setting IP address of ${EIFACE} to '${NODE_IP}'"
252*fa212bfbSJulian Elischer		jexec ${NODE_NAME} ifconfig ${EIFACE} ${IPVER} ${NODE_IP}
253*fa212bfbSJulian Elischer
254*fa212bfbSJulian Elischer		# Connect virtual interface to bridge interface. Syntax is :
255*fa212bfbSJulian Elischer		# ngctl connect INTERFACE: BRIDGE: INTERFACE_HOOK EMPTY_LINK.
256*fa212bfbSJulian Elischer		# Interface has one hook named 'ether' and below line connects
257*fa212bfbSJulian Elischer		# ether hook to bridge's first unconnected link.
258*fa212bfbSJulian Elischer
259*fa212bfbSJulian Elischer		echo -n "Connecting ${EIFACE}:ether to ${BRIDGE_NAME}:link${LINKNUM}..."
260*fa212bfbSJulian Elischer		ngctl connect ${EIFACE}: ${BRIDGE_NAME}: ether link${LINKNUM} \
261*fa212bfbSJulian Elischer			|| exit 1
262*fa212bfbSJulian Elischer		echo "done"
263*fa212bfbSJulian Elischer
264*fa212bfbSJulian Elischer		# Now, bridge has one more connected link thus link count is
265*fa212bfbSJulian Elischer		# incremented.
266*fa212bfbSJulian Elischer		LINKNUM=`expr ${LINKNUM} + 1`
267*fa212bfbSJulian Elischer	done
268*fa212bfbSJulian Elischer	echo "Virtual LAN established succesfully!"
269*fa212bfbSJulian Elischer
270*fa212bfbSJulian Elischer}
271*fa212bfbSJulian Elischer
272*fa212bfbSJulian Elischer# Stop routine.
273*fa212bfbSJulian Elischervirtual_lan_stop() {
274*fa212bfbSJulian Elischer
275*fa212bfbSJulian Elischer	if [ ! -e ${TEMP_FILE} ]; then
276*fa212bfbSJulian Elischer		echo "Nothing to stop! ${TEMP_FILE}: temp file not found"
277*fa212bfbSJulian Elischer	else
278*fa212bfbSJulian Elischer
279*fa212bfbSJulian Elischer		echo -n "Shutdown bridge interface.."
280*fa212bfbSJulian Elischer		OBJECTS=`cat ${TEMP_FILE} | grep bridge | awk '{print $2}'`
281*fa212bfbSJulian Elischer		for BRIDGE in ${OBJECTS}; do
282*fa212bfbSJulian Elischer			ngctl shutdown ${BRIDGE}: >/dev/null 2>&1
283*fa212bfbSJulian Elischer		done
284*fa212bfbSJulian Elischer		echo "done"
285*fa212bfbSJulian Elischer
286*fa212bfbSJulian Elischer		echo -n "Shutdown all eiface interfaces..."
287*fa212bfbSJulian Elischer		OBJECTS=`cat ${TEMP_FILE} | grep interface | awk '{print $2}'`
288*fa212bfbSJulian Elischer		for INTERFACE in ${OBJECTS}; do
289*fa212bfbSJulian Elischer			ngctl shutdown ${INTERFACE}: >/dev/null 2>&1
290*fa212bfbSJulian Elischer		done
291*fa212bfbSJulian Elischer		echo "done"
292*fa212bfbSJulian Elischer
293*fa212bfbSJulian Elischer		echo -n "Removing all jails..."
294*fa212bfbSJulian Elischer		OBJECTS=`cat ${TEMP_FILE} | grep node | awk '{print $2}'`
295*fa212bfbSJulian Elischer		for NODE in ${OBJECTS}; do
296*fa212bfbSJulian Elischer			jail -r ${NODE}
297*fa212bfbSJulian Elischer		done
298*fa212bfbSJulian Elischer		echo "done"
299*fa212bfbSJulian Elischer
300*fa212bfbSJulian Elischer		echo "Removing tempfile ${TEMP_FILE}"
301*fa212bfbSJulian Elischer		rm ${TEMP_FILE}
302*fa212bfbSJulian Elischer	fi
303*fa212bfbSJulian Elischer	echo "Virtual LAN objects removed succesfully!"
304*fa212bfbSJulian Elischer
305*fa212bfbSJulian Elischer}
306*fa212bfbSJulian Elischer
307*fa212bfbSJulian Elischervirtual_lan_usage() {
308*fa212bfbSJulian Elischer	echo "usage: $0 start [target_topology]"
309*fa212bfbSJulian Elischer	echo "     : $0 [ stop | help ]"
310*fa212bfbSJulian Elischer}
311*fa212bfbSJulian Elischer
312*fa212bfbSJulian Elischer
313*fa212bfbSJulian Elischer# Main entry point.
314*fa212bfbSJulian Elischer
315*fa212bfbSJulian Elischercase $# in
316*fa212bfbSJulian Elischer	1)
317*fa212bfbSJulian Elischer		case $1 in
318*fa212bfbSJulian Elischer                        start)
319*fa212bfbSJulian Elischer                                echo -n "Creating default target topology:"
320*fa212bfbSJulian Elischer				echo " ${TARGET_TOPOLOGY}"
321*fa212bfbSJulian Elischer                                virtual_lan_start
322*fa212bfbSJulian Elischer                                ;;
323*fa212bfbSJulian Elischer                        stop)
324*fa212bfbSJulian Elischer
325*fa212bfbSJulian Elischer				if [ ! -e ${TEMP_FILE} ]; then
326*fa212bfbSJulian Elischer					echo -n "Noting to stop! ${TEMP_FILE}:"
327*fa212bfbSJulian Elischer					echo " temp file not found"
328*fa212bfbSJulian Elischer				else
329*fa212bfbSJulian Elischer					virtual_lan_stop
330*fa212bfbSJulian Elischer				fi
331*fa212bfbSJulian Elischer                                ;;
332*fa212bfbSJulian Elischer                        help)
333*fa212bfbSJulian Elischer                                virtual_lan_usage
334*fa212bfbSJulian Elischer				exit 1
335*fa212bfbSJulian Elischer                                ;;
336*fa212bfbSJulian Elischer                        *)
337*fa212bfbSJulian Elischer                                virtual_lan_usage
338*fa212bfbSJulian Elischer                                exit 1
339*fa212bfbSJulian Elischer
340*fa212bfbSJulian Elischer                esac
341*fa212bfbSJulian Elischer		;;
342*fa212bfbSJulian Elischer	2)
343*fa212bfbSJulian Elischer	        case $1 in
344*fa212bfbSJulian Elischer			start)
345*fa212bfbSJulian Elischer                        	TARGET_TOPOLOGY=$2
346*fa212bfbSJulian Elischer                                echo -n "Creating target topology:"
347*fa212bfbSJulian Elischer				echo "${TARGET_TOPOLOGY}"
348*fa212bfbSJulian Elischer                                virtual_lan_start
349*fa212bfbSJulian Elischer                                ;;
350*fa212bfbSJulian Elischer                        *)
351*fa212bfbSJulian Elischer                        	virtual_lan_usage
352*fa212bfbSJulian Elischer                                exit 1
353*fa212bfbSJulian Elischer                esac
354*fa212bfbSJulian Elischer		;;
355*fa212bfbSJulian Elischer
356*fa212bfbSJulian Elischer	*)
357*fa212bfbSJulian Elischer                virtual_lan_usage
358*fa212bfbSJulian Elischer                exit 1
359*fa212bfbSJulian Elischeresac
360*fa212bfbSJulian Elischer
361