]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/mac/tkn154/AssociateP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / mac / tkn154 / AssociateP.nc
index fd8f34455cc1285880974019154ea3384fbf5df7..494745fb8352b9c0f07ea0688e79cd9e1687174e 100644 (file)
@@ -42,7 +42,6 @@ module AssociateP
   {
     interface Init;
     interface MLME_ASSOCIATE;
-    interface MLME_DISASSOCIATE;
     interface MLME_COMM_STATUS;
   }
   uses
@@ -52,14 +51,6 @@ module AssociateP
     interface FrameExtracted as AssociationResponseExtracted;
     interface FrameTx as AssociationResponseTx;
 
-    interface FrameTx as DisassociationIndirectTx;
-    interface FrameTx as DisassociationDirectTx;
-    interface FrameTx as DisassociationToCoord;
-
-    interface FrameRx as DisassociationDirectRxFromCoord;
-    interface FrameExtracted as DisassociationExtractedFromCoord;
-    interface FrameRx as DisassociationRxFromDevice;
-
     interface DataRequest;
     interface Timer<TSymbolIEEE802154> as ResponseTimeout;
     interface Pool<ieee154_txframe_t> as TxFramePool;
@@ -68,9 +59,7 @@ module AssociateP
     interface MLME_SET;
     interface FrameUtility;
     interface IEEE154Frame as Frame;
-    interface Leds;
     interface Get<uint64_t> as LocalExtendedAddress;
-    interface Ieee802154Debug as Debug;
   }
 }
 implementation
@@ -79,29 +68,25 @@ implementation
     S_IDLE = 0xFF,
   };
   uint8_t m_payloadAssocRequest[2];
-  uint8_t m_payloadDisassocRequest[2];
   uint8_t m_payloadAssocResponse[MAX_PENDING_ASSOC_RESPONSES][4];
   uint8_t m_coordAddrMode;
   uint8_t m_assocRespStatus;
   uint16_t m_shortAddress;
   bool m_associationOngoing;
-  bool m_disAssociationOngoing;
 
   command error_t Init.init()
   {
     uint8_t i;
     call ResponseTimeout.stop();
     m_payloadAssocRequest[0] = S_IDLE;
-    m_payloadDisassocRequest[0] = S_IDLE;
     m_coordAddrMode = 0;
     m_associationOngoing = FALSE;
-    m_disAssociationOngoing = FALSE;
     for (i=0; i<MAX_PENDING_ASSOC_RESPONSES; i++)
       m_payloadAssocResponse[i][0] = S_IDLE;
     return SUCCESS;
   }
 
-/* ------------------- MLME_ASSOCIATE Request ------------------- */
+  /* ------------------- MLME_ASSOCIATE Request ------------------- */
 
   command ieee154_status_t MLME_ASSOCIATE.request  (
                           uint8_t LogicalChannel,
@@ -110,8 +95,7 @@ implementation
                           uint16_t CoordPANID,
                           ieee154_address_t CoordAddress,
                           ieee154_CapabilityInformation_t CapabilityInformation,
-                          ieee154_security_t *security
-                        )
+                          ieee154_security_t *security)
   {
     ieee154_status_t status = IEEE154_SUCCESS;
     ieee154_txframe_t *txFrame=0;
@@ -126,11 +110,11 @@ implementation
       status = IEEE154_INVALID_PARAMETER;
     else if (m_associationOngoing || !(txFrame = call TxFramePool.get()))
       status = IEEE154_TRANSACTION_OVERFLOW;
-    else if (!(txControl = call TxControlPool.get())){
+    else if (!(txControl = call TxControlPool.get())) {
       call TxFramePool.put(txFrame);
       status = IEEE154_TRANSACTION_OVERFLOW;
     }
-    if (status == IEEE154_SUCCESS){
+    if (status == IEEE154_SUCCESS) {
       m_assocRespStatus = IEEE154_NO_DATA;
       m_shortAddress = 0xFFFF;
       call MLME_SET.phyCurrentChannel(LogicalChannel);
@@ -160,13 +144,13 @@ implementation
       txFrame->payload = m_payloadAssocRequest;
       txFrame->payloadLen = 2;
       m_associationOngoing = TRUE;
-      if ((status = call AssociationRequestTx.transmit(txFrame)) != IEEE154_SUCCESS){
+      if ((status = call AssociationRequestTx.transmit(txFrame)) != IEEE154_SUCCESS) {
         m_associationOngoing = FALSE;
         call TxFramePool.put(txFrame);
         call TxControlPool.put(txControl);
       }
     }
-    call Debug.log(LEVEL_INFO, AssociateP_REQUEST, status, 0, 0);
+    dbg_serial("AssociationP", "MLME_ASSOCIATE.request -> result: %lu\n", (uint32_t) status);
     return status;
   }
 
@@ -174,15 +158,15 @@ implementation
   {
     call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) txFrame->header - offsetof(ieee154_txcontrol_t, header)));
     call TxFramePool.put(txFrame);
-    if (status != IEEE154_SUCCESS){
+    if (status != IEEE154_SUCCESS) {
+      dbg_serial("AssociationP", "transmitDone() failed!\n");
       m_associationOngoing = FALSE;
       signal MLME_ASSOCIATE.confirm(0xFFFF, status, 0);
     } else {
       call ResponseTimeout.startOneShot(call MLME_GET.macResponseWaitTime()*IEEE154_aBaseSuperframeDuration);
-      call Debug.log(LEVEL_INFO, AssociateP_SETTIMER
-          call MLME_GET.macResponseWaitTime()*IEEE154_aBaseSuperframeDuration, 0, 0);
+      dbg_serial("AssociationP", "transmitDone() ok, waiting for %lu\n"
+          (uint32_t) (call MLME_GET.macResponseWaitTime() * IEEE154_aBaseSuperframeDuration));
     }
-    call Debug.log(LEVEL_INFO, AssociateP_TXDONE, status, 0, 0);
   }
   
   event void ResponseTimeout.fired()
@@ -191,22 +175,24 @@ implementation
     if (!m_associationOngoing)
       return;
     // have not received an AssociationResponse yet, poll the coordinator now
+    dbg_serial("AssociationP", "Polling the coordinator for an AssociationResponse now...\n");
     if (m_coordAddrMode == ADDR_MODE_SHORT_ADDRESS)
       *((nxle_uint16_t*) &coordAddress) = call MLME_GET.macCoordShortAddress();
     else
       call FrameUtility.copyCoordExtendedAddressLE(coordAddress);
     if (call DataRequest.poll(m_coordAddrMode, call MLME_GET.macPANId(), 
-          coordAddress, ADDR_MODE_EXTENDED_ADDRESS) != IEEE154_SUCCESS){
+          coordAddress, ADDR_MODE_EXTENDED_ADDRESS) != IEEE154_SUCCESS) {
       m_shortAddress = 0xFFFF;
       m_assocRespStatus = IEEE154_TRANSACTION_OVERFLOW;
       signal DataRequest.pollDone();
+      dbg_serial("AssociationP", "Poll failed (locally)...\n");
     }
   }
 
   event message_t* AssociationResponseExtracted.received(message_t* frame, ieee154_txframe_t *txFrame)
   {
     uint8_t *payload = (uint8_t *) &frame->data;
-    if (m_associationOngoing){
+    if (m_associationOngoing) {
       m_shortAddress =  *((nxle_uint16_t*) (payload + 1));
       m_assocRespStatus = *(payload + 3);
     }
@@ -215,15 +201,18 @@ implementation
 
   event void DataRequest.pollDone()
   {
-    if (m_associationOngoing){
-      call Debug.log(LEVEL_INFO, AssociateP_POLL_DONE, m_payloadAssocRequest[0], m_assocRespStatus, 0);
+    if (m_associationOngoing) {
       call ResponseTimeout.stop();
       m_associationOngoing = FALSE;
+      if (m_assocRespStatus == IEEE154_ASSOCIATION_SUCCESSFUL)
+        call MLME_SET.macShortAddress(m_shortAddress);
       signal MLME_ASSOCIATE.confirm(m_shortAddress, m_assocRespStatus, 0);
+      dbg_serial("AssociationP", "confirm, status:  %lu, my new address: 0x%lx\n", 
+          (uint32_t) m_assocRespStatus, (uint32_t) m_shortAddress);
     }
   }
 
-/* ------------------- MLME_ASSOCIATE Response ------------------- */
+  /* ------------------- MLME_ASSOCIATE Response ------------------- */
 
   event message_t* AssociationRequestRx.received(message_t* frame)
   {
@@ -240,8 +229,7 @@ implementation
                           uint64_t deviceAddress,
                           uint16_t assocShortAddress,
                           ieee154_association_status_t status,
-                          ieee154_security_t *security
-                        )
+                          ieee154_security_t *security)
   {
     uint8_t i;
     ieee154_status_t txStatus = IEEE154_SUCCESS;
@@ -252,9 +240,11 @@ implementation
     for (i=0; i<MAX_PENDING_ASSOC_RESPONSES;i++)
       if (m_payloadAssocResponse[i][0] == S_IDLE)
         break;    
-    if (i == MAX_PENDING_ASSOC_RESPONSES || !(txFrame = call TxFramePool.get()))
+    if (security && security->SecurityLevel)
+      txStatus = IEEE154_UNSUPPORTED_SECURITY;
+    else if (i == MAX_PENDING_ASSOC_RESPONSES || !(txFrame = call TxFramePool.get()))
       txStatus = IEEE154_TRANSACTION_OVERFLOW;
-    else if (!(txControl = call TxControlPool.get())){
+    else if (!(txControl = call TxControlPool.get())) {
       call TxFramePool.put(txFrame);
       txStatus = IEEE154_TRANSACTION_OVERFLOW;
     } else {
@@ -277,7 +267,7 @@ implementation
       *((nxle_uint16_t*) &txFrame->payload[1]) = assocShortAddress;
       txFrame->payload[3] = status;
       txFrame->payloadLen = 4;
-      if ((txStatus = call AssociationResponseTx.transmit(txFrame)) != IEEE154_SUCCESS){
+      if ((txStatus = call AssociationResponseTx.transmit(txFrame)) != IEEE154_SUCCESS) {
         txFrame->payload[0] = S_IDLE;
         call TxFramePool.put(txFrame);
         call TxControlPool.put(txControl);
@@ -302,164 +292,16 @@ implementation
                           status, 0);
   }
 
+  /* ------------------- Defaults ------------------- */
 
-/* ------------------- MLME_DISASSOCIATE (initiating) ------------------- */
-
-  command ieee154_status_t MLME_DISASSOCIATE.request  (
-                          uint8_t DeviceAddrMode,
-                          uint16_t DevicePANID,
-                          ieee154_address_t DeviceAddress,
-                          ieee154_disassociation_reason_t DisassociateReason,
-                          bool TxIndirect,
-                          ieee154_security_t *security
-                        )
-  {
-    ieee154_status_t status = IEEE154_SUCCESS;
-    ieee154_txframe_t *txFrame=0;
-    ieee154_txcontrol_t *txControl=0;
-    ieee154_address_t srcAddress;
-
-    if (security && security->SecurityLevel)
-      status = IEEE154_UNSUPPORTED_SECURITY;
-    else if (call MLME_GET.macPANId() != DevicePANID || 
-        (DeviceAddrMode != ADDR_MODE_SHORT_ADDRESS && DeviceAddrMode != ADDR_MODE_EXTENDED_ADDRESS))
-      status = IEEE154_INVALID_PARAMETER;
-    else if (m_disAssociationOngoing || !(txFrame = call TxFramePool.get()))
-      status = IEEE154_TRANSACTION_OVERFLOW;
-    else if (!(txControl = call TxControlPool.get())){
-      call TxFramePool.put(txFrame);
-      status = IEEE154_TRANSACTION_OVERFLOW;
-    } 
-    if (status == IEEE154_SUCCESS){
-      txFrame->header = &txControl->header;
-      txFrame->metadata = &txControl->metadata;
-      srcAddress.extendedAddress = call LocalExtendedAddress.get();
-      txFrame->headerLen = call FrameUtility.writeHeader(
-          txFrame->header->mhr,
-          DeviceAddrMode,
-          call MLME_GET.macPANId(),
-          &DeviceAddress,
-          ADDR_MODE_EXTENDED_ADDRESS,
-          call MLME_GET.macPANId(),
-          &srcAddress,
-          TRUE);
-      txFrame->header->mhr[MHR_INDEX_FC1] = FC1_ACK_REQUEST | FC1_FRAMETYPE_CMD | FC1_PAN_ID_COMPRESSION;
-      txFrame->header->mhr[MHR_INDEX_FC2] = FC2_SRC_MODE_EXTENDED |
-        (DeviceAddrMode == ADDR_MODE_SHORT_ADDRESS ? FC2_DEST_MODE_SHORT : FC2_DEST_MODE_EXTENDED);
-      m_payloadDisassocRequest[0] = CMD_FRAME_DISASSOCIATION_NOTIFICATION;
-      m_payloadDisassocRequest[1] = DisassociateReason;
-      txFrame->payload = m_payloadDisassocRequest;
-      txFrame->payloadLen = 2;
-      m_disAssociationOngoing = TRUE;
-      if ((DeviceAddrMode == ADDR_MODE_SHORT_ADDRESS &&
-            DeviceAddress.shortAddress == call MLME_GET.macCoordShortAddress()) ||
-          (DeviceAddrMode == ADDR_MODE_EXTENDED_ADDRESS &&
-           DeviceAddress.extendedAddress == call MLME_GET.macCoordExtendedAddress())){
-        status = call DisassociationToCoord.transmit(txFrame);
-      } else if (TxIndirect) {
-        status = call DisassociationIndirectTx.transmit(txFrame);
-      } else {
-        status = call DisassociationDirectTx.transmit(txFrame);
-      }
-      if (status != IEEE154_SUCCESS){
-        m_disAssociationOngoing = FALSE;
-        call TxFramePool.put(txFrame);
-        call TxControlPool.put(txControl);
-      }
-    }
-    call Debug.log(LEVEL_INFO, DISSASSOCIATE_REQUEST, status, 0, 0);
-    return status;
-  }
-
-  event void DisassociationToCoord.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) 
-  { 
-    // transmitted a disassociation notification to our coordinator
-    uint8_t *mhr = MHR(data), srcAddrOffset = 7;
-    uint8_t DeviceAddrMode = (mhr[MHR_INDEX_FC2] & FC2_SRC_MODE_MASK) >> FC2_SRC_MODE_OFFSET;
-    uint16_t DevicePANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS])));
-    ieee154_address_t DeviceAddress;
-    if ((mhr[MHR_INDEX_FC2] & FC2_DEST_MODE_MASK) == FC2_DEST_MODE_EXTENDED)
-      srcAddrOffset += 6;
-    call FrameUtility.convertToNative(&DeviceAddress.extendedAddress, &mhr[srcAddrOffset]);
-    call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) data->header - offsetof(ieee154_txcontrol_t, header)));
-    call TxFramePool.put(data);
-    call Debug.log(LEVEL_INFO, DISSASSOCIATE_TXDONE, status, 2, 0);
-    m_disAssociationOngoing = FALSE;
-    signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress);
-  }
-
-  event void DisassociationIndirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) 
-  {
-    signal DisassociationDirectTx.transmitDone(data, status);
-  }
-
-  event void DisassociationDirectTx.transmitDone(ieee154_txframe_t *data, ieee154_status_t status) 
-  { 
-    // transmitted a disassociation notification to a device
-    uint8_t *mhr = MHR(data), dstAddrOffset = 5;
-    uint8_t DeviceAddrMode = (mhr[1] & FC2_DEST_MODE_MASK) >> FC2_DEST_MODE_OFFSET;
-    uint16_t DevicePANID = *((nxle_uint16_t*) (&(mhr[MHR_INDEX_ADDRESS])));
-    ieee154_address_t DeviceAddress;
-    call FrameUtility.convertToNative(&DeviceAddress.extendedAddress, &mhr[dstAddrOffset]);
-    call Debug.log(LEVEL_INFO, DISSASSOCIATE_TXDONE, status, 1, 0);
-    call TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) data->header - offsetof(ieee154_txcontrol_t, header)));
-    call TxFramePool.put(data);
-    call Debug.log(LEVEL_INFO, DISSASSOCIATE_TXDONE, status, 2, 0);
-    m_disAssociationOngoing = FALSE;
-    signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress);
-  }
-
-/* ------------------- MLME_DISASSOCIATE (receiving) ------------------- */
-
-  event message_t* DisassociationDirectRxFromCoord.received(message_t* frame)
-  {
-    // received a disassociation notification from the coordinator (direct tx)
-    ieee154_address_t address;
-    address.extendedAddress = call LocalExtendedAddress.get();
-    signal MLME_DISASSOCIATE.indication(address.extendedAddress, frame->data[1], NULL);
-    return frame;
-  }
-
-  event message_t* DisassociationExtractedFromCoord.received(message_t* frame, ieee154_txframe_t *txFrame)
-  {
-    // received a disassociation notification from the coordinator (indirect transmission)
-    return signal DisassociationDirectRxFromCoord.received(frame);
-  }
-
-  event message_t* DisassociationRxFromDevice.received(message_t* frame)
-  {
-    // received a disassociation notification from the device
-    ieee154_address_t address;
-    call Debug.log(LEVEL_INFO, DISSASSOCIATE_RX, 0, 0, 0);
-    if (call Frame.getSrcAddrMode(frame) == ADDR_MODE_EXTENDED_ADDRESS && 
-        call Frame.getSrcAddr(frame, &address) == SUCCESS)
-      signal MLME_DISASSOCIATE.indication(address.extendedAddress, frame->data[1], NULL);
-    return frame;
-  }
-
-/* ------------------- Defaults ------------------- */
-
-  default event void MLME_DISASSOCIATE.indication (
-                          uint64_t DeviceAddress,
-                          ieee154_disassociation_reason_t DisassociateReason,
-                          ieee154_security_t *security
-                        ){}
-  default event void MLME_DISASSOCIATE.confirm    (
-                          ieee154_status_t status,
-                          uint8_t DeviceAddrMode,
-                          uint16_t DevicePANID,
-                          ieee154_address_t DeviceAddress
-                        ){}
   default event void MLME_ASSOCIATE.indication (
                           uint64_t DeviceAddress,
                           ieee154_CapabilityInformation_t CapabilityInformation,
-                          ieee154_security_t *security
-                        ){}
+                          ieee154_security_t *security) {}
   default event void MLME_ASSOCIATE.confirm    (
                           uint16_t AssocShortAddress,
                           uint8_t status,
-                          ieee154_security_t *security
-                        ){}
+                          ieee154_security_t *security) {}
   default event void MLME_COMM_STATUS.indication (
                           uint16_t PANId,
                           uint8_t SrcAddrMode,
@@ -467,6 +309,5 @@ implementation
                           uint8_t DstAddrMode,
                           ieee154_address_t DstAddr,
                           ieee154_status_t status,
-                          ieee154_security_t *security
-                        ){}
+                          ieee154_security_t *security) {}
 }