Merge "add the SDN-IP mininet testbed"
diff --git a/TestON/tests/SDNIPfunction/Dependency/SDNIPfuntionMininet.py b/TestON/tests/SDNIPfunction/Dependency/SDNIPfuntionMininet.py
new file mode 100755
index 0000000..5eba83e
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/SDNIPfuntionMininet.py
@@ -0,0 +1,357 @@
+#!/usr/bin/python
+
+"""
+Set up the SDN-IP function test topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+
+class SDNTopo( Topo ):
+ "SDN Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
+ sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
+ sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
+ sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
+ sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
+ sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
+ # add a switch for 100 quagga hosts
+ sw100 = self.addSwitch( 'sw100', dpid = '0000000000000100' )
+ swTestOn = self.addSwitch( 'swTestOn', dpid = '0000000000000102' )
+ # Note this switch isn't part of the SDN topology
+ # We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch( 'as6sw', dpid = '00000000000000a7' )
+
+ host1 = self.addHost( 'host1' )
+ host2 = self.addHost( 'host2' )
+ root1 = self.addHost( 'root1', inNamespace = False , ip = '0' )
+ root2 = self.addHost( 'root2', inNamespace = False, ip = '0' )
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace = False, ip = '0' )
+
+ # AS2 host
+ host3 = self.addHost( 'host3' )
+ as2host = self.addHost( 'as2host' )
+ # AS3 host
+ host4 = self.addHost( 'host4' )
+ as3host = self.addHost( 'as3host' )
+ # AS4 host
+ for i in range( numHost101, numHost200 + 1 ):
+ self.addHost( 'host%s' % ( i ) )
+
+ as4host = self.addHost( 'as4host' )
+ for i in range( numHost101, numHost200 + 1 ):
+ self.addHost( 'as4host%s' % ( i ) )
+ # AS6 host
+ as6rs = self.addHost( 'as6rs' )
+ host5 = self.addHost( 'host5' )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw1 )
+ self.addLink( host2, sw1 )
+ # Links to the multihomed AS
+ self.addLink( host3, sw3 )
+ self.addLink( host3, sw5 )
+ self.addLink( as2host, host3 )
+ # Single links to the remaining two ASes
+ self.addLink( host4, sw2 )
+ self.addLink( sw100, sw6 )
+ self.addLink( as3host, host4 )
+ for i in range( numHost101, numHost200 + 1 ):
+ self.addLink( 'host%s' % ( i ), sw100 )
+ for i in range( numHost101, numHost200 + 1 ):
+ self.addLink( 'host%s' % ( i ), 'as4host%s' % ( i ) )
+
+ # AS3-AS4 link
+ # self.addLink( host4, host5)
+ # Add new AS6 to its bridge
+ self.addLink( as6rs, as6sw )
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ # test the host behind the router(behind the router server)
+ '''
+ for i in range(1, 10):
+ host = self.addHost('as6host%d' % i)
+ self.addLink(host, as6router)
+ '''
+ # Internal Connection To Hosts
+ self.addLink( root1, host1 )
+ self.addLink( root2, host2 )
+
+ self.addLink( sw1, sw2 )
+ self.addLink( sw1, sw3 )
+ self.addLink( sw2, sw4 )
+ self.addLink( sw3, sw4 )
+ self.addLink( sw3, sw5 )
+ self.addLink( sw4, sw6 )
+ self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw4 )
+
+ self.addLink( swTestOn, rootTestOn )
+ self.addLink( swTestOn, host3 )
+ self.addLink( swTestOn, host4 )
+ self.addLink( swTestOn, host5 )
+ self.addLink( swTestOn, as2host )
+
+ for i in range( numHost101, numHost200 + 1 ):
+ self.addLink( swTestOn, 'host' + str( i ) )
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd():
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = \
+ '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
+ % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+ quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
+ % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = \
+ '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
+ % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+ quagga_cmd = \
+ '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
+ % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga():
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo = topo, controller = RemoteController )
+
+ host1, host2, host3, host4, host5 = \
+ net.get( 'host1', 'host2' , 'host3', 'host4', 'host5' )
+
+ # Adding 2nd, 3rd and 4th interface to host1 connected to sw1
+ # for another BGP peering
+ host1.setMAC( '00:00:00:00:00:01', 'host1-eth0' )
+ host1.cmd( 'ip addr add 192.168.20.101/24 dev host1-eth0' )
+ host1.cmd( 'ip addr add 192.168.30.101/24 dev host1-eth0' )
+ host1.cmd( 'ip addr add 192.168.40.101/24 dev host1-eth0' )
+ host1.cmd( 'ip addr add 192.168.60.101/24 dev host1-eth0' )
+
+ # Net has to be start after adding the above link
+ net.start()
+ for i in range( numHost101, numHost200 + 1 ):
+ host100 = net.get( 'host%s' % ( i ) )
+ host100.cmd( 'ifconfig host%s-eth0 192.168.40.%s up' % ( i, i - 100 ) )
+ host100.setIP( str( i ) + ".0.0.254", 8, str( host100 ) + "-eth1" )
+ host100.setMAC( '00:00:' + str( i - 101 ) + ':00:00:90', 'host'
+ + str( i ) + '-eth0' )
+ host100.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get( 'as6sw' )
+ as6sw.cmd( 'ovs-vsctl set-controller as6sw none' )
+ as6sw.cmd( 'ovs-vsctl set-fail-mode as6sw standalone' )
+
+
+ sw1, sw2, sw3, sw4, sw5, sw6 = \
+ net.get( 'sw1', 'sw2', 'sw3', 'sw4', 'sw5', 'sw6' )
+ sw1.cmd( 'ovs-vsctl set-controller sw1 tcp:10.128.4.52:6633' )
+ sw2.cmd( 'ovs-vsctl set-controller sw2 tcp:10.128.4.52:6633' )
+ sw3.cmd( 'ovs-vsctl set-controller sw3 tcp:10.128.4.52:6633' )
+ sw4.cmd( 'ovs-vsctl set-controller sw4 tcp:10.128.4.52:6633' )
+ sw5.cmd( 'ovs-vsctl set-controller sw5 tcp:10.128.4.52:6633' )
+ sw6.cmd( 'ovs-vsctl set-controller sw6 tcp:10.128.4.52:6633' )
+
+
+ # Set up sw100 as a learning
+ sw100 = net.get( 'sw100' )
+ sw100.cmd( 'ovs-vsctl set-controller sw100 none' )
+ sw100.cmd( 'ovs-vsctl set-fail-mode sw100 standalone' )
+
+ swTestOn = net.get( 'swTestOn' )
+ swTestOn.cmd( 'ovs-vsctl set-controller swTestOn none' )
+ swTestOn.cmd( 'ovs-vsctl set-fail-mode swTestOn standalone' )
+
+ host1.defaultIntf().setIP( '192.168.10.101/24' )
+
+ # Configure new host interfaces
+ host2.defaultIntf().setIP( '172.16.10.2/24' )
+ host2.defaultIntf().setMAC( '00:00:00:00:01:02' )
+
+ # Set up AS2
+ host3.setIP( '192.168.10.1', 24, 'host3-eth0' )
+ host3.setIP( '192.168.20.1', 24, 'host3-eth1' )
+ host3.setMAC( '00:00:00:00:02:01', 'host3-eth0' )
+ host3.setMAC( '00:00:00:00:02:02', 'host3-eth1' )
+ host3.setIP( '3.0.0.254', 8, 'host3-eth2' )
+ host3.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+
+ host3.setIP( '1.168.30.2', 24, 'host3-eth3' )
+ host3.cmd( 'sysctl net.ipv4.conf.all.arp_ignore=1' )
+ host3.cmd( 'sysctl net.ipv4.conf.all.arp_announce=1' )
+ as2host = net.get( 'as2host' )
+
+ for i in range( 0, 20 ):
+ as2host.cmd( 'sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' % i )
+ as2host.setIP( '1.168.30.100', 24, 'as2host-eth1' )
+
+ as2host.cmd( 'ip route add default via 3.0.0.254' )
+
+ # Set up AS3
+ host4.setIP( '192.168.30.1', 24, 'host4-eth0' )
+ host4.setMAC( '00:00:00:00:03:01', 'host4-eth0' )
+ host4.setIP( '4.0.0.254', 8, 'host4-eth1' )
+ host4.setMAC( '00:00:00:00:03:99', 'host4-eth1' )
+ host4.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+ as3host = net.get( 'as3host' )
+ for i in range( 0, 20 ):
+ as3host.cmd( 'sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' % i )
+ as3host.cmd( 'ip route add default via 4.0.0.254' )
+
+ # root space
+ host4.setIP( '1.168.30.3', 24, 'host4-eth2' )
+ host4.setMAC( '00:00:00:00:03:03', 'host4-eth2' )
+
+ # setup interface address for 100 quagga hosts
+ time.sleep( 10 )
+ for i in range( numHost101, numHost200 + 1 ):
+ as4host100 = net.get( 'as4host%s' % ( i ) )
+ as4host100.defaultIntf().setIP( str( i ) + '.0.0.1/24' )
+ as4host100.cmd( 'ip route add default via ' + str( i ) + '.0.0.254' )
+ for j in range( 0, 100 ):
+ as4host100.cmd( 'sudo ip addr add %d.0.%d.1/24 dev %s-eth0' \
+ % ( i, j, as4host100 ) )
+
+ # Set up AS6 - This has a router and a route server
+ as6rs, host5 = net.get( 'as6rs', 'host5' )
+ as6rs.setIP( '192.168.60.1', 24, 'as6rs-eth0' )
+ as6rs.setMAC( '00:00:00:00:06:01', 'as6rs-eth0' )
+ host5.setIP( '192.168.60.2', 24, 'host5-eth0' )
+ host5.setMAC( '00:00:00:00:06:02', 'host5-eth0' )
+ host5.setIP( '5.0.0.254', 8, 'host5-eth1' )
+ host5.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
+ host5.setIP( '1.168.30.5', 24, 'host5-eth2' )
+ host5.setMAC( '00:00:00:00:06:05', 'host5-eth2' )
+
+ as6host = net.get( 'as6host' )
+ as6host.defaultIntf().setIP( '5.0.0.1/24' )
+ as6host.cmd( 'ip route add default via 5.0.0.254' )
+ for i in range( 0, 10 ):
+ as6host.cmd( 'sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' % i )
+
+ # test the host in the as6
+ '''
+ for i in range(1, 10):
+ baseip = (i-1)*4
+ host = net.get('as6host%d' % i)
+ host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+ '''
+
+ # Start Quagga on border routers
+ startquagga( host3, 1, 'quagga1.conf' )
+ startquagga( host4, 2, 'quagga2.conf' )
+ for i in range( numHost101, numHost200 + 1 ):
+ host100 = net.get( 'host%d' % ( i ) )
+ startquaggahost5( host100, i )
+
+ startquagga( as6rs, 4, 'quagga-as6-rs.conf' )
+ startquagga( host5, 5, 'quagga-as6.conf' )
+
+ root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ host1.intf( 'host1-eth1' ).setIP( '1.1.1.1/24' )
+ root1.intf( 'root1-eth0' ).setIP( '1.1.1.2/24' )
+ host2.intf( 'host2-eth1' ).setIP( '1.1.2.1/24' )
+ root2.intf( 'root2-eth0' ).setIP( '1.1.2.2/24' )
+
+ rootTestOn.cmd( 'ip addr add 1.168.30.99/24 dev rootTestOn-eth0' )
+
+ stopsshd()
+ for i in range( numHost101, numHost200 + 1 ):
+ hostX = net.get( 'host%s' % ( i ) )
+ hostX.setIP( '1.168.30.' + str( i ), 24, str( "host" ) + str( i )
+ + "-eth2" )
+ startsshd( hostX )
+
+ startquagga( host1, 100, 'quagga-sdn.conf' )
+ hosts = [ host1, host2, host3, host4, host5, as2host ];
+ startsshds( hosts )
+ #
+ onos1 = '10.128.4.52'
+ forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1 )
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
+ -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1 ) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ '''
+ root1.cmd('ssh -N -o "PasswordAuthentication no" \
+ -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ '''
+ time.sleep( 3000000000 )
+ CLI( net )
+
+ # Close the ssh port forwarding
+ # quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ sdn1net()
diff --git a/TestON/tests/SDNIPfunction/Dependency/as4quaggas/quagga-config-gen.sh b/TestON/tests/SDNIPfunction/Dependency/as4quaggas/quagga-config-gen.sh
new file mode 100755
index 0000000..c984acb
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/as4quaggas/quagga-config-gen.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+for i in range(1, 101):
+ num= i + 100
+
+ v='quagga%d.conf' %num
+ f=open(v, 'w')
+
+ f.write('hostname bgpd\n')
+ f.write('password hello\n')
+ k=i + 65000
+ v='router bgp %d\n' % (k)
+ f.write(v)
+ v='bgp router-id 192.168.40.%d\n' %i
+ f.write(v)
+ v='neighbor 192.168.40.101 remote-as 64513\n'
+ f.write(v)
+ #print v
+
+ v='neighbor 192.168.40.101 ebgp-multihop\n'
+ f.write(v)
+ v='neighbor 192.168.40.101 update-source 192.168.40.%d\n' %i
+ f.write(v)
+ v='neighbor 192.168.40.101 timers connect 300\n'
+ f.write(v)
diff --git a/TestON/tests/SDNIPfunction/Dependency/quagga-as6-rs.conf b/TestON/tests/SDNIPfunction/Dependency/quagga-as6-rs.conf
new file mode 100644
index 0000000..12be0e9
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SDNIPfunction/Dependency/quagga-as6.conf b/TestON/tests/SDNIPfunction/Dependency/quagga-as6.conf
new file mode 100644
index 0000000..60d6a9e
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/quagga-as6.conf
@@ -0,0 +1,38 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SDNIPfunction/Dependency/quagga-sdn.conf b/TestON/tests/SDNIPfunction/Dependency/quagga-sdn.conf
new file mode 100644
index 0000000..dc4e7af
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/quagga-sdn.conf
@@ -0,0 +1,349 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+neighbor 192.168.40.1 remote-as 65001
+neighbor 192.168.40.1 ebgp-multihop
+neighbor 192.168.40.1 timers connect 10
+neighbor 192.168.40.2 remote-as 65002
+neighbor 192.168.40.2 ebgp-multihop
+neighbor 192.168.40.2 timers connect 10
+neighbor 192.168.40.3 remote-as 65003
+neighbor 192.168.40.3 ebgp-multihop
+neighbor 192.168.40.3 timers connect 10
+neighbor 192.168.40.4 remote-as 65004
+neighbor 192.168.40.4 ebgp-multihop
+neighbor 192.168.40.4 timers connect 10
+neighbor 192.168.40.5 remote-as 65005
+neighbor 192.168.40.5 ebgp-multihop
+neighbor 192.168.40.5 timers connect 10
+neighbor 192.168.40.6 remote-as 65006
+neighbor 192.168.40.6 ebgp-multihop
+neighbor 192.168.40.6 timers connect 10
+neighbor 192.168.40.7 remote-as 65007
+neighbor 192.168.40.7 ebgp-multihop
+neighbor 192.168.40.7 timers connect 10
+neighbor 192.168.40.8 remote-as 65008
+neighbor 192.168.40.8 ebgp-multihop
+neighbor 192.168.40.8 timers connect 10
+neighbor 192.168.40.9 remote-as 65009
+neighbor 192.168.40.9 ebgp-multihop
+neighbor 192.168.40.9 timers connect 10
+neighbor 192.168.40.10 remote-as 65010
+neighbor 192.168.40.10 ebgp-multihop
+neighbor 192.168.40.10 timers connect 10
+neighbor 192.168.40.11 remote-as 65011
+neighbor 192.168.40.11 ebgp-multihop
+neighbor 192.168.40.11 timers connect 10
+neighbor 192.168.40.12 remote-as 65012
+neighbor 192.168.40.12 ebgp-multihop
+neighbor 192.168.40.12 timers connect 10
+neighbor 192.168.40.13 remote-as 65013
+neighbor 192.168.40.13 ebgp-multihop
+neighbor 192.168.40.13 timers connect 10
+neighbor 192.168.40.14 remote-as 65014
+neighbor 192.168.40.14 ebgp-multihop
+neighbor 192.168.40.14 timers connect 10
+neighbor 192.168.40.15 remote-as 65015
+neighbor 192.168.40.15 ebgp-multihop
+neighbor 192.168.40.15 timers connect 10
+neighbor 192.168.40.16 remote-as 65016
+neighbor 192.168.40.16 ebgp-multihop
+neighbor 192.168.40.16 timers connect 10
+neighbor 192.168.40.17 remote-as 65017
+neighbor 192.168.40.17 ebgp-multihop
+neighbor 192.168.40.17 timers connect 10
+neighbor 192.168.40.18 remote-as 65018
+neighbor 192.168.40.18 ebgp-multihop
+neighbor 192.168.40.18 timers connect 10
+neighbor 192.168.40.19 remote-as 65019
+neighbor 192.168.40.19 ebgp-multihop
+neighbor 192.168.40.19 timers connect 10
+neighbor 192.168.40.20 remote-as 65020
+neighbor 192.168.40.20 ebgp-multihop
+neighbor 192.168.40.20 timers connect 10
+neighbor 192.168.40.21 remote-as 65021
+neighbor 192.168.40.21 ebgp-multihop
+neighbor 192.168.40.21 timers connect 10
+neighbor 192.168.40.22 remote-as 65022
+neighbor 192.168.40.22 ebgp-multihop
+neighbor 192.168.40.22 timers connect 10
+neighbor 192.168.40.23 remote-as 65023
+neighbor 192.168.40.23 ebgp-multihop
+neighbor 192.168.40.23 timers connect 10
+neighbor 192.168.40.24 remote-as 65024
+neighbor 192.168.40.24 ebgp-multihop
+neighbor 192.168.40.24 timers connect 10
+neighbor 192.168.40.25 remote-as 65025
+neighbor 192.168.40.25 ebgp-multihop
+neighbor 192.168.40.25 timers connect 10
+neighbor 192.168.40.26 remote-as 65026
+neighbor 192.168.40.26 ebgp-multihop
+neighbor 192.168.40.26 timers connect 10
+neighbor 192.168.40.27 remote-as 65027
+neighbor 192.168.40.27 ebgp-multihop
+neighbor 192.168.40.27 timers connect 10
+neighbor 192.168.40.28 remote-as 65028
+neighbor 192.168.40.28 ebgp-multihop
+neighbor 192.168.40.28 timers connect 10
+neighbor 192.168.40.29 remote-as 65029
+neighbor 192.168.40.29 ebgp-multihop
+neighbor 192.168.40.29 timers connect 10
+neighbor 192.168.40.30 remote-as 65030
+neighbor 192.168.40.30 ebgp-multihop
+neighbor 192.168.40.30 timers connect 10
+neighbor 192.168.40.31 remote-as 65031
+neighbor 192.168.40.31 ebgp-multihop
+neighbor 192.168.40.31 timers connect 10
+neighbor 192.168.40.32 remote-as 65032
+neighbor 192.168.40.32 ebgp-multihop
+neighbor 192.168.40.32 timers connect 10
+neighbor 192.168.40.33 remote-as 65033
+neighbor 192.168.40.33 ebgp-multihop
+neighbor 192.168.40.33 timers connect 10
+neighbor 192.168.40.34 remote-as 65034
+neighbor 192.168.40.34 ebgp-multihop
+neighbor 192.168.40.34 timers connect 10
+neighbor 192.168.40.35 remote-as 65035
+neighbor 192.168.40.35 ebgp-multihop
+neighbor 192.168.40.35 timers connect 10
+neighbor 192.168.40.36 remote-as 65036
+neighbor 192.168.40.36 ebgp-multihop
+neighbor 192.168.40.36 timers connect 10
+neighbor 192.168.40.37 remote-as 65037
+neighbor 192.168.40.37 ebgp-multihop
+neighbor 192.168.40.37 timers connect 10
+neighbor 192.168.40.38 remote-as 65038
+neighbor 192.168.40.38 ebgp-multihop
+neighbor 192.168.40.38 timers connect 10
+neighbor 192.168.40.39 remote-as 65039
+neighbor 192.168.40.39 ebgp-multihop
+neighbor 192.168.40.39 timers connect 10
+neighbor 192.168.40.40 remote-as 65040
+neighbor 192.168.40.40 ebgp-multihop
+neighbor 192.168.40.40 timers connect 10
+neighbor 192.168.40.41 remote-as 65041
+neighbor 192.168.40.41 ebgp-multihop
+neighbor 192.168.40.41 timers connect 10
+neighbor 192.168.40.42 remote-as 65042
+neighbor 192.168.40.42 ebgp-multihop
+neighbor 192.168.40.42 timers connect 10
+neighbor 192.168.40.43 remote-as 65043
+neighbor 192.168.40.43 ebgp-multihop
+neighbor 192.168.40.43 timers connect 10
+neighbor 192.168.40.44 remote-as 65044
+neighbor 192.168.40.44 ebgp-multihop
+neighbor 192.168.40.44 timers connect 10
+neighbor 192.168.40.45 remote-as 65045
+neighbor 192.168.40.45 ebgp-multihop
+neighbor 192.168.40.45 timers connect 10
+neighbor 192.168.40.46 remote-as 65046
+neighbor 192.168.40.46 ebgp-multihop
+neighbor 192.168.40.46 timers connect 10
+neighbor 192.168.40.47 remote-as 65047
+neighbor 192.168.40.47 ebgp-multihop
+neighbor 192.168.40.47 timers connect 10
+neighbor 192.168.40.48 remote-as 65048
+neighbor 192.168.40.48 ebgp-multihop
+neighbor 192.168.40.48 timers connect 10
+neighbor 192.168.40.49 remote-as 65049
+neighbor 192.168.40.49 ebgp-multihop
+neighbor 192.168.40.49 timers connect 10
+neighbor 192.168.40.50 remote-as 65050
+neighbor 192.168.40.50 ebgp-multihop
+neighbor 192.168.40.50 timers connect 10
+neighbor 192.168.40.51 remote-as 65051
+neighbor 192.168.40.51 ebgp-multihop
+neighbor 192.168.40.51 timers connect 10
+neighbor 192.168.40.52 remote-as 65052
+neighbor 192.168.40.52 ebgp-multihop
+neighbor 192.168.40.52 timers connect 10
+neighbor 192.168.40.53 remote-as 65053
+neighbor 192.168.40.53 ebgp-multihop
+neighbor 192.168.40.53 timers connect 10
+neighbor 192.168.40.54 remote-as 65054
+neighbor 192.168.40.54 ebgp-multihop
+neighbor 192.168.40.54 timers connect 10
+neighbor 192.168.40.55 remote-as 65055
+neighbor 192.168.40.55 ebgp-multihop
+neighbor 192.168.40.55 timers connect 10
+neighbor 192.168.40.56 remote-as 65056
+neighbor 192.168.40.56 ebgp-multihop
+neighbor 192.168.40.56 timers connect 10
+neighbor 192.168.40.57 remote-as 65057
+neighbor 192.168.40.57 ebgp-multihop
+neighbor 192.168.40.57 timers connect 10
+neighbor 192.168.40.58 remote-as 65058
+neighbor 192.168.40.58 ebgp-multihop
+neighbor 192.168.40.58 timers connect 10
+neighbor 192.168.40.59 remote-as 65059
+neighbor 192.168.40.59 ebgp-multihop
+neighbor 192.168.40.59 timers connect 10
+neighbor 192.168.40.60 remote-as 65060
+neighbor 192.168.40.60 ebgp-multihop
+neighbor 192.168.40.60 timers connect 10
+neighbor 192.168.40.61 remote-as 65061
+neighbor 192.168.40.61 ebgp-multihop
+neighbor 192.168.40.61 timers connect 10
+neighbor 192.168.40.62 remote-as 65062
+neighbor 192.168.40.62 ebgp-multihop
+neighbor 192.168.40.62 timers connect 10
+neighbor 192.168.40.63 remote-as 65063
+neighbor 192.168.40.63 ebgp-multihop
+neighbor 192.168.40.63 timers connect 10
+neighbor 192.168.40.64 remote-as 65064
+neighbor 192.168.40.64 ebgp-multihop
+neighbor 192.168.40.64 timers connect 10
+neighbor 192.168.40.65 remote-as 65065
+neighbor 192.168.40.65 ebgp-multihop
+neighbor 192.168.40.65 timers connect 10
+neighbor 192.168.40.66 remote-as 65066
+neighbor 192.168.40.66 ebgp-multihop
+neighbor 192.168.40.66 timers connect 10
+neighbor 192.168.40.67 remote-as 65067
+neighbor 192.168.40.67 ebgp-multihop
+neighbor 192.168.40.67 timers connect 10
+neighbor 192.168.40.68 remote-as 65068
+neighbor 192.168.40.68 ebgp-multihop
+neighbor 192.168.40.68 timers connect 10
+neighbor 192.168.40.69 remote-as 65069
+neighbor 192.168.40.69 ebgp-multihop
+neighbor 192.168.40.69 timers connect 10
+neighbor 192.168.40.70 remote-as 65070
+neighbor 192.168.40.70 ebgp-multihop
+neighbor 192.168.40.70 timers connect 10
+neighbor 192.168.40.71 remote-as 65071
+neighbor 192.168.40.71 ebgp-multihop
+neighbor 192.168.40.71 timers connect 10
+neighbor 192.168.40.72 remote-as 65072
+neighbor 192.168.40.72 ebgp-multihop
+neighbor 192.168.40.72 timers connect 10
+neighbor 192.168.40.73 remote-as 65073
+neighbor 192.168.40.73 ebgp-multihop
+neighbor 192.168.40.73 timers connect 10
+neighbor 192.168.40.74 remote-as 65074
+neighbor 192.168.40.74 ebgp-multihop
+neighbor 192.168.40.74 timers connect 10
+neighbor 192.168.40.75 remote-as 65075
+neighbor 192.168.40.75 ebgp-multihop
+neighbor 192.168.40.75 timers connect 10
+neighbor 192.168.40.76 remote-as 65076
+neighbor 192.168.40.76 ebgp-multihop
+neighbor 192.168.40.76 timers connect 10
+neighbor 192.168.40.77 remote-as 65077
+neighbor 192.168.40.77 ebgp-multihop
+neighbor 192.168.40.77 timers connect 10
+neighbor 192.168.40.78 remote-as 65078
+neighbor 192.168.40.78 ebgp-multihop
+neighbor 192.168.40.78 timers connect 10
+neighbor 192.168.40.79 remote-as 65079
+neighbor 192.168.40.79 ebgp-multihop
+neighbor 192.168.40.79 timers connect 10
+neighbor 192.168.40.80 remote-as 65080
+neighbor 192.168.40.80 ebgp-multihop
+neighbor 192.168.40.80 timers connect 10
+neighbor 192.168.40.81 remote-as 65081
+neighbor 192.168.40.81 ebgp-multihop
+neighbor 192.168.40.81 timers connect 10
+neighbor 192.168.40.82 remote-as 65082
+neighbor 192.168.40.82 ebgp-multihop
+neighbor 192.168.40.82 timers connect 10
+neighbor 192.168.40.83 remote-as 65083
+neighbor 192.168.40.83 ebgp-multihop
+neighbor 192.168.40.83 timers connect 10
+neighbor 192.168.40.84 remote-as 65084
+neighbor 192.168.40.84 ebgp-multihop
+neighbor 192.168.40.84 timers connect 10
+neighbor 192.168.40.85 remote-as 65085
+neighbor 192.168.40.85 ebgp-multihop
+neighbor 192.168.40.85 timers connect 10
+neighbor 192.168.40.86 remote-as 65086
+neighbor 192.168.40.86 ebgp-multihop
+neighbor 192.168.40.86 timers connect 10
+neighbor 192.168.40.87 remote-as 65087
+neighbor 192.168.40.87 ebgp-multihop
+neighbor 192.168.40.87 timers connect 10
+neighbor 192.168.40.88 remote-as 65088
+neighbor 192.168.40.88 ebgp-multihop
+neighbor 192.168.40.88 timers connect 10
+neighbor 192.168.40.89 remote-as 65089
+neighbor 192.168.40.89 ebgp-multihop
+neighbor 192.168.40.89 timers connect 10
+neighbor 192.168.40.90 remote-as 65090
+neighbor 192.168.40.90 ebgp-multihop
+neighbor 192.168.40.90 timers connect 10
+neighbor 192.168.40.91 remote-as 65091
+neighbor 192.168.40.91 ebgp-multihop
+neighbor 192.168.40.91 timers connect 10
+neighbor 192.168.40.92 remote-as 65092
+neighbor 192.168.40.92 ebgp-multihop
+neighbor 192.168.40.92 timers connect 10
+neighbor 192.168.40.93 remote-as 65093
+neighbor 192.168.40.93 ebgp-multihop
+neighbor 192.168.40.93 timers connect 10
+neighbor 192.168.40.94 remote-as 65094
+neighbor 192.168.40.94 ebgp-multihop
+neighbor 192.168.40.94 timers connect 10
+neighbor 192.168.40.95 remote-as 65095
+neighbor 192.168.40.95 ebgp-multihop
+neighbor 192.168.40.95 timers connect 10
+neighbor 192.168.40.96 remote-as 65096
+neighbor 192.168.40.96 ebgp-multihop
+neighbor 192.168.40.96 timers connect 10
+neighbor 192.168.40.97 remote-as 65097
+neighbor 192.168.40.97 ebgp-multihop
+neighbor 192.168.40.97 timers connect 10
+neighbor 192.168.40.98 remote-as 65098
+neighbor 192.168.40.98 ebgp-multihop
+neighbor 192.168.40.98 timers connect 10
+neighbor 192.168.40.99 remote-as 65099
+neighbor 192.168.40.99 ebgp-multihop
+neighbor 192.168.40.99 timers connect 10
+neighbor 192.168.40.100 remote-as 65100
+neighbor 192.168.40.100 ebgp-multihop
+neighbor 192.168.40.100 timers connect 10
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SDNIPfunction/Dependency/quagga1.conf b/TestON/tests/SDNIPfunction/Dependency/quagga1.conf
new file mode 100644
index 0000000..ecc3baa
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+ network 3.0.0.0/24
+ network 3.0.1.0/24
+ network 3.0.2.0/24
+ network 3.0.3.0/24
+ network 3.0.4.0/24
+ network 3.0.5.0/24
+ network 3.0.6.0/24
+ network 3.0.7.0/24
+ network 3.0.8.0/24
+ network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/SDNIPfunction/Dependency/quagga2.conf b/TestON/tests/SDNIPfunction/Dependency/quagga2.conf
new file mode 100644
index 0000000..a508c49
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/quagga2.conf
@@ -0,0 +1,31 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+ neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SDNIPfunction/Dependency/zebra.conf b/TestON/tests/SDNIPfunction/Dependency/zebra.conf
new file mode 100644
index 0000000..517db94
--- /dev/null
+++ b/TestON/tests/SDNIPfunction/Dependency/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log