VOID MultipathEntryInsert( IN PRTMP_ADAPTER pAd, IN UCHAR LinkIdx, IN PUCHAR pMac) { PMESH_MULTIPATH_ENTRY pEntry; UINT8 HashId = *(pMac + 5); ULONG Now; if (!VALID_MESH_LINK_ID(LinkIdx)) return; pEntry = MultipathEntryLookUp(pAd, LinkIdx, pMac); if(pEntry == NULL) { if ((pEntry = MultipathEntyAlloc(pAd)) == NULL) return; insertTailList(&pAd->MeshTab.MeshLink[LinkIdx].Entry.MultiPathHash[HashId], (PLIST_ENTRY)pEntry); } DBGPRINT(RT_DEBUG_TRACE, ("Block multipath pkt to link(%d) from SA=%02x:%02x:%02x:%02x:%02x:%02x\n", LinkIdx, pMac[0], pMac[1], pMac[2], pMac[3], pMac[4], pMac[5])); NdisGetSystemUpTime(&Now); COPY_MAC_ADDR(pEntry->MeshSA, pMac); pEntry->ReferTime = Now; return; }
VOID MeshClonePacket( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, IN UINT8 MeshSrc, IN UINT8 MeshLinkIdx) { INT idx; PUCHAR pSA = NULL; PUCHAR pDA = NULL; for (idx = 0; idx < MAX_MESH_LINKS; idx++) { if ((MeshSrc == MESH_FORWARD) && (MeshLinkIdx == idx)) continue; pSA = GET_OS_PKT_DATAPTR(pPacket) + MAC_ADDR_LEN; if (MAC_ADDR_EQUAL(pAd->MeshTab.MeshLink[idx].Entry.PeerMacAddr, pSA)) continue; pDA = GET_OS_PKT_DATAPTR(pPacket); if (IS_MULTICAST_MAC_ADDR(pDA) && (MultipathEntryLookUp(pAd, idx, pSA) != NULL)) continue; if (PeerLinkValidCheck(pAd, idx) == TRUE) { PNDIS_PACKET pPacketClone; /* pPacketClone = skb_clone(RTPKT_TO_OSPKT(pPacket), GFP_ATOMIC); */ OS_PKT_CLONE(pAd, pPacket, pPacketClone, GFP_ATOMIC); if (pPacketClone == NULL) continue; RTMP_SET_PACKET_NET_DEVICE_MESH(pPacketClone, 0); RTMP_SET_PACKET_SOURCE(pPacketClone, PKTSRC_NDIS); RTMP_SET_PACKET_MOREDATA(pPacketClone, FALSE); RTMP_SET_PACKET_WCID(pPacketClone, pAd->MeshTab.MeshLink[idx].Entry.MacTabMatchWCID); RTMP_SET_MESH_ROUTE_ID(pPacketClone, BMCAST_ROUTE_ID); RTMP_SET_MESH_SOURCE(pPacketClone, MeshSrc); #ifdef CONFIG_AP_SUPPORT APSendPacket(pAd, pPacketClone); #endif /* CONFIG_AP_SUPPORT */ #ifdef CONFIG_STA_SUPPORT STASendPacket(pAd, pPacketClone); #endif /* CONFIG_STA_SUPPORT */ } } return; }
VOID MultipathEntryDelete( IN PRTMP_ADAPTER pAd, IN UCHAR LinkIdx, IN PUCHAR pMac) { UINT8 HashId = *(pMac + 5); PMESH_MULTIPATH_ENTRY pEntry; if (!VALID_MESH_LINK_ID(LinkIdx)) return; pEntry = MultipathEntryLookUp(pAd, LinkIdx, pMac); if (pEntry != NULL) { DBGPRINT(RT_DEBUG_TRACE, ("release multipath pkt to link(%d) from SA=%02x:%02x:%02x:%02x:%02x:%02x\n", LinkIdx, pMac[0], pMac[1], pMac[2], pMac[3], pMac[4], pMac[5])); delEntryList(&pAd->MeshTab.MeshLink[LinkIdx].Entry.MultiPathHash[HashId], (PLIST_ENTRY)pEntry); MultipathEntyFree(pAd, pEntry); } }