📄 maca_indirect_polling.c
字号:
/*******************************************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC2420 INTEGRATED 802.15.4 MAC AND PHY *
* *** + + *** Indirect Packet Polling + Related *
* *** +++ *** *
* *** *** *
* ************ *
* ********** *
* *
*******************************************************************************************************
* CONFIDENTIAL *
* The use of this file is restricted by the signed MAC software license agreement. *
* *
* Copyright Chipcon AS, 2004 *
*******************************************************************************************************
* This module contains functions related to indirect packet polling, including packet formatting and *
* timeouts. *
*******************************************************************************************************
* Compiler: AVR-GCC *
* Target platform: CC2420DB, CC2420 + any ATMEGA MCU *
*******************************************************************************************************
* The revision history is located at the bottom of this file *
*******************************************************************************************************/
#pragma SFR
#pragma NOP
#pragma STOP
#pragma HALT
#pragma DI
#pragma EI
#include "mac_headers.h"
/*******************************************************************************************************
*******************************************************************************************************
************************** COMMON POLLING FUNCTIONS **************************
*******************************************************************************************************
*******************************************************************************************************/
//-------------------------------------------------------------------------------------------------------
// Internal function dec.
void mipPollAssociateResponseTask(MAC_TASK_INFO *pTask);
void mipDataRequestTimeoutTask(MAC_TASK_INFO *pTask);
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
// void mipTransmitAutoDataRequest(void)
//
// DESCRIPTION:
// Tranmits an automatic data request when the address of the device has appeared in the beacon
// pending list, and mpib.macAutoRequest has been set (the default value is TRUE). This kind of
// data request does not make any callbacks to the higher layer (mlmePollConfirm).
//-------------------------------------------------------------------------------------------------------
void mipTransmitAutoDataRequest(void) {
MAC_ENUM result;
BOOL securityEnable = FALSE; // TBD...
// Switch to automatic polling mode
if (!macSetState(MAC_STATE_TX_AUTO_DATA_REQUEST)) return;
// Try to transmit the data request
if (mpib.macCoordShortAddress < 0xFFFE) {
result = mipTransmitDataRequest(AM_SHORT_16, mpib.macPANId, (ADDRESS*) &mpib.macCoordShortAddress, securityEnable);
} else {
result = mipTransmitDataRequest(AM_EXTENDED_64, mpib.macPANId, (ADDRESS*) &mpib.macCoordExtendedAddress, securityEnable);
}
// Clean up if it failed
if (result != SUCCESS) macSetState(MAC_STATE_DEFAULT);
} // mipTransmitAutoDataRequest
//-------------------------------------------------------------------------------------------------------
// MAC_ENUM mipTransmitDataRequest(BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, BOOL ...)
//
// DESCRIPTION:
// Transmits a data request packet.
//
// ARGUMENTS:
// BYTE coordAddrMode
// The address mode used by the coordinator
// WORD coordPANId
// The PAN ID used by the coordinator
// ADDRESS *pCoordAddress
// A pointer to the coordinator address (taken from the MAC PIB, short or extended)
// BOOL securityEnable
// TBD...
//
// RETURN VALUE:
// MAC_ENUM
// SUCCESS No error (the transmission was initiated)
// RESOURCE_SHORTAGE TX packet or task not available
// UNAVAILABLE_KEY No key
// FAILED_SECURITY_CHECK Failed security check
//-------------------------------------------------------------------------------------------------------
MAC_ENUM mipTransmitDataRequest(BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, BOOL securityEnable) {
MAC_TX_PACKET *pPacket;
UINT8 taskNumber;
BYTE txOptions;
UINT8 temp;
BYTE *pPayload;
// Try to reserve a packet
pPacket = mtxpReservePacket();
if (!pPacket) return RESOURCE_SHORTAGE;
// Try to reserve a transmission task
taskNumber = mschReserveTask();
if (taskNumber == NO_TASK) {
mtxpReleasePacket(pPacket);
return RESOURCE_SHORTAGE;
}
// Set TX options
txOptions = TX_OPT_ACK_REQ;
#if MAC_OPT_SECURITY
if (securityEnable) {
txOptions |= TX_OPT_SECURITY_ENABLE;
}
#endif
// TX mode
pPacket->txMode = MTX_MODE_USE_CSMACA_BM;
pPacket->retriesLeft = aMaxFrameRetries;
// Generate the packet header (and find security material, if enabled)
if (mpib.macShortAddress >= 0xFFFE) {
msupPrepareHeader(pPacket, FT_MAC_COMMAND, (coordAddrMode << 2) | SRC_ADDR_EXT, mpib.macPANId, (ADDRESS*) &aExtendedAddress, coordPANId, pCoordAddress, txOptions);
} else {
msupPrepareHeader(pPacket, FT_MAC_COMMAND, (coordAddrMode << 2) | SRC_ADDR_SHORT, mpib.macPANId, (ADDRESS*) &mpib.macShortAddress, coordPANId, pCoordAddress, txOptions);
}
// Store the command type
pPacket->mc.commandType = CMD_DATA_REQUEST;///
// Command frame identifier
pPayload = pPacket->pPayload;
*(pPayload++) = CMD_DATA_REQUEST;
#if MAC_OPT_SECURITY
// #bytes in frame counter + key sequence counter (0 or 5)
temp = msecProcessSecurityCounters(pPacket, pPayload);
// In case of frame counter overflow or missing key
// Generate error with FAILED_SECURITY_CHECK or UNAVAILABLE_KEY
if (pPacket->securitySuite >= 8) {
mtxpReleasePacket(pPacket);
mschReleaseTask(taskNumber);
return pPacket->securitySuite;
}
// Increment payload pointer when counters inserted
pPayload += temp;
// Include command payload length and optional MIC (integrity code) length
temp += CMD_DATA_REQUEST_PAYLOAD_LENGTH + pPacket->securitySetup.micLength;
#else
// No security material included, set MAC payload length
temp = CMD_DATA_REQUEST_PAYLOAD_LENGTH;
#endif
// Set the packet length
pPacket->length = pPacket->headerLength + temp + MAC_FCS_LENGTH;
// No further packet payload
// Calculate the packet duration (including ack. and FCS)
pPacket->duration = msupCalcPacketDuration(pPacket->length, pPacket->txOptions & TX_OPT_ACK_REQ);
// Initiate the transmission
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
return SUCCESS;
} // mipTransmitDataRequest
/*******************************************************************************************************
*******************************************************************************************************
************************** DATA REQUEST TIMEOUT **************************
*******************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -