Added end to end test of fabric
diff --git a/ofdpa/sr.py b/ofdpa/sr.py
new file mode 100644
index 0000000..2c6b34c
--- /dev/null
+++ b/ofdpa/sr.py
@@ -0,0 +1,207 @@
+
+from oftest import config
+import logging
+import oftest.base_tests as base_tests
+import ofp
+from oftest.testutils import *
+from accton_util import *
+
+class Leaf1(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ #Add flows correspondent to Leaf1
+ switch_mac=[0x00, 0x00, 0x00, 0x01, 0xea, 0xf1]
+ dst_mac= [0x00, 0x00, 0x00, 0x12, 0x34, 0x01]
+ #Add L3Unicast to Host
+ port, vlan_id = 33, 10
+ ##add L2 Interface Group
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ ##add L3 Unicast Group
+ l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=switch_mac,
+ dst_mac=dst_mac)
+ add_one_vlan_table_flow(self.controller, of_port=port, vlan_id=vlan_id, vrf=vlan_id,
+ flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ ##add Termination Flow
+ add_termination_flow(self.controller, port, 0x0800, switch_mac, vlan_id)
+ ##add unicast routing flow
+ dst_ip=0x0a000001
+ mask=0xffffff00
+ add_unicast_routing_flow(self.controller, 0x0800, dst_ip, mask, l3_msg.group_id, vrf=10)
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(vlan_id, port)
+ add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
+
+ port = 32
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ add_termination_flow(self.controller, port, 0x0800, switch_mac, vlan_id)
+ do_barrier(self.controller)
+
+ #Add L3VPN initiation
+ dst_mac = [0x00, 0x00, 0x00, 0x55, 0x55, 0x55]
+ vlan_id = 100
+ ##add L2 Interface Group
+ l2_gid, l2_msg = add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ #add MPLS interface group
+ mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, switch_mac, vlan_id, port)
+ ##add L3VPN interface
+ mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
+ index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=20, set_bos=1, set_ttl=32)
+ ##add unicast routing flow
+ dst_ip=0x14000001
+ add_unicast_routing_flow(self.controller, 0x0800, dst_ip, mask, mpls_label_gid, vrf=10)
+
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(vlan_id, port)
+ add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
+
+ do_barrier(self.controller)
+
+class Leaf2(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ #Add flows correspondent to Leaf2
+ switch_mac=[0x00, 0x00, 0x00, 0x01, 0xea, 0xf2]
+ dst_mac= [0x00, 0x00, 0x00, 0x12, 0x34, 0x02]
+ #Add L3Unicast to Host
+ port, vlan_id=33, 20
+ ##add L2 Interface Group
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ ##add L3 Unicast Group
+ l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=switch_mac,
+ dst_mac=dst_mac)
+ add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=20, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ ##add Termination Flow
+ add_termination_flow(self.controller, port, 0x0800, switch_mac, vlan_id)
+ ##add unicast routing flow
+ dst_ip=0x14000001
+ mask=0xffffff00
+ add_unicast_routing_flow(self.controller, 0x0800, dst_ip, mask, l3_msg.group_id, vrf=vlan_id)
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(vlan_id, port)
+ add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
+
+ port = 32
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ add_one_vlan_table_flow(self.controller, port, vlan_id, vrf=vlan_id, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ add_termination_flow(self.controller, port, 0x0800, switch_mac, vlan_id)
+ do_barrier(self.controller)
+
+ #Add L3VPN initiation
+ dst_mac= [0x00, 0x00, 0x00, 0x55, 0x55, 0x55]
+ vlan_id = 100
+ ##add L2 Interface Group
+ l2_gid, l2_msg = add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ #add MPLS interface group
+ mpls_gid, mpls_msg = add_mpls_intf_group(self.controller, l2_gid, dst_mac, switch_mac, vlan_id, port)
+ ##add L3VPN interface
+ mpls_label_gid, mpls_label_msg = add_mpls_label_group(self.controller, subtype=OFDPA_MPLS_GROUP_SUBTYPE_L3_VPN_LABEL,
+ index=port, ref_gid= mpls_gid, push_mpls_header=True, set_mpls_label=10, set_bos=1, set_ttl=32)
+ ##add unicast routing flow
+ dst_ip=0x0a000001
+ add_unicast_routing_flow(self.controller, 0x0800, dst_ip, mask, mpls_label_gid, vrf=20)
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(vlan_id, port)
+ add_bridge_flow(self.controller, dst_mac, vlan_id, group_id, True)
+
+class Spine(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ #add Spine Flows
+ switch_mac = [0x00, 0x00, 0x00, 0x55, 0x55, 0x55]
+ dst_mac = [0x00, 0x00, 0x00, 0x01, 0xea, 0xf1]
+ #Add MPLS termination
+ port, vlan_id=31, 10
+ ##add L2 Interface Group
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ ##add L3 Unicast Group
+ l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=switch_mac,
+ dst_mac=dst_mac)
+ ecmp_msg = add_l3_ecmp_group(self.controller, port, [l3_msg.group_id])
+ vlan_id=100
+ add_one_vlan_table_flow(self.controller, of_port=port, vlan_id=100, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ add_termination_flow(self.controller, port, 0x8847, switch_mac, vlan_id, goto_table=24)
+ add_mpls_flow(self.controller, ecmp_msg.group_id, 10)
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(100, port)
+ add_bridge_flow(self.controller, dst_mac, 100, group_id, True)
+
+ dst_mac = [0x00, 0x00, 0x00, 0x01, 0xea, 0xf2]
+ #Add MPLS termination
+ port, vlan_id=32, 20
+ ##add L2 Interface Group
+ add_one_l2_interface_grouop(self.controller, port, vlan_id=vlan_id, is_tagged=True, send_barrier=False)
+ ##add L3 Unicast Group
+ l3_msg=add_l3_unicast_group(self.controller, port, vlanid=vlan_id, id=vlan_id, src_mac=switch_mac,
+ dst_mac=dst_mac)
+ ecmp_msg = add_l3_ecmp_group(self.controller, port, [l3_msg.group_id])
+ add_one_vlan_table_flow(self.controller, of_port=port, vlan_id=100, flag=VLAN_TABLE_FLAG_ONLY_TAG)
+ vlan_id=100
+ add_termination_flow(self.controller, port, 0x8847, switch_mac, vlan_id, goto_table=24)
+ add_mpls_flow(self.controller, ecmp_msg.group_id, 20)
+ #add entries in the Bridging table to avoid packet-in from mac learning
+ group_id = encode_l2_interface_group_id(100, port)
+ add_bridge_flow(self.controller, dst_mac, 100, group_id, True)
+
+class TestLeaf1(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ host_mac='00:00:00:12:34:01'
+ ip_src='10.0.0.1'
+ ip_dst='20.0.0.2'
+ switch_mac='00:00:00:01:ea:f1'
+ parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=10, ip_src=ip_src,
+ ip_dst=ip_dst, eth_dst=switch_mac, eth_src=host_mac, ip_ttl=33)
+ pkt=str(parsed_pkt)
+ self.dataplane.send(33, pkt)
+
+ #build expect packet
+ next_hop_mac='00:00:00:55:55:55'
+ switch_mac='00:00:00:01:ea:f1'
+ label = (20, 0, 1, 32)
+ exp_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=100, label=[label],
+ eth_dst=next_hop_mac, eth_src=switch_mac, ip_ttl=32, ip_src=ip_src, ip_dst=ip_dst)
+ pkt=str(exp_pkt)
+ verify_packet(self, pkt, 37)
+
+class TestSpine(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ ip_src='10.0.0.1'
+ ip_dst='20.0.0.2'
+
+ #build outgoing packet
+ spine_mac='00:00:00:55:55:55'
+ switch_mac='00:00:00:01:ea:f2'
+ leaf1= '00:00:00:01:ea:f1'
+ label = (20, 0, 1, 32)
+ parsed_pkt = mpls_packet(pktlen=104, dl_vlan_enable=True, vlan_vid=100, label=[label],
+ eth_dst=spine_mac, eth_src=leaf1, ip_ttl=32, ip_src=ip_src, ip_dst=ip_dst)
+ pkt=str(parsed_pkt)
+ self.dataplane.send(33, pkt)
+
+ exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=20, ip_src=ip_src,
+ ip_dst=ip_dst, eth_dst=switch_mac, eth_src=spine_mac, ip_ttl=31)
+ pkt=str(exp_pkt)
+ verify_packet(self, pkt, 37)
+
+class TestLeaf2(base_tests.SimpleDataPlane):
+
+ def runTest(self):
+ host_mac='00:00:00:55:55:55'
+ ip_src='10.0.0.1'
+ ip_dst='20.0.0.3'
+ switch_mac='00:00:00:01:ea:f1'
+ parsed_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=10, ip_src=ip_src,
+ ip_dst=ip_dst, eth_dst=switch_mac, eth_src=host_mac, ip_ttl=33)
+ pkt=str(parsed_pkt)
+ self.dataplane.send(33, pkt)
+ switch_mac='00:00:00:01:ea:f2'
+ host_mac='00:00:00:12:34:02'
+ exp_pkt = simple_tcp_packet(pktlen=100, dl_vlan_enable=True, vlan_vid=20, ip_src=ip_src,
+ ip_dst=ip_dst, eth_dst=host_mac, eth_src=switch_mac, ip_ttl=30)
+ pkt=str(exp_pkt)
+ verify_packet(self, pkt, 37)
+
+
+