ovs-appctl vlog/set :dbg ovs-appctl vlog/set connmgr:warn ovs-appctl vlog/set netlink_socket:INFO ovs-appctl vlog/set poll_loop:INFO ovs-appctl vlog/set dpif:INFO ovs-appctl vlog/set unixctl:INFO ovs-appctl vlog/set jsonrpc:INFO ip netns del ns-int ip netns add ns-int ip link del ovs-int ip netns del ns-ext1 ip netns add ns-ext1 ip link del ovs-ext1 ip netns del ns-ext2 ip netns add ns-ext2 ip link del ovs-ext2 ovs-vsctl del-br br-ext ovs-vsctl del-br br-int ovs-vsctl del-br br-tun ovs-vsctl del-br br-phy sleep 1 ip link add int type veth peer name ovs-int ip link set int netns ns-int ip link set dev ovs-int up ip netns exec ns-int ip addr add "169.254.1.1/24" dev int ip netns exec ns-int ip link set dev int up ip link add ext1 type veth peer name ovs-ext1 ip link set ext1 netns ns-ext1 ip link set dev ovs-ext1 up ip netns exec ns-ext1 ip link set dev ext1 up ip netns exec ns-ext1 ip addr add 172.31.1.1/24 dev ext1 ip link add ext2 type veth peer name ovs-ext2 ip link set ext2 netns ns-ext2 ip link set dev ovs-ext2 up ip netns exec ns-ext2 ip link set dev ext2 up ip netns exec ns-ext2 ip addr add 172.31.1.2/24 dev ext2 ADD_NATIVE_TUNNEL() { ip netns exec $7 ip link del dev $2 2> /dev/null ip netns exec $7 ip link add dev $2 type $1 remote $3 $5 ip netns exec $7 ip link set dev $2 address fc:16:3e:15:65:00 ip netns exec $7 ip addr add dev $2 $4 ip netns exec $7 ip link set dev $2 mtu 1450 $6 up } ADD_NATIVE_TUNNEL vxlan in_vxlan 172.31.1.100 169.254.1.2/24 "id 0 dstport 4789" "" ns-ext1 ADD_NATIVE_TUNNEL vxlan in_vxlan 172.31.1.100 169.254.1.2/24 "id 0 dstport 4789" "" ns-ext2 ip netns exec ns-int ip -6 addr flush dev int ip netns exec ns-ext1 ip -6 addr flush dev ext1 ip netns exec ns-ext2 ip -6 addr flush dev ext2 ip netns exec ns-ext1 ip -6 addr flush dev in_vxlan ip netns exec ns-ext2 ip -6 addr flush dev in_vxlan ip netns exec ns-int ethtool -K int rx off ip netns exec ns-int ethtool -K int tx off ip netns exec ns-ext1 ethtool -K ext1 rx off ip netns exec ns-ext1 ethtool -K ext1 tx off ip netns exec ns-ext1 ethtool -K in_vxlan rx off ip netns exec ns-ext1 ethtool -K in_vxlan tx off ip netns exec ns-ext2 ethtool -K ext2 rx off ip netns exec ns-ext2 ethtool -K ext2 tx off ip netns exec ns-ext2 ethtool -K in_vxlan rx off ip netns exec ns-ext2 ethtool -K in_vxlan tx off sleep 1 ovs-vsctl add-br br-int -- set Bridge br-int datapath_type="netdev" ovs-vsctl add-br br-tun -- set Bridge br-tun datapath_type="netdev" ovs-vsctl add-br br-ext -- set Bridge br-ext datapath_type="netdev" ovs-vsctl add-br br-phy -- set Bridge br-phy datapath_type="netdev" ovs-vsctl \ -- add-port br-ext phy-br-ex \ -- set interface phy-br-ex type=patch options:peer=int-br-ex \ -- add-port br-int int-br-ex \ -- set interface int-br-ex type=patch options:peer=phy-br-ex ovs-vsctl \ -- add-port br-tun patch-int \ -- set interface patch-int type=patch options:peer=patch-tun \ -- add-port br-int patch-tun \ -- set interface patch-tun type=patch options:peer=patch-int ovs-vsctl \ -- add-port br-phy phy-br-phy \ -- set interface phy-br-phy type=patch options:peer=ext-br-ex \ -- add-port br-ext ext-br-ex \ -- set interface ext-br-ex type=patch options:peer=phy-br-phy ip link set dev br-phy up ip link set dev br-tun up ip addr add dev br-phy "172.31.1.100/24" ovs-vsctl add-port br-int ovs-int tag=5 ovs-vsctl set port br-ext tag=2020 ovs-vsctl add-port br-phy ovs-ext1 ovs-vsctl add-port br-phy ovs-ext2 ovs-vsctl set Bridge br-ext protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15 ovs-vsctl set Bridge br-int protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15 ovs-vsctl set Bridge br-tun protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15 ovs-vsctl set Bridge br-phy protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14,OpenFlow15 ovs-vsctl add-port br-tun vxlan2 -- set interface vxlan2 type=vxlan \ options:remote_ip=172.31.1.1 options:local_ip=172.31.1.100 options:key=flow options:dst_port=4789 options:in_key=flow options:out_key=flow ovs-vsctl add-port br-tun vxlan3 -- set interface vxlan3 type=vxlan \ options:remote_ip=172.31.1.2 options:local_ip=172.31.1.100 options:key=flow options:dst_port=4789 options:in_key=flow options:out_key=flow #ovs-vsctl del-port vxlan2 #ovs-vsctl del-port vxlan3 #ovs-vsctl add-port br-tun vxlan2 -- set interface vxlan2 type=vxlan \ # options:remote_ip=172.31.1.1 options:local_ip=172.31.1.100 options:dst_port=4789 #ovs-vsctl add-port br-tun vxlan3 -- set interface vxlan3 type=vxlan \ # options:remote_ip=172.31.1.2 options:local_ip=172.31.1.100 options:dst_port=4789 ovs-ofctl del-flows br-ext ovs-ofctl del-flows br-int ovs-ofctl del-flows br-phy ovs-ofctl del-flows br-tun ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=100,in_port=ovs-ext1,arp,actions=br-phy" ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=100,in_port=ovs-ext2,arp,actions=br-phy" ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=100,in_port=br-phy,arp,actions=ovs-ext1,ovs-ext2" ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=50,in_port=ovs-ext1,actions=phy-br-phy" ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=50,in_port=ovs-ext2,actions=phy-br-phy" for i in $(ip netns exec ns-ext1 ip l | grep -EA1 "in_vxlan|ext" | grep -Eo "ether [^ ]+ " | grep -Eo "[a-f0-9]+:.*"); do ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=40,in_port=phy-br-phy,dl_dst=${i},actions=ovs-ext1" done for i in $(ip netns exec ns-ext2 ip l | grep -EA1 "in_vxlan|ext" | grep -Eo "ether [^ ]+ " | grep -Eo "[a-f0-9]+:.*"); do ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=40,in_port=phy-br-phy,dl_dst=${i},actions=ovs-ext2" done ovs-ofctl -OOpenFlow15 add-flow br-phy "priority=1,actions=NORMAL" ovs-ofctl -OOpenFlow15 add-flow br-ext "priority=4,in_port=ext-br-ex actions=mod_vlan_vid:638,phy-br-ex" ovs-ofctl -OOpenFlow15 add-flow br-ext "priority=4,in_port=phy-br-ex actions=ext-br-ex" ovs-ofctl -OOpenFlow15 add-flow br-ext "priority=8,in_port=ext-br-ex,arp actions=push_vlan:0x8100,mod_vlan_vid:2020,br-ext" ovs-ofctl -OOpenFlow15 add-flow br-ext "priority=8,in_port=br-ext,arp actions=ext-br-ex" ovs-ofctl -OOpenFlow15 add-flow br-ext "priority=0,actions=NORMAL" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=65535,dl_vlan=4095 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=200,reg3=0 actions=set_queue:0,load:0x1->NXM_NX_REG3[0],resubmit(,0)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=10,arp,in_port=ovs-int actions=resubmit(,24)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=2,in_port=int-br-ex actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=9,in_port=ovs-int actions=resubmit(,25)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=4,in_port=int-br-ex,dl_vlan=638 actions=mod_vlan_vid:5,patch-tun" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=3,in_port=int-br-ex,dl_vlan=638 actions=mod_vlan_vid:5,resubmit(,60)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=0,priority=0 actions=resubmit(,60)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=23,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-int "table=24,priority=2,arp,in_port=ovs-int actions=resubmit(,25)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=24,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-int "table=25,priority=2,in_port=ovs-int actions=resubmit(,60)" ovs-ofctl -OOpenFlow15 add-flow br-int "table=60,priority=3 actions=NORMAL" ovs-ofctl -OOpenFlow15 add-flow br-int "table=62,priority=3 actions=NORMAL" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=0,priority=2,in_port=patch-int actions=resubmit(,2)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=0,priority=2,in_port=vxlan2 actions=resubmit(,4)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=0,priority=2,in_port=vxlan3 actions=resubmit(,4)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=0,priority=1,tun_dst=172.31.1.100 actions=resubmit(,4)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=0,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=2,priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=2,priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,22)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=3,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=1,tun_id=0x9be8 actions=mod_vlan_vid:2,resubmit(,10)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=1,tun_id=0xcfd0 actions=mod_vlan_vid:1,resubmit(,10)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=1,tun_id=0x2de5 actions=mod_vlan_vid:3,resubmit(,10)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=1,tun_id=0x8891 actions=mod_vlan_vid:4,resubmit(,10)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=1,tun_id=0 actions=mod_vlan_vid:5,resubmit(,10)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=4,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=6,priority=0 actions=drop" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=10,priority=1 actions=learn(table=20,hard_timeout=300,priority=1,cookie=0x4291b5d8aea40b08,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:patch-int" #ovs-ofctl -OOpenFlow15 add-flow br-tun "table=10,arp,arp_tha=ff:ff:ff:ff:ff:ff,priority=2 actions=learn(table=20,hard_timeout=300,priority=2,cookie=0x4291b5d8aea40b08,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:patch-int" #ovs-ofctl -OOpenFlow15 add-flow br-tun "table=10,icmp6,icmp_type=134,priority=2 actions=learn(table=20,hard_timeout=300,priority=2,cookie=0x4291b5d8aea40b08,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:patch-int" #ovs-ofctl -OOpenFlow15 add-flow br-tun "table=10,icmp6,icmp_type=136,priority=2 actions=learn(table=20,hard_timeout=300,priority=2,cookie=0x4291b5d8aea40b08,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:OXM_OF_IN_PORT[]),output:patch-int" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=20,priority=0 actions=resubmit(,22)" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=2,dl_vlan=2 actions=strip_vlan,load:0x9be8->NXM_NX_TUN_ID[],output:vxlan2,output:vxlan3" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=2,dl_vlan=1 actions=strip_vlan,load:0xcfd0->NXM_NX_TUN_ID[],output:vxlan2,output:vxlan3" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=2,dl_vlan=3 actions=strip_vlan,load:0x2de5->NXM_NX_TUN_ID[],output:vxlan2,output:vxlan3" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=2,dl_vlan=4 actions=strip_vlan,load:0x8891->NXM_NX_TUN_ID[],output:vxlan2,output:vxlan3" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=2,dl_vlan=4 actions=strip_vlan,load:0x0->NXM_NX_TUN_ID[],output:vxlan2,output:vxlan3" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=1,dl_vlan=5 actions=strip_vlan,LOCAL" ovs-ofctl -OOpenFlow15 add-flow br-tun "table=22,priority=0 actions=drop" #server.py import socket import sys import time from os import path val = sys.argv[1] sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(("169.254.1.2", 5353)) while True: data, addr = sock.recvfrom(1024) seq = int(data.decode()) #print("Got %i on %s" %( seq, val)) sock.sendto(data, addr) if path.exists(val): with open("log", "a") as fh: fh.write("%s BAD ROUTE %s\n" %(time.ctime(), val)) # client.py import socket import time sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(1) seq = 1 while True: msg = str(seq).encode() sock.sendto(msg, ("169.254.1.2", 5353)) try: data, addr = sock.recvfrom(1024) except KeyboardInterrupt: raise except: print("miss") continue print("Got", data, "from", addr) seq += 1 time.sleep(0.1) # failover.py from scapy.all import * import sys def send_garp(iface, src_ip, src_mac): arp = ARP(op=2, psrc=src_ip, hwsrc=src_mac, pdst=src_ip, hwdst="ff:ff:ff:ff:ff:ff") eth = Ether(src=src_mac, dst="ff:ff:ff:ff:ff:ff") pkt = eth/arp sendp(pkt, iface=iface, verbose=False) if __name__ == "__main__": with open("log", "a") as f: f.write("sent garp %s\n" % sys.argv[1]) send_garp("in_vxlan", "169.254.1.2", "fc:16:3e:15:65:00") # Test commands ip netns exec ns-ext1 python server.py ext1 ip netns exec ns-ext2 python server.py ext2 ip netns exec ns-int python client.py while [[ 1 ]]; do rm -f ext2; touch ext1; ip netns exec ns-ext1 python failover.py; sleep 1; rm -f ext1; touch ext2; ip netns exec ns-ext2 python failover.py; sleep 1; done;