- atomic {
- if (!m_busy)
- return frame;
- if (m_scanType == ORPHAN_SCAN) {
- if (!m_resultIndex)
- if ((MHR(frame)[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD &&
- ((uint8_t*)call Frame.getPayload(frame))[0] == CMD_FRAME_COORDINATOR_REALIGNMENT) {
- m_resultIndex++;
- dbg_serial("ScanP", "Received coordinator realignment frame.\n");
- m_currentChannelNum = 27; // terminate scan
- call RadioOff.off();
- }
- } else if ((((ieee154_header_t*) frame->header)->mhr[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_BEACON) {
- // PASSIVE_SCAN / ACTIVE_SCAN
- if (!m_macAutoRequest)
- return signal MLME_BEACON_NOTIFY.indication (frame);
- else if (m_resultListNumEntries && m_resultIndex < m_resultListNumEntries &&
- call BeaconFrame.parsePANDescriptor(
- frame,
- m_currentChannelNum,
- IEEE154_SUPPORTED_CHANNELPAGE,
- &((ieee154_PANDescriptor_t*) m_resultList)[m_resultIndex]) == SUCCESS) {
-
- // check uniqueness: both PAN ID and source address must not be in a previously received beacon
- uint8_t i;
- ieee154_PANDescriptor_t* descriptor = (ieee154_PANDescriptor_t*) m_resultList;
- if (m_resultIndex)
- for (i=0; i<m_resultIndex; i++)
- if (descriptor[i].CoordPANId == descriptor[m_resultIndex].CoordPANId &&
- descriptor[i].CoordAddrMode == descriptor[m_resultIndex].CoordAddrMode)
- if ((descriptor[i].CoordAddrMode == ADDR_MODE_SHORT_ADDRESS &&
- descriptor[i].CoordAddress.shortAddress ==
- descriptor[m_resultIndex].CoordAddress.shortAddress) ||
- (descriptor[i].CoordAddrMode == ADDR_MODE_EXTENDED_ADDRESS &&
- descriptor[i].CoordAddress.extendedAddress ==
- descriptor[m_resultIndex].CoordAddress.extendedAddress))
- return frame; // not unique
- dbg_serial("ScanP", "Received beacon, source: 0x%lx, channel: %lu.\n",
- (uint32_t) descriptor[m_resultIndex].CoordAddress.shortAddress, (uint32_t) m_currentChannelNum);
- m_resultIndex++;
- if (m_resultIndex == m_resultListNumEntries) {
- m_currentChannelNum = 27; // terminate scan
- call RadioOff.off();
- }
+ if (!m_busy)
+ return frame;
+ if (m_scanType == ORPHAN_SCAN) {
+ if (!m_resultIndex)
+ if ((MHR(frame)[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD &&
+ ((uint8_t*)call Frame.getPayload(frame))[0] == CMD_FRAME_COORDINATOR_REALIGNMENT) {
+ m_resultIndex++;
+ dbg_serial("ScanP", "Received coordinator realignment frame.\n");
+ m_terminateScan = TRUE;
+ call RadioOff.off();