/************************************************************************************************** Filename: mac_pib.c Revised: $Date: 2012-02-15 12:54:07 -0800 (Wed, 15 Feb 2012) $ Revision: $Revision: 29306 $ Description: This module contains procedures for the MAC PIB. Copyright 2006-2012 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ /* ------------------------------------------------------------------------------------------------ * Includes * ------------------------------------------------------------------------------------------------ */ #include "hal_mcu.h" #include "hal_board.h" #include "mac_api.h" #include "mac_spec.h" #include "mac_low_level.h" #include "mac_radio_defs.h" #include "mac_main.h" #include "mac_pib.h" #include "OSAL.h" #include /* ------------------------------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------------------------------ */ /* Attribute index constants, based on attribute ID values from spec */ #define MAC_ATTR_SET1_START 0x40 #define MAC_ATTR_SET1_END 0x5D #define MAC_ATTR_SET1_OFFSET 0 #define MAC_ATTR_SET2_START 0xE0 #define MAC_ATTR_SET2_END 0xE5 #define MAC_ATTR_SET2_OFFSET (MAC_ATTR_SET1_END - MAC_ATTR_SET1_START + MAC_ATTR_SET1_OFFSET + 1) /* frame response values */ #define MAC_MAX_FRAME_RESPONSE_MIN 143 #define MAC_MAX_FRAME_RESPONSE_MAX 25776 /* ------------------------------------------------------------------------------------------------ * Typedefs * ------------------------------------------------------------------------------------------------ */ /* PIB access and min/max table type */ typedef struct { uint8 offset; uint8 len; uint8 min; uint8 max; } macPibTbl_t; /* ------------------------------------------------------------------------------------------------ * Local Variables * ------------------------------------------------------------------------------------------------ */ /* PIB default values */ static CODE const macPib_t macPibDefaults = { 54, /* ackWaitDuration */ FALSE, /* associationPermit */ TRUE, /* autoRequest */ FALSE, /* battLifeExt */ 6, /* battLifeExtPeriods */ NULL, /* *pMacBeaconPayload */ 0, /* beaconPayloadLength */ MAC_BO_NON_BEACON, /* beaconOrder */ 0, /* beaconTxTime */ 0, /* bsn */ {0, SADDR_MODE_EXT}, /* coordExtendedAddress */ MAC_SHORT_ADDR_NONE, /* coordShortAddress */ 0, /* dsn */ FALSE, /* gtsPermit */ 4, /* maxCsmaBackoffs */ 3, /* minBe */ 0xFFFF, /* panId */ FALSE, /* promiscuousMode */ FALSE, /* rxOnWhenIdle */ MAC_SHORT_ADDR_NONE, /* shortAddress */ MAC_SO_NONE, /* superframeOrder */ 0x01F4, /* transactionPersistenceTime */ FALSE, /* assocciatedPanCoord */ 5, /* maxBe */ 1220, /* maxFrameTotalWaitTime */ 3, /* maxFrameRetries */ 32, /* ResponseWaitTime */ 0, /* syncSymbolOffset */ TRUE, /* timeStampSupported */ FALSE, /* securityEnabled */ /* Proprietary */ #if defined (HAL_PA_LNA) 19, /* phyTransmitPower for CC2591 */ #elif defined (HAL_PA_LNA_CC2590) 11, /* phyTransmitPower for CC2590 */ #else 0, /* phyTransmitPower without frontend */ #endif MAC_CHAN_11, /* logicalChannel */ {0, SADDR_MODE_EXT}, /* extendedAddress */ 1, /* altBe */ MAC_BO_NON_BEACON, /* deviceBeaconOrder */ }; /* PIB access and min/max table. min/max of 0/0 means not checked; if min/max are * equal, element is read-only */ static CODE const macPibTbl_t macPibTbl[] = { {offsetof(macPib_t, ackWaitDuration), sizeof(uint8), 54, 54}, /* MAC_ACK_WAIT_DURATION */ {offsetof(macPib_t, associationPermit), sizeof(bool), FALSE, TRUE}, /* MAC_ASSOCIATION_PERMIT */ {offsetof(macPib_t, autoRequest), sizeof(bool), FALSE, TRUE}, /* MAC_AUTO_REQUEST */ {offsetof(macPib_t, battLifeExt), sizeof(bool), FALSE, TRUE}, /* MAC_BATT_LIFE_EXT */ {offsetof(macPib_t, battLifeExtPeriods), sizeof(uint8), 6, 6}, /* MAC_BATT_LIFE_EXT_PERIODS */ {offsetof(macPib_t, pBeaconPayload), sizeof(uint8 *), 0, 0}, /* MAC_BEACON_PAYLOAD */ {offsetof(macPib_t, beaconPayloadLength), sizeof(uint8), 0, 52}, /* MAC_BEACON_PAYLOAD_LENGTH */ {offsetof(macPib_t, beaconOrder), sizeof(uint8), 0, 15}, /* MAC_BEACON_ORDER */ {offsetof(macPib_t, beaconTxTime), sizeof(uint32), 1, 1}, /* MAC_BEACON_TX_TIME */ {offsetof(macPib_t, bsn), sizeof(uint8), 0x00, 0xFF}, /* MAC_BSN */ {offsetof(macPib_t, coordExtendedAddress.addr.extAddr), sizeof(sAddrExt_t), 0, 0}, /* MAC_COORD_EXTENDED_ADDRESS */ {offsetof(macPib_t, coordShortAddress), sizeof(uint16), 0, 0}, /* MAC_COORD_SHORT_ADDRESS */ {offsetof(macPib_t, dsn), sizeof(uint8), 0x00, 0xFF}, /* MAC_DSN */ {offsetof(macPib_t, gtsPermit), sizeof(bool), FALSE, TRUE}, /* MAC_GTS_PERMIT */ /* Range of maxCsmaBackoffs is between 0 and 5 in IEEE 802.15.4. * Such restriction is removed here to allow 802.15.4 non-compliant experimental * applications. * To be compliant with 802.15.4, application or upper layer must not set this * PIB attribute out of range of 802.15.4. * The range is still restricted to 254 since value 255 would cause backoff * counter to overflow, wrap around and loop infinitely. */ {offsetof(macPib_t, maxCsmaBackoffs), sizeof(uint8), 0, 254}, /* MAC_MAX_CSMA_BACKOFFS */ {offsetof(macPib_t, minBe), sizeof(uint8), 0, 8}, /* MAC_MIN_BE */ {offsetof(macPib_t, panId), sizeof(uint16), 0, 0}, /* MAC_PAN_ID */ {offsetof(macPib_t, promiscuousMode), sizeof(bool), FALSE, TRUE}, /* MAC_PROMISCUOUS_MODE */ {offsetof(macPib_t, rxOnWhenIdle), sizeof(bool), FALSE, TRUE}, /* MAC_RX_ON_WHEN_IDLE */ {offsetof(macPib_t, shortAddress), sizeof(uint16), 0, 0}, /* MAC_SHORT_ADDRESS */ {offsetof(macPib_t, superframeOrder), sizeof(uint8), 0, 15}, /* MAC_SUPERFRAME_ORDER */ {offsetof(macPib_t, transactionPersistenceTime), sizeof(uint16), 0, 0}, /* MAC_TRANSACTION_PERSISTENCE_TIME */ {offsetof(macPib_t, associatedPanCoord), sizeof(bool), FALSE, TRUE}, /* MAC_ASSOCIATED_PAN_COORD */ /* Range of maxBe is between 3 and 8 in IEEE 802.15.4. * Such restriction is removed here to allow 802.15.4 non-compliant experimental * applications. * To be compliant with 802.15.4, application or upper layer must not set this * PIB attribute out of range of 802.15.4. */ {offsetof(macPib_t, maxBe), sizeof(uint8), 0, 8}, /* MAC_MAX_BE */ {offsetof(macPib_t, maxFrameTotalWaitTime), sizeof(uint16), 0x00, 0xFF}, /* MAC_MAX_FRAME_RESPONSE_TIME */ {offsetof(macPib_t, maxFrameRetries), sizeof(uint8), 0, 7}, /* MAC_MAX_FRAME_RETRIES */ {offsetof(macPib_t, responseWaitTime), sizeof(uint8), 2, 64}, /* MAC_RESPONSE_WAIT_TIME */ {offsetof(macPib_t, syncSymbolOffset), sizeof(uint8), 0, 0}, /* MAC_SYNC_SYMBOL_OFFSET */ {offsetof(macPib_t, timeStampSupported), sizeof(bool), FALSE, TRUE}, /* MAC_TIMESTAMP_SUPPORTED */ {offsetof(macPib_t, securityEnabled), sizeof(bool), FALSE, TRUE}, /* MAC_SECURITY_ENABLED */ /* Proprietary PIBs */ {offsetof(macPib_t, phyTransmitPower), sizeof(uint8), 0, 0xFF}, /* MAC_PHY_TRANSMIT_POWER */ {offsetof(macPib_t, logicalChannel), sizeof(uint8), MAC_CHAN_11, MAC_CHAN_28}, /* MAC_LOGICAL_CHANNEL */ {offsetof(macPib_t, extendedAddress.addr.extAddr), sizeof(sAddrExt_t), 0, 0}, /* MAC_EXTENDED_ADDRESS */ {offsetof(macPib_t, altBe), sizeof(uint8), 0, 8}, /* MAC_ALT_BE */ {offsetof(macPib_t, deviceBeaconOrder), sizeof(uint8), 0, 15}, /* MAC_DEVICE_BEACON_ORDER */ {offsetof(macPib_t, phyTransmitPower), sizeof(uint8), 0, 0}, /* MAC_PHY_TRANSMIT_POWER_SIGNED */ }; /* Invalid PIB table index used for error code */ #define MAC_PIB_INVALID ((uint8) (sizeof(macPibTbl) / sizeof(macPibTbl[0]))) /* ------------------------------------------------------------------------------------------------ * Global Variables * ------------------------------------------------------------------------------------------------ */ /* MAC PIB */ macPib_t macPib; /************************************************************************************************** * @fn macPibReset * * @brief This function initializes the PIB. * * input parameters * * @param None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ MAC_INTERNAL_API void macPibReset(void) { /* copy PIB defaults */ macPib = macPibDefaults; /* initialize random sequence numbers */ macPib.dsn = macRadioRandomByte(); macPib.bsn = macRadioRandomByte(); } /************************************************************************************************** * @fn macPibIndex * * @brief This function takes an PIB attribute and returns the index in to * macPibTbl for the attribute. * * input parameters * * @param pibAttribute - PIB attribute to look up. * * output parameters * * None. * * @return Index in to macPibTbl for the attribute or MAC_PIB_INVALID. ************************************************************************************************** */ static uint8 macPibIndex(uint8 pibAttribute) { if ((pibAttribute >= MAC_ATTR_SET1_START) && (pibAttribute <= MAC_ATTR_SET1_END)) { return (pibAttribute - MAC_ATTR_SET1_START + MAC_ATTR_SET1_OFFSET); } else if ((pibAttribute >= MAC_ATTR_SET2_START) && (pibAttribute <= MAC_ATTR_SET2_END)) { return (pibAttribute - MAC_ATTR_SET2_START + MAC_ATTR_SET2_OFFSET); } else { return MAC_PIB_INVALID; } } /************************************************************************************************** * @fn MAC_MlmeGetReq * * @brief This direct execute function retrieves an attribute value * from the MAC PIB. * * input parameters * * @param pibAttribute - The attribute identifier. * @param pValue - pointer to the attribute value. * * output parameters * * @param pValue - pointer to the attribute value. * * @return The status of the request, as follows: * MAC_SUCCESS Operation successful. * MAC_UNSUPPORTED_ATTRIBUTE Attribute not found. * ************************************************************************************************** */ uint8 MAC_MlmeGetReq(uint8 pibAttribute, void *pValue) { uint8 i; halIntState_t intState; if ((i = macPibIndex(pibAttribute)) == MAC_PIB_INVALID) { return MAC_UNSUPPORTED_ATTRIBUTE; } HAL_ENTER_CRITICAL_SECTION(intState); osal_memcpy(pValue, (uint8 *) &macPib + macPibTbl[i].offset, macPibTbl[i].len); HAL_EXIT_CRITICAL_SECTION(intState); return MAC_SUCCESS; } /************************************************************************************************** * @fn MAC_MlmeSetReq * * @brief This direct execute function sets an attribute value * in the MAC PIB. * * input parameters * * @param pibAttribute - The attribute identifier. * @param pValue - pointer to the attribute value. * * output parameters * * None. * * @return The status of the request, as follows: * MAC_SUCCESS Operation successful. * MAC_UNSUPPORTED_ATTRIBUTE Attribute not found. * ************************************************************************************************** */ uint8 MAC_MlmeSetReq(uint8 pibAttribute, void *pValue) { uint8 i; halIntState_t intState; if (pibAttribute == MAC_BEACON_PAYLOAD) { macPib.pBeaconPayload = pValue; return MAC_SUCCESS; } /* look up attribute in PIB table */ if ((i = macPibIndex(pibAttribute)) == MAC_PIB_INVALID) { return MAC_UNSUPPORTED_ATTRIBUTE; } /* do range check; no range check if min and max are zero */ if ((macPibTbl[i].min != 0) || (macPibTbl[i].max != 0)) { /* if min == max, this is a read-only attribute */ if (macPibTbl[i].min == macPibTbl[i].max) { return MAC_READ_ONLY; } /* check for special cases */ if (pibAttribute == MAC_MAX_FRAME_TOTAL_WAIT_TIME) { if ((*((uint16 *) pValue) < MAC_MAX_FRAME_RESPONSE_MIN) || (*((uint16 *) pValue) > MAC_MAX_FRAME_RESPONSE_MAX)) { return MAC_INVALID_PARAMETER; } } /* range check for general case */ if ((*((uint8 *) pValue) < macPibTbl[i].min) || (*((uint8 *) pValue) > macPibTbl[i].max)) { return MAC_INVALID_PARAMETER; } } /* set value in PIB */ HAL_ENTER_CRITICAL_SECTION(intState); osal_memcpy((uint8 *) &macPib + macPibTbl[i].offset, pValue, macPibTbl[i].len); HAL_EXIT_CRITICAL_SECTION(intState); /* handle special cases */ switch (pibAttribute) { case MAC_PAN_ID: /* set pan id in radio */ macRadioSetPanID(macPib.panId); break; case MAC_SHORT_ADDRESS: /* set short address in radio */ macRadioSetShortAddr(macPib.shortAddress); break; case MAC_RX_ON_WHEN_IDLE: /* turn rx on or off */ if (macPib.rxOnWhenIdle) { macRxEnable(MAC_RX_WHEN_IDLE); } else { macRxDisable(MAC_RX_WHEN_IDLE); } break; case MAC_LOGICAL_CHANNEL: macRadioSetChannel(macPib.logicalChannel); break; case MAC_EXTENDED_ADDRESS: /* set ext address in radio */ macRadioSetIEEEAddr(macPib.extendedAddress.addr.extAddr); break; #ifndef MAC_OBSOLETE_PHY_TRANSMIT_POWER /* Define MAC_OBSOLETE_PHY_TRANSMIT_POWER to save some code */ case MAC_PHY_TRANSMIT_POWER: /* Legacy transmit power attribute */ #if !defined HAL_MAC_USE_REGISTER_POWER_VALUES && \ !defined HAL_PA_LNA && !defined HAL_PA_LNA_CC2590 /* Legacy transmit power attribute value for CC2530 alone, * or runtime selection support build means a negative absolute value. * However, when used as register power values or * with HAL_PA_LNAxxx definition (without runtime selection) * the attribute value is not a negative absolute value. */ macPib.phyTransmitPower = (uint8)(-(int8)macPib.phyTransmitPower); #endif /* !defined HAL_MAC_USE_REGISTER_POWER_VALUES && ... */ /* pass through to next case -- do not break*/ #endif /* MAC_OBSOLETE_PHY_TRANSMIT_POWER */ case MAC_PHY_TRANSMIT_POWER_SIGNED: (void)macRadioSetTxPower(macPib.phyTransmitPower); break; default: break; } return MAC_SUCCESS; }