[CORD-381] Implement L3McastToL2 tests

- Be careful with 224.1.1.1

Change-Id: I5c561f62956c669d946bf16cc6d09632b89d9688
diff --git a/ofdpa/utils.py b/ofdpa/utils.py
index 5bbce7f..0b8ab77 100644
--- a/ofdpa/utils.py
+++ b/ofdpa/utils.py
@@ -3,6 +3,126 @@
 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,
@@ -99,4 +219,4 @@
         port_to_src_ip_str,
         port_to_intf_src_mac_str,
         Groups
-        )
\ No newline at end of file
+        )