📄 mac_scan.c
字号:
/*******************************************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC2420 INTEGRATED 802.15.4 MAC AND PHY *
* *** + + *** Scan Functions *
* *** +++ *** *
* *** *** *
* ************ *
* ********** *
* *
*******************************************************************************************************
* CONFIDENTIAL *
* The use of this file is restricted by the signed MAC software license agreement. *
* *
* Copyright Chipcon AS, 2004 *
*******************************************************************************************************
* This module contains the scan state machine, and transmissin of scan-related packets. *
*******************************************************************************************************
* 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
#pragma section @@DATA scan at 0xE800///
#include "mac_headers.h"
//-------------------------------------------------------------------------------------------------------
// Variables related to channel scanning (state machine and results)
MAC_SCAN_INFO mscInfo;
//-------------------------------------------------------------------------------------------------------
int UART_StartTx(char *buffer);///
//-------------------------------------------------------------------------------------------------------
// Internal functions
BOOL mscSetNextChannel(void);
BOOL mscTransmitOrphanNotification(void);
//-------------------------------------------------------------------------------------------------------
/*******************************************************************************************************
*******************************************************************************************************
************************** SCAN-RELATED PACKET TRANSMISSIONS **************************
*******************************************************************************************************
*******************************************************************************************************/
//-------------------------------------------------------------------------------------------------------
// BOOL mscTransmitBeacon(void)
//
// DESCRIPTION:
// Used by a coordinator in a non-beacon network to transmit a single beacon upon a beacon request.
// Unlike the beacon transmission in mac_beacon_handler.c, this beacon is transmitted as a regular
// packet, and does not involve timing adjustments, etc.
//
// RETURN VALUE:
// BOOL
// The transmission was initiated
//-------------------------------------------------------------------------------------------------------
#if MAC_OPT_FFD
BOOL mscTransmitBeacon(void) {
MAC_TX_PACKET *pPacket;
UINT8 taskNumber;
// Try to reserve a packet
pPacket = mtxpReservePacket();
if (!pPacket) return FALSE;
// Try to reserve a transmission task
taskNumber = mschReserveTask();
if (taskNumber == NO_TASK) {
mtxpReleasePacket(pPacket);
return FALSE;
}
// Prepare the packet structure
mbcnPrepareBeacon(pPacket);
pPacket->txMode = MTX_MODE_FORCE_UNSLOTTED_BM | MTX_MODE_USE_CSMACA_BM; // This function is only used in non-beacon networks
// Initiate the transmission
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
return TRUE;
} // mscTransmitBeacon
#endif
//-------------------------------------------------------------------------------------------------------
// BOOL mscTransmitBeaconRequest(void)
//
// DESCRIPTION:
// Transmits a beacon request during active scan.
//
// RETURN VALUE:
// BOOL
// The transmission was initiated
//-------------------------------------------------------------------------------------------------------
BOOL mscTransmitBeaconRequest(void) {
MAC_TX_PACKET *pPacket;
UINT8 taskNumber;
WORD broadcast = 0xFFFF;
// Try to reserve a packet
pPacket = mtxpReservePacket();
if (!pPacket) return FALSE;
// Try to reserve a transmission task
taskNumber = mschReserveTask();
if (taskNumber == NO_TASK) {
mtxpReleasePacket(pPacket);
return FALSE;
}
// TX mode
pPacket->txMode = MTX_MODE_USE_CSMACA_BM | MTX_MODE_SCAN_RELATED_BM;
pPacket->retriesLeft = aMaxFrameRetries;
// Generate the packet header
msupPrepareHeader(pPacket, FT_MAC_COMMAND, DEST_ADDR_SHORT, broadcast, (ADDRESS*) &broadcast, broadcast, (ADDRESS*) &broadcast, TX_OPT_NONE);
// Generate the packet payload
pPacket->pPayload[0] = CMD_BEACON_REQUEST;
// Store the command type
pPacket->mc.commandType = CMD_BEACON_REQUEST;///
// Calculate and set the total packet length
pPacket->length = pPacket->headerLength + CMD_BEACON_REQUEST_PAYLOAD_LENGTH + MAC_FCS_LENGTH;
// Calculate the packet duration (including ack. and IFS)
pPacket->duration = msupCalcPacketDuration(pPacket->length, FALSE);
// Initiate the transmission
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
return TRUE;
} // mipTransmitDataRequest
//-------------------------------------------------------------------------------------------------------
// BOOL mscTransmitOrphanNotification(void)
//
// DESCRIPTION:
// Transmits an orphan notification during orphan scan.
//
// RETURN VALUE:
// BOOL
// The transmission was initiated
//-------------------------------------------------------------------------------------------------------
BOOL mscTransmitOrphanNotification(void) {
MAC_TX_PACKET *pPacket;
UINT8 taskNumber;
WORD broadcast = 0xFFFF;
// Try to reserve a packet
pPacket = mtxpReservePacket();
if (!pPacket) return FALSE;
// Try to reserve a transmission task
taskNumber = mschReserveTask();
if (taskNumber == NO_TASK) {
mtxpReleasePacket(pPacket);
return FALSE;
}
// TX mode
pPacket->txMode = MTX_MODE_USE_CSMACA_BM | MTX_MODE_FORCE_UNSLOTTED_BM | MTX_MODE_SCAN_RELATED_BM;
pPacket->retriesLeft = aMaxFrameRetries;
// Generate the packet header
msupPrepareHeader(pPacket, FT_MAC_COMMAND, DEST_ADDR_SHORT | SRC_ADDR_EXT, broadcast, (ADDRESS*) &aExtendedAddress, broadcast, (ADDRESS*) &broadcast, TX_OPT_NONE);
// Generate the packet payload
pPacket->pPayload[0] = CMD_ORPHAN_NOTIFICATION;
// Store the command type
pPacket->mc.commandType = CMD_ORPHAN_NOTIFICATION;///
// Calculate and set the total packet length
pPacket->length = pPacket->headerLength + CMD_ORPHAN_NOTIFICATION_PAYLOAD_LENGTH + MAC_FCS_LENGTH;
// Calculate the packet duration (including ack. and IFS)
pPacket->duration = msupCalcPacketDuration(pPacket->length, FALSE);
// Initiate the transmission
mschAddTask(taskNumber, MAC_TASK_PRI_LOW, mtxScheduleTransmission, (WORD) pPacket);
return TRUE;
} // mscTransmitOrphanNotification
/*******************************************************************************************************
*******************************************************************************************************
************************** CHANNEL SCANNING + SUPPORT FUNCTIONS **************************
*******************************************************************************************************
*******************************************************************************************************/
//-------------------------------------------------------------------------------------------------------
// BOOL mscPanDescriptorExists(PAN_DESCRIPTOR *pPanDescriptor)
//
// DESCRIPTION:
// Used by a scanning device (active or passive scan) to determine whether or not the PAN descriptor
// from a received beacon already exists in the scan result list. The function returns TRUE if
// there's a match on coordinator PAN ID + address, and the logical channel.
//
// ARGUMENTS:
// PAN_DESCRIPTOR *pPanDescriptor
// A pointer to the new PAN descriptor
//
// RETURN VALUE:
// BOOL
// The PAN descriptor pointed to by pPanDescriptor already exists in the result list.
//-------------------------------------------------------------------------------------------------------
BOOL mscPanDescriptorExists(PAN_DESCRIPTOR *pPanDescriptor) {
UINT8 n;
PAN_DESCRIPTOR *pExistingPanDesc;
MAC_SCAN_RESULT *pScanResult = mscInfo.pScanResult;
// Search for duplicates
for (n = 0; n < pScanResult->resultListSize; n++) {
pExistingPanDesc = &pScanResult->sf.pPANDescriptorList[n];///
if ((pPanDescriptor->coordAddrMode == pExistingPanDesc->coordAddrMode ) &&
(pPanDescriptor->coordPanId == pExistingPanDesc->coordPanId ) &&
(pPanDescriptor->logicalChannel == pExistingPanDesc->logicalChannel)) {
if (pPanDescriptor->coordAddrMode == AM_EXTENDED_64) {
if (msupCompareQword(&pPanDescriptor->coordAddress.Extended, &pExistingPanDesc->coordAddress.Extended)) return TRUE;
} else {
if (pPanDescriptor->coordAddress.Short == pExistingPanDesc->coordAddress.Short) return TRUE;
}
}
}
// No match
return FALSE;
} // mscPanDescriptorExists
//-------------------------------------------------------------------------------------------------------
// BOOL mscSetNextChannel(void)
//
// DESCRIPTION:
// Finds the next valid channel during scan (changes the mscInfo.currentChannel variable), and
// updates the unscanned channels mask.
//
// RETURN VALUE:
// BOOL
// FALSE when there are no more channels to scan.
//-------------------------------------------------------------------------------------------------------
BOOL mscSetNextChannel(void) {
UINT8 n;
DWORD bitmask = 0x00000001;
// Go through the channels
mscInfo.currentChannel++;
for (n = 0; n < 27; n++) {
if (n >= mscInfo.currentChannel) {
if (bitmask & mscInfo.scanChannels) {
mscInfo.currentChannel = n;
mscInfo.pScanResult->unscannedChannels &= ~bitmask;
return TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -