From f671bb50bd1080d906f927b3a6625d5573d5ede8 Mon Sep 17 00:00:00 2001 From: janhauer Date: Fri, 16 Oct 2009 12:25:45 +0000 Subject: [PATCH] - macShortAddress PIB attribute is now updated automatically after a successful association - all PAN-related attributes are removed automatically from PIB after successful disassociation - added some debug output --- tos/lib/mac/tkn154/AssociateP.nc | 2 ++ tos/lib/mac/tkn154/BeaconSynchronizeP.nc | 25 +++++++++++----- tos/lib/mac/tkn154/DisassociateP.nc | 29 +++++++++++++++++++ tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc | 1 + tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc | 1 + 5 files changed, 51 insertions(+), 7 deletions(-) diff --git a/tos/lib/mac/tkn154/AssociateP.nc b/tos/lib/mac/tkn154/AssociateP.nc index d5296c87..3d697f65 100644 --- a/tos/lib/mac/tkn154/AssociateP.nc +++ b/tos/lib/mac/tkn154/AssociateP.nc @@ -204,6 +204,8 @@ implementation 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: %lx, %lu\n", (uint32_t) m_shortAddress, (uint32_t) m_assocRespStatus); diff --git a/tos/lib/mac/tkn154/BeaconSynchronizeP.nc b/tos/lib/mac/tkn154/BeaconSynchronizeP.nc index 779a81f4..57f4faeb 100644 --- a/tos/lib/mac/tkn154/BeaconSynchronizeP.nc +++ b/tos/lib/mac/tkn154/BeaconSynchronizeP.nc @@ -244,8 +244,8 @@ implementation if (call RadioOff.isOff()) signal RadioOff.offDone(); - else - ASSERT(call RadioOff.off() == SUCCESS); + else if (call RadioOff.off() != SUCCESS) + ASSERT(0); } async event void RadioOff.offDone() @@ -267,18 +267,29 @@ implementation async event void BeaconRx.enableRxDone() { + uint32_t dt; + switch (m_state) { case S_INITIAL_SCAN: + // "To acquire beacon synchronization, a device shall enable its + // receiver and search for at most [aBaseSuperframeDuration * (2^n + 1)] + // symbols, where n is the value of macBeaconOrder [...] Once the number + // of missed beacons reaches aMaxLostBeacons, the MLME shall notify the + // next higher layer." (Sect. 7.5.4.1) m_state = S_RECEIVING; - call TrackAlarm.start((((uint32_t) 1 << m_beaconOrder) + (uint32_t) 1) * - (uint32_t) IEEE154_aBaseSuperframeDuration * (uint32_t) IEEE154_aMaxLostBeacons); + dt = (((uint32_t) 1 << m_beaconOrder) + (uint32_t) 1) * + (uint32_t) IEEE154_aBaseSuperframeDuration * + (uint32_t) IEEE154_aMaxLostBeacons; + call TrackAlarm.start(dt); + dbg_serial("BeaconSynchronizeP","Rx enabled, expecting beacon within %lu symbols.\n", dt); break; case S_PREPARE: m_state = S_RECEIVING; - dbg_serial("BeaconSynchronizeP","Rx enabled, expecting beacon in %lu symbols.\n", - (uint32_t) ((m_lastBeaconRxTime + m_dt) - call TrackAlarm.getNow())); - call TrackAlarm.startAt(m_lastBeaconRxTime, m_dt + IEEE154_MAX_BEACON_LISTEN_TIME(m_beaconOrder)); + dt = m_dt + IEEE154_MAX_BEACON_LISTEN_TIME(m_beaconOrder); + call TrackAlarm.startAt(m_lastBeaconRxTime, dt); + dbg_serial("BeaconSynchronizeP","Rx enabled, expecting beacon within %lu symbols.\n", + (uint32_t) ((m_lastBeaconRxTime + dt) - call TrackAlarm.getNow())); break; default: ASSERT(0); diff --git a/tos/lib/mac/tkn154/DisassociateP.nc b/tos/lib/mac/tkn154/DisassociateP.nc index dbc58a99..ad9404ed 100644 --- a/tos/lib/mac/tkn154/DisassociateP.nc +++ b/tos/lib/mac/tkn154/DisassociateP.nc @@ -55,6 +55,7 @@ module DisassociateP interface Pool as TxFramePool; interface Pool as TxControlPool; interface MLME_GET; + interface MLME_SET; interface FrameUtility; interface IEEE154Frame as Frame; interface Get as LocalExtendedAddress; @@ -68,6 +69,7 @@ implementation uint8_t m_payloadDisassocRequest[2]; uint8_t m_coordAddrMode; bool m_disAssociationOngoing; + void resetPanValuesInPib(); command error_t Init.init() { @@ -151,6 +153,7 @@ implementation 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]); @@ -158,6 +161,11 @@ implementation call TxFramePool.put(data); dbg_serial("DisassociateP", "transmitDone() -> result: %lu\n", (uint32_t) status); m_disAssociationOngoing = FALSE; + + // "[...] even if the acknowledgment is not received, + // the device should consider itself disassociated." (Sect. 7.5.3.2) + if (status == IEEE154_SUCCESS || status == IEEE154_NO_ACK) + resetPanValuesInPib(); signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress); } @@ -173,11 +181,17 @@ implementation 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 TxControlPool.put((ieee154_txcontrol_t*) ((uint8_t*) data->header - offsetof(ieee154_txcontrol_t, header))); call TxFramePool.put(data); dbg_serial("DisassociateP", "transmitDone() -> result: %lu\n", (uint32_t) status); m_disAssociationOngoing = FALSE; + + // "[...] even if the acknowledgment is not received, + // the device should consider itself disassociated." (Sect. 7.5.3.2) + if (status == IEEE154_SUCCESS || status == IEEE154_NO_ACK) + resetPanValuesInPib(); signal MLME_DISASSOCIATE.confirm(status, DeviceAddrMode, DevicePANID, DeviceAddress); } @@ -187,6 +201,7 @@ implementation { // 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; @@ -202,6 +217,7 @@ implementation { // received a disassociation notification from the device ieee154_address_t address; + 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); @@ -209,6 +225,19 @@ implementation return frame; } + void resetPanValuesInPib() + { + // "An associated device shall disassociate itself by removing + // all references to the PAN; the MLME shall set macPANId, + // macShortAddress, macAssociatedPANCoord, macCoordShortAddress + // and macCoordExtended- Address to the default values." (Sect. 7.5.3.2) + call MLME_SET.macPANId(IEEE154_DEFAULT_PANID); + call MLME_SET.macShortAddress(IEEE154_DEFAULT_SHORTADDRESS); + call MLME_SET.macAssociatedPANCoord(IEEE154_DEFAULT_ASSOCIATEDPANCOORD); + call MLME_SET.macCoordShortAddress(IEEE154_DEFAULT_COORDSHORTADDRESS); + call MLME_SET.macCoordExtendedAddress(0); + } + /* ------------------- Defaults ------------------- */ default event void MLME_DISASSOCIATE.indication ( diff --git a/tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc b/tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc index a2fe4972..474995d7 100644 --- a/tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc +++ b/tos/lib/mac/tkn154/TKN154BeaconEnabledP.nc @@ -318,6 +318,7 @@ implementation DisassociateP.TxFramePool -> TxFramePoolP; DisassociateP.TxControlPool -> TxControlPoolP; DisassociateP.MLME_GET -> PibP; + DisassociateP.MLME_SET -> PibP; DisassociateP.FrameUtility -> PibP; DisassociateP.Frame -> PibP; DisassociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; diff --git a/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc b/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc index f553f715..dea2bdce 100644 --- a/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc +++ b/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc @@ -231,6 +231,7 @@ implementation DisassociateP.TxFramePool -> TxFramePoolP; DisassociateP.TxControlPool -> TxControlPoolP; DisassociateP.MLME_GET -> PibP; + DisassociateP.MLME_SET -> PibP; DisassociateP.FrameUtility -> PibP; DisassociateP.Frame -> PibP; DisassociateP.LocalExtendedAddress -> PibP.GetLocalExtendedAddress; -- 2.39.2