示例#1
0
/*
========================================================================
Routine Description:
	write high memory.
	if firmware do not support auto high/low memory switching, we should switch to high memory by ourself.

Arguments:
	pAd				- WLAN control block pointer
	Offset			- Memory offsets
	Value			- Written value
	Unit				- Unit in "Byte"

Return Value:
	None

Note:
========================================================================
*/
VOID RtmpChipWriteHighMemory(
	IN RTMP_ADAPTER *pAd,
	IN USHORT Offset,
	IN UINT32 Value,
	IN UINT8 Unit)
{
#ifdef RTMP_MAC_PCI
#ifdef SPECIFIC_BCN_BUF_SUPPORT
unsigned long irqFlag = 0;
	RTMP_MAC_SHR_MSEL_LOCK(pAd, HIGHER_SHRMEM, irqFlag);
	RtmpChipWriteMemory(pAd, Offset, Value, Unit);
	RTMP_MAC_SHR_MSEL_UNLOCK(pAd, LOWER_SHRMEM, irqFlag);
#endif /* SPECIFIC_BCN_BUF_SUPPORT */
#endif /* RTMP_MAC_PCI */
}
示例#2
0
/*
	==========================================================================
	Description:
		Pre-build a BEACON frame in the shared memory
	==========================================================================
*/
VOID APMakeBssBeacon(
	IN PRTMP_ADAPTER	pAd,
	IN INT				apidx)
{
	UCHAR         DsLen = 1, SsidLen;//, TimLen = 4,
				  //BitmapControl = 0, VirtualBitmap = 0, EmptySsidLen = 0, SsidLen;
//	UCHAR         RSNIe=IE_WPA, RSNIe2=IE_WPA2;
	HEADER_802_11 BcnHdr;
	LARGE_INTEGER FakeTimestamp;
	ULONG         FrameLen = 0;
	PTXWI_STRUC    pTxWI = &pAd->BeaconTxWI;
	PUCHAR        pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;
	UCHAR  *ptr;
	UINT  i;
	UINT32 longValue;
	HTTRANSMIT_SETTING	BeaconTransmit;   // MGMT frame PHY rate setting when operatin at Ht rate.
	UCHAR PhyMode, SupRateLen;
#ifdef SPECIFIC_BCN_BUF_SUPPORT
	unsigned long irqFlag = 0;
#endif // SPECIFIC_BCN_BUF_SUPPORT //
	BOOLEAN		bHasWpsIE = FALSE;

	if(!BeaconTransmitRequired(pAd, apidx, &pAd->ApCfg.MBSSID[apidx]))
		return;

	PhyMode = pAd->ApCfg.MBSSID[apidx].PhyMode;

	if (pAd->ApCfg.MBSSID[apidx].bHideSsid)
		SsidLen = 0;
	else
		SsidLen = pAd->ApCfg.MBSSID[apidx].SsidLen;

	MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR, pAd->ApCfg.MBSSID[apidx].Bssid);

	
	// for update framelen to TxWI later.
	SupRateLen = pAd->CommonCfg.SupRateLen;
	if (PhyMode == PHY_11B)
		SupRateLen = 4;

	MakeOutgoingFrame(pBeaconFrame,                  &FrameLen,
					sizeof(HEADER_802_11),           &BcnHdr, 
					TIMESTAMP_LEN,                   &FakeTimestamp,
					2,                               &pAd->CommonCfg.BeaconPeriod,
					2,                               &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,
					1,                               &SsidIe, 
					1,                               &SsidLen, 
					SsidLen,                         pAd->ApCfg.MBSSID[apidx].Ssid,
					1,                               &SupRateIe, 
					1,                               &SupRateLen,
					SupRateLen,                      pAd->CommonCfg.SupRate, 
					1,                               &DsIe, 
					1,                               &DsLen, 
					1,                               &pAd->CommonCfg.Channel,
					END_OF_ARGS);

	if ((pAd->CommonCfg.ExtRateLen) && (PhyMode != PHY_11B))
	{
		ULONG TmpLen;
		MakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,
						1,                               &ExtRateIe, 
						1,                               &pAd->CommonCfg.ExtRateLen,
						pAd->CommonCfg.ExtRateLen,           pAd->CommonCfg.ExtRate, 
						END_OF_ARGS);
		FrameLen += TmpLen;
	}


    // add country IE, power constraint IE
	if (pAd->CommonCfg.bCountryFlag)
	{
		ULONG TmpLen, TmpLen2=0;
		UCHAR TmpFrame[256];
		UCHAR CountryIe = IE_COUNTRY;

		NdisZeroMemory(TmpFrame, sizeof(TmpFrame));

		// prepare channel information
#ifdef EXT_BUILD_CHANNEL_LIST
		BuildBeaconChList(pAd, TmpFrame, &TmpLen2);
#else
		{
			UCHAR MaxTxPower = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel);
			MakeOutgoingFrame(TmpFrame+TmpLen2,     &TmpLen,
								1,                 	&pAd->ChannelList[0].Channel,
								1,                 	&pAd->ChannelListNum,
								1,                 	&MaxTxPower,
								END_OF_ARGS);
			TmpLen2 += TmpLen;
		}
#endif // EXT_BUILD_CHANNEL_LIST //


		// need to do the padding bit check, and concatenate it
		if ((TmpLen2%2) == 0)
		{
			UCHAR	TmpLen3 = TmpLen2+4;
			MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
			                  1,                 	&CountryIe,
			                  1,                 	&TmpLen3,
			                  3,                 	pAd->CommonCfg.CountryCode,
			                  TmpLen2+1,				TmpFrame,
			                  END_OF_ARGS);
		}
		else
		{
			UCHAR	TmpLen3 = TmpLen2+3;
			MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
			                  1,                 	&CountryIe,
			                  1,                 	&TmpLen3,
			                  3,                 	pAd->CommonCfg.CountryCode,
			                  TmpLen2,				TmpFrame,
			                  END_OF_ARGS);
		}
		FrameLen += TmpLen;
	}


#ifdef DOT11_N_SUPPORT
	// AP Channel Report
	{
		UCHAR APChannelReportIe = IE_AP_CHANNEL_REPORT;
		ULONG	TmpLen;

		// 802.11n D2.0 Annex J
		// USA
		// regulatory class 32, channel set 1~7
		// regulatory class 33, channel set 5-11

		UCHAR rclass32[]={32, 1, 2, 3, 4, 5, 6, 7};
        UCHAR rclass33[]={33, 5, 6, 7, 8, 9, 10, 11};
		UCHAR rclasslen = 8; //sizeof(rclass32);
		if (PhyMode == PHY_11BGN_MIXED)
		{
			MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
							  1,                    &APChannelReportIe,
							  1,                    &rclasslen,
							  rclasslen,            rclass32,
   							  1,                    &APChannelReportIe,
							  1,                    &rclasslen,
							  rclasslen,            rclass33,
							  END_OF_ARGS);
			FrameLen += TmpLen;		
		}
	}

#endif // DOT11_N_SUPPORT //

#ifdef WSC_AP_SUPPORT
    // add Simple Config Information Element
    if (((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode >= 1) && (pAd->ApCfg.MBSSID[apidx].WscIEBeacon.ValueLen)))
    {
    	bHasWpsIE = TRUE;
    }

    if ((pAd->ApCfg.MBSSID[apidx].WscControl.WscConfMode != WSC_DISABLE) &&
#ifdef DOT1X_SUPPORT
        (pAd->ApCfg.MBSSID[apidx].IEEE8021X == FALSE) && 
#endif // DOT1X_SUPPORT //		
        (pAd->ApCfg.MBSSID[apidx].WepStatus == Ndis802_11WEPEnabled))
    {
        /*
            Non-WPS Windows XP and Vista PCs are unable to determine if a WEP enalbed network is static key based 
            or 802.1X based. If the legacy station gets an EAP-Rquest/Identity from the AP, it assume the WEP
            network is 802.1X enabled & will prompt the user for 802.1X credentials. If the legacy station doesn't
            receive anything after sending an EAPOL-Start, it will assume the WEP network is static key based and
            prompt user for the WEP key. <<from "WPS and Static Key WEP Networks">>
            A WPS enabled AP should include this IE in the beacon when the AP is hosting a static WEP key network.  
            The IE would be 7 bytes long with the Extended Capability field set to 0 (all bits zero)
            http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
        */
        ULONG TempLen = 0;
        UCHAR PROVISION_SERVICE_IE[7] = {0xDD, 0x05, 0x00, 0x50, 0xF2, 0x05, 0x00};
        MakeOutgoingFrame(pBeaconFrame+FrameLen,        &TempLen,
						  7,                            PROVISION_SERVICE_IE,
                          END_OF_ARGS);
        FrameLen += TempLen;
    }
#endif // WSC_AP_SUPPORT //
 	

	BeaconTransmit.word = 0;
	RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID, 
		FrameLen, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit);


	//
	// step 6. move BEACON TXD and frame content to on-chip memory
	//
	ptr = (PUCHAR)&pAd->BeaconTxWI;
#ifdef RT_BIG_ENDIAN
    RTMPWIEndianChange(ptr, TYPE_TXWI);
#endif

#ifdef SPECIFIC_BCN_BUF_SUPPORT
	/*
		Shared memory access selection (higher 8KB shared memory)
	*/
	if (pAd->BcnCB.bHighShareMemSupport == 1)	
		RTMP_MAC_SHR_MSEL_LOCK(pAd, HIGHER_SHRMEM, irqFlag);
		
#endif // SPECIFIC_BCN_BUF_SUPPORT //

	for (i=0; i<TXWI_SIZE; i+=4)  // 16-byte TXWI field
	{
		longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
		RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx] + i, longValue);
		ptr += 4;
	}

	// update BEACON frame content. start right after the 16-byte TXWI field.
	ptr = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;
#ifdef RT_BIG_ENDIAN
    RTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE);
#endif

	for (i= 0; i< FrameLen; i+=4)
	{
		longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
		RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx] + TXWI_SIZE + i, longValue);
		ptr += 4;
	}

#ifdef SPECIFIC_BCN_BUF_SUPPORT
	/*
		Shared memory access selection (lower 16KB shared memory)
	*/
	if (pAd->BcnCB.bHighShareMemSupport == 1)
		RTMP_MAC_SHR_MSEL_UNLOCK(pAd, LOWER_SHRMEM, irqFlag);	
#endif // SPECIFIC_BCN_BUF_SUPPORT //


	pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon = (UCHAR)FrameLen; 
	pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon = sizeof(HEADER_802_11) + TIMESTAMP_LEN + 2;
}
示例#3
0
/*
	==========================================================================
	Description:
		Pre-build a BEACON frame in the shared memory
	==========================================================================
*/
VOID APMakeBssBeacon(
    IN PRTMP_ADAPTER	pAd,
    IN INT				apidx)
{
    UCHAR         DsLen = 1, SsidLen;/*, TimLen = 4, */
    /*BitmapControl = 0, VirtualBitmap = 0, EmptySsidLen = 0, SsidLen; */
    /*	UCHAR         RSNIe=IE_WPA, RSNIe2=IE_WPA2; */
    HEADER_802_11 BcnHdr;
    LARGE_INTEGER FakeTimestamp;
    ULONG         FrameLen = 0;
    PTXWI_STRUC    pTxWI = &pAd->BeaconTxWI;
    PUCHAR        pBeaconFrame = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;
    UCHAR  *ptr;
    UINT  i;
    UINT32 longValue;
    HTTRANSMIT_SETTING	BeaconTransmit;   /* MGMT frame PHY rate setting when operatin at Ht rate. */
    UCHAR PhyMode, SupRateLen;
#ifdef SPECIFIC_BCN_BUF_SUPPORT
    unsigned long irqFlag = 0;
#endif /* SPECIFIC_BCN_BUF_SUPPORT */

    if(!BeaconTransmitRequired(pAd, apidx, &pAd->ApCfg.MBSSID[apidx]))
        return;

    PhyMode = pAd->ApCfg.MBSSID[apidx].PhyMode;

    if (pAd->ApCfg.MBSSID[apidx].bHideSsid)
        SsidLen = 0;
    else
        SsidLen = pAd->ApCfg.MBSSID[apidx].SsidLen;

    MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR,
#ifdef P2P_SUPPORT
                     pAd->ApCfg.MBSSID[apidx].Bssid,
#endif /* P2P_SUPPORT */
                     pAd->ApCfg.MBSSID[apidx].Bssid);


    /* for update framelen to TxWI later. */
    SupRateLen = pAd->CommonCfg.SupRateLen;
    if (PhyMode == PHY_11B)
        SupRateLen = 4;

#ifdef P2P_SUPPORT
    if (P2P_GO_ON(pAd))
    {
        UCHAR		SupRate[MAX_LEN_OF_SUPPORTED_RATES];
        UCHAR		SupRateIe = IE_SUPP_RATES;
        UCHAR		SupRateLen = 0;

        SupRate[0]	= 0x8C;    /* 6 mbps, in units of 0.5 Mbps, basic rate */
        SupRate[1]	= 0x12;    /* 9 mbps, in units of 0.5 Mbps */
        SupRate[2]	= 0x98;    /* 12 mbps, in units of 0.5 Mbps, basic rate */
        SupRate[3]	= 0x24;    /* 18 mbps, in units of 0.5 Mbps */
        SupRate[4]	= 0xb0;    /* 24 mbps, in units of 0.5 Mbps, basic rate */
        SupRate[5]	= 0x48;    /* 36 mbps, in units of 0.5 Mbps */
        SupRate[6]	= 0x60;    /* 48 mbps, in units of 0.5 Mbps */
        SupRate[7]	= 0x6c;    /* 54 mbps, in units of 0.5 Mbps */
        SupRateLen	= 8;

        MakeOutgoingFrame(pBeaconFrame,                  &FrameLen,
                          sizeof(HEADER_802_11),           &BcnHdr,
                          TIMESTAMP_LEN,                   &FakeTimestamp,
                          2,                               &pAd->CommonCfg.BeaconPeriod,
                          2,                               &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,
                          1,                               &SsidIe,
                          1,                               &SsidLen,
                          SsidLen,                       pAd->ApCfg.MBSSID[apidx].Ssid,
                          1,                               &SupRateIe,
                          1,                               &SupRateLen,
                          SupRateLen,                 &SupRate,
                          1,                               &DsIe,
                          1,                               &DsLen,
                          1,                               &pAd->CommonCfg.Channel,
                          END_OF_ARGS);

    }
    else
#endif /* P2P_SUPPORT */
        MakeOutgoingFrame(pBeaconFrame,                  &FrameLen,
                          sizeof(HEADER_802_11),           &BcnHdr,
                          TIMESTAMP_LEN,                   &FakeTimestamp,
                          2,                               &pAd->CommonCfg.BeaconPeriod,
                          2,                               &pAd->ApCfg.MBSSID[apidx].CapabilityInfo,
                          1,                               &SsidIe,
                          1,                               &SsidLen,
                          SsidLen,                         pAd->ApCfg.MBSSID[apidx].Ssid,
                          1,                               &SupRateIe,
                          1,                               &SupRateLen,
                          SupRateLen,                      pAd->CommonCfg.SupRate,
                          1,                               &DsIe,
                          1,                               &DsLen,
                          1,                               &pAd->CommonCfg.Channel,
                          END_OF_ARGS);

    if ((pAd->CommonCfg.ExtRateLen) && (PhyMode != PHY_11B))
    {
        ULONG TmpLen;
        MakeOutgoingFrame(pBeaconFrame+FrameLen,         &TmpLen,
                          1,                               &ExtRateIe,
                          1,                               &pAd->CommonCfg.ExtRateLen,
                          pAd->CommonCfg.ExtRateLen,           pAd->CommonCfg.ExtRate,
                          END_OF_ARGS);
        FrameLen += TmpLen;
    }


    /* add country IE, power constraint IE */
    if (pAd->CommonCfg.bCountryFlag)
    {
        ULONG TmpLen, TmpLen2=0;
        /*		UCHAR TmpFrame[256]; */
        UCHAR *TmpFrame = NULL;
        UCHAR CountryIe = IE_COUNTRY;

        os_alloc_mem(NULL, (UCHAR **)&TmpFrame, 256);
        if (TmpFrame != NULL)
        {
            NdisZeroMemory(TmpFrame, sizeof(TmpFrame));

            /* prepare channel information */
#ifdef EXT_BUILD_CHANNEL_LIST
            BuildBeaconChList(pAd, TmpFrame, &TmpLen2);
#else
            {
                UCHAR MaxTxPower = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel);
                MakeOutgoingFrame(TmpFrame+TmpLen2,     &TmpLen,
                                  1,                 	&pAd->ChannelList[0].Channel,
                                  1,                 	&pAd->ChannelListNum,
                                  1,                 	&MaxTxPower,
                                  END_OF_ARGS);
                TmpLen2 += TmpLen;
            }
#endif /* EXT_BUILD_CHANNEL_LIST */


            /* need to do the padding bit check, and concatenate it */
            if ((TmpLen2%2) == 0)
            {
                UCHAR	TmpLen3 = TmpLen2+4;
                MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
                                  1,                 	&CountryIe,
                                  1,                 	&TmpLen3,
                                  3,                 	pAd->CommonCfg.CountryCode,
                                  TmpLen2+1,				TmpFrame,
                                  END_OF_ARGS);
            }
            else
            {
                UCHAR	TmpLen3 = TmpLen2+3;
                MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
                                  1,                 	&CountryIe,
                                  1,                 	&TmpLen3,
                                  3,                 	pAd->CommonCfg.CountryCode,
                                  TmpLen2,				TmpFrame,
                                  END_OF_ARGS);
            }
            FrameLen += TmpLen;

            os_free_mem(NULL, TmpFrame);
        }
        else
            DBGPRINT(RT_DEBUG_ERROR, ("%s: Allocate memory fail!!!\n", __FUNCTION__));
    }


#ifdef DOT11_N_SUPPORT
    /* AP Channel Report */
    {
        UCHAR APChannelReportIe = IE_AP_CHANNEL_REPORT;
        ULONG	TmpLen;

        /* 802.11n D2.0 Annex J */
        /* USA */
        /* regulatory class 32, channel set 1~7 */
        /* regulatory class 33, channel set 5-11 */

        UCHAR rclass32[]= {32, 1, 2, 3, 4, 5, 6, 7};
        UCHAR rclass33[]= {33, 5, 6, 7, 8, 9, 10, 11};
        UCHAR rclasslen = 8; /*sizeof(rclass32); */
        if (PhyMode == PHY_11BGN_MIXED)
        {
            MakeOutgoingFrame(pBeaconFrame+FrameLen,&TmpLen,
                              1,                    &APChannelReportIe,
                              1,                    &rclasslen,
                              rclasslen,            rclass32,
                              1,                    &APChannelReportIe,
                              1,                    &rclasslen,
                              rclasslen,            rclass33,
                              END_OF_ARGS);
            FrameLen += TmpLen;
        }
    }

#endif /* DOT11_N_SUPPORT */



    BeaconTransmit.word = 0;
    RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, BSS0Mcast_WCID,
                  FrameLen, PID_MGMT, 0, 0,IFS_HTTXOP, FALSE, &BeaconTransmit);


    /* */
    /* step 6. move BEACON TXD and frame content to on-chip memory */
    /* */
    ptr = (PUCHAR)&pAd->BeaconTxWI;
#ifdef RT_BIG_ENDIAN
    RTMPWIEndianChange(ptr, TYPE_TXWI);
#endif

#ifdef SPECIFIC_BCN_BUF_SUPPORT
    /*
    	Shared memory access selection (higher 8KB shared memory)
    */
    RTMP_MAC_SHR_MSEL_LOCK(pAd, HIGHER_SHRMEM, irqFlag);
#endif /* SPECIFIC_BCN_BUF_SUPPORT */

    for (i=0; i<TXWI_SIZE; i+=4)  /* 16-byte TXWI field */
    {
        longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
        RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx] + i, longValue);
        ptr += 4;
    }

    /* update BEACON frame content. start right after the 16-byte TXWI field. */
    ptr = (PUCHAR)pAd->ApCfg.MBSSID[apidx].BeaconBuf;
#ifdef RT_BIG_ENDIAN
    RTMPFrameEndianChange(pAd, ptr, DIR_WRITE, FALSE);
#endif

    for (i= 0; i< FrameLen; i+=4)
    {
        longValue =  *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24);
        RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[pAd->ApCfg.MBSSID[apidx].BcnBufIdx] + TXWI_SIZE + i, longValue);
        ptr += 4;
    }

#ifdef SPECIFIC_BCN_BUF_SUPPORT
    /*
    	Shared memory access selection (lower 16KB shared memory)
    */
    RTMP_MAC_SHR_MSEL_UNLOCK(pAd, LOWER_SHRMEM, irqFlag);
#endif /* SPECIFIC_BCN_BUF_SUPPORT */


    pAd->ApCfg.MBSSID[apidx].TimIELocationInBeacon = (UCHAR)FrameLen;
    pAd->ApCfg.MBSSID[apidx].CapabilityInfoLocationInBeacon = sizeof(HEADER_802_11) + TIMESTAMP_LEN + 2;
}