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); }
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); }