void rtl8367_mcast_group_event(const u8 *mac_src, const u8 *mac_dst, const char *dev_name, int is_leave)
{
	int port_id;
	u16 port_efid, port_fid;
	u32 lan_grp_mask;

	if (!g_igmp_snooping_enabled)
		return;

#ifdef RTL8367_DBG
	printk("rtl8367_mcast_group_%s(SRC: %02X-%02X-%02X-%02X-%02X-%02X, DST: %02X-%02X-%02X-%02X-%02X-%02X, dev: %s)\n", 
			(!is_leave) ? "enter" : "leave",
			mac_src[0], mac_src[1], mac_src[2],
			mac_src[3], mac_src[4], mac_src[5],
			mac_dst[0], mac_dst[1], mac_dst[2],
			mac_dst[3], mac_dst[4], mac_dst[5],
			dev_name
		);
#endif

	/* check source MAC is unicast */
	if (mac_src[0] & 0x01)
		return;

	/* listen eth2/eth2.1/eth2.3 events only */
	if (strncmp(dev_name, "eth2", 4) != 0)
		return;

	port_efid = 0; // always use efid = 0 for LAN group
	port_fid = 1;
#if defined(EXT_PORT_INIC)
	if (strcmp(dev_name, "eth2.3") == 0)
		port_fid = INIC_GUEST_FID;
#endif

	/* get port_id by unicast source MAC in l2 lookup table */
	spin_lock(&g_lut_lock);
	port_id = asic_find_port_with_ucast_mac(mac_src, port_efid, port_fid);
	spin_unlock(&g_lut_lock);

	/* check valid port_id */
	if (port_id < 0 || port_id >= RTK_MAX_NUM_OF_PORT)
		return;

	lan_grp_mask = get_phy_ports_mask_lan(0);
#if defined(EXT_PORT_INIC)
	lan_grp_mask |= (1u << EXT_PORT_INIC);
#endif

	/* check this port_id in LAN group */
	if (!((1u << port_id) & lan_grp_mask))
		return;

	on_mcast_group_event(mac_dst, mac_src, port_efid, port_fid, (u32)port_id, is_leave);
}
Exemple #2
0
static void
mcast_group_event_wq(struct work_struct *work)
{
	int port_id;
	u32 lan_grp_mask;
	struct mcast_work *mw = container_of(work, struct mcast_work, ws);

#ifdef RTL8367_DBG
	const char *s_event = "enter";

	if (mw->is_leave == 2)
		s_event = "leave_last";
	else if (mw->is_leave == 1)
		s_event = "leave";

	printk("rtl8367_mcast_group_%s(SRC: %02X-%02X-%02X-%02X-%02X-%02X, DST: %02X-%02X-%02X-%02X-%02X-%02X, cvid_fid: %d)\n", 
			s_event,
			mw->mac_src[0], mw->mac_src[1], mw->mac_src[2],
			mw->mac_src[3], mw->mac_src[4], mw->mac_src[5],
			mw->mac_dst[0], mw->mac_dst[1], mw->mac_dst[2],
			mw->mac_dst[3], mw->mac_dst[4], mw->mac_dst[5],
			mw->port_cvid_fid
		);
#endif

	/* get port_id by unicast source MAC in l2 lookup table */
	mutex_lock(&g_lut_lock);
	port_id = asic_find_port_with_ucast_mac(mw->mac_src, mw->port_efid, mw->port_cvid_fid);
	mutex_unlock(&g_lut_lock);

	/* check valid port_id */
	if (port_id >= 0 && port_id < RTK_MAX_NUM_OF_PORT) {
		lan_grp_mask = get_phy_ports_mask_lan(0);
#if defined(EXT_PORT_INIC)
		lan_grp_mask |= (1u << EXT_PORT_INIC);
#endif
		/* check this port_id in LAN group */
		if ((1u << port_id) & lan_grp_mask)
			on_mcast_group_event(mw->mac_dst, mw->mac_src, mw->port_efid, mw->port_cvid_fid, (u32)port_id, (int)mw->is_leave);
	}

	kfree(mw);
}