Esempio n. 1
0
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;
}
Esempio n. 2
0
/*
========================================================================
Routine Description:
    Early checking and OS-depened parsing for Tx packet to AP device.

Arguments:
    NDIS_HANDLE 	MiniportAdapterContext	Pointer refer to the device handle, i.e., the pAd.
	PPNDIS_PACKET	ppPacketArray			The packet array need to do transmission.
	UINT			NumberOfPackets			Number of packet in packet array.

Return Value:
	NONE

Note:
	This function do early checking and classification for send-out packet.
	You only can put OS-depened & AP related code in here.
========================================================================
*/
VOID wdev_tx_pkts(NDIS_HANDLE dev_hnd, PPNDIS_PACKET pkt_list, UINT pkt_cnt, struct wifi_dev *wdev)
{
    RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev_hnd;
    PNDIS_PACKET pPacket;
    BOOLEAN allowToSend;
    UCHAR wcid = MCAST_WCID;
    UINT Index;



    for (Index = 0; Index < pkt_cnt; Index++)
    {
        pPacket = pkt_list[Index];

        if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
                                 fRTMP_ADAPTER_HALT_IN_PROGRESS |
                                 fRTMP_ADAPTER_RADIO_OFF |
                                 fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)))
        {
            /* Drop send request since hardware is in reset state */
            RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
            continue;
        }

        if ((wdev->allow_data_tx == TRUE) && (wdev->tx_pkt_allowed))
            allowToSend = wdev->tx_pkt_allowed(pAd, wdev, pPacket, &wcid);
        else
            allowToSend = FALSE;

        if (allowToSend == TRUE)
        {
            RTMP_SET_PACKET_WCID(pPacket, wcid);
            RTMP_SET_PACKET_WDEV(pPacket, wdev->wdev_idx);
            NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_PENDING);
            pAd->RalinkCounters.PendingNdisPacketCount++;

#ifdef CONFIG_AP_SUPPORT
            IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
            {
#ifdef DELAYED_TCP_ACK
                if(!delay_tcp_ack(pAd, wcid, pPacket))
#endif /* DELAYED_TCP_ACK */
                    APSendPacket(pAd, pPacket);
            }
#endif /* CONFIG_AP_SUPPORT */

        } else {
Esempio n. 3
0
UINT flush_tcp_ack_queue(PRTMP_ADAPTER pAd, PMAC_TABLE_ENTRY pEntry, BOOLEAN bCancelTimer)
{
    PNDIS_PACKET	pPacket;
    BOOLEAN Cancelled;
    UINT cnt = 0;

    if (bCancelTimer && pEntry->QueueAckTimerRunning == TRUE)
        RTMPCancelTimer(&pEntry->QueueAckTimer, &Cancelled);

    pEntry->QueueAckTimerRunning = FALSE;

    while (1)
    {
        pPacket = skb_dequeue(&pEntry->ack_queue);
        if (pPacket == NULL)
            break;

        cnt++;
        APSendPacket(pAd, pPacket);
    }

    return cnt;
}