📄 mac_scan.c
字号:
/*******************************************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC2430 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, 2005 *
*******************************************************************************************************
* This module contains the scan state machine, and transmissin of scan-related packets. *
*******************************************************************************************************/
#include <mac_headers.h>
//-------------------------------------------------------------------------------------------------------
// Variables related to channel scanning (state machine and results)
__no_init MAC_SCAN_INFO mscInfo @ "PM0_XDATA";
//-------------------------------------------------------------------------------------------------------
/*******************************************************************************************************
*******************************************************************************************************
************************** 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
ROOT 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;
// 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
//-------------------------------------------------------------------------------------------------------
ROOT 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->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
//-------------------------------------------------------------------------------------------------------
ROOT 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->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.
//-------------------------------------------------------------------------------------------------------
ROOT 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->list.pPANDescriptorList[n];
if ((pPanDescriptor->coordAddrMode == pExistingPanDesc->coordAddrMode ) &&
(pPanDescriptor->coordPanId == pExistingPanDesc->coordPanId ) &&
(pPanDescriptor->logicalChannel == pExistingPanDesc->logicalChannel)) {
if (pPanDescriptor->coordAddrMode == AM_EXTENDED_64) {
if (msupCompareExtendedAddress(&pPanDescriptor->coordAddress, &pExistingPanDesc->coordAddress)) return TRUE;
} else {
if (pPanDescriptor->coordAddress.Short == pExistingPanDesc->coordAddress.Short) return TRUE;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -