blob: b7e68d6a45eccfbf9cca0b3466ea68b21b187645 [file] [log] [blame]
import Queue
from oftest.testutils import *
from accton_util import *
def fill_mcast_pipeline_L3toL2(
controller,
logging,
ports,
is_ingress_tagged,
is_egress_tagged,
is_vlan_translated,
is_max_vlan
):
"""
This method, according to the scenario, fills properly
the pipeline. The method generates using ports data the
necessary information to fill the multicast pipeline and
fills properly the pipeline which consists in this scenario:
i) to create l2 interface groups;
ii) to create l3 multicast groups;
iii) to add multicast flows;
iv) to add termination; flows;
v) to add vlan flows
Scenarios:
1) ingress untagged, egress untagged
2) ingress untagged, egress tagged
3) ingress tagged, egress untagged
4) ingress tagged, egress tagged, no translation
5) ingress tagged, egress tagged, translation
"""
MAX_INTERNAL_VLAN = 4094
# Used for no translation
FIXED_VLAN = 300
Groups = Queue.LifoQueue( )
L2_Groups = []
port_to_in_vlan = {}
port_to_out_vlan = {}
port_to_src_mac = {}
port_to_src_mac_str = {}
port_to_dst_mac = {}
port_to_dst_mac_str = {}
port_to_src_ip = {}
port_to_src_ip_str = {}
src_ip_0 = 0xc0a80100
src_ip_0_str = "192.168.1.%s"
dst_ip = 0xe0000001
switch_mac = [ 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 ]
for port in ports:
in_vlan_id = port + 1
out_vlan_id = MAX_INTERNAL_VLAN - port
if is_max_vlan and not is_vlan_translated:
in_vlan_id = MAX_INTERNAL_VLAN
out_vlan_id = MAX_INTERNAL_VLAN
elif not is_max_vlan and not is_vlan_translated:
in_vlan_id = FIXED_VLAN
out_vlan_id = FIXED_VLAN
src_mac = [ 0x00, 0x11, 0x11, 0x11, 0x11, port ]
src_mac_str = ':'.join( [ '%02X' % x for x in src_mac ] )
dst_mac = [ 0x01, 0x00, 0x5e, 0x01, 0x01, port ]
dst_mac_str = ':'.join( [ '%02X' % x for x in dst_mac ] )
src_ip = src_ip_0 + port
src_ip_str = src_ip_0_str % port
port_to_in_vlan[port] = in_vlan_id
port_to_out_vlan[port] = out_vlan_id
port_to_src_mac[port] = src_mac
port_to_src_mac_str[port] = src_mac_str
port_to_dst_mac[port] = dst_mac
port_to_dst_mac_str[port] = dst_mac_str
port_to_src_ip[port] = src_ip
port_to_src_ip_str[port] = src_ip_str
for in_port in ports:
L2_Groups = []
# add vlan flows table
add_one_vlan_table_flow( controller, in_port, port_to_in_vlan[in_port], flag=VLAN_TABLE_FLAG_ONLY_TAG )
if not is_ingress_tagged:
add_one_vlan_table_flow( controller, in_port, port_to_in_vlan[in_port], flag=VLAN_TABLE_FLAG_ONLY_UNTAG )
elif is_vlan_translated:
add_one_vlan_table_flow_translation( controller, in_port, port_to_in_vlan[in_port], port_to_out_vlan[in_port], flag=VLAN_TABLE_FLAG_ONLY_TAG)
# add termination flow
if not is_vlan_translated:
add_termination_flow( controller, in_port, 0x0800, switch_mac, port_to_in_vlan[in_port] )
else:
add_termination_flow( controller, in_port, 0x0800, switch_mac, port_to_out_vlan[in_port] )
for out_port in ports:
if out_port == in_port:
continue
# add l2 interface group, vlan_id equals for each port and must coincide with mcast_group vlan_id
if not is_vlan_translated:
l2gid, msg = add_one_l2_interface_group( controller, out_port, vlan_id=port_to_in_vlan[in_port],
is_tagged=is_egress_tagged, send_barrier=True )
else:
l2gid, msg = add_one_l2_interface_group( controller, out_port, vlan_id=port_to_out_vlan[in_port],
is_tagged=is_egress_tagged, send_barrier=True )
Groups._put( l2gid )
L2_Groups.append( l2gid )
# add l3 mcast group
if not is_vlan_translated:
mcat_group_msg = add_l3_mcast_group( controller, port_to_in_vlan[in_port], in_port, L2_Groups )
else:
mcat_group_msg = add_l3_mcast_group( controller, port_to_out_vlan[in_port], in_port, L2_Groups )
Groups._put( mcat_group_msg.group_id )
# add mcast routing flow
if not is_vlan_translated:
add_mcast4_routing_flow( controller, port_to_in_vlan[in_port], port_to_src_ip[in_port], 0, dst_ip, mcat_group_msg.group_id )
else:
add_mcast4_routing_flow( controller, port_to_out_vlan[in_port], port_to_src_ip[in_port], 0, dst_ip, mcat_group_msg.group_id )
return (
port_to_in_vlan,
port_to_out_vlan,
port_to_src_mac_str,
port_to_dst_mac_str,
port_to_src_ip_str,
Groups
)
def fill_mcast_pipeline_L3toL3(
controller,
logging,
ports,
is_ingress_tagged,
is_egress_tagged,
is_vlan_translated,
is_max_vlan
):
"""
This method, according to the scenario, fills properly
the pipeline. The method generates using ports data the
necessary information to fill the multicast pipeline and
fills properly the pipeline which consists in this scenario:
i) to create l2 interface groups;
ii)to create l3 interface groups;
iii) to create l3 multicast groups;
iv) to add multicast flows;
v) to add termination; flows;
vi) to add vlan flows
Scenarios:
1) ingress tagged, egress tagged, translation
"""
Groups = Queue.LifoQueue( )
MAX_INTERNAL_VLAN = 4094
port_to_in_vlan = {}
port_to_out_vlan = {}
port_to_src_mac = {}
port_to_src_mac_str = {}
port_to_dst_mac = {}
port_to_dst_mac_str = {}
port_to_src_ip = {}
port_to_src_ip_str = {}
port_to_intf_src_mac = {}
port_to_intf_src_mac_str = {}
src_ip_0 = 0xc0a80100
src_ip_0_str = "192.168.1.%s"
dst_ip = 0xe0000001
switch_mac = [ 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 ]
for port in ports:
in_vlan_id = port + 1
out_vlan_id = MAX_INTERNAL_VLAN - port
src_mac = [ 0x00, 0x11, 0x11, 0x11, 0x11, port ]
src_mac_str = ':'.join( [ '%02X' % x for x in src_mac ] )
dst_mac = [ 0x01, 0x00, 0x5e, 0x01, 0x01, port ]
dst_mac_str = ':'.join( [ '%02X' % x for x in dst_mac ] )
src_ip = src_ip_0 + port
src_ip_str = src_ip_0_str % port
intf_src_mac = [ 0x00, 0x00, 0x00, 0xcc, 0xcc, port ]
intf_src_mac_str = ':'.join( [ '%02X' % x for x in intf_src_mac ] )
port_to_in_vlan[port] = in_vlan_id
port_to_out_vlan[port] = out_vlan_id
port_to_src_mac[port] = src_mac
port_to_src_mac_str[port] = src_mac_str
port_to_dst_mac[port] = dst_mac
port_to_dst_mac_str[port] = dst_mac_str
port_to_src_ip[port] = src_ip
port_to_src_ip_str[port] = src_ip_str
port_to_intf_src_mac[port] = intf_src_mac
port_to_intf_src_mac_str[port] = intf_src_mac_str
for port in ports:
L3_Groups = []
for other_port in ports:
# add l2 interface group
l2gid, msg = add_one_l2_interface_group( controller, other_port, vlan_id=port_to_out_vlan[other_port],
is_tagged=True, send_barrier=False )
Groups._put( l2gid )
# add l3 interface group
l3group_ucast_msg = add_l3_interface_group( controller, other_port, port_to_out_vlan[other_port], port_to_in_vlan[other_port],
port_to_intf_src_mac[other_port] )
L3_Groups.append(l3group_ucast_msg.group_id)
Groups._put( l3group_ucast_msg.group_id )
# add mcast group
mcat_group_msg = add_l3_mcast_group( controller, port_to_in_vlan[port], port_to_in_vlan[port], L3_Groups )
Groups._put( mcat_group_msg.group_id )
# add mcast flow
add_mcast4_routing_flow( controller, port_to_in_vlan[port], port_to_src_ip[port], 0, dst_ip, mcat_group_msg.group_id )
# add termination flow
add_termination_flow( controller, port, 0x0800, switch_mac, port_to_in_vlan[port] )
# add vlan flow table
add_one_vlan_table_flow( controller, port, port_to_in_vlan[port], flag=VLAN_TABLE_FLAG_ONLY_TAG )
return (
port_to_in_vlan,
port_to_out_vlan,
port_to_src_mac_str,
port_to_dst_mac_str,
port_to_src_ip_str,
port_to_intf_src_mac_str,
Groups
)