]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/ScanP.nc
Fixed some issues with the orphan scan / coordinator realignment - this was reported...
[tinyos-2.x.git] / tos / lib / mac / tkn154 / ScanP.nc
index 37ac03b661bfd485c25c48ee5c125a90b3960de4..f8f44f77925727cc6df711cffad2cba2139c2f51 100644 (file)
@@ -219,14 +219,14 @@ implementation
         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;
@@ -345,17 +345,33 @@ implementation
   {
     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) {
@@ -367,25 +383,28 @@ implementation
             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;
   }