Contiki 3.x
frame802154.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008, Swedish Institute of Computer Science
3  * All rights reserved.
4  *
5  * Additional fixes for AVR contributed by:
6  * Colin O'Flynn coflynn@newae.com
7  * Eric Gnoske egnoske@gmail.com
8  * Blake Leverett bleverett@gmail.com
9  * Mike Vidales mavida404@gmail.com
10  * Kevin Brown kbrown3@uccs.edu
11  * Nate Bohlmann nate@elfwerks.com
12  *
13  * Additional fixes for MSP430 contributed by:
14  * Joakim Eriksson
15  * Niclas Finne
16  * Nicolas Tsiftes
17  *
18  * All rights reserved.
19  *
20  * Redistribution and use in source and binary forms, with or without
21  * modification, are permitted provided that the following conditions are met:
22  *
23  * * Redistributions of source code must retain the above copyright
24  * notice, this list of conditions and the following disclaimer.
25  * * Redistributions in binary form must reproduce the above copyright
26  * notice, this list of conditions and the following disclaimer in
27  * the documentation and/or other materials provided with the
28  * distribution.
29  * * Neither the name of the copyright holders nor the names of
30  * contributors may be used to endorse or promote products derived
31  * from this software without specific prior written permission.
32  *
33  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
34  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
37  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
38  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
39  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
40  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
41  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
42  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
43  * POSSIBILITY OF SUCH DAMAGE.
44  */
45 
46 /**
47  * \addtogroup net
48  * @{
49  */
50 
51 /**
52  * \defgroup frame802154 802.15.4 frame creation and parsing
53  * @{
54  */
55 /**
56  * \file
57  * \brief 802.15.4 frame creation and parsing functions
58  *
59  * This file converts to and from a structure to a packed 802.15.4
60  * frame.
61  *
62  */
63 
64 /* Includes */
65 #ifndef FRAME_802154_H
66 #define FRAME_802154_H
67 
68 #include "contiki-conf.h"
69 #include "net/linkaddr.h"
70 
71 #ifdef IEEE802154_CONF_PANID
72 #define IEEE802154_PANID IEEE802154_CONF_PANID
73 #else /* IEEE802154_CONF_PANID */
74 #define IEEE802154_PANID 0xABCD
75 #endif /* IEEE802154_CONF_PANID */
76 
77 #ifdef FRAME802154_CONF_VERSION
78 #define FRAME802154_VERSION FRAME802154_CONF_VERSION
79 #else /* FRAME802154_CONF_VERSION */
80 #define FRAME802154_VERSION FRAME802154_IEEE802154_2006
81 #endif /* FRAME802154_CONF_VERSION */
82 
83 #ifdef FRAME802154_CONF_SUPPR_SEQNO
84 #define FRAME802154_SUPPR_SEQNO FRAME802154_CONF_SUPPR_SEQNO
85 #else /* FRAME802154_CONF_SUPPR_SEQNO */
86 #define FRAME802154_SUPPR_SEQNO 0
87 #endif /* FRAME802154_CONF_SUPPR_SEQNO */
88 
89 /* Macros & Defines */
90 
91 /** \brief These are some definitions of values used in the FCF. See the 802.15.4 spec for details.
92  * \name FCF element values definitions
93  * @{
94  */
95 #define FRAME802154_BEACONFRAME (0x00)
96 #define FRAME802154_DATAFRAME (0x01)
97 #define FRAME802154_ACKFRAME (0x02)
98 #define FRAME802154_CMDFRAME (0x03)
99 
100 #define FRAME802154_BEACONREQ (0x07)
101 
102 #define FRAME802154_IEEERESERVED (0x00)
103 #define FRAME802154_NOADDR (0x00) /**< Only valid for ACK or Beacon frames. */
104 #define FRAME802154_SHORTADDRMODE (0x02)
105 #define FRAME802154_LONGADDRMODE (0x03)
106 
107 #define FRAME802154_NOBEACONS (0x0F)
108 
109 #define FRAME802154_BROADCASTADDR (0xFFFF)
110 #define FRAME802154_BROADCASTPANDID (0xFFFF)
111 
112 #define FRAME802154_IEEE802154_2003 (0x00)
113 #define FRAME802154_IEEE802154_2006 (0x01)
114 #define FRAME802154_IEEE802154E_2012 (0x02)
115 
116 #define FRAME802154_SECURITY_LEVEL_NONE (0)
117 #define FRAME802154_SECURITY_LEVEL_MIC_32 (1)
118 #define FRAME802154_SECURITY_LEVEL_MIC_64 (2)
119 #define FRAME802154_SECURITY_LEVEL_MIC_128 (3)
120 #define FRAME802154_SECURITY_LEVEL_ENC (4)
121 #define FRAME802154_SECURITY_LEVEL_ENC_MIC_32 (5)
122 #define FRAME802154_SECURITY_LEVEL_ENC_MIC_64 (6)
123 #define FRAME802154_SECURITY_LEVEL_ENC_MIC_128 (7)
124 
125 #define FRAME802154_IMPLICIT_KEY (0)
126 #define FRAME802154_1_BYTE_KEY_ID_MODE (1)
127 #define FRAME802154_5_BYTE_KEY_ID_MODE (2)
128 #define FRAME802154_9_BYTE_KEY_ID_MODE (3)
129 
130 /**
131  * @brief The IEEE 802.15.4 frame has a number of constant/fixed fields that
132  * can be counted to make frame construction and max payload
133  * calculations easier.
134  *
135  * These include:
136  * 1. FCF - 2 bytes - Fixed
137  * 2. Sequence number - 1 byte - Fixed
138  * 3. Addressing fields - 4 - 20 bytes - Variable
139  * 4. Aux security header - 0 - 14 bytes - Variable
140  * 5. CRC - 2 bytes - Fixed
141  */
142 
143 /**
144  * \brief Defines the bitfields of the frame control field (FCF).
145  */
146 typedef struct {
147  uint8_t frame_type; /**< 3 bit. Frame type field, see 802.15.4 */
148  uint8_t security_enabled; /**< 1 bit. True if security is used in this frame */
149  uint8_t frame_pending; /**< 1 bit. True if sender has more data to send */
150  uint8_t ack_required; /**< 1 bit. Is an ack frame required? */
151  uint8_t panid_compression; /**< 1 bit. Is this a compressed header? */
152  /* uint8_t reserved; */ /**< 1 bit. Unused bit */
153  uint8_t sequence_number_suppression; /**< 1 bit. Does the header omit sequence number?, see 802.15.4e */
154  uint8_t ie_list_present; /**< 1 bit. Does the header contain Information Elements?, see 802.15.4e */
155  uint8_t dest_addr_mode; /**< 2 bit. Destination address mode, see 802.15.4 */
156  uint8_t frame_version; /**< 2 bit. 802.15.4 frame version */
157  uint8_t src_addr_mode; /**< 2 bit. Source address mode, see 802.15.4 */
159 
160 /** \brief 802.15.4 security control bitfield. See section 7.6.2.2.1 in 802.15.4 specification */
161 typedef struct {
162  uint8_t security_level; /**< 3 bit. security level */
163  uint8_t key_id_mode; /**< 2 bit. Key identifier mode */
164  uint8_t frame_counter_suppression; /**< 1 bit. Frame counter suppression */
165  uint8_t frame_counter_size; /**< 1 bit. Frame counter size (0: 4 bytes, 1: 5 bytes) */
166  uint8_t reserved; /**< 3 bit. Reserved bits */
168 
169 typedef union {
170  uint32_t u32;
171  uint16_t u16[2];
172  uint8_t u8[4];
173 } frame802154_frame_counter_t;
174 
175 typedef union {
176  uint16_t u16[4];
177  uint8_t u8[8];
178 } frame802154_key_source_t;
179 
180 /** \brief 802.15.4 Aux security header */
181 typedef struct {
182  frame802154_scf_t security_control; /**< Security control bitfield */
183  frame802154_frame_counter_t frame_counter; /**< Frame counter, used for security */
184  frame802154_key_source_t key_source; /**< Key Source subfield */
185  uint8_t key_index; /**< Key Index subfield */
187 
188 /** \brief Parameters used by the frame802154_create() function. These
189  * parameters are used in the 802.15.4 frame header. See the 802.15.4
190  * specification for details.
191  */
192 typedef struct {
193  /* The fields dest_addr and src_addr must come first to ensure they are aligned to the
194  * CPU word size. Needed as they are accessed directly as linkaddr_t*. Note we cannot use
195  * the type linkaddr_t directly here, as we always need 8 bytes, not LINKADDR_SIZE bytes. */
196  uint8_t dest_addr[8]; /**< Destination address */
197  uint8_t src_addr[8]; /**< Source address */
198  frame802154_fcf_t fcf; /**< Frame control field */
199  uint8_t seq; /**< Sequence number */
200  uint16_t dest_pid; /**< Destination PAN ID */
201  uint16_t src_pid; /**< Source PAN ID */
202  frame802154_aux_hdr_t aux_hdr; /**< Aux security header */
203  uint8_t *payload; /**< Pointer to 802.15.4 payload */
204  int payload_len; /**< Length of payload field */
205 } frame802154_t;
206 
207 /* Prototypes */
208 
210 int frame802154_create(frame802154_t *p, uint8_t *buf);
211 int frame802154_parse(uint8_t *data, int length, frame802154_t *pf);
212 
213 /* Get current PAN ID */
214 uint16_t frame802154_get_pan_id(void);
215 /* Set current PAN ID */
216 void frame802154_set_pan_id(uint16_t pan_id);
217 /* Tells whether a given Frame Control Field indicates a frame with
218  * source PANID and/or destination PANID */
219 void frame802154_has_panid(frame802154_fcf_t *fcf, int *has_src_pan_id, int *has_dest_pan_id);
220 /* Check if the destination PAN ID, if any, matches ours */
221 int frame802154_check_dest_panid(frame802154_t *frame);
222 /* Check is the address is a broadcast address, whatever its size */
223 int frame802154_is_broadcast_addr(uint8_t mode, uint8_t *addr);
224 /* Check and extract source and destination linkaddr from frame */
225 int frame802154_extract_linkaddr(frame802154_t *frame, linkaddr_t *source_address, linkaddr_t *dest_address);
226 
227 /** @} */
228 #endif /* FRAME_802154_H */
229 /** @} */
230 /** @} */
int frame802154_hdrlen(frame802154_t *p)
Calculates the length of the frame header.
Definition: frame802154.c:349
uint8_t security_enabled
1 bit.
Definition: frame802154.h:148
uint16_t src_pid
Source PAN ID.
Definition: frame802154.h:201
frame802154_scf_t security_control
Security control bitfield.
Definition: frame802154.h:182
uint8_t key_id_mode
2 bit.
Definition: frame802154.h:163
uint16_t dest_pid
Destination PAN ID.
Definition: frame802154.h:200
uint8_t key_index
Key Index subfield.
Definition: frame802154.h:185
static uip_ds6_addr_t * addr
Pointer to a router list entry.
Definition: uip-nd6.c:124
frame802154_fcf_t fcf
Frame control field.
Definition: frame802154.h:198
uint8_t ie_list_present
1 bit.
Definition: frame802154.h:154
frame802154_frame_counter_t frame_counter
Frame counter, used for security.
Definition: frame802154.h:183
802.15.4 security control bitfield.
Definition: frame802154.h:161
int payload_len
Length of payload field.
Definition: frame802154.h:204
uint8_t frame_pending
1 bit.
Definition: frame802154.h:149
uint8_t seq
Sequence number.
Definition: frame802154.h:199
uint8_t * payload
Pointer to 802.15.4 payload.
Definition: frame802154.h:203
802.15.4 Aux security header
Definition: frame802154.h:181
int frame802154_create(frame802154_t *p, uint8_t *buf)
Creates a frame for transmission over the air.
Definition: frame802154.c:369
Header file for the Rime address representation
The IEEE 802.15.4 frame has a number of constant/fixed fields that can be counted to make frame const...
Definition: frame802154.h:146
frame802154_key_source_t key_source
Key Source subfield.
Definition: frame802154.h:184
uint8_t frame_type
3 bit.
Definition: frame802154.h:147
int frame802154_parse(uint8_t *data, int len, frame802154_t *pf)
Parses an input frame.
Definition: frame802154.c:465
uint8_t security_level
3 bit.
Definition: frame802154.h:162
uint8_t src_addr_mode
2 bit.
Definition: frame802154.h:157
uint8_t frame_counter_size
1 bit.
Definition: frame802154.h:165
frame802154_aux_hdr_t aux_hdr
Aux security header.
Definition: frame802154.h:202
uint8_t dest_addr_mode
2 bit.
Definition: frame802154.h:155
uint8_t panid_compression
1 bit.
Definition: frame802154.h:151
uint8_t ack_required
1 bit.
Definition: frame802154.h:150
uint8_t reserved
3 bit.
Definition: frame802154.h:166
uint8_t frame_version
2 bit.
Definition: frame802154.h:156
Parameters used by the frame802154_create() function.
Definition: frame802154.h:192
uint8_t frame_counter_suppression
1 bit.
Definition: frame802154.h:164
uint8_t sequence_number_suppression
< 1 bit.
Definition: frame802154.h:153