From Ivan Lawrow: Added IEEE 802.15.4-2003 AES-CCM security modes
[obnox/wireshark/wip.git] / epan / dissectors / packet-ieee802154.h
1 /* packet-ieee802154.h
2  *
3  * $Id$
4  *
5  * IEEE 802.15.4 Dissectors for Wireshark
6  * By Owen Kirby <osk@exegin.com>
7  * Copyright 2007 Exegin Technologies Limited
8  *
9  * Wireshark - Network traffic analyzer
10  * By Gerald Combs <gerald@wireshark.org>
11  * Copyright 1998 Gerald Combs
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  */
27 #ifndef PACKET_IEEE802154_H
28 #define PACKET_IEEE802154_H
29
30 /* Protocol Abbreviation */
31 #define IEEE802154_PROTOABBREV_WPAN     "wpan"
32
33 /*  Packet Overhead from MAC header + footer (excluding addressing) */
34 #define IEEE802154_MAX_FRAME_LEN            127
35 #define IEEE802154_FCS_LEN                  2
36
37 /*  Command Frame Identifier Types Definions */
38 #define IEEE802154_CMD_ASRQ                 0x01
39 #define IEEE802154_CMD_ASRSP                0x02
40 #define IEEE802154_CMD_DISAS                0x03
41 #define IEEE802154_CMD_DATA_RQ              0x04
42 #define IEEE802154_CMD_PANID_ERR            0x05
43 #define IEEE802154_CMD_ORPH_NOTIF           0x06
44 #define IEEE802154_CMD_BCN_RQ               0x07
45 #define IEEE802154_CMD_COORD_REAL           0x08
46 #define IEEE802154_CMD_GTS_REQ              0x09
47 #define IEEE802145_CMD_MAX_ID               0x09
48
49 /*  Definitions for Association Response Command */
50 #define IEEE802154_CMD_ASRSP_AS_SUCCESS     0x00
51 #define IEEE802154_CMD_ASRSP_PAN_FULL       0x01
52 #define IEEE802154_CMD_ASRSP_PAN_DENIED     0x02
53
54 /*  Bit Masks for Capability Information Field
55     Included in Association Req. command    */
56 #define IEEE802154_CMD_CINFO_ALT_PAN_COORD  0x01
57 #define IEEE802154_CMD_CINFO_DEVICE_TYPE    0x02
58 #define IEEE802154_CMD_CINFO_POWER_SRC      0x04
59 #define IEEE802154_CMD_CINFO_IDLE_RX        0x08
60 #define IEEE802154_CMD_CINFO_SEC_CAPABLE    0x40
61 #define IEEE802154_CMD_CINFO_ALLOC_ADDR     0x80
62
63 #define IEEE802154_CMD_GTS_REQ_LEN          0x0F
64 #define IEEE802154_CMD_GTS_REQ_DIR          0x10
65 #define IEEE802154_CMD_GTS_REQ_TYPE         0x20
66
67 /*  Bit masks & shifts for various beacon fields */
68 #define IEEE802154_BEACON_ORDER_MASK        0x000F
69 #define IEEE802154_SUPERFRAME_ORDER_MASK    0x00F0
70 #define IEEE802154_SUPERFRAME_CAP_MASK      0x0F00
71 #define IEEE802154_BATT_EXTENSION_MASK      0x1000
72 #define IEEE802154_SUPERFRAME_COORD_MASK    0x4000
73 #define IEEE802154_ASSOC_PERMIT_MASK        0x8000
74 #define IEEE802154_SUPERFRAME_ORDER_SHIFT   4
75 #define IEEE802154_SUPERFRAME_CAP_SHIFT     8
76
77 #define IEEE802154_GTS_COUNT_MASK           0x07
78 #define IEEE802154_GTS_PERMIT_MASK          0x80
79 #define IEEE802154_GTS_DIRECTION_SLOT(i)    (0x01<<(i))
80 #define IEEE802154_GTS_MAX_SLOTS            7
81 #define IEEE802154_GTS_DIRECTION_SLOT1      0x01
82 #define IEEE802154_GTS_DIRECTION_SLOT2      0x02
83 #define IEEE802154_GTS_DIRECTION_SLOT3      0x04
84 #define IEEE802154_GTS_DIRECTION_SLOT4      0x08
85 #define IEEE802154_GTS_DIRECTION_SLOT5      0x10
86 #define IEEE802154_GTS_DIRECTION_SLOT6      0x20
87 #define IEEE802154_GTS_DIRECTION_SLOT7      0x40
88 #define IEEE802154_GTS_SLOT_MASK            0x0F
89 #define IEEE802154_GTS_LENGTH_MASK          0xF0
90 #define IEEE802154_GTS_LENGTH_SHIFT         4
91
92 #define IEEE802154_PENDADDR_SHORT_MASK      0x07
93 #define IEEE802154_PENDADDR_LONG_MASK       0x70
94 #define IEEE802154_PENDADDR_LONG_SHIFT      4
95
96 #define IEEE802154_SUPERFRAME_DURATION      (IEEE802154_BASE_SLOT_DURATION * IEEE802154_SUPERFRAME_SLOTS)
97 #define IEEE802154_BASE_SLOT_DURATION       60
98 #define IEEE802154_SUPERFRAME_SLOTS         16
99
100 /*  Bit-masks for the FCF */
101 #define IEEE802154_FCF_TYPE_MASK            0x0007  /* Frame Type Mask */
102 #define IEEE802154_FCF_SEC_EN               0x0008
103 #define IEEE802154_FCF_FRAME_PND            0x0010
104 #define IEEE802154_FCF_ACK_REQ              0x0020
105 #define IEEE802154_FCF_INTRA_PAN            0x0040  /* known as PAN ID Compression in IEEE 802.15.4-2006 */
106 #define IEEE802154_FCF_DADDR_MASK           0x0C00  /* destination addressing mask */
107 #define IEEE802154_FCF_VERSION              0x3000
108 #define IEEE802154_FCF_SADDR_MASK           0xC000  /* source addressing mask */
109
110 /* Frame Type Definitions */
111 #define IEEE802154_FCF_BEACON               0x0000  /* Beacon Frame */
112 #define IEEE802154_FCF_DATA                 0x0001  /* Data Frame */
113 #define IEEE802154_FCF_ACK                  0x0002  /* Acknowlegement Frame */
114 #define IEEE802154_FCF_CMD                  0x0003  /* Command Frame */
115
116 /* Frame version definitions. */
117 #define IEEE802154_VERSION_2003             0x0
118 #define IEEE802154_VERSION_2006             0x1
119
120 /* Address Mode Definitions */
121 #define IEEE802154_FCF_ADDR_NONE            0x0000
122 #define IEEE802154_FCF_ADDR_SHORT           0x0002
123 #define IEEE802154_FCF_ADDR_EXT             0x0003
124
125 /*  Bit-masks for CC24xx style FCS */
126 #define IEEE802154_CC24xx_CORRELATION       0x7F00
127 #define IEEE802154_CC24xx_CRC_OK            0x8000
128 #define IEEE802154_CC24xx_RSSI              0x00FF
129
130 /*  Special IEEE802.15.4 Addresses */
131 #define IEEE802154_NO_ADDR16                0xFFFE
132 #define IEEE802154_BCAST_ADDR               0xFFFF
133 #define IEEE802154_BCAST_PAN                0xFFFF
134
135 /*  Bit mask for PHY length field */
136 #define IEEE802154_PHY_LENGTH_MASK          0x7f
137
138 /* Auxiliary Security Header */
139 #define IEEE802154_AUX_SEC_LEVEL_MASK       0x07  /* Security Level */
140 #define IEEE802154_AUX_KEY_ID_MODE_MASK     0x18  /* Key Identifier Mode */
141 #define IEEE802154_AUX_KEY_ID_MODE_SHIFT    3
142 #define IEEE802154_AUX_KEY_RESERVED_MASK    0xE0  /* Reserved */
143
144 typedef enum {
145     SECURITY_LEVEL_NONE = 0x00,
146     SECURITY_LEVEL_MIC_32 = 0x01,
147     SECURITY_LEVEL_MIC_64 = 0x02,
148     SECURITY_LEVEL_MIC_128 = 0x03,
149     SECURITY_LEVEL_ENC = 0x04,
150     SECURITY_LEVEL_ENC_MIC_32 = 0x05,
151     SECURITY_LEVEL_ENC_MIC_64 = 0x06,
152     SECURITY_LEVEL_ENC_MIC_128 = 0x07
153 } ieee802154_security_level;
154
155 typedef enum {
156     KEY_ID_MODE_IMPLICIT = 0x00,
157     KEY_ID_MODE_KEY_INDEX = 0x01,
158     KEY_ID_MODE_KEY_EXPLICIT_4 = 0x02,
159     KEY_ID_MODE_KEY_EXPLICIT_8 = 0x03
160 } ieee802154_key_id_mode;
161
162 /* IEEE 802.15.4 cipher block size. */
163 #define IEEE802154_CIPHER_SIZE              16
164
165 /* Macro to compute the MIC length. */
166 #define IEEE802154_MIC_LENGTH(_level_) ((0x2 << ((_level_) & 0x3)) & ~0x3)
167 /* Macro to check for payload encryption. */
168 #define IEEE802154_IS_ENCRYPTED(_level_) ((_level_) & 0x4)
169
170 /*  Structure containing information regarding all necessary packet fields. */
171 typedef struct {
172     /* Frame control field. */
173     gint32      version;
174     gint32      frame_type;
175     gint32      dst_addr_mode;
176     gint32      src_addr_mode;
177     gboolean    security_enable;
178     gboolean    frame_pending;
179     gboolean    ack_request;
180     gboolean    intra_pan;
181
182     guint8      seqno;
183
184     /* Addressing Info. */
185     guint16     dst_pan;
186     guint16     src_pan;
187     guint16     dst16;
188     guint64     dst64;
189     guint16     src16;
190     guint64     src64;
191
192     /* Security Info. */
193     ieee802154_security_level   security_level;
194     ieee802154_key_id_mode      key_id_mode;
195     guint32     frame_counter;
196     guint8      key_sequence_counter;    /* Only for 802.15.4-2003 security suite with encryption */
197
198     union {
199         guint32 addr32;
200         guint64 addr64;
201     } key_source;
202     guint8      key_index;
203
204     /* Command ID (only if frame_type == 0x3) */
205     guint8      command_id;
206     GHashTable *short_table;
207 } ieee802154_packet;
208
209 /* Structure for two-way mapping table */
210 typedef struct {
211     GHashTable *long_table;
212     GHashTable *short_table;
213 } ieee802154_map_tab_t;
214
215 /* Key used by the short address hash table. */
216 typedef struct {
217     guint16     pan;
218     guint16     addr;
219 } ieee802154_short_addr;
220
221 /* Key used by the long address hash table. */
222 typedef struct {
223     guint64     addr;
224 } ieee802154_long_addr;
225
226 /* A mapping record for a frame, pointed to by hash table */
227 typedef struct {
228     const char *proto; /* name of protocol that created this record */
229     guint       start_fnum;
230     guint       end_fnum;
231     guint64     addr64;
232     /*guint32   frame_counter;   TODO for frame counter sequence checks. */
233 } ieee802154_map_rec;
234
235 #define IEEE802154_USER_MAPPING 0
236
237 typedef struct {
238     guint16             src_pan;
239     guint16             src16;
240     ieee802154_map_rec *map_rec;
241 } ieee802154_hints_t;
242
243 /* Short to Extended Address Prototypes */
244 extern ieee802154_map_rec *ieee802154_addr_update(ieee802154_map_tab_t *, guint16, guint16, guint64,
245         const char *, guint);
246 extern guint    ieee802154_short_addr_hash(gconstpointer);
247 extern guint    ieee802154_long_addr_hash(gconstpointer key);
248 extern gboolean ieee802154_short_addr_equal(gconstpointer, gconstpointer);
249 extern gboolean ieee802154_long_addr_equal(gconstpointer a, gconstpointer b);
250
251 extern gboolean ieee802154_short_addr_invalidate(guint16, guint16, guint);
252 extern gboolean ieee802154_long_addr_invalidate(guint64, guint);
253
254 #endif /* PACKET_IEEE802154_H */