break;
case ORPHAN_SCAN:
// orphan notification frame
- m_scanDuration = call MLME_GET.macResponseWaitTime();
+ m_scanDuration = call MLME_GET.macResponseWaitTime() * IEEE154_aBaseSuperframeDuration;
m_txFrame->header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_CMD | FC1_PAN_ID_COMPRESSION;
m_txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED | FC2_DEST_MODE_SHORT;
m_txFrame->header->mhr[MHR_INDEX_SEQNO] = dsn;
call MLME_SET.macDSN(dsn+1);
for (i=0; i<4; i++) // broadcast dest PAN ID + broadcast dest addr
m_txFrame->header->mhr[MHR_INDEX_ADDRESS + i] = 0xFF;
- call FrameUtility.copyLocalExtendedAddressLE((uint8_t*) &(m_txFrame->header[MHR_INDEX_ADDRESS + i]));
+ call FrameUtility.copyLocalExtendedAddressLE((uint8_t*) &(m_txFrame->header->mhr[MHR_INDEX_ADDRESS + i]));
m_txFrame->headerLen = 15;
m_payload[0] = CMD_FRAME_ORPHAN_NOTIFICATION;
m_txFrame->payloadLen = 1;
{
if (!m_busy)
return frame;
+
if (m_scanType == ORPHAN_SCAN) {
+ uint8_t *payload = call Frame.getPayload(frame);
if (!m_resultIndex)
if ((MHR(frame)[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_CMD &&
- ((uint8_t*)call Frame.getPayload(frame))[0] == CMD_FRAME_COORDINATOR_REALIGNMENT) {
+ payload[0] == CMD_FRAME_COORDINATOR_REALIGNMENT) {
+
+ // Sect. 7.5.4.3: "the device shall update its MAC PIB with the PAN
+ // information contained in the coordinator realignment command"
+
+ call MLME_SET.macPANId( *((nxle_uint16_t*) &payload[1]) );
+ call MLME_SET.macCoordShortAddress( *((nxle_uint16_t*) &payload[3]) );
+ call MLME_SET.phyCurrentChannel( *((nxle_uint16_t*) &payload[5]) );
+ call MLME_SET.macShortAddress( *((nxle_uint16_t*) &payload[6]) );
m_resultIndex++;
dbg_serial("ScanP", "Received coordinator realignment frame.\n");
m_terminateScan = TRUE;
call RadioOff.off();
}
} else if ((((ieee154_header_t*) frame->header)->mhr[0] & FC1_FRAMETYPE_MASK) == FC1_FRAMETYPE_BEACON) {
- // PASSIVE_SCAN / ACTIVE_SCAN
+
+ // PASSIVE_SCAN / ACTIVE_SCAN:
+ // A beacon frame containing a non-empty payload is always signalled
+ // to the next higher layer (regardless of the value of macAutoRequest);
+ // when macAutoRequest is set to TRUE, then the beacon is always
+ // stored in the PAN Descriptor list (see 7.1.11.2.1 - Table 68)
+
if (!call MLME_GET.macAutoRequest())
return signal MLME_BEACON_NOTIFY.indication (frame);
else if (m_resultIndex >= m_resultListNumEntries) {
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
+ // check uniqueness: PAN ID and source address must
+ // not be found in a previously received beacon
uint8_t i;
ieee154_PANDescriptor_t* descriptor = (ieee154_PANDescriptor_t*) m_resultList;
dbg_serial("ScanP", "Received beacon, source: 0x%lx, channel: %lu.\n",
(uint32_t) descriptor[m_resultIndex].CoordAddress.shortAddress, (uint32_t) m_currentChannelNum);
- 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
- m_resultIndex++; // was unique
+ 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))
+ break; // not unique
+ if (i == m_resultIndex)
+ m_resultIndex++; // was unique
}
+ if (call BeaconFrame.getBeaconPayloadLength(frame) > 0)
+ return signal MLME_BEACON_NOTIFY.indication (frame);
} // PASSIVE_SCAN / ACTIVE_SCAN
return frame;
}