/* * Copyright (c) 2008, Swedish Institute of Computer Science * All rights reserved. * * Additional fixes for AVR contributed by: * Colin O'Flynn coflynn@newae.com * Eric Gnoske egnoske@gmail.com * Blake Leverett bleverett@gmail.com * Mike Vidales mavida404@gmail.com * Kevin Brown kbrown3@uccs.edu * Nate Bohlmann nate@elfwerks.com * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of the copyright holders nor the names of * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /** * \addtogroup frame * @{ */ /** * \file * \brief 802.15.4 frame creation and parsing functions * * This file converts to and from a structure to a packed 802.15.4 * frame. * */ /* Includes */ #ifndef FRAME_UTILS_H #define FRAME_UTILS_H #include "hal.h" /* Macros & Defines */ /** * \brief Defines the bitfields of the frame control field (FCF). */ typedef union{ /** \brief Structure of bitfields for the FCF */ struct{ uint8_t frameType : 3; /**< Frame type field, see 802.15.4 */ bool securityEnabled : 1; /**< True if security is used in this frame */ bool framePending : 1; /**< True if sender has more data to send */ bool ackRequired : 1; /**< Is an ack frame required? */ bool panIdCompression : 1; /**< Is this a compressed header? */ uint8_t reserved : 3; /**< Unused bits */ uint8_t destAddrMode : 2; /**< Destination address mode, see 802.15.4 */ uint8_t frameVersion : 2; /**< 802.15.4 frame version */ uint8_t srcAddrMode : 2; /**< Source address mode, see 802.15.4 */ }; uint16_t word_val; /**< A word-wide value for the entire FCF */ }fcf_t; /** * \brief Structure that contains the lengths of the various addressing and security fields * in the 802.15.4 header. This structure is used in \ref frame_tx_create() */ typedef struct{ uint8_t dest_pid_len; /**< Length (in bytes) of destination PAN ID field */ uint8_t dest_addr_len; /**< Length (in bytes) of destination address field */ uint8_t src_pid_len; /**< Length (in bytes) of source PAN ID field */ uint8_t src_addr_len; /**< Length (in bytes) of source address field */ uint8_t aux_sec_len; /**< Length (in bytes) of aux security header field */ } field_length_t; /** \brief 802.15.4 security control bitfield. See section 7.6.2.2.1 in 802.15.4 specification */ typedef struct{ uint8_t security_level : 3; /**< security level */ uint8_t key_id_mode : 2; /**< Key identifier mode */ uint8_t reserved : 3; /**< Reserved bits */ } scf_t; /** \brief 802.15.4 Aux security header */ typedef struct{ scf_t security_control; /**< Security control bitfield */ uint32_t frame_counter; /**< Frame counter, used for security */ uint8_t key[9]; /**< The key itself, or an index to the key */ } aux_hdr_t; /** * @brief Some constants for frame length calculations. * The IEEE 802.15.4 frame has a number of constant/fixed fields that * can be counted to make frame construction and max payload * calculations easier. * * These include: * 1. FCF - 2 bytes - Fixed * 2. Sequence number - 1 byte - Fixed * 3. Addressing fields - 4 - 20 bytes - Variable * 4. Aux security header - 0 - 14 bytes - Variable * 5. CRC - 2 bytes - Fixed */ #define FIXEDFRAMEOVERHEAD (5) /** \brief A union of short and long address types. Although a node can have * both long and short addresses a frame will contain * only one of these. Therefore, a union is appropriate here. */ typedef union{ uint16_t shortAddr; /**< Short address, two bytes */ uint64_t longAddr; /**< Long address, eight bytes */ }ADDR_SIZE_SPEC_t; /** \brief Structure containing a PAN ID and an address */ typedef struct{ uint16_t panId; /**< PAN ID */ ADDR_SIZE_SPEC_t addrSpec; /**< A short or long address */ }PAN_ID_ADDR_SPEC_t; /** \brief Structure containing both source and destination addresses */ typedef struct{ PAN_ID_ADDR_SPEC_t destAddrFields; /**< Destination address */ PAN_ID_ADDR_SPEC_t srcAddrFields; /**< Source address */ }ADDR_FIELD_SPEC_t; /** \brief Union of both short and long addresses */ typedef union{ uint16_t addr16; /**< Short address */ uint64_t addr64; /**< Long address */ } addr_t; /** \brief Strucure used to return that status of the frame create process. * See frame_tx_create() function.*/ typedef struct{ uint8_t *frame; /**< Pointer to created frame */ uint8_t length; /**< Length (in bytes) of created frame */ } frame_result_t; /** \brief Parameters used by the frame_tx_create() function. These * parameters are used in the 802.15.4 frame header. See the 802.15.4 * specification for details. */ typedef struct{ fcf_t fcf; /**< Frame control field */ uint8_t seq; /**< Sequence number */ uint16_t dest_pid; /**< Destination PAN ID */ addr_t dest_addr; /**< Destination address */ uint16_t src_pid; /**< Source PAN ID */ addr_t src_addr; /**< Source address */ aux_hdr_t aux_hdr; /**< Aux security header */ uint8_t *payload; /**< Pointer to 802.15.4 frame payload */ uint8_t payload_len; /**< Length of payload field */ } frame_create_params_t; typedef struct{ fcf_t * fcf; /**< The FCF of the frame. */ uint8_t * seqNum; /**< The sequence number of the frame. */ uint16_t * dest_pid; /**< Destination PAN ID. */ addr_t * dest_addr; /**< Destination address. */ uint16_t * src_pid; /**< PAN ID */ addr_t * src_addr; /**< Source address */ uint8_t * aux_sec_hdr; /**< 802.15.4 Aux security header */ uint8_t * payload; /**< Frame payload */ uint8_t payload_length; /**< Length of payload section of frame */ uint8_t lqi; /**< Link quality indication value */ uint8_t rssi; /**< Received signal strength indication value */ uint32_t time; /**< Time stamp of received frame */ bool fcs:1; /**< True if checksum has passed */ bool in_use:1; /**< Is this frame struct being used? */ } parsed_frame_t; /* Globals */ //extern FRAME_t rx_frame; /* Protoypes */ void frame_tx_create(frame_create_params_t *p,frame_result_t *frame_result); void frame_rx_callback(uint16_t data); void rx_frame_parse(hal_rx_frame_t *rx_frame, parsed_frame_t *pf); /** @} */ #endif /* FRAME_UTILS_H */