123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- /**************************************************************************************************
- 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 <stddef.h>
- /* ------------------------------------------------------------------------------------------------
- * 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
- 3, /* 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;
- }
|