router = self.addHost(name, cls=Router, quaggaConfFile=quaggaConf,
zebraConfFile=zebraConf, intfDict=intfs)
host = self.addHost('h%s' % i, cls=SdnIpHost,
ip='192.168.%s.1/24' % i,
route='192.168.%s.254' % i)
class SdnIpHost(Host):
def __init__(self, name, ip, route, *args, **kwargs):
Host.__init__(self, name, ip=ip, *args, **kwargs)
self.route = route
def config(self, **kwargs):
Host.config(self, **kwargs)
debug("configuring route %s" % self.route)
self.cmd('ip route add default via %s' % self.route)
class Router(Host):
def __init__(self, name, quaggaConfFile, zebraConfFile, intfDict, *args, **kwargs):
Host.__init__(self, name, *args, **kwargs)
self.quaggaConfFile = quaggaConfFile
self.zebraConfFile = zebraConfFile
self.intfDict = intfDict
def config(self, **kwargs):
Host.config(self, **kwargs)
self.cmd('sysctl net.ipv4.ip_forward=1')
for intf, attrs in self.intfDict.items():
self.cmd('ip addr flush dev %s' % intf)
if 'mac' in attrs:
self.cmd('ip link set %s down' % intf)
self.cmd('ip link set %s address %s' % (intf, attrs['mac']))
self.cmd('ip link set %s up ' % intf)
for addr in attrs['ipAddrs']:
self.cmd('ip addr add %s dev %s' % (addr, intf))
self.cmd('zebra -d -f %s -z %s/zebra%s.api -i %s/zebra%s.pid' % (self.zebraConfFile, QUAGGA_RUN_DIR, self.name, QUAGGA_RUN_DIR, self.name))
self.cmd('bgpd -d -f %s -z %s/zebra%s.api -i %s/bgpd%s.pid' % (self.quaggaConfFile, QUAGGA_RUN_DIR, self.name, QUAGGA_RUN_DIR, self.name))
def terminate(self):
self.cmd("ps ax | egrep 'bgpd%s.pid|zebra%s.pid' | awk '{print $1}' | xargs kill" % (self.name, self.name))
Host.terminate(self)
mininet> dump
<Router bgp: bgp-eth0:10.0.0.1,bgp-eth1:None pid=57128>
<SdnIpHost h1: h1-eth0:192.168.1.1 pid=57133>
<SdnIpHost h2: h2-eth0:192.168.2.1 pid=57135>
<SdnIpHost h3: h3-eth0:192.168.3.1 pid=57137>
<SdnIpHost h4: h4-eth0:192.168.4.1 pid=57139>
<Router r1: r1-eth0:10.0.0.6,r1-eth1:None pid=57141>
<Router r2: r2-eth0:10.0.0.7,r2-eth1:None pid=57143>
<Router r3: r3-eth0:10.0.0.8,r3-eth1:None pid=57145>
<Router r4: r4-eth0:10.0.0.9,r4-eth1:None pid=57147>
<Host root: root-eth0:10.10.10.2 pid=57151>
<Host sdnh1: sdnh1-eth0:192.168.0.1 pid=57153>
<Host sdnh2: sdnh2-eth0:192.168.0.2 pid=57155>
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None,s1-eth3:None pid=57160>
<OVSSwitch s2: lo:127.0.0.1,s2-eth1:None,s2-eth2:None,s2-eth3:None pid=57163>
<OVSSwitch s3: lo:127.0.0.1,s3-eth1:None,s3-eth2:None,s3-eth3:None,s3-eth4:None,s3-eth5:None pid=57166>
<OVSSwitch s4: lo:127.0.0.1,s4-eth1:None,s4-eth2:None,s4-eth3:None,s4-eth4:None pid=57169>
<OVSSwitch s5: lo:127.0.0.1,s5-eth1:None,s5-eth2:None,s5-eth3:None pid=57172>
<OVSSwitch s6: lo:127.0.0.1,s6-eth1:None,s6-eth2:None,s6-eth3:None pid=57175>
<RemoteController c0: 127.0.0.1:6653 pid=57122>
mininet> bgp ip a
*** errRun: ['stty', '-icanon', 'min', '1']
01: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bgp-eth0@if424: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:00:00:00:00:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.1.101/24 scope global bgp-eth0
valid_lft forever preferred_lft forever
inet 10.0.2.101/24 scope global bgp-eth0
valid_lft forever preferred_lft forever
inet 10.0.3.101/24 scope global bgp-eth0
valid_lft forever preferred_lft forever
inet 10.0.4.101/24 scope global bgp-eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:ff:fe00:1/64 scope link
valid_lft forever preferred_lft forever
3: bgp-eth1@if429: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 8a:0c:5b:bc:87:35 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.10.10.1/24 scope global bgp-eth1
valid_lft forever preferred_lft forever
mininet> bgp ping 10.10.10.1
*** errRun: ['stty', '-icanon', 'min', '1']
0PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=0.014 ms
^CsendInt: writing chr(3)
--- 10.10.10.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1035ms
rtt min/avg/max/mdev = 0.014/0.035/0.056/0.021 ms
mininet> bgp ping 10.10.10.2
*** errRun: ['stty', '-icanon', 'min', '1']
0PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data.
64 bytes from 10.10.10.2: icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from 10.10.10.2: icmp_seq=2 ttl=64 time=0.013 ms
64 bytes from 10.10.10.2: icmp_seq=3 ttl=64 time=0.012 ms
^CsendInt: writing chr(3)
--- 10.10.10.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2104ms
rtt min/avg/max/mdev = 0.012/0.026/0.055/0.020 ms
mininet> sdnh1 ping sdnh2
_popen ['mnexec', '-da', '57155', 'ifconfig', 'sdnh2-eth0'] 62659*** errRun: ['stty', '-icanon', 'min', '1']
0PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
From 192.168.0.1 icmp_seq=1 Destination Host Unreachable
From 192.168.0.1 icmp_seq=2 Destination Host Unreachable
From 192.168.0.1 icmp_seq=3 Destination Host Unreachable
^CsendInt: writing chr(3)
--- 192.168.0.2 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4141ms
pipe 4
mininet> bgp netstat -lpn
*** errRun: ['stty', '-icanon', 'min', '1']
0Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
mininet> bgp ls
*** errRun: ['stty', '-icanon', 'min', '1']
0configs quagga2.conf quagga4.conf quagga-test1.py
quagga1.conf quagga3.conf quagga-sdn.conf zebra.conf
mininet> bgp ps -elf | grep zebra
*** errRun: ['stty', '-icanon', 'min', '1']
01 S quagga 36047 1 0 80 0 - 418 do_sel 03:48 ? 00:00:00 /usr/sbin/zebra -d -A 127.0.0.1 -f /etc/quagga/zebra.conf
0 S root 63958 57128 0 80 0 - 1730 pipe_w 11:31 pts/4 00:00:00 grep zebra
mininet>
mininet> r1 telnet localhost 2605
*** errRun: ['stty', '-icanon', 'min', '1']
0Trying ::1...
Connected to localhost.
Escape character is '^]'.
Hello, this is Quagga (version 0.99.22.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password: sdnip
mininet> r4 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
246: r4-eth1@if245: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 86:06:3d:2c:d0:8e brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet 192.168.4.254/24 scope global r4-eth1
valid_lft forever preferred_lft forever
248: r4-eth0@if247: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:00:00:00:04:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.4.1/24 scope global r4-eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:ff:fe00:401/64 scope link
valid_lft forever preferred_lft forever
mininet> r4 netstat -tpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2605 0.0.0.0:* LISTEN 20647/bgpd
tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 20647/bgpd
tcp 0 0 0.0.0.0:2601 0.0.0.0:* LISTEN 20645/zebra
tcp 0 1 10.0.4.1:46276 10.0.4.101:179 SYN_SENT 20647/bgpd
tcp6 0 0 :::2605 :::* LISTEN 20647/bgpd
tcp6 0 0 :::179 :::* LISTEN 20647/bgpd
tcp6 0 0 :::2601 :::* LISTEN 20645/zebra
mininet> r4 telnet localhost 2601
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Hello, this is Quagga (version 1.2.4).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password: sdnip
zebra> sshhoo^^
% Command incomplete.
zebra> sshh
% Command incomplete.
zebra>
mininet> r4 vtysh -c "show ip route"
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, P - PIM, A - Babel, N - NHRP,
> - selected route, * - FIB route
C>* 10.0.4.0/24 is directly connected, r4-eth0
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.4.0/24 is directly connected, r4-eth1
mininet> r4 vtysh -c "show run"
Building configuration...
Current configuration:
!
hostname zebra
log stdout
hostname r4
!
password sdnip
!
interface lo
!
interface r4-eth0
!
interface r4-eth1
!
router bgp 65004
bgp router-id 10.0.4.1
timers bgp 3 9
neighbor 10.0.4.101 remote-as 65000
neighbor 10.0.4.101 ebgp-multihop 255
neighbor 10.0.4.101 advertisement-interval 5
neighbor 10.0.4.101 timers connect 5
!
address-family ipv6
exit-address-family
exit
!
ip forwarding
!
line vty
!
end
mininet>