Add dual upstream routers

Change-Id: I6f98e8788551082efa60c1ad7a4307f22b459b12
diff --git a/trellis/bgpdbgp1.conf b/trellis/bgpdbgp1.conf
index 5400dfd..8870fb4 100644
--- a/trellis/bgpdbgp1.conf
+++ b/trellis/bgpdbgp1.conf
@@ -5,27 +5,39 @@
 ! Different next hop for IPv4
 !
 ip prefix-list 1 seq 10 permit 10.0.2.0/24
-ip prefix-list 1 seq 20 permit 10.0.3.0/24
-ip prefix-list 1 seq 30 permit 10.0.4.0/24
+ip prefix-list 1 seq 20 permit 10.1.2.0/24
+ip prefix-list 1 seq 30 permit 10.0.3.0/24
+ip prefix-list 1 seq 40 permit 10.0.4.0/24
 !
-route-map NEXTHOP4 permit 10
+route-map NEXTHOP41 permit 10
 match ip address prefix-list 1
 set ip next-hop 10.0.1.254
 !
+!
+route-map NEXTHOP47 permit 10
+match ip address prefix-list 1
+set ip next-hop 10.0.7.254
+!
 ! Different next hop for IPv6
 !
 ipv6 prefix-list 2 seq 10 permit 2000::200/120
 ipv6 prefix-list 2 seq 20 permit 2000::300/120
 !
-route-map NEXTHOP6 permit 10
+route-map NEXTHOP61 permit 10
 match ipv6 address prefix-list 2
 set ipv6 next-hop global 2000::1ff
 set ipv6 next-hop local 2000::1ff
 !
+!
+route-map NEXTHOP67 permit 10
+match ipv6 address prefix-list 2
+set ipv6 next-hop global 2000::7ff
+set ipv6 next-hop local 2000::7ff
+!
 ! Basic router config
 !
-router bgp 65002
-bgp router-id 10.0.1.2
+router bgp 65003
+bgp router-id 172.16.0.3
 timers bgp 3 9
 !
 ! IPv4
@@ -34,14 +46,26 @@
 neighbor 10.0.1.1 ebgp-multihop
 neighbor 10.0.1.1 timers connect 5
 neighbor 10.0.1.1 advertisement-interval 5
-neighbor 10.0.1.1 route-map NEXTHOP4 out
+neighbor 10.0.1.1 route-map NEXTHOP41 out
 !
 neighbor 2000::101 remote-as 65001
 neighbor 2000::101 timers connect 5
 neighbor 2000::101 advertisement-interval 1
 no neighbor 2000::101 activate
 !
+neighbor 10.0.7.1 remote-as 65002
+neighbor 10.0.7.1 ebgp-multihop
+neighbor 10.0.7.1 timers connect 5
+neighbor 10.0.7.1 advertisement-interval 5
+neighbor 10.0.7.1 route-map NEXTHOP47 out
+!
+neighbor 2000::701 remote-as 65002
+neighbor 2000::701 timers connect 5
+neighbor 2000::701 advertisement-interval 1
+no neighbor 2000::701 activate
+!
 network 10.0.2.0/24
+network 10.1.2.0/24
 network 10.0.3.0/24
 network 10.0.4.0/24
 !
@@ -51,5 +75,7 @@
 network 2000::200/120
 network 2000::300/120
 neighbor 2000::101 activate
-neighbor 2000::101 route-map NEXTHOP6 out
+neighbor 2000::101 route-map NEXTHOP61 out
+neighbor 2000::701 activate
+neighbor 2000::701 route-map NEXTHOP67 out
 exit-address-family
diff --git a/trellis/bgpdbgp2.conf b/trellis/bgpdbgp2.conf
new file mode 100644
index 0000000..e554de4
--- /dev/null
+++ b/trellis/bgpdbgp2.conf
@@ -0,0 +1,81 @@
+log file /var/log/quagga/bgpdbgp2.log
+hostname bgp2
+password quagga
+!
+! Different next hop for IPv4
+!
+ip prefix-list 1 seq 10 permit 10.0.2.0/24
+ip prefix-list 1 seq 20 permit 10.1.2.0/24
+ip prefix-list 1 seq 30 permit 10.0.3.0/24
+ip prefix-list 1 seq 40 permit 10.0.4.0/24
+!
+route-map NEXTHOP45 permit 10
+match ip address prefix-list 1
+set ip next-hop 10.0.5.254
+!
+!
+route-map NEXTHOP46 permit 10
+match ip address prefix-list 1
+set ip next-hop 10.0.6.254
+!
+! Different next hop for IPv6
+!
+ipv6 prefix-list 2 seq 10 permit 2000::200/120
+ipv6 prefix-list 2 seq 20 permit 2000::300/120
+!
+route-map NEXTHOP65 permit 10
+match ipv6 address prefix-list 2
+set ipv6 next-hop global 2000::5ff
+set ipv6 next-hop local 2000::5ff
+!
+!
+route-map NEXTHOP66 permit 10
+match ipv6 address prefix-list 2
+set ipv6 next-hop global 2000::6ff
+set ipv6 next-hop local 2000::6ff
+!
+! Basic router config
+!
+router bgp 65003
+bgp router-id 172.16.0.4
+timers bgp 3 9
+!
+! IPv4
+!
+neighbor 10.0.5.1 remote-as 65001
+neighbor 10.0.5.1 ebgp-multihop
+neighbor 10.0.5.1 timers connect 5
+neighbor 10.0.5.1 advertisement-interval 5
+neighbor 10.0.5.1 route-map NEXTHOP45 out
+!
+neighbor 2000::501 remote-as 65001
+neighbor 2000::501 timers connect 5
+neighbor 2000::501 advertisement-interval 1
+no neighbor 2000::501 activate
+!
+neighbor 10.0.6.1 remote-as 65002
+neighbor 10.0.6.1 ebgp-multihop
+neighbor 10.0.6.1 timers connect 5
+neighbor 10.0.6.1 advertisement-interval 5
+neighbor 10.0.6.1 route-map NEXTHOP46 out
+!
+neighbor 2000::601 remote-as 65002
+neighbor 2000::601 timers connect 5
+neighbor 2000::601 advertisement-interval 1
+no neighbor 2000::601 activate
+!
+network 10.0.2.0/24
+network 10.1.2.0/24
+network 10.0.3.0/24
+network 10.0.4.0/24
+!
+! IPv6
+!
+address-family ipv6
+network 2000::200/120
+network 2000::300/120
+neighbor 2000::501 activate
+neighbor 2000::501 route-map NEXTHOP65 out
+neighbor 2000::601 activate
+neighbor 2000::601 route-map NEXTHOP66 out
+exit-address-family
diff --git a/trellis/bgpdr1.conf b/trellis/bgpdr1.conf
index 9a05ac9..9e526b8 100644
--- a/trellis/bgpdr1.conf
+++ b/trellis/bgpdr1.conf
@@ -10,21 +10,33 @@
 !
 ! IPv4
 !
-neighbor 10.0.1.2 remote-as 65002
+neighbor 10.0.1.2 remote-as 65003
 neighbor 10.0.1.2 ebgp-multihop
 neighbor 10.0.1.2 timers connect 5
 neighbor 10.0.1.2 advertisement-interval 5
 !
-neighbor 2000::102 remote-as 65002
+neighbor 2000::102 remote-as 65003
 neighbor 2000::102 timers connect 5
 neighbor 2000::102 advertisement-interval 1
 no neighbor 2000::102 activate
 !
+neighbor 10.0.5.2 remote-as 65003
+neighbor 10.0.5.2 ebgp-multihop
+neighbor 10.0.5.2 timers connect 5
+neighbor 10.0.5.2 advertisement-interval 5
+!
+neighbor 2000::502 remote-as 65003
+neighbor 2000::502 timers connect 5
+neighbor 2000::502 advertisement-interval 1
+no neighbor 2000::502 activate
+!
 network 10.0.99.0/24
 !
 ! IPv6
 !
 address-family ipv6
+network 2000::7700/120
 network 2000::9900/120
 neighbor 2000::102 activate
+neighbor 2000::502 activate
 exit-address-family
diff --git a/trellis/bgpdr2.conf b/trellis/bgpdr2.conf
new file mode 100644
index 0000000..49553e2
--- /dev/null
+++ b/trellis/bgpdr2.conf
@@ -0,0 +1,42 @@
+log file /var/log/quagga/bgpdr2.log
+hostname r2
+password quagga
+!
+! Basic router config
+!
+router bgp 65002
+bgp router-id 10.0.6.1
+timers bgp 3 9
+!
+! IPv4
+!
+neighbor 10.0.6.2 remote-as 65003
+neighbor 10.0.6.2 ebgp-multihop
+neighbor 10.0.6.2 timers connect 5
+neighbor 10.0.6.2 advertisement-interval 5
+!
+neighbor 2000::602 remote-as 65003
+neighbor 2000::602 timers connect 5
+neighbor 2000::602 advertisement-interval 1
+no neighbor 2000::602 activate
+!
+neighbor 10.0.7.2 remote-as 65003
+neighbor 10.0.7.2 ebgp-multihop
+neighbor 10.0.7.2 timers connect 5
+neighbor 10.0.7.2 advertisement-interval 5
+!
+neighbor 2000::702 remote-as 65003
+neighbor 2000::702 timers connect 5
+neighbor 2000::702 advertisement-interval 1
+no neighbor 2000::702 activate
+!
+network 10.0.99.0/24
+!
+! IPv6
+!
+address-family ipv6
+network 2000::8800/120
+network 2000::9900/120
+neighbor 2000::602 activate
+neighbor 2000::702 activate
+exit-address-family
diff --git a/trellis/dhcpd.conf b/trellis/dhcpd.conf
index b193ce9..c16dc33 100644
--- a/trellis/dhcpd.conf
+++ b/trellis/dhcpd.conf
@@ -11,6 +11,11 @@
   option routers 10.0.2.254;
 }
 
+subnet 10.1.2.0 netmask 255.255.255.0 {
+  range 10.1.2.100 10.1.2.240;
+  option routers 10.1.2.254;
+}
+
 subnet 10.0.3.0 netmask 255.255.255.0 {
   range 10.0.3.100 10.0.3.240;
   option routers 10.0.3.254;
@@ -46,5 +51,5 @@
 
 host dh1 {
   hardware ethernet 00:cc:00:00:00:01;
-  fixed-address 10.0.2.11;
+  fixed-address 10.1.2.1;
 }
diff --git a/trellis/trellis_dualhome.json b/trellis/trellis_dualhome.json
index 5f4cdef..e9f1dfd 100644
--- a/trellis/trellis_dualhome.json
+++ b/trellis/trellis_dualhome.json
@@ -3,24 +3,24 @@
         "of:0000000000000203/5" : {
             "interfaces" : [
                 {
-                    "ips" : [ "10.0.2.254/24", "2000::2ff/120" ],
-                    "vlan-tagged": [20]
+                    "ips" : [ "10.1.2.254/24", "2001::2ff/120" ],
+                    "vlan-tagged": [20, 21]
                 }
             ]
         },
         "of:0000000000000203/6" : {
             "interfaces" : [
                 {
-                    "ips" : [ "10.0.2.254/24", "2000::2ff/120" ],
-                    "vlan-untagged": 20
+                    "ips" : [ "10.1.2.254/24", "2001::2ff/120" ],
+                    "vlan-untagged": 21
                 }
             ]
         },
         "of:0000000000000204/5" : {
             "interfaces" : [
                 {
-                    "ips" : [ "10.0.2.254/24", "2000::2ff/120" ],
-                    "vlan-tagged": [20]
+                    "ips" : [ "10.1.2.254/24", "2001::2ff/120" ],
+                    "vlan-tagged": [20, 21]
                 }
             ]
         },
@@ -59,8 +59,8 @@
         "of:0000000000000204/10" : {
             "interfaces" : [
                 {
-                    "ips" : [ "10.0.2.254/24", "2000::2ff/120" ],
-                    "vlan-untagged": 20
+                    "ips" : [ "10.1.2.254/24", "2001::2ff/120" ],
+                    "vlan-untagged": 21
                 }
             ]
         },
@@ -107,8 +107,8 @@
         "of:0000000000000205/11" : {
             "interfaces" : [
                 {
-                    "ips" : [ "10.0.1.254/24", "2000::1ff/120" ],
-                    "vlan-untagged": 10
+                    "ips" : [ "10.0.1.254/24", "10.0.7.254/24", "2000::1ff/120", "2000::7ff/120" ],
+                    "vlan-tagged": [110, 170]
                 }
             ]
         },
@@ -116,7 +116,39 @@
             "interfaces" : [
                 {
                     "ips" : [ "10.0.1.254/24", "2000::1ff/120" ],
-                    "vlan-untagged": 10
+                    "vlan-untagged": 110
+                }
+            ]
+        },
+        "of:0000000000000205/13" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.0.7.254/24", "2000::7ff/120" ],
+                    "vlan-untagged": 170
+                }
+            ]
+        },
+        "of:0000000000000206/6" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.0.5.254/24", "10.0.6.254/24", "2000::5ff/120", "2000::6ff/120" ],
+                    "vlan-tagged": [150, 160]
+                }
+            ]
+        },
+        "of:0000000000000206/7" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.0.5.254/24", "2000::5ff/120" ],
+                    "vlan-untagged": 150
+                }
+            ]
+        },
+        "of:0000000000000206/8" : {
+            "interfaces" : [
+                {
+                    "ips" : [ "10.0.6.254/24", "2000::6ff/120" ],
+                    "vlan-untagged": 160
                 }
             ]
         }
@@ -167,7 +199,9 @@
                 "ipv6Loopback" : "2000::c0a8:0205",
                 "routerMac" : "00:00:00:00:02:05",
                 "isEdgeRouter" : true,
-                "adjacencySids" : []
+                "adjacencySids" : [],
+                "pairDeviceId": "of:0000000000000206",
+                "pairLocalPort": 5
             },
             "basic" : {
                 "name": "s205",
@@ -183,7 +217,9 @@
                 "ipv6Loopback" : "2000::c0a8:0206",
                 "routerMac" : "00:00:00:00:02:05",
                 "isEdgeRouter" : true,
-                "adjacencySids" : []
+                "adjacencySids" : [],
+                "pairDeviceId": "of:0000000000000205",
+                "pairLocalPort": 5
             },
             "basic" : {
                 "name": "s206",
diff --git a/trellis/trellis_dualhome.py b/trellis/trellis_dualhome.py
index 598c4f5..62269ed 100755
--- a/trellis/trellis_dualhome.py
+++ b/trellis/trellis_dualhome.py
@@ -94,8 +94,9 @@
         self.addLink(cs0, nat)
 
         # Internal Quagga bgp1
-        intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
-                 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
+        intfs = {'bgp1-eth0': [{'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:03', 'vlan': '110'},
+                               {'ipAddrs': ['10.0.7.2/24', '2000::702/120'], 'mac': '00:88:00:00:00:03', 'vlan': '170'}],
+                 'bgp1-eth1': {'ipAddrs': ['172.16.0.3/12']}}
         bgp1 = self.addHost('bgp1', cls=BgpRouter,
                             interfaces=intfs,
                             quaggaConfFile='./bgpdbgp1.conf',
@@ -103,14 +104,28 @@
         self.addLink(bgp1, s205)
         self.addLink(bgp1, cs0)
 
+        # Internal Quagga bgp2
+        intfs = {'bgp2-eth0': [{'ipAddrs': ['10.0.5.2/24', '2000::502/120'], 'mac': '00:88:00:00:00:04', 'vlan': '150'},
+                               {'ipAddrs': ['10.0.6.2/24', '2000::602/120'], 'mac': '00:88:00:00:00:04', 'vlan': '160'}],
+                 'bgp2-eth1': {'ipAddrs': ['172.16.0.4/12']}}
+        bgp2 = self.addHost('bgp2', cls=BgpRouter,
+                            interfaces=intfs,
+                            quaggaConfFile='./bgpdbgp2.conf',
+                            zebraConfFile='./zebradbgp2.conf')
+        self.addLink(bgp2, s206)
+        self.addLink(bgp2, cs0)
+
         # External Quagga r1
         intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
-                 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
-                 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
+                 'r1-eth1': {'ipAddrs': ['10.0.5.1/24', '2000::501/120'], 'mac': '00:88:00:00:00:11'},
+                 'r1-eth2': {'ipAddrs': ['10.0.99.1/16']},
+                 'r1-eth3': {'ipAddrs': ['2000::9901/120']},
+                 'r1-eth4': {'ipAddrs': ['2000::7701/120']}}
         r1 = self.addHost('r1', cls=BgpRouter,
                             interfaces=intfs,
                             quaggaConfFile='./bgpdr1.conf')
         self.addLink(r1, s205)
+        self.addLink(r1, s206)
 
         # External IPv4 Host behind r1
         rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
@@ -120,6 +135,34 @@
         rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
         self.addLink(r1, rh1v6)
 
+        # Another external IPv6 Host behind r1
+        rh11v6 = self.addHost('rh11v6', cls=RoutedHost, ips=['2000::7702/120'], gateway='2000::7701')
+        self.addLink(r1, rh11v6)
+
+        # External Quagga r2
+        intfs = {'r2-eth0': {'ipAddrs': ['10.0.6.1/24', '2000::601/120'], 'mac': '00:88:00:00:00:02'},
+                 'r2-eth1': {'ipAddrs': ['10.0.7.1/24', '2000::701/120'], 'mac': '00:88:00:00:00:22'},
+                 'r2-eth2': {'ipAddrs': ['10.0.99.1/16']},
+                 'r2-eth3': {'ipAddrs': ['2000::9901/120']},
+                 'r2-eth4': {'ipAddrs': ['2000::8801/120']}}
+        r2 = self.addHost('r2', cls=BgpRouter,
+                            interfaces=intfs,
+                            quaggaConfFile='./bgpdr2.conf')
+        self.addLink(r2, s206)
+        self.addLink(r2, s205)
+
+        # External IPv4 Host behind r2
+        rh2 = self.addHost('rh2', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
+        self.addLink(r2, rh2)
+
+        # External IPv6 Host behind r2
+        rh2v6 = self.addHost('rh126', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
+        self.addLink(r2, rh2v6)
+
+        # Another external IPv6 Host behind r1
+        rh22v6 = self.addHost('rh22v6', cls=RoutedHost, ips=['2000::8802/120'], gateway='2000::8801')
+        self.addLink(r2, rh22v6)
+
 topos = { 'trellis' : Trellis }
 
 if __name__ == "__main__":
@@ -127,9 +170,9 @@
     topo = Trellis()
 
     net = Mininet(topo=topo, controller=None)
-    net.addController(RemoteController('c0', ip='192.168.56.11'))
-    net.addController(RemoteController('c1', ip='192.168.56.12'))
-    net.addController(RemoteController('c2', ip='192.168.56.13'))
+    #net.addController(RemoteController('c0', ip='192.168.56.11'))
+    #net.addController(RemoteController('c1', ip='192.168.56.12'))
+    #net.addController(RemoteController('c2', ip='192.168.56.13'))
 
     net.start()
     CLI(net)
diff --git a/trellis/zebradbgp2.conf b/trellis/zebradbgp2.conf
new file mode 100644
index 0000000..dce218d
--- /dev/null
+++ b/trellis/zebradbgp2.conf
@@ -0,0 +1,9 @@
+log file /var/log/quagga/zebradbgp2.log
+hostname zebra-bgp2
+password quagga
+!
+! Default route via virtual management switch
+!
+ip route 0.0.0.0/0 172.16.0.1
+!
+fpm connection ip 192.168.56.11 port 2620