5 * IEEE 802.15.4 Dissectors for Wireshark
6 * By Owen Kirby <osk@exegin.com>
7 * Copyright 2007 Exegin Technologies Limited
9 * Wireshark - Network traffic analyzer
10 * By Gerald Combs <gerald@wireshark.org>
11 * Copyright 1998 Gerald Combs
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.
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.
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.
27 #ifndef PACKET_IEEE802154_H
28 #define PACKET_IEEE802154_H
30 /* Protocol Abbreviation */
31 #define IEEE802154_PROTOABBREV_WPAN "wpan"
33 /* Packet Overhead from MAC header + footer (excluding addressing) */
34 #define IEEE802154_MAX_FRAME_LEN 127
35 #define IEEE802154_FCS_LEN 2
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
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
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
63 #define IEEE802154_CMD_GTS_REQ_LEN 0x0F
64 #define IEEE802154_CMD_GTS_REQ_DIR 0x10
65 #define IEEE802154_CMD_GTS_REQ_TYPE 0x20
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
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
92 #define IEEE802154_PENDADDR_SHORT_MASK 0x07
93 #define IEEE802154_PENDADDR_LONG_MASK 0x70
94 #define IEEE802154_PENDADDR_LONG_SHIFT 4
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
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 */
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 */
116 /* Frame version definitions. */
117 #define IEEE802154_VERSION_2003 0x0
118 #define IEEE802154_VERSION_2006 0x1
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
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
130 /* Special IEEE802.15.4 Addresses */
131 #define IEEE802154_NO_ADDR16 0xFFFE
132 #define IEEE802154_BCAST_ADDR 0xFFFF
133 #define IEEE802154_BCAST_PAN 0xFFFF
135 /* Bit mask for PHY length field */
136 #define IEEE802154_PHY_LENGTH_MASK 0x7f
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 */
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;
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;
162 /* IEEE 802.15.4 cipher block size. */
163 #define IEEE802154_CIPHER_SIZE 16
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)
170 /* Structure containing information regarding all necessary packet fields. */
172 /* Frame control field. */
175 gint32 dst_addr_mode;
176 gint32 src_addr_mode;
177 gboolean security_enable;
178 gboolean frame_pending;
179 gboolean ack_request;
184 /* Addressing 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 */
204 /* Command ID (only if frame_type == 0x3) */
206 GHashTable *short_table;
209 /* Structure for two-way mapping table */
211 GHashTable *long_table;
212 GHashTable *short_table;
213 } ieee802154_map_tab_t;
215 /* Key used by the short address hash table. */
219 } ieee802154_short_addr;
221 /* Key used by the long address hash table. */
224 } ieee802154_long_addr;
226 /* A mapping record for a frame, pointed to by hash table */
228 const char *proto; /* name of protocol that created this record */
232 /*guint32 frame_counter; TODO for frame counter sequence checks. */
233 } ieee802154_map_rec;
235 #define IEEE802154_USER_MAPPING 0
240 ieee802154_map_rec *map_rec;
241 } ieee802154_hints_t;
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);
251 extern gboolean ieee802154_short_addr_invalidate(guint16, guint16, guint);
252 extern gboolean ieee802154_long_addr_invalidate(guint64, guint);
254 #endif /* PACKET_IEEE802154_H */