/* ======================================================================== Routine Description: 1. Append bit 1 to end of the message 2. Append the length of message in rightmost 64 bits 3. Transform the Hash Value to digest message Arguments: pMD5_CTX Pointer to MD5_CTX_STRUC Return Value: digestMessage Digest message Note: None ======================================================================== */ VOID RT_MD5_End ( IN MD5_CTX_STRUC *pMD5_CTX, OUT UINT8 DigestMessage[]) { UINT index; UINT64 message_length_bits; /* append 1 bits to end of the message */ NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80); /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */ if (pMD5_CTX->BlockLen > 55) RT_MD5_Hash(pMD5_CTX); /* End of if */ /* Append the length of message in rightmost 64 bits */ message_length_bits = pMD5_CTX->MessageLen*8; message_length_bits = cpu2le64(message_length_bits); NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8); RT_MD5_Hash(pMD5_CTX); /* Return message digest, transform the UINT32 hash value to bytes */ for (index = 0; index < 4;index++) pMD5_CTX->HashValue[index] = cpu2le32(pMD5_CTX->HashValue[index]); /* End of for */ NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE); } /* End of RT_MD5_End */
/* ========================================================================== Description: Prepare Measurement request action frame and enqueue it into management queue waiting for transmition. Parametrs: 1. the destination mac address of the frame. Return : None. ========================================================================== */ VOID EnqueueMeasurementReq( IN PRTMP_ADAPTER pAd, IN PUCHAR pDA, IN UINT8 MeasureToken, IN UINT8 MeasureReqMode, IN UINT8 MeasureReqType, IN UINT8 MeasureCh, IN UINT16 MeasureDuration) { PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; ULONG FrameLen; HEADER_802_11 ActHdr; MEASURE_REQ_INFO MeasureReqIE; UINT8 RmReqDailogToken = RandomByte(pAd); UINT64 MeasureStartTime = GetCurrentTimeStamp(pAd); // build action frame header. MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, pAd->CurrentAddress); NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory if(NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __func__)); return; } NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); FrameLen = sizeof(HEADER_802_11); InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_MRQ); // fill Dialog Token InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, MeasureToken); // prepare Measurement IE. NdisZeroMemory(&MeasureReqIE, sizeof(MEASURE_REQ_INFO)); MeasureReqIE.Token = RmReqDailogToken; MeasureReqIE.ReqMode.word = MeasureReqMode; MeasureReqIE.ReqType = MeasureReqType; MeasureReqIE.MeasureReq.ChNum = MeasureCh; MeasureReqIE.MeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime); MeasureReqIE.MeasureReq.MeasureDuration = cpu2le16(MeasureDuration); InsertMeasureReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureReqIE); MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); MlmeFreeMemory(pAd, pOutBuffer); return; }