#!/bin/sh
#
# Hint: In order to have a dummy3 interface available, you have to do a 
# 'insmod -o dummy3'.
#

set -x
set -e

case "$1" in
  start)	
	insmod -o dummy0 dummy
	insmod -o dummy1 dummy
	insmod -o dummy2 dummy
	insmod -o dummy3 dummy

	# bridge "brx" for the hosts app109,A,B,C
	brctl addbr 	brx
	brctl setfd		brx 1
	brctl sethello  brx 1
	brctl stp 		brx off
	ip link set brx up
	# app109, the bridge owner
	ip link set dummy0 up
	brctl addif brx dummy0
	ip addr add 172.16.42.254/24 dev brx
	# host uml1
	tunctl -u ch -t umlx1
	ip link set umlx1 up
	brctl addif brx umlx1
	# host uml2
	tunctl -u ch -t umlx2
	ip link set umlx2 up
	brctl addif brx umlx2
	# host uml3
	tunctl -u ch -t umlx3
	ip link set umlx3 up
	brctl addif brx umlx3

 	## Bridge A (uml1,uml2)
 	brctl addbr 	bra
 	brctl setfd 	bra 1
 	brctl sethello 	bra 1
 	brctl stp 		bra off
	ip link set 	bra up
	# a.app109
	ip link set 		dummy1 up
	brctl addif 	bra	dummy1
	ip add add 10.0.1.254/24 dev bra
	# a.uml1
	tunctl -u ch -t 	umla1 
	ip link set 		umla1 up
	brctl addif 	bra umla1
	# a.uml2
	tunctl -u ch -t 	umla2 
	ip link set 		umla2 up
	brctl addif 	bra umla2

 	## Bridge B (uml2,uml3)
 	brctl addbr 	brb
 	brctl setfd 	brb 1
 	brctl sethello 	brb 1
 	brctl stp 		brb off
	ip link set 	brb up
	# b.app109
	ip link set     	dummy2 up
	brctl addif 	brb dummy2
	ip add add 10.0.2.254/24 dev brb
	# b.uml2
	tunctl -u ch -t 	umlb2
	ip link set     	umlb2 up
	brctl addif 	brb umlb2
	# b.uml3
	tunctl -u ch -t 	umlb3
	ip link set		    umlb3 up
	brctl addif 	brb umlb3

 	## Bridge C (uml3,uml1)
 	brctl addbr 	brc
 	brctl setfd 	brc 1
 	brctl sethello 	brc 1
 	brctl stp 		brc off
	ip link set 	brc up
	# c.app109
	ip link set     	dummy3 up
	brctl addif 	brc dummy3
	ip add add 10.0.3.254/24 dev brc
	# c.uml1
	tunctl -u ch -t 	umlc1
	ip link set		    umlc1 up
	brctl addif 	brc umlc1
	# c.uml3
	tunctl -u ch -t 	umlc3
	ip link set     	umlc3 up
	brctl addif 	brc umlc3


	echo "1" > /proc/sys/net/ipv4/ip_forward
	;;

  stop)
  	echo "Sorry, not yet implemented!"; exit 1;

  	devs=`ip link show |cut -d' ' -f2 |cut -d: -f1 |egrep -v '^(|lo|eth[[:digit:]]+)$'`;
	for i in $devs; do
		echo $i
		ip link set $i down
	done
	
	for i in bra brb brc brx; do
		for ii in 0 1 2 3; do
		 	brctl delif $i dummy$ii
			brctl delif $i umla$ii
			brctl delif $i umlb$ii
			brctl delif $i umlc$ii
			brctl delif $i umlx$ii
		done
		brctl delbr $i
	done
		
	;;

  show)	
  	brctl show; 
  	brctl showmacs brx; 
  	brctl showmacs bra; 
  	brctl showmacs brb; 
  	brctl showmacs brc; 
	;;

  *)	echo "$0 [start|stop|show]"
  		exit 1
  		;;
esac

