X-Git-Url: https://oss.titaniummirror.com/gitweb/?p=tinyos-2.x.git;a=blobdiff_plain;f=tos%2Flib%2Fmac%2Ftkn154%2FAssociateP.nc;h=494745fb8352b9c0f07ea0688e79cd9e1687174e;hp=fd8f34455cc1285880974019154ea3384fbf5df7;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hpb=adf1de6c009d13b7b52e68535c63b28f59c97400 diff --git a/tos/lib/mac/tkn154/AssociateP.nc b/tos/lib/mac/tkn154/AssociateP.nc index fd8f3445..494745fb 100644 --- a/tos/lib/mac/tkn154/AssociateP.nc +++ b/tos/lib/mac/tkn154/AssociateP.nc @@ -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 as ResponseTimeout; interface Pool as TxFramePool; @@ -68,9 +59,7 @@ module AssociateP interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; - interface Leds; interface Get 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; ipayload = 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; iSecurityLevel) + 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) {} }