BOOLEAN ApWdsAllowToSendPacket( IN RTMP_ADAPTER *pAd, IN PNDIS_PACKET pPacket, OUT UCHAR *pWcid) { UCHAR wdsIndex; BOOLEAN allowed; /*DBGPRINT(RT_DEBUG_TRACE, ("ApCliAllowToSendPacket():Packet to ApCli interface!\n")); */ wdsIndex = RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_WDS; if (ValidWdsEntry(pAd, wdsIndex)) { /* 3. send out the packet. b7 as WDS bit, b0-6 as WDS index when b7==1 */ *pWcid = (UCHAR)pAd->WdsTab.WdsEntry[wdsIndex].MacTabMatchWCID; /*RTMP_SET_PACKET_WCID(pPacket, pAd->WdsTab.WdsEntry[wdsIndex].MacTabMatchWCID); // to all WDS links. */ allowed = TRUE; } else { allowed = FALSE; } return allowed; }
INT ApWdsAllowToSendPacket( IN RTMP_ADAPTER *pAd, IN struct wifi_dev *wdev, IN PNDIS_PACKET pPacket, OUT UCHAR *pWcid) { UCHAR idx; INT allowed = FALSE; RT_802_11_WDS_ENTRY *wds_entry; if (!wdev) return FALSE; for (idx = 0; idx < MAX_WDS_ENTRY; idx++) { wds_entry = &pAd->WdsTab.WdsEntry[idx]; if (ValidWdsEntry(pAd, idx) && (wdev == (&wds_entry->wdev))) { RTMP_SET_PACKET_WDEV(pPacket, wdev->wdev_idx); *pWcid = (UCHAR)pAd->WdsTab.WdsEntry[idx].MacTabMatchWCID; allowed = TRUE; break; } } return allowed; }
VOID NotifyChSwAnnToPeerAPs( IN PRTMP_ADAPTER pAd, IN PUCHAR pRA, IN PUCHAR pTA, IN UINT8 ChSwMode, IN UINT8 Channel) { #ifdef WDS_SUPPORT if (!((pRA[0] & 0xff) == 0xff)) // is pRA a broadcase address. { INT i; // info neighbor APs that Radar signal found throgh WDS link. for (i = 0; i < MAX_WDS_ENTRY; i++) { if (ValidWdsEntry(pAd, i)) { PUCHAR pDA = pAd->WdsTab.WdsEntry[i].PeerWdsAddr; // DA equal to SA. have no necessary orignal AP which found Radar signal. if (MAC_ADDR_EQUAL(pTA, pDA)) continue; // send Channel Switch Action frame to info Neighbro APs. EnqueueChSwAnn(pAd, pDA, ChSwMode, Channel); } } } #endif // WDS_SUPPORT // }
int WDS_PacketSend( IN PNDIS_PACKET pSkb, IN PNET_DEV dev, IN RTMP_NET_PACKET_TRANSMIT Func) { UCHAR i; RTMP_ADAPTER *pAd; PNDIS_PACKET pPacket = (PNDIS_PACKET) pSkb; pAd = (PRTMP_ADAPTER) RTMP_OS_NETDEV_GET_PRIV(dev); #ifdef RALINK_ATE if (ATE_ON(pAd)) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); return 0; } #endif /* RALINK_ATE */ if ((RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); return 0; } if (!(RTMP_OS_NETDEV_STATE_RUNNING(dev))) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); return 0; } for (i = 0; i < MAX_WDS_ENTRY; i++) { if (ValidWdsEntry(pAd, i) && (pAd->WdsTab.WdsEntry[i].dev == dev)) { RTMP_SET_PACKET_NET_DEVICE_WDS(pSkb, i); SET_OS_PKT_NETDEV(pSkb, pAd->net_dev); return Func(pSkb); } } RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); return 0; }