VOID IgmpGroupDelMembers( IN PRTMP_ADAPTER pAd, IN PUCHAR pMemberAddr, IN PNET_DEV pDev) { int i; MULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL; PMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable; for (i = 0; i < MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++) { /* pick up the first available vacancy */ pEntry = &pMulticastFilterTable->Content[i]; if (pEntry->Valid == TRUE) { if(pMemberAddr != NULL) { RTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock); DeleteIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr); RTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock); } if((pEntry->type == MCAT_FILTER_DYNAMIC) && (IgmpMemberCnt(&pEntry->MemberList) == 0)) MulticastFilterTableDeleteEntry(pAd, pEntry->Addr, pMemberAddr, pDev); } } }
/* ========================================================================== Description: Display all entrys in IGMP table ========================================================================== */ static VOID IGMPTableDisplay( IN PRTMP_ADAPTER pAd) { int i; MULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL; PMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable; printk("Multicast filter table: "); if (pMulticastFilterTable == NULL) { printk("Table is not ready!\n"); return; } // if FULL, return if (pMulticastFilterTable->Size == 0) { printk("Table is empty.\n"); return; } printk("\n"); // allocate one MAC entry RTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock); for (i = 0; i< MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++) { // pick up the first available vacancy if (pMulticastFilterTable->Content[i].Valid == TRUE) { PMEMBER_ENTRY pMemberEntry = NULL; pEntry = &pMulticastFilterTable->Content[i]; printk("IF(%s) entry #%d, type=%s, GrpId=(%02x:%02x:%02x:%02x:%02x:%02x) memberCnt=%d\n", RTMP_OS_NETDEV_GET_DEVNAME(pEntry->net_dev), i, (pEntry->type==0 ? "static":"dynamic"), PRINT_MAC(pEntry->Addr), IgmpMemberCnt(&pEntry->MemberList)); pMemberEntry = (PMEMBER_ENTRY)pEntry->MemberList.pHead; while (pMemberEntry) { printk(" member MAC=(%02x:%02x:%02x:%02x:%02x:%02x)\n", PRINT_MAC(pMemberEntry->Addr)); pMemberEntry = pMemberEntry->pNext; } } } RTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock); return; }
/* ========================================================================== Description: Display all entrys in IGMP table ========================================================================== */ static VOID IGMPTableDisplay( IN PRTMP_ADAPTER pAd) { int i; MULTICAST_FILTER_TABLE_ENTRY *pEntry = NULL; PMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable; if (pMulticastFilterTable == NULL) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("%s Multicase filter table is not ready.\n", __FUNCTION__)); return; } /* if FULL, return */ if (pMulticastFilterTable->Size == 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("Table empty.\n")); return; } /* allocate one MAC entry */ RTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock); for (i = 0; i< MAX_LEN_OF_MULTICAST_FILTER_TABLE; i++) { /* pick up the first available vacancy */ if (pMulticastFilterTable->Content[i].Valid == TRUE) { PMEMBER_ENTRY pMemberEntry = NULL; pEntry = &pMulticastFilterTable->Content[i]; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("IF(%s) entry #%d, type=%s, GrpId=(%02x:%02x:%02x:%02x:%02x:%02x) memberCnt=%d\n", RTMP_OS_NETDEV_GET_DEVNAME(pEntry->net_dev), i, (pEntry->type==0 ? "static":"dynamic"), PRINT_MAC(pEntry->Addr), IgmpMemberCnt(&pEntry->MemberList))); pMemberEntry = (PMEMBER_ENTRY)pEntry->MemberList.pHead; while (pMemberEntry) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_OFF, ("member mac=(%02x:%02x:%02x:%02x:%02x:%02x)\n", PRINT_MAC(pMemberEntry->Addr))); pMemberEntry = pMemberEntry->pNext; } } } RTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock); return; }
/* ========================================================================== Description: Delete a specified client from MAC table ========================================================================== */ BOOLEAN MulticastFilterTableDeleteEntry( IN PRTMP_ADAPTER pAd, IN PUCHAR pGrpId, IN PUCHAR pMemberAddr, IN PNET_DEV dev) { USHORT HashIdx; MULTICAST_FILTER_TABLE_ENTRY *pEntry, *pPrevEntry; PMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable; if (pMulticastFilterTable == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("%s Multicase filter table is not ready.\n", __FUNCTION__)); return FALSE; } RTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock); do { HashIdx = MULTICAST_ADDR_HASH_INDEX(pGrpId); pPrevEntry = pEntry = pMulticastFilterTable->Hash[HashIdx]; while (pEntry && pEntry->Valid) { if ((pEntry->net_dev == dev) && MAC_ADDR_EQUAL(pEntry->Addr, pGrpId)) break; else { pPrevEntry = pEntry; pEntry = pEntry->pNext; } } /* check the rule is in table already or not. */ if (pEntry && (pMemberAddr != NULL)) { /*USHORT Aid = MCAST_WCID; */ /*SST Sst = SST_ASSOC; */ /*UCHAR PsMode = PWR_ACTIVE, Rate; */ /*if(APSsPsInquiry(pAd, pMemberAddr, &Sst, &Aid, &PsMode, &Rate)) */ DeleteIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr); if (IgmpMemberCnt(&pEntry->MemberList) > 0) break; } if (pEntry) { if (pEntry == pMulticastFilterTable->Hash[HashIdx]) { pMulticastFilterTable->Hash[HashIdx] = pEntry->pNext; DeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList); NdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY)); pMulticastFilterTable->Size --; DBGPRINT(RT_DEBUG_TRACE, ("MCastFilterTableDeleteEntry 1 - Total= %d\n", pMulticastFilterTable->Size)); } else { pPrevEntry->pNext = pEntry->pNext; DeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList); NdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY)); pMulticastFilterTable->Size --; DBGPRINT(RT_DEBUG_TRACE, ("MCastFilterTableDeleteEntry 2 - Total= %d\n", pMulticastFilterTable->Size)); } } else { DBGPRINT(RT_DEBUG_ERROR, ("%s: the Group doesn't exist.\n", __FUNCTION__)); } } while(FALSE); RTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock); return TRUE; }
/* ========================================================================== Description: Delete a specified client from MAC table ========================================================================== */ BOOLEAN MulticastFilterTableDeleteEntry( IN PRTMP_ADAPTER pAd, IN PUCHAR pGrpId, IN PUCHAR pMemberAddr, IN PNET_DEV dev) { USHORT HashIdx; MULTICAST_FILTER_TABLE_ENTRY *pEntry, *pPrevEntry; PMULTICAST_FILTER_TABLE pMulticastFilterTable = pAd->pMulticastFilterTable; if (pMulticastFilterTable == NULL) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s Multicase filter table is not ready.\n", __FUNCTION__)); return FALSE; } RTMP_SEM_LOCK(&pMulticastFilterTable->MulticastFilterTabLock); do { HashIdx = MULTICAST_ADDR_HASH_INDEX(pGrpId); pPrevEntry = pEntry = pMulticastFilterTable->Hash[HashIdx]; while (pEntry && pEntry->Valid) { if ((pEntry->net_dev == dev) && MAC_ADDR_EQUAL(pEntry->Addr, pGrpId)) break; else { pPrevEntry = pEntry; pEntry = pEntry->pNext; } } /* check the rule is in table already or not. */ if (pEntry && (pMemberAddr != NULL)) { DeleteIgmpMember(pMulticastFilterTable, &pEntry->MemberList, pMemberAddr); if (IgmpMemberCnt(&pEntry->MemberList) > 0) break; } if (pEntry) { if (pEntry == pMulticastFilterTable->Hash[HashIdx]) { pMulticastFilterTable->Hash[HashIdx] = pEntry->pNext; DeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList); NdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY)); pMulticastFilterTable->Size --; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("MCastFilterTableDeleteEntry 1 - Total= %d\n", pMulticastFilterTable->Size)); } else { pPrevEntry->pNext = pEntry->pNext; DeleteIgmpMemberList(pMulticastFilterTable, &pEntry->MemberList); NdisZeroMemory(pEntry, sizeof(MULTICAST_FILTER_TABLE_ENTRY)); pMulticastFilterTable->Size --; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("MCastFilterTableDeleteEntry 2 - Total= %d\n", pMulticastFilterTable->Size)); } } else { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: the Group doesn't exist.\n", __FUNCTION__)); } } while(FALSE); RTMP_SEM_UNLOCK(&pMulticastFilterTable->MulticastFilterTabLock); return TRUE; }