xref: /libbtbb/wireshark/plugins/btbredr/packet-btlmp.c (revision 4cc286f39977de0d2c7d8305e14882bbf313e363)
1*4cc286f3SDominic Spill /* packet-btlmp.c
2*4cc286f3SDominic Spill  * Routines for Bluetooth LMP dissection
3*4cc286f3SDominic Spill  * Copyright 2009, Michael Ossmann <[email protected]>
4*4cc286f3SDominic Spill  *
5*4cc286f3SDominic Spill  * Wireshark - Network traffic analyzer
6*4cc286f3SDominic Spill  * By Gerald Combs <[email protected]>
7*4cc286f3SDominic Spill  * Copyright 1998 Gerald Combs
8*4cc286f3SDominic Spill  *
9*4cc286f3SDominic Spill  * This program is free software; you can redistribute it and/or
10*4cc286f3SDominic Spill  * modify it under the terms of the GNU General Public License
11*4cc286f3SDominic Spill  * as published by the Free Software Foundation; either version 2
12*4cc286f3SDominic Spill  * of the License, or (at your option) any later version.
13*4cc286f3SDominic Spill  *
14*4cc286f3SDominic Spill  * This program is distributed in the hope that it will be useful,
15*4cc286f3SDominic Spill  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16*4cc286f3SDominic Spill  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*4cc286f3SDominic Spill  * GNU General Public License for more details.
18*4cc286f3SDominic Spill  *
19*4cc286f3SDominic Spill  * You should have received a copy of the GNU General Public License
20*4cc286f3SDominic Spill  * along with this program; if not, write to the Free Software
21*4cc286f3SDominic Spill  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22*4cc286f3SDominic Spill  */
23*4cc286f3SDominic Spill 
24*4cc286f3SDominic Spill #ifdef HAVE_CONFIG_H
25*4cc286f3SDominic Spill #include "config.h"
26*4cc286f3SDominic Spill #else
27*4cc286f3SDominic Spill #include <wireshark/config.h>
28*4cc286f3SDominic Spill #endif
29*4cc286f3SDominic Spill 
30*4cc286f3SDominic Spill #include <wireshark/config.h> /* needed for epan/gcc-4.x */
31*4cc286f3SDominic Spill #include <epan/packet.h>
32*4cc286f3SDominic Spill #include <epan/prefs.h>
33*4cc286f3SDominic Spill 
34*4cc286f3SDominic Spill /* LMP opcodes */
35*4cc286f3SDominic Spill #define LMP_NAME_REQ                     1
36*4cc286f3SDominic Spill #define LMP_NAME_RES                     2
37*4cc286f3SDominic Spill #define LMP_ACCEPTED                     3
38*4cc286f3SDominic Spill #define LMP_NOT_ACCEPTED                 4
39*4cc286f3SDominic Spill #define LMP_CLKOFFSET_REQ                5
40*4cc286f3SDominic Spill #define LMP_CLKOFFSET_RES                6
41*4cc286f3SDominic Spill #define LMP_DETACH                       7
42*4cc286f3SDominic Spill #define LMP_IN_RAND                      8
43*4cc286f3SDominic Spill #define LMP_COMB_KEY                     9
44*4cc286f3SDominic Spill #define LMP_UNIT_KEY                     10
45*4cc286f3SDominic Spill #define LMP_AU_RAND                      11
46*4cc286f3SDominic Spill #define LMP_SRES                         12
47*4cc286f3SDominic Spill #define LMP_TEMP_RAND                    13
48*4cc286f3SDominic Spill #define LMP_TEMP_KEY                     14
49*4cc286f3SDominic Spill #define LMP_ENCRYPTION_MODE_REQ          15
50*4cc286f3SDominic Spill #define LMP_ENCRYPTION_KEY_SIZE_REQ      16
51*4cc286f3SDominic Spill #define LMP_START_ENCRYPTION_REQ         17
52*4cc286f3SDominic Spill #define LMP_STOP_ENCRYPTION_REQ          18
53*4cc286f3SDominic Spill #define LMP_SWITCH_REQ                   19
54*4cc286f3SDominic Spill #define LMP_HOLD                         20
55*4cc286f3SDominic Spill #define LMP_HOLD_REQ                     21
56*4cc286f3SDominic Spill #define LMP_SNIFF_REQ                    23
57*4cc286f3SDominic Spill #define LMP_UNSNIFF_REQ                  24
58*4cc286f3SDominic Spill #define LMP_PARK_REQ                     25
59*4cc286f3SDominic Spill #define LMP_SET_BROADCAST_SCAN_WINDOW    27
60*4cc286f3SDominic Spill #define LMP_MODIFY_BEACON                28
61*4cc286f3SDominic Spill #define LMP_UNPARK_BD_ADDR_REQ           29
62*4cc286f3SDominic Spill #define LMP_UNPARK_PM_ADDR_REQ           30
63*4cc286f3SDominic Spill #define LMP_INCR_POWER_REQ               31
64*4cc286f3SDominic Spill #define LMP_DECR_POWER_REQ               32
65*4cc286f3SDominic Spill #define LMP_MAX_POWER                    33
66*4cc286f3SDominic Spill #define LMP_MIN_POWER                    34
67*4cc286f3SDominic Spill #define LMP_AUTO_RATE                    35
68*4cc286f3SDominic Spill #define LMP_PREFERRED_RATE               36
69*4cc286f3SDominic Spill #define LMP_VERSION_REQ                  37
70*4cc286f3SDominic Spill #define LMP_VERSION_RES                  38
71*4cc286f3SDominic Spill #define LMP_FEATURES_REQ                 39
72*4cc286f3SDominic Spill #define LMP_FEATURES_RES                 40
73*4cc286f3SDominic Spill #define LMP_QUALITY_OF_SERVICE           41
74*4cc286f3SDominic Spill #define LMP_QUALITY_OF_SERVICE_REQ       42
75*4cc286f3SDominic Spill #define LMP_SCO_LINK_REQ                 43
76*4cc286f3SDominic Spill #define LMP_REMOVE_SCO_LINK_REQ          44
77*4cc286f3SDominic Spill #define LMP_MAX_SLOT                     45
78*4cc286f3SDominic Spill #define LMP_MAX_SLOT_REQ                 46
79*4cc286f3SDominic Spill #define LMP_TIMING_ACCURACY_REQ          47
80*4cc286f3SDominic Spill #define LMP_TIMING_ACCURACY_RES          48
81*4cc286f3SDominic Spill #define LMP_SETUP_COMPLETE               49
82*4cc286f3SDominic Spill #define LMP_USE_SEMI_PERMANENT_KEY       50
83*4cc286f3SDominic Spill #define LMP_HOST_CONNECTION_REQ          51
84*4cc286f3SDominic Spill #define LMP_SLOT_OFFSET                  52
85*4cc286f3SDominic Spill #define LMP_PAGE_MODE_REQ                53
86*4cc286f3SDominic Spill #define LMP_PAGE_SCAN_MODE_REQ           54
87*4cc286f3SDominic Spill #define LMP_SUPERVISION_TIMEOUT          55
88*4cc286f3SDominic Spill #define LMP_TEST_ACTIVATE                56
89*4cc286f3SDominic Spill #define LMP_TEST_CONTROL                 57
90*4cc286f3SDominic Spill #define LMP_ENCRYPTION_KEY_SIZE_MASK_REQ 58
91*4cc286f3SDominic Spill #define LMP_ENCRYPTION_KEY_SIZE_MASK_RES 59
92*4cc286f3SDominic Spill #define LMP_SET_AFH                      60
93*4cc286f3SDominic Spill #define LMP_ENCAPSULATED_HEADER          61
94*4cc286f3SDominic Spill #define LMP_ENCAPSULATED_PAYLOAD         62
95*4cc286f3SDominic Spill #define LMP_SIMPLE_PAIRING_CONFIRM       63
96*4cc286f3SDominic Spill #define LMP_SIMPLE_PAIRING_NUMBER        64
97*4cc286f3SDominic Spill #define LMP_DHKEY_CHECK                  65
98*4cc286f3SDominic Spill #define LMP_ESCAPE_1                     124
99*4cc286f3SDominic Spill #define LMP_ESCAPE_2                     125
100*4cc286f3SDominic Spill #define LMP_ESCAPE_3                     126
101*4cc286f3SDominic Spill #define LMP_ESCAPE_4                     127
102*4cc286f3SDominic Spill 
103*4cc286f3SDominic Spill /* LMP extended opcodes */
104*4cc286f3SDominic Spill #define LMP_ACCEPTED_EXT               1
105*4cc286f3SDominic Spill #define LMP_NOT_ACCEPTED_EXT           2
106*4cc286f3SDominic Spill #define LMP_FEATURES_REQ_EXT           3
107*4cc286f3SDominic Spill #define LMP_FEATURES_RES_EXT           4
108*4cc286f3SDominic Spill #define LMP_PACKET_TYPE_TABLE_REQ      11
109*4cc286f3SDominic Spill #define LMP_ESCO_LINK_REQ              12
110*4cc286f3SDominic Spill #define LMP_REMOVE_ESCO_LINK_REQ       13
111*4cc286f3SDominic Spill #define LMP_CHANNEL_CLASSIFICATION_REQ 16
112*4cc286f3SDominic Spill #define LMP_CHANNEL_CLASSIFICATION     17
113*4cc286f3SDominic Spill #define LMP_SNIFF_SUBRATING_REQ        21
114*4cc286f3SDominic Spill #define LMP_SNIFF_SUBRATING_RES        22
115*4cc286f3SDominic Spill #define LMP_PAUSE_ENCRYPTION_REQ       23
116*4cc286f3SDominic Spill #define LMP_RESUME_ENCRYPTION_REQ      24
117*4cc286f3SDominic Spill #define LMP_IO_CAPABILITY_REQ          25
118*4cc286f3SDominic Spill #define LMP_IO_CAPABILITY_RES          26
119*4cc286f3SDominic Spill #define LMP_NUMERIC_COMPARISON_FAILED  27
120*4cc286f3SDominic Spill #define LMP_PASSKEY_FAILED             28
121*4cc286f3SDominic Spill #define LMP_OOB_FAILED                 29
122*4cc286f3SDominic Spill #define LMP_KEYPRESS_NOTIFICATION      30
123*4cc286f3SDominic Spill #define LMP_POWER_CONTROL_REQ          31
124*4cc286f3SDominic Spill #define LMP_POWER_CONTROL_RES          32
125*4cc286f3SDominic Spill 
126*4cc286f3SDominic Spill /* initialize the protocol and registered fields */
127*4cc286f3SDominic Spill static int proto_btlmp = -1;
128*4cc286f3SDominic Spill static int hf_lmp_accscheme = -1;
129*4cc286f3SDominic Spill static int hf_lmp_afhchmap = -1;
130*4cc286f3SDominic Spill static int hf_lmp_afhclass = -1;
131*4cc286f3SDominic Spill static int hf_lmp_afhinst = -1;
132*4cc286f3SDominic Spill static int hf_lmp_afhmaxintvl = -1;
133*4cc286f3SDominic Spill static int hf_lmp_afhminintvl = -1;
134*4cc286f3SDominic Spill static int hf_lmp_afhmode = -1;
135*4cc286f3SDominic Spill static int hf_lmp_afhrptmode = -1;
136*4cc286f3SDominic Spill static int hf_lmp_airmode = -1;
137*4cc286f3SDominic Spill static int hf_lmp_araddr = -1;
138*4cc286f3SDominic Spill static int hf_lmp_authreqs = -1;
139*4cc286f3SDominic Spill static int hf_lmp_authres = -1;
140*4cc286f3SDominic Spill static int hf_lmp_bdaddr = -1;
141*4cc286f3SDominic Spill static int hf_lmp_bdaddr1 = -1;
142*4cc286f3SDominic Spill static int hf_lmp_bdaddr2 = -1;
143*4cc286f3SDominic Spill static int hf_lmp_bsw = -1;
144*4cc286f3SDominic Spill static int hf_lmp_clkoffset = -1;
145*4cc286f3SDominic Spill static int hf_lmp_commit = -1;
146*4cc286f3SDominic Spill static int hf_lmp_confirm = -1;
147*4cc286f3SDominic Spill static int hf_lmp_compid = -1;
148*4cc286f3SDominic Spill static int hf_lmp_cryptmode = -1;
149*4cc286f3SDominic Spill static int hf_lmp_daccess = -1;
150*4cc286f3SDominic Spill static int hf_lmp_db = -1;
151*4cc286f3SDominic Spill static int hf_lmp_dbsleep = -1;
152*4cc286f3SDominic Spill static int hf_lmp_deltab = -1;
153*4cc286f3SDominic Spill static int hf_lmp_desco = -1;
154*4cc286f3SDominic Spill static int hf_lmp_drift = -1;
155*4cc286f3SDominic Spill static int hf_lmp_dsco = -1;
156*4cc286f3SDominic Spill static int hf_lmp_dsniff = -1;
157*4cc286f3SDominic Spill static int hf_lmp_encdata = -1;
158*4cc286f3SDominic Spill static int hf_lmp_enclen = -1;
159*4cc286f3SDominic Spill static int hf_lmp_encmaj = -1;
160*4cc286f3SDominic Spill static int hf_lmp_encmin = -1;
161*4cc286f3SDominic Spill static int hf_lmp_eop = -1;
162*4cc286f3SDominic Spill static int hf_lmp_eopinre = -1;
163*4cc286f3SDominic Spill static int hf_lmp_escolenms = -1;
164*4cc286f3SDominic Spill static int hf_lmp_escolensm = -1;
165*4cc286f3SDominic Spill static int hf_lmp_escotypems = -1;
166*4cc286f3SDominic Spill static int hf_lmp_escotypesm = -1;
167*4cc286f3SDominic Spill static int hf_lmp_err = -1;
168*4cc286f3SDominic Spill static int hf_lmp_escohdl = -1;
169*4cc286f3SDominic Spill static int hf_lmp_escoltaddr = -1;
170*4cc286f3SDominic Spill static int hf_lmp_features = -1;
171*4cc286f3SDominic Spill static int hf_lmp_fpage = -1;
172*4cc286f3SDominic Spill static int hf_lmp_htime = -1;
173*4cc286f3SDominic Spill static int hf_lmp_hinst = -1;
174*4cc286f3SDominic Spill static int hf_lmp_hopmode = -1;
175*4cc286f3SDominic Spill static int hf_lmp_iocaps = -1;
176*4cc286f3SDominic Spill static int hf_lmp_jitter = -1;
177*4cc286f3SDominic Spill static int hf_lmp_key = -1;
178*4cc286f3SDominic Spill static int hf_lmp_keysz = -1;
179*4cc286f3SDominic Spill static int hf_lmp_ksmask = -1;
180*4cc286f3SDominic Spill static int hf_lmp_ltaddr1 = -1;
181*4cc286f3SDominic Spill static int hf_lmp_ltaddr2 = -1;
182*4cc286f3SDominic Spill static int hf_lmp_ltaddr3 = -1;
183*4cc286f3SDominic Spill static int hf_lmp_ltaddr4 = -1;
184*4cc286f3SDominic Spill static int hf_lmp_ltaddr5 = -1;
185*4cc286f3SDominic Spill static int hf_lmp_ltaddr6 = -1;
186*4cc286f3SDominic Spill static int hf_lmp_ltaddr7 = -1;
187*4cc286f3SDominic Spill static int hf_lmp_maccess = -1;
188*4cc286f3SDominic Spill static int hf_lmp_maxslots = -1;
189*4cc286f3SDominic Spill static int hf_lmp_maxsp = -1;
190*4cc286f3SDominic Spill static int hf_lmp_maxss = -1;
191*4cc286f3SDominic Spill static int hf_lmp_minsmt = -1;
192*4cc286f3SDominic Spill static int hf_lmp_naccslots = -1;
193*4cc286f3SDominic Spill static int hf_lmp_namefrag = -1;
194*4cc286f3SDominic Spill static int hf_lmp_namelen = -1;
195*4cc286f3SDominic Spill static int hf_lmp_nameoffset = -1;
196*4cc286f3SDominic Spill static int hf_lmp_nb = -1;
197*4cc286f3SDominic Spill static int hf_lmp_nbc = -1;
198*4cc286f3SDominic Spill static int hf_lmp_nbsleep = -1;
199*4cc286f3SDominic Spill static int hf_lmp_negstate = -1;
200*4cc286f3SDominic Spill static int hf_lmp_nonce = -1;
201*4cc286f3SDominic Spill static int hf_lmp_nottype = -1;
202*4cc286f3SDominic Spill static int hf_lmp_npoll = -1;
203*4cc286f3SDominic Spill static int hf_lmp_oobauthdata = -1;
204*4cc286f3SDominic Spill static int hf_lmp_op = -1;
205*4cc286f3SDominic Spill static int hf_lmp_opinre = -1;
206*4cc286f3SDominic Spill static int hf_lmp_pagesch = -1;
207*4cc286f3SDominic Spill static int hf_lmp_pcmode = -1;
208*4cc286f3SDominic Spill static int hf_lmp_pkttype = -1;
209*4cc286f3SDominic Spill static int hf_lmp_pkttypetbl = -1;
210*4cc286f3SDominic Spill static int hf_lmp_pmaddr = -1;
211*4cc286f3SDominic Spill static int hf_lmp_pmaddr1 = -1;
212*4cc286f3SDominic Spill static int hf_lmp_pmaddr2 = -1;
213*4cc286f3SDominic Spill static int hf_lmp_pmaddr3 = -1;
214*4cc286f3SDominic Spill static int hf_lmp_pmaddr4 = -1;
215*4cc286f3SDominic Spill static int hf_lmp_pmaddr5 = -1;
216*4cc286f3SDominic Spill static int hf_lmp_pmaddr6 = -1;
217*4cc286f3SDominic Spill static int hf_lmp_pmaddr7 = -1;
218*4cc286f3SDominic Spill static int hf_lmp_pollintvl = -1;
219*4cc286f3SDominic Spill static int hf_lmp_pollper = -1;
220*4cc286f3SDominic Spill static int hf_lmp_pssettings = -1;
221*4cc286f3SDominic Spill static int hf_lmp_pwradjreq = -1;
222*4cc286f3SDominic Spill static int hf_lmp_pwradjres = -1;
223*4cc286f3SDominic Spill static int hf_lmp_pwradj_8dpsk = -1;
224*4cc286f3SDominic Spill static int hf_lmp_pwradj_dqpsk = -1;
225*4cc286f3SDominic Spill static int hf_lmp_pwradj_gfsk = -1;
226*4cc286f3SDominic Spill static int hf_lmp_rand = -1;
227*4cc286f3SDominic Spill static int hf_lmp_rate = -1;
228*4cc286f3SDominic Spill static int hf_lmp_rate_fec = -1;
229*4cc286f3SDominic Spill static int hf_lmp_rate_size = -1;
230*4cc286f3SDominic Spill static int hf_lmp_rate_type = -1;
231*4cc286f3SDominic Spill static int hf_lmp_rate_edrsize = -1;
232*4cc286f3SDominic Spill static int hf_lmp_rxfreq = -1;
233*4cc286f3SDominic Spill static int hf_lmp_scohdl = -1;
234*4cc286f3SDominic Spill static int hf_lmp_scopkt = -1;
235*4cc286f3SDominic Spill static int hf_lmp_slotoffset = -1;
236*4cc286f3SDominic Spill static int hf_lmp_sniffatt = -1;
237*4cc286f3SDominic Spill static int hf_lmp_sniffsi = -1;
238*4cc286f3SDominic Spill static int hf_lmp_sniffto = -1;
239*4cc286f3SDominic Spill static int hf_lmp_subversnr = -1;
240*4cc286f3SDominic Spill static int hf_lmp_suptimeout = -1;
241*4cc286f3SDominic Spill static int hf_lmp_swinst = -1;
242*4cc286f3SDominic Spill static int hf_lmp_taccess = -1;
243*4cc286f3SDominic Spill static int hf_lmp_tb = -1;
244*4cc286f3SDominic Spill static int hf_lmp_tesco = -1;
245*4cc286f3SDominic Spill static int hf_lmp_testlen = -1;
246*4cc286f3SDominic Spill static int hf_lmp_testscen = -1;
247*4cc286f3SDominic Spill static int hf_lmp_tid = -1;
248*4cc286f3SDominic Spill static int hf_lmp_timectrl = -1;
249*4cc286f3SDominic Spill static int hf_lmp_time_change = -1;
250*4cc286f3SDominic Spill static int hf_lmp_time_init = -1;
251*4cc286f3SDominic Spill static int hf_lmp_time_accwin = -1;
252*4cc286f3SDominic Spill static int hf_lmp_tsco = -1;
253*4cc286f3SDominic Spill static int hf_lmp_tsniff = -1;
254*4cc286f3SDominic Spill static int hf_lmp_txfreq = -1;
255*4cc286f3SDominic Spill static int hf_lmp_versnr = -1;
256*4cc286f3SDominic Spill static int hf_lmp_wesco = -1;
257*4cc286f3SDominic Spill 
258*4cc286f3SDominic Spill /* timing control flags */
259*4cc286f3SDominic Spill static const int *timectrl_fields[] = {
260*4cc286f3SDominic Spill 	&hf_lmp_time_change,
261*4cc286f3SDominic Spill 	&hf_lmp_time_init,
262*4cc286f3SDominic Spill 	&hf_lmp_time_accwin,
263*4cc286f3SDominic Spill 	/* bits 3-7 reserved */
264*4cc286f3SDominic Spill 	NULL
265*4cc286f3SDominic Spill };
266*4cc286f3SDominic Spill 
267*4cc286f3SDominic Spill static const true_false_string time_change = {
268*4cc286f3SDominic Spill 	"timing change",
269*4cc286f3SDominic Spill 	"no timing change"
270*4cc286f3SDominic Spill };
271*4cc286f3SDominic Spill 
272*4cc286f3SDominic Spill static const true_false_string time_init = {
273*4cc286f3SDominic Spill 	"use initialization 2",
274*4cc286f3SDominic Spill 	"use initialization 1"
275*4cc286f3SDominic Spill };
276*4cc286f3SDominic Spill 
277*4cc286f3SDominic Spill static const true_false_string time_accwin = {
278*4cc286f3SDominic Spill 	"no access window",
279*4cc286f3SDominic Spill 	"access window"
280*4cc286f3SDominic Spill };
281*4cc286f3SDominic Spill 
282*4cc286f3SDominic Spill static const true_false_string fec = {
283*4cc286f3SDominic Spill 	"do not use FEC",
284*4cc286f3SDominic Spill 	"use FEC"
285*4cc286f3SDominic Spill };
286*4cc286f3SDominic Spill 
287*4cc286f3SDominic Spill static const true_false_string tid = {
288*4cc286f3SDominic Spill 	"transaction initiated by slave",
289*4cc286f3SDominic Spill 	"transaction initiated by master"
290*4cc286f3SDominic Spill };
291*4cc286f3SDominic Spill 
292*4cc286f3SDominic Spill /* short LMP opcodes */
293*4cc286f3SDominic Spill static const value_string opcode[] = {
294*4cc286f3SDominic Spill 	{ LMP_NAME_REQ, "LMP_name_req" },
295*4cc286f3SDominic Spill 	{ LMP_NAME_RES, "LMP_name_res" },
296*4cc286f3SDominic Spill 	{ LMP_ACCEPTED, "LMP_accepted" },
297*4cc286f3SDominic Spill 	{ LMP_NOT_ACCEPTED, "LMP_not_accepted" },
298*4cc286f3SDominic Spill 	{ LMP_CLKOFFSET_REQ, "LMP_clkoffset_req" },
299*4cc286f3SDominic Spill 	{ LMP_CLKOFFSET_RES, "LMP_clkoffset_res" },
300*4cc286f3SDominic Spill 	{ LMP_DETACH, "LMP_detach" },
301*4cc286f3SDominic Spill 	{ LMP_IN_RAND, "LMP_in_rand" },
302*4cc286f3SDominic Spill 	{ LMP_COMB_KEY, "LMP_comb_key" },
303*4cc286f3SDominic Spill 	{ LMP_UNIT_KEY, "LMP_unit_key" },
304*4cc286f3SDominic Spill 	{ LMP_AU_RAND, "LMP_au_rand" },
305*4cc286f3SDominic Spill 	{ LMP_SRES, "LMP_sres" },
306*4cc286f3SDominic Spill 	{ LMP_TEMP_RAND, "LMP_temp_rand" },
307*4cc286f3SDominic Spill 	{ LMP_TEMP_KEY, "LMP_temp_key" },
308*4cc286f3SDominic Spill 	{ LMP_ENCRYPTION_MODE_REQ, "LMP_encryption_mode_req" },
309*4cc286f3SDominic Spill 	{ LMP_ENCRYPTION_KEY_SIZE_REQ, "LMP_encryption_key_size_req" },
310*4cc286f3SDominic Spill 	{ LMP_START_ENCRYPTION_REQ, "LMP_start_encryption_req" },
311*4cc286f3SDominic Spill 	{ LMP_STOP_ENCRYPTION_REQ, "LMP_stop_encryption_req" },
312*4cc286f3SDominic Spill 	{ LMP_SWITCH_REQ, "LMP_switch_req" },
313*4cc286f3SDominic Spill 	{ LMP_HOLD, "LMP_hold" },
314*4cc286f3SDominic Spill 	{ LMP_HOLD_REQ, "LMP_hold_req" },
315*4cc286f3SDominic Spill 	{ LMP_SNIFF_REQ, "LMP_sniff_req" },
316*4cc286f3SDominic Spill 	{ LMP_UNSNIFF_REQ, "LMP_unsniff_req" },
317*4cc286f3SDominic Spill 	{ LMP_PARK_REQ, "LMP_park_req" },
318*4cc286f3SDominic Spill 	{ LMP_SET_BROADCAST_SCAN_WINDOW, "LMP_set_broadcast_scan_window" },
319*4cc286f3SDominic Spill 	{ LMP_MODIFY_BEACON, "LMP_modify_beacon" },
320*4cc286f3SDominic Spill 	{ LMP_UNPARK_BD_ADDR_REQ, "LMP_unpark_BD_ADDR_req" },
321*4cc286f3SDominic Spill 	{ LMP_UNPARK_PM_ADDR_REQ, "LMP_unpark_PM_ADDR_req" },
322*4cc286f3SDominic Spill 	{ LMP_INCR_POWER_REQ, "LMP_incr_power_req" },
323*4cc286f3SDominic Spill 	{ LMP_DECR_POWER_REQ, "LMP_decr_power_req" },
324*4cc286f3SDominic Spill 	{ LMP_MAX_POWER, "LMP_max_power" },
325*4cc286f3SDominic Spill 	{ LMP_MIN_POWER, "LMP_min_power" },
326*4cc286f3SDominic Spill 	{ LMP_AUTO_RATE, "LMP_auto_rate" },
327*4cc286f3SDominic Spill 	{ LMP_PREFERRED_RATE, "LMP_preferred_rate" },
328*4cc286f3SDominic Spill 	{ LMP_VERSION_REQ, "LMP_version_req" },
329*4cc286f3SDominic Spill 	{ LMP_VERSION_RES, "LMP_version_res" },
330*4cc286f3SDominic Spill 	{ LMP_FEATURES_REQ, "LMP_features_req" },
331*4cc286f3SDominic Spill 	{ LMP_FEATURES_RES, "LMP_features_res" },
332*4cc286f3SDominic Spill 	{ LMP_QUALITY_OF_SERVICE, "LMP_quality_of_service" },
333*4cc286f3SDominic Spill 	{ LMP_QUALITY_OF_SERVICE_REQ, "LMP_quality_of_service_req" },
334*4cc286f3SDominic Spill 	{ LMP_SCO_LINK_REQ, "LMP_SCO_link_req" },
335*4cc286f3SDominic Spill 	{ LMP_REMOVE_SCO_LINK_REQ, "LMP_remove_SCO_link_req" },
336*4cc286f3SDominic Spill 	{ LMP_MAX_SLOT, "LMP_max_slot" },
337*4cc286f3SDominic Spill 	{ LMP_MAX_SLOT_REQ, "LMP_max_slot_req" },
338*4cc286f3SDominic Spill 	{ LMP_TIMING_ACCURACY_REQ, "LMP_timing_accuracy_req" },
339*4cc286f3SDominic Spill 	{ LMP_TIMING_ACCURACY_RES, "LMP_timing_accuracy_res" },
340*4cc286f3SDominic Spill 	{ LMP_SETUP_COMPLETE, "LMP_setup_complete" },
341*4cc286f3SDominic Spill 	{ LMP_USE_SEMI_PERMANENT_KEY, "LMP_use_semi_permanent_key" },
342*4cc286f3SDominic Spill 	{ LMP_HOST_CONNECTION_REQ, "LMP_host_connection_req" },
343*4cc286f3SDominic Spill 	{ LMP_SLOT_OFFSET, "LMP_slot_offset" },
344*4cc286f3SDominic Spill 	{ LMP_PAGE_MODE_REQ, "LMP_page_mode_req" },
345*4cc286f3SDominic Spill 	{ LMP_PAGE_SCAN_MODE_REQ, "LMP_page_scan_mode_req" },
346*4cc286f3SDominic Spill 	{ LMP_SUPERVISION_TIMEOUT, "LMP_supervision_timeout" },
347*4cc286f3SDominic Spill 	{ LMP_TEST_ACTIVATE, "LMP_test_activate" },
348*4cc286f3SDominic Spill 	{ LMP_TEST_CONTROL, "LMP_test_control" },
349*4cc286f3SDominic Spill 	{ LMP_ENCRYPTION_KEY_SIZE_MASK_REQ, "LMP_encryption_key_size_mask_req" },
350*4cc286f3SDominic Spill 	{ LMP_ENCRYPTION_KEY_SIZE_MASK_RES, "LMP_encryption_key_size_mask_res" },
351*4cc286f3SDominic Spill 	{ LMP_SET_AFH, "LMP_set_AFH" },
352*4cc286f3SDominic Spill 	{ LMP_ENCAPSULATED_HEADER, "LMP_encapsulated_header" },
353*4cc286f3SDominic Spill 	{ LMP_ENCAPSULATED_PAYLOAD, "LMP_encapsulated_payload" },
354*4cc286f3SDominic Spill 	{ LMP_SIMPLE_PAIRING_CONFIRM, "LMP_Simple_Pairing_Confirm" },
355*4cc286f3SDominic Spill 	{ LMP_SIMPLE_PAIRING_NUMBER, "LMP_Simple_Pairing_Number" },
356*4cc286f3SDominic Spill 	{ LMP_DHKEY_CHECK, "LMP_DHkey_Check" },
357*4cc286f3SDominic Spill 	{ LMP_ESCAPE_1, "Escape 1" },
358*4cc286f3SDominic Spill 	{ LMP_ESCAPE_2, "Escape 2" },
359*4cc286f3SDominic Spill 	{ LMP_ESCAPE_3, "Escape 3" },
360*4cc286f3SDominic Spill 	{ LMP_ESCAPE_4, "Escape 4" },
361*4cc286f3SDominic Spill 	{ 0, NULL }
362*4cc286f3SDominic Spill };
363*4cc286f3SDominic Spill 
364*4cc286f3SDominic Spill /* extended LMP opcodes */
365*4cc286f3SDominic Spill static const value_string ext_opcode[] = {
366*4cc286f3SDominic Spill 	{ LMP_ACCEPTED_EXT, "LMP_accepted_ext" },
367*4cc286f3SDominic Spill 	{ LMP_NOT_ACCEPTED_EXT, "LMP_not_accepted_ext" },
368*4cc286f3SDominic Spill 	{ LMP_FEATURES_REQ_EXT, "LMP_features_req_ext" },
369*4cc286f3SDominic Spill 	{ LMP_FEATURES_RES_EXT, "LMP_features_res_ext" },
370*4cc286f3SDominic Spill 	{ LMP_PACKET_TYPE_TABLE_REQ, "LMP_packet_type_table_req" },
371*4cc286f3SDominic Spill 	{ LMP_ESCO_LINK_REQ, "LMP_eSCO_link_req" },
372*4cc286f3SDominic Spill 	{ LMP_REMOVE_ESCO_LINK_REQ, "LMP_remove_eSCO_link_req" },
373*4cc286f3SDominic Spill 	{ LMP_CHANNEL_CLASSIFICATION_REQ, "LMP_channel_classification_req" },
374*4cc286f3SDominic Spill 	{ LMP_CHANNEL_CLASSIFICATION, "LMP_channel_classification" },
375*4cc286f3SDominic Spill 	{ LMP_SNIFF_SUBRATING_REQ, "LMP_sniff_subrating_req" },
376*4cc286f3SDominic Spill 	{ LMP_SNIFF_SUBRATING_RES, "LMP_sniff_subrating_res" },
377*4cc286f3SDominic Spill 	{ LMP_PAUSE_ENCRYPTION_REQ, "LMP_pause_encryption_req" },
378*4cc286f3SDominic Spill 	{ LMP_RESUME_ENCRYPTION_REQ, "LMP_resume_encryption_req" },
379*4cc286f3SDominic Spill 	{ LMP_IO_CAPABILITY_REQ, "LMP_IO_Capability_req" },
380*4cc286f3SDominic Spill 	{ LMP_IO_CAPABILITY_RES, "LMP_IO_Capability_res" },
381*4cc286f3SDominic Spill 	{ LMP_NUMERIC_COMPARISON_FAILED, "LMP_numeric_comparison_failed" },
382*4cc286f3SDominic Spill 	{ LMP_PASSKEY_FAILED, "LMP_passkey_failed" },
383*4cc286f3SDominic Spill 	{ LMP_OOB_FAILED, "LMP_oob_failed" },
384*4cc286f3SDominic Spill 	{ LMP_KEYPRESS_NOTIFICATION, "LMP_keypress_notification" },
385*4cc286f3SDominic Spill 	{ LMP_POWER_CONTROL_REQ, "LMP_power_control_req" },
386*4cc286f3SDominic Spill 	{ LMP_POWER_CONTROL_RES, "LMP_power_control_res" },
387*4cc286f3SDominic Spill 	{ 0, NULL }
388*4cc286f3SDominic Spill };
389*4cc286f3SDominic Spill 
390*4cc286f3SDominic Spill /* LMP error codes */
391*4cc286f3SDominic Spill static const value_string error_code[] = {
392*4cc286f3SDominic Spill 	{ 0x00, "Success" },
393*4cc286f3SDominic Spill 	{ 0x01, "Unknown HCI Command" },
394*4cc286f3SDominic Spill 	{ 0x02, "Unknown Connection Identifier" },
395*4cc286f3SDominic Spill 	{ 0x03, "Hardware Failure" },
396*4cc286f3SDominic Spill 	{ 0x04, "Page Timeout" },
397*4cc286f3SDominic Spill 	{ 0x05, "Authentication Failure" },
398*4cc286f3SDominic Spill 	{ 0x06, "PIN or Key Missing" },
399*4cc286f3SDominic Spill 	{ 0x07, "Memory Capacity Exceeded" },
400*4cc286f3SDominic Spill 	{ 0x08, "Connection Timeout" },
401*4cc286f3SDominic Spill 	{ 0x09, "Connection Limit Exceeded" },
402*4cc286f3SDominic Spill 	{ 0x0A, "Synchronous Connection Limit To A Device Exceeded" },
403*4cc286f3SDominic Spill 	{ 0x0B, "ACL Connection Already Exists" },
404*4cc286f3SDominic Spill 	{ 0x0C, "Command Disallowed" },
405*4cc286f3SDominic Spill 	{ 0x0D, "Connection Rejected due to Limited Resources" },
406*4cc286f3SDominic Spill 	{ 0x0E, "Connection Rejected Due To Security Reasons" },
407*4cc286f3SDominic Spill 	{ 0x0F, "Connection Rejected due to Unacceptable BD_ADDR" },
408*4cc286f3SDominic Spill 	{ 0x10, "Connection Accept Timeout Exceeded" },
409*4cc286f3SDominic Spill 	{ 0x11, "Unsupported Feature or Parameter Value" },
410*4cc286f3SDominic Spill 	{ 0x12, "Invalid HCI Command Parameters" },
411*4cc286f3SDominic Spill 	{ 0x13, "Remote User Terminated Connection" },
412*4cc286f3SDominic Spill 	{ 0x14, "Remote Device Terminated Connection due to Low Resources" },
413*4cc286f3SDominic Spill 	{ 0x15, "Remote Device Terminated Connection due to Power Off" },
414*4cc286f3SDominic Spill 	{ 0x16, "Connection Terminated By Local Host" },
415*4cc286f3SDominic Spill 	{ 0x17, "Repeated Attempts" },
416*4cc286f3SDominic Spill 	{ 0x18, "Pairing Not Allowed" },
417*4cc286f3SDominic Spill 	{ 0x19, "Unknown LMP PDU" },
418*4cc286f3SDominic Spill 	{ 0x1A, "Unsupported Remote Feature / Unsupported LMP Feature" },
419*4cc286f3SDominic Spill 	{ 0x1B, "SCO Offset Rejected" },
420*4cc286f3SDominic Spill 	{ 0x1C, "SCO Interval Rejected" },
421*4cc286f3SDominic Spill 	{ 0x1D, "SCO Air Mode Rejected" },
422*4cc286f3SDominic Spill 	{ 0x1E, "Invalid LMP Parameters" },
423*4cc286f3SDominic Spill 	{ 0x1F, "Unspecified Error" },
424*4cc286f3SDominic Spill 	{ 0x20, "Unsupported LMP Parameter Value" },
425*4cc286f3SDominic Spill 	{ 0x21, "Role Change Not Allowed" },
426*4cc286f3SDominic Spill 	{ 0x22, "LMP Response Timeout" },
427*4cc286f3SDominic Spill 	{ 0x23, "LMP Error Transaction Collision" },
428*4cc286f3SDominic Spill 	{ 0x24, "LMP PDU Not Allowed" },
429*4cc286f3SDominic Spill 	{ 0x25, "Encryption Mode Not Acceptable" },
430*4cc286f3SDominic Spill 	{ 0x26, "Link Key Can Not be Changed" },
431*4cc286f3SDominic Spill 	{ 0x27, "Requested QoS Not Supported" },
432*4cc286f3SDominic Spill 	{ 0x28, "Instant Passed" },
433*4cc286f3SDominic Spill 	{ 0x29, "Pairing With Unit Key Not Supported" },
434*4cc286f3SDominic Spill 	{ 0x2A, "Different Transaction Collision" },
435*4cc286f3SDominic Spill 	{ 0x2B, "Reserved" },
436*4cc286f3SDominic Spill 	{ 0x2C, "QoS Unacceptable Parameter" },
437*4cc286f3SDominic Spill 	{ 0x2D, "QoS Rejected" },
438*4cc286f3SDominic Spill 	{ 0x2E, "Channel Classification Not Supported" },
439*4cc286f3SDominic Spill 	{ 0x2F, "Insufficient Security" },
440*4cc286f3SDominic Spill 	{ 0x30, "Parameter Out Of Mandatory Range" },
441*4cc286f3SDominic Spill 	{ 0x31, "Reserved" },
442*4cc286f3SDominic Spill 	{ 0x32, "Role Switch Pending" },
443*4cc286f3SDominic Spill 	{ 0x33, "Reserved" },
444*4cc286f3SDominic Spill 	{ 0x34, "Reserved Slot Violation" },
445*4cc286f3SDominic Spill 	{ 0x35, "Role Switch Failed" },
446*4cc286f3SDominic Spill 	{ 0x36, "Extended Inquiry Response Too Large" },
447*4cc286f3SDominic Spill 	{ 0x37, "Secure Simple Pairing Not Supported By Host." },
448*4cc286f3SDominic Spill 	{ 0x38, "Host Busy - Pairing" },
449*4cc286f3SDominic Spill 	{ 0x39, "Connection Rejected due to No Suitable Channel Found" },
450*4cc286f3SDominic Spill 	{ 0, NULL }
451*4cc286f3SDominic Spill };
452*4cc286f3SDominic Spill 
453*4cc286f3SDominic Spill static const value_string encryption_mode[] = {
454*4cc286f3SDominic Spill 	{ 0, "no encryption" },
455*4cc286f3SDominic Spill 	{ 1, "encryption" },
456*4cc286f3SDominic Spill 	{ 2, "encryption" },
457*4cc286f3SDominic Spill 	/* 3 - 255 reserved */
458*4cc286f3SDominic Spill 	{ 0, NULL }
459*4cc286f3SDominic Spill };
460*4cc286f3SDominic Spill 
461*4cc286f3SDominic Spill static const value_string access_scheme[] = {
462*4cc286f3SDominic Spill 	{ 0, "polling technique" },
463*4cc286f3SDominic Spill 	/* 1 - 15 reserved */
464*4cc286f3SDominic Spill 	{ 0, NULL }
465*4cc286f3SDominic Spill };
466*4cc286f3SDominic Spill 
467*4cc286f3SDominic Spill static const value_string packet_size[] = {
468*4cc286f3SDominic Spill 	{ 0, "no packet-size preference available" },
469*4cc286f3SDominic Spill 	{ 1, "use 1-slot packets" },
470*4cc286f3SDominic Spill 	{ 2, "use 3-slot packets" },
471*4cc286f3SDominic Spill 	{ 3, "use 5-slot packets" },
472*4cc286f3SDominic Spill 	{ 0, NULL }
473*4cc286f3SDominic Spill };
474*4cc286f3SDominic Spill 
475*4cc286f3SDominic Spill static const value_string edr_type[] = {
476*4cc286f3SDominic Spill 	{ 0, "use DM1 packets" },
477*4cc286f3SDominic Spill 	{ 1, "use 2 Mbps packets" },
478*4cc286f3SDominic Spill 	{ 2, "use 3 Mbps packets" },
479*4cc286f3SDominic Spill 	/* 3 reserved */
480*4cc286f3SDominic Spill 	{ 0, NULL }
481*4cc286f3SDominic Spill };
482*4cc286f3SDominic Spill 
483*4cc286f3SDominic Spill static const value_string versnr[] = {
484*4cc286f3SDominic Spill 	{ 0, "Bluetooth Core Specification 1.0b" },
485*4cc286f3SDominic Spill 	{ 1, "Bluetooth Core Specification 1.1" },
486*4cc286f3SDominic Spill 	{ 2, "Bluetooth Core Specification 1.2" },
487*4cc286f3SDominic Spill 	{ 3, "Bluetooth Core Specification 2.0 + EDR" },
488*4cc286f3SDominic Spill 	{ 4, "Bluetooth Core Specification 2.1 + EDR" },
489*4cc286f3SDominic Spill 	{ 5, "Bluetooth Core Specification 3.0 + HS" },
490*4cc286f3SDominic Spill 	/* 6 - 255 reserved */
491*4cc286f3SDominic Spill 	{ 0, NULL }
492*4cc286f3SDominic Spill };
493*4cc286f3SDominic Spill 
494*4cc286f3SDominic Spill static const value_string compid[] = {
495*4cc286f3SDominic Spill 	{ 0, "Ericsson Technology Licensing" },
496*4cc286f3SDominic Spill 	{ 1, "Nokia Mobile Phones" },
497*4cc286f3SDominic Spill 	{ 2, "Intel Corp." },
498*4cc286f3SDominic Spill 	{ 3, "IBM Corp." },
499*4cc286f3SDominic Spill 	{ 4, "Toshiba Corp." },
500*4cc286f3SDominic Spill 	{ 5, "3Com" },
501*4cc286f3SDominic Spill 	{ 6, "Microsoft" },
502*4cc286f3SDominic Spill 	{ 7, "Lucent" },
503*4cc286f3SDominic Spill 	{ 8, "Motorola" },
504*4cc286f3SDominic Spill 	{ 9, "Infineon Technologies AG" },
505*4cc286f3SDominic Spill 	{ 10, "Cambridge Silicon Radio" },
506*4cc286f3SDominic Spill 	{ 11, "Silicon Wave" },
507*4cc286f3SDominic Spill 	{ 12, "Digianswer A/S" },
508*4cc286f3SDominic Spill 	{ 13, "Texas Instruments Inc." },
509*4cc286f3SDominic Spill 	{ 14, "Parthus Technologies Inc." },
510*4cc286f3SDominic Spill 	{ 15, "Broadcom Corporation" },
511*4cc286f3SDominic Spill 	{ 16, "Mitel Semiconductor" },
512*4cc286f3SDominic Spill 	{ 17, "Widcomm, Inc." },
513*4cc286f3SDominic Spill 	{ 18, "Zeevo, Inc." },
514*4cc286f3SDominic Spill 	{ 19, "Atmel Corporation" },
515*4cc286f3SDominic Spill 	{ 20, "Mitsubishi Electric Corporation" },
516*4cc286f3SDominic Spill 	{ 21, "RTX Telecom A/S" },
517*4cc286f3SDominic Spill 	{ 22, "KC Technology Inc." },
518*4cc286f3SDominic Spill 	{ 23, "Newlogic" },
519*4cc286f3SDominic Spill 	{ 24, "Transilica, Inc." },
520*4cc286f3SDominic Spill 	{ 25, "Rohde & Schwarz GmbH & Co. KG" },
521*4cc286f3SDominic Spill 	{ 26, "TTPCom Limited" },
522*4cc286f3SDominic Spill 	{ 27, "Signia Technologies, Inc." },
523*4cc286f3SDominic Spill 	{ 28, "Conexant Systems Inc." },
524*4cc286f3SDominic Spill 	{ 29, "Qualcomm" },
525*4cc286f3SDominic Spill 	{ 30, "Inventel" },
526*4cc286f3SDominic Spill 	{ 31, "AVM Berlin" },
527*4cc286f3SDominic Spill 	{ 32, "BandSpeed, Inc." },
528*4cc286f3SDominic Spill 	{ 33, "Mansella Ltd" },
529*4cc286f3SDominic Spill 	{ 34, "NEC Corporation" },
530*4cc286f3SDominic Spill 	{ 35, "WavePlus Technology Co., Ltd." },
531*4cc286f3SDominic Spill 	{ 36, "Alcatel" },
532*4cc286f3SDominic Spill 	{ 37, "Philips Semiconductors" },
533*4cc286f3SDominic Spill 	{ 38, "C Technologies" },
534*4cc286f3SDominic Spill 	{ 39, "Open Interface" },
535*4cc286f3SDominic Spill 	{ 40, "R F Micro Devices" },
536*4cc286f3SDominic Spill 	{ 41, "Hitachi Ltd" },
537*4cc286f3SDominic Spill 	{ 42, "Symbol Technologies, Inc." },
538*4cc286f3SDominic Spill 	{ 43, "Tenovis" },
539*4cc286f3SDominic Spill 	{ 44, "Macronix International Co. Ltd." },
540*4cc286f3SDominic Spill 	{ 45, "GCT Semiconductor" },
541*4cc286f3SDominic Spill 	{ 46, "Norwood Systems" },
542*4cc286f3SDominic Spill 	{ 47, "MewTel Technology Inc." },
543*4cc286f3SDominic Spill 	{ 48, "ST Microelectronics" },
544*4cc286f3SDominic Spill 	{ 49, "Synopsys" },
545*4cc286f3SDominic Spill 	{ 50, "Red-M (Communications) Ltd" },
546*4cc286f3SDominic Spill 	{ 51, "Commil Ltd" },
547*4cc286f3SDominic Spill 	{ 52, "Computer Access Technology Corporation (CATC)" },
548*4cc286f3SDominic Spill 	{ 53, "Eclipse (HQ Espana) S.L." },
549*4cc286f3SDominic Spill 	{ 54, "Renesas Technology Corp." },
550*4cc286f3SDominic Spill 	{ 55, "Mobilian Corporation" },
551*4cc286f3SDominic Spill 	{ 56, "Terax" },
552*4cc286f3SDominic Spill 	{ 57, "Integrated System Solution Corp." },
553*4cc286f3SDominic Spill 	{ 58, "Matsushita Electric Industrial Co., Ltd." },
554*4cc286f3SDominic Spill 	{ 59, "Gennum Corporation" },
555*4cc286f3SDominic Spill 	{ 60, "Research In Motion" },
556*4cc286f3SDominic Spill 	{ 61, "IPextreme, Inc." },
557*4cc286f3SDominic Spill 	{ 62, "Systems and Chips, Inc" },
558*4cc286f3SDominic Spill 	{ 63, "Bluetooth SIG, Inc" },
559*4cc286f3SDominic Spill 	{ 64, "Seiko Epson Corporation" },
560*4cc286f3SDominic Spill 	{ 65, "Integrated Silicon Solution Taiwan, Inc." },
561*4cc286f3SDominic Spill 	{ 66, "CONWISE Technology Corporation Ltd" },
562*4cc286f3SDominic Spill 	{ 67, "PARROT SA" },
563*4cc286f3SDominic Spill 	{ 68, "Socket Mobile" },
564*4cc286f3SDominic Spill 	{ 69, "Atheros Communications, Inc." },
565*4cc286f3SDominic Spill 	{ 70, "MediaTek, Inc." },
566*4cc286f3SDominic Spill 	{ 71, "Bluegiga (tentative)" },
567*4cc286f3SDominic Spill 	{ 72, "Marvell Technology Group Ltd." },
568*4cc286f3SDominic Spill 	{ 73, "3DSP Corporation" },
569*4cc286f3SDominic Spill 	{ 74, "Accel Semiconductor Ltd." },
570*4cc286f3SDominic Spill 	{ 75, "Continental Automotive Systems" },
571*4cc286f3SDominic Spill 	{ 76, "Apple, Inc." },
572*4cc286f3SDominic Spill 	{ 77, "Staccato Communications, Inc." },
573*4cc286f3SDominic Spill 	{ 78, "Avago Technologies" },
574*4cc286f3SDominic Spill 	{ 79, "APT Ltd." },
575*4cc286f3SDominic Spill 	{ 80, "SiRF Technology, Inc." },
576*4cc286f3SDominic Spill 	{ 81, "Tzero Technologies, Inc." },
577*4cc286f3SDominic Spill 	{ 82, "J&M Corporation" },
578*4cc286f3SDominic Spill 	{ 83, "Free2move AB" },
579*4cc286f3SDominic Spill 	/* 84 - 65534 reserved */
580*4cc286f3SDominic Spill 	{ 65535, "test" },
581*4cc286f3SDominic Spill 	{ 0, NULL }
582*4cc286f3SDominic Spill };
583*4cc286f3SDominic Spill 
584*4cc286f3SDominic Spill static const value_string sco_packet[] = {
585*4cc286f3SDominic Spill 	{ 0, "HV1" },
586*4cc286f3SDominic Spill 	{ 1, "HV2" },
587*4cc286f3SDominic Spill 	{ 2, "HV3" },
588*4cc286f3SDominic Spill 	/* 3 - 255 reserved */
589*4cc286f3SDominic Spill 	{ 0, NULL }
590*4cc286f3SDominic Spill };
591*4cc286f3SDominic Spill 
592*4cc286f3SDominic Spill static const value_string air_mode[] = {
593*4cc286f3SDominic Spill 	{ 0, "mu-law log" },
594*4cc286f3SDominic Spill 	{ 1, "A-law log" },
595*4cc286f3SDominic Spill 	{ 2, "CVSD" },
596*4cc286f3SDominic Spill 	{ 3, "transparent data" },
597*4cc286f3SDominic Spill 	/* 4 - 255 reserved */
598*4cc286f3SDominic Spill 	{ 0, NULL }
599*4cc286f3SDominic Spill };
600*4cc286f3SDominic Spill 
601*4cc286f3SDominic Spill static const value_string paging_scheme[] = {
602*4cc286f3SDominic Spill 	{ 0, "mandatory scheme" },
603*4cc286f3SDominic Spill 	/* 1 - 255 reserved */
604*4cc286f3SDominic Spill 	{ 0, NULL }
605*4cc286f3SDominic Spill };
606*4cc286f3SDominic Spill 
607*4cc286f3SDominic Spill static const value_string paging_scheme_settings[] = {
608*4cc286f3SDominic Spill 	/* for mandatory scheme: */
609*4cc286f3SDominic Spill 	{ 0, "R0" },
610*4cc286f3SDominic Spill 	{ 1, "R1" },
611*4cc286f3SDominic Spill 	{ 2, "R2" },
612*4cc286f3SDominic Spill 	/* 3 - 255 reserved */
613*4cc286f3SDominic Spill 	{ 0, NULL }
614*4cc286f3SDominic Spill };
615*4cc286f3SDominic Spill 
616*4cc286f3SDominic Spill static const value_string afh_mode[] = {
617*4cc286f3SDominic Spill 	{ 0, "AFH disabled" },
618*4cc286f3SDominic Spill 	{ 1, "AFH enabled" },
619*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
620*4cc286f3SDominic Spill 	{ 0, NULL }
621*4cc286f3SDominic Spill };
622*4cc286f3SDominic Spill 
623*4cc286f3SDominic Spill static const value_string features_page[] = {
624*4cc286f3SDominic Spill 	{ 0, "standard features" },
625*4cc286f3SDominic Spill 	/* 1 - 255 other feature pages */
626*4cc286f3SDominic Spill 	{ 0, NULL }
627*4cc286f3SDominic Spill };
628*4cc286f3SDominic Spill 
629*4cc286f3SDominic Spill static const value_string packet_type_table[] = {
630*4cc286f3SDominic Spill 	{ 0, "1 Mbps only" },
631*4cc286f3SDominic Spill 	{ 1, "2/3 Mbps" },
632*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
633*4cc286f3SDominic Spill 	{ 0, NULL }
634*4cc286f3SDominic Spill };
635*4cc286f3SDominic Spill 
636*4cc286f3SDominic Spill static const value_string negotiation_state[] = {
637*4cc286f3SDominic Spill 	{ 0, "Initiate negotiation" },
638*4cc286f3SDominic Spill 	{ 1, "The latest received set of negotiable parameters were possible but these parameters are preferred." },
639*4cc286f3SDominic Spill 	{ 2, "The latest received set of negotiable parameters would cause a reserved slot violation." },
640*4cc286f3SDominic Spill 	{ 3, "The latest received set of negotiable parameters would cause a latency violation." },
641*4cc286f3SDominic Spill 	{ 4, "The latest received set of negotiable parameters are not supported." },
642*4cc286f3SDominic Spill 	/* 5 - 255 reserved */
643*4cc286f3SDominic Spill 	{ 0, NULL }
644*4cc286f3SDominic Spill };
645*4cc286f3SDominic Spill 
646*4cc286f3SDominic Spill static const value_string afh_reporting_mode[] = {
647*4cc286f3SDominic Spill 	{ 0, "AFH reporting disabled" },
648*4cc286f3SDominic Spill 	{ 1, "AFH reporting enabled" },
649*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
650*4cc286f3SDominic Spill 	{ 0, NULL }
651*4cc286f3SDominic Spill };
652*4cc286f3SDominic Spill 
653*4cc286f3SDominic Spill static const value_string io_capabilities[] = {
654*4cc286f3SDominic Spill 	{ 0, "Display Only" },
655*4cc286f3SDominic Spill 	{ 1, "Display Yes/No" },
656*4cc286f3SDominic Spill 	{ 2, "Keyboard Only" },
657*4cc286f3SDominic Spill 	{ 3, "No Input/No Output" },
658*4cc286f3SDominic Spill 	/* 4 - 255 reserved */
659*4cc286f3SDominic Spill 	{ 0, NULL }
660*4cc286f3SDominic Spill };
661*4cc286f3SDominic Spill 
662*4cc286f3SDominic Spill static const value_string oob_auth_data[] = {
663*4cc286f3SDominic Spill 	{ 0, "No OOB Authentication Data received" },
664*4cc286f3SDominic Spill 	{ 1, "OOB Authentication Data received" },
665*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
666*4cc286f3SDominic Spill 	{ 0, NULL }
667*4cc286f3SDominic Spill };
668*4cc286f3SDominic Spill 
669*4cc286f3SDominic Spill static const value_string auth_requirements[] = {
670*4cc286f3SDominic Spill 	{ 0x00, "MITM Protection Not Required - No Bonding" },
671*4cc286f3SDominic Spill 	{ 0x01, "MITM Protection Required - No Bonding" },
672*4cc286f3SDominic Spill 	{ 0x02, "MITM Protection Not Required - Dedicated Bonding" },
673*4cc286f3SDominic Spill 	{ 0x03, "MITM Protection Required - Dedicated Bonding" },
674*4cc286f3SDominic Spill 	{ 0x04, "MITM Protection Not Required - General Bonding" },
675*4cc286f3SDominic Spill 	{ 0x05, "MITM Protection Required - General Bonding" },
676*4cc286f3SDominic Spill 	/* 0x06 - 0xff reserved */
677*4cc286f3SDominic Spill 	{ 0, NULL }
678*4cc286f3SDominic Spill };
679*4cc286f3SDominic Spill 
680*4cc286f3SDominic Spill static const value_string power_adjust_req[] = {
681*4cc286f3SDominic Spill 	{ 0, "decrement power one step" },
682*4cc286f3SDominic Spill 	{ 1, "increment power one step" },
683*4cc286f3SDominic Spill 	{ 2, "increase to maximum power" },
684*4cc286f3SDominic Spill 	/* 3 - 255 reserved */
685*4cc286f3SDominic Spill 	{ 0, NULL }
686*4cc286f3SDominic Spill };
687*4cc286f3SDominic Spill 
688*4cc286f3SDominic Spill static const value_string power_adjust_res[] = {
689*4cc286f3SDominic Spill 	{ 0, "not supported" },
690*4cc286f3SDominic Spill 	{ 1, "changed one step (not min or max)" },
691*4cc286f3SDominic Spill 	{ 2, "max power" },
692*4cc286f3SDominic Spill 	{ 3, "min power" },
693*4cc286f3SDominic Spill 	/* 4 - 255 reserved */
694*4cc286f3SDominic Spill 	{ 0, NULL }
695*4cc286f3SDominic Spill };
696*4cc286f3SDominic Spill 
697*4cc286f3SDominic Spill static const value_string test_scenario[] = {
698*4cc286f3SDominic Spill 	{ 0, "Pause Test Mode" },
699*4cc286f3SDominic Spill 	{ 1, "Transmitter test - 0 pattern" },
700*4cc286f3SDominic Spill 	{ 2, "Transmitter test - 1 pattern" },
701*4cc286f3SDominic Spill 	{ 3, "Transmitter test - 1010 pattern" },
702*4cc286f3SDominic Spill 	{ 4, "Pseudorandom bit sequence" },
703*4cc286f3SDominic Spill 	{ 5, "Closed Loop Back - ACL packets" },
704*4cc286f3SDominic Spill 	{ 6, "Closed Loop Back - Synchronous packets" },
705*4cc286f3SDominic Spill 	{ 7, "ACL Packets without whitening" },
706*4cc286f3SDominic Spill 	{ 8, "Synchronous Packets without whitening" },
707*4cc286f3SDominic Spill 	{ 9, "Transmitter test - 1111 0000 pattern" },
708*4cc286f3SDominic Spill 	/* 10 - 254 reserved */
709*4cc286f3SDominic Spill 	{ 255, "Exit Test Mode" },
710*4cc286f3SDominic Spill 	{ 0, NULL }
711*4cc286f3SDominic Spill };
712*4cc286f3SDominic Spill 
713*4cc286f3SDominic Spill static const value_string hopping_mode[] = {
714*4cc286f3SDominic Spill 	{ 0, "RX/TX on single frequency" },
715*4cc286f3SDominic Spill 	{ 1, "Normal hopping" },
716*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
717*4cc286f3SDominic Spill 	{ 0, NULL }
718*4cc286f3SDominic Spill };
719*4cc286f3SDominic Spill 
720*4cc286f3SDominic Spill static const value_string power_control_mode[] = {
721*4cc286f3SDominic Spill 	{ 0, "fixed TX output power" },
722*4cc286f3SDominic Spill 	{ 1, "adaptive power control" },
723*4cc286f3SDominic Spill 	/* 2 - 255 reserved */
724*4cc286f3SDominic Spill 	{ 0, NULL }
725*4cc286f3SDominic Spill };
726*4cc286f3SDominic Spill 
727*4cc286f3SDominic Spill static const value_string esco_packet_type[] = {
728*4cc286f3SDominic Spill 	{ 0x00, "NULL/POLL" },
729*4cc286f3SDominic Spill 	{ 0x07, "EV3" },
730*4cc286f3SDominic Spill 	{ 0x0C, "EV4" },
731*4cc286f3SDominic Spill 	{ 0x0D, "EV5" },
732*4cc286f3SDominic Spill 	{ 0x26, "2-EV3" },
733*4cc286f3SDominic Spill 	{ 0x2C, "2-EV5" },
734*4cc286f3SDominic Spill 	{ 0x37, "3-EV3" },
735*4cc286f3SDominic Spill 	{ 0x3D, "3-EV5" },
736*4cc286f3SDominic Spill 	/* other values reserved */
737*4cc286f3SDominic Spill 	{ 0, NULL }
738*4cc286f3SDominic Spill };
739*4cc286f3SDominic Spill 
740*4cc286f3SDominic Spill static const value_string notification_value[] = {
741*4cc286f3SDominic Spill 	{ 0, "passkey entry started" },
742*4cc286f3SDominic Spill 	{ 1, "passkey digit entered" },
743*4cc286f3SDominic Spill 	{ 2, "passkey digit erased" },
744*4cc286f3SDominic Spill 	{ 3, "passkey cleared" },
745*4cc286f3SDominic Spill 	{ 4, "passkey entry completed" },
746*4cc286f3SDominic Spill 	/* 5 - 255 reserved */
747*4cc286f3SDominic Spill 	{ 0, NULL }
748*4cc286f3SDominic Spill };
749*4cc286f3SDominic Spill 
750*4cc286f3SDominic Spill /* initialize the subtree pointers */
751*4cc286f3SDominic Spill static gint ett_lmp = -1;
752*4cc286f3SDominic Spill static gint ett_lmp_pwradjres = -1;
753*4cc286f3SDominic Spill static gint ett_lmp_rate = -1;
754*4cc286f3SDominic Spill static gint ett_lmp_timectrl = -1;
755*4cc286f3SDominic Spill 
756*4cc286f3SDominic Spill /* LMP PDUs with short opcodes */
757*4cc286f3SDominic Spill 
758*4cc286f3SDominic Spill void
dissect_name_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)759*4cc286f3SDominic Spill dissect_name_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
760*4cc286f3SDominic Spill {
761*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
762*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
763*4cc286f3SDominic Spill 
764*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nameoffset, tvb, offset, 1, ENC_NA);
765*4cc286f3SDominic Spill }
766*4cc286f3SDominic Spill 
767*4cc286f3SDominic Spill void
dissect_name_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)768*4cc286f3SDominic Spill dissect_name_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
769*4cc286f3SDominic Spill {
770*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
771*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
772*4cc286f3SDominic Spill 
773*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nameoffset, tvb, offset, 1, ENC_NA);
774*4cc286f3SDominic Spill 	offset += 1;
775*4cc286f3SDominic Spill 
776*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_namelen, tvb, offset, 1, ENC_NA);
777*4cc286f3SDominic Spill 	offset += 1;
778*4cc286f3SDominic Spill 
779*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_namefrag, tvb, offset, 14, ENC_ASCII|ENC_NA);
780*4cc286f3SDominic Spill }
781*4cc286f3SDominic Spill 
782*4cc286f3SDominic Spill void
dissect_accepted(proto_tree * tree,tvbuff_t * tvb,int offset,int len)783*4cc286f3SDominic Spill dissect_accepted(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
784*4cc286f3SDominic Spill {
785*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
786*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
787*4cc286f3SDominic Spill 
788*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_NA);
789*4cc286f3SDominic Spill }
790*4cc286f3SDominic Spill 
791*4cc286f3SDominic Spill void
dissect_not_accepted(proto_tree * tree,tvbuff_t * tvb,int offset,int len)792*4cc286f3SDominic Spill dissect_not_accepted(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
793*4cc286f3SDominic Spill {
794*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
795*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
796*4cc286f3SDominic Spill 
797*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_NA);
798*4cc286f3SDominic Spill 	offset += 1;
799*4cc286f3SDominic Spill 
800*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA);
801*4cc286f3SDominic Spill }
802*4cc286f3SDominic Spill 
803*4cc286f3SDominic Spill void
dissect_clkoffset_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)804*4cc286f3SDominic Spill dissect_clkoffset_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
805*4cc286f3SDominic Spill {
806*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
807*4cc286f3SDominic Spill }
808*4cc286f3SDominic Spill 
809*4cc286f3SDominic Spill void
dissect_clkoffset_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)810*4cc286f3SDominic Spill dissect_clkoffset_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
811*4cc286f3SDominic Spill {
812*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
813*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
814*4cc286f3SDominic Spill 
815*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_clkoffset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
816*4cc286f3SDominic Spill }
817*4cc286f3SDominic Spill 
818*4cc286f3SDominic Spill void
dissect_detach(proto_tree * tree,tvbuff_t * tvb,int offset,int len)819*4cc286f3SDominic Spill dissect_detach(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
820*4cc286f3SDominic Spill {
821*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
822*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
823*4cc286f3SDominic Spill 
824*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA);
825*4cc286f3SDominic Spill }
826*4cc286f3SDominic Spill 
827*4cc286f3SDominic Spill void
dissect_in_rand(proto_tree * tree,tvbuff_t * tvb,int offset,int len)828*4cc286f3SDominic Spill dissect_in_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
829*4cc286f3SDominic Spill {
830*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
831*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
832*4cc286f3SDominic Spill 
833*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA);
834*4cc286f3SDominic Spill }
835*4cc286f3SDominic Spill 
836*4cc286f3SDominic Spill void
dissect_comb_key(proto_tree * tree,tvbuff_t * tvb,int offset,int len)837*4cc286f3SDominic Spill dissect_comb_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
838*4cc286f3SDominic Spill {
839*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
840*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
841*4cc286f3SDominic Spill 
842*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA);
843*4cc286f3SDominic Spill }
844*4cc286f3SDominic Spill 
845*4cc286f3SDominic Spill void
dissect_unit_key(proto_tree * tree,tvbuff_t * tvb,int offset,int len)846*4cc286f3SDominic Spill dissect_unit_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
847*4cc286f3SDominic Spill {
848*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
849*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
850*4cc286f3SDominic Spill 
851*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_key, tvb, offset, 16, ENC_NA);
852*4cc286f3SDominic Spill }
853*4cc286f3SDominic Spill 
854*4cc286f3SDominic Spill void
dissect_au_rand(proto_tree * tree,tvbuff_t * tvb,int offset,int len)855*4cc286f3SDominic Spill dissect_au_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
856*4cc286f3SDominic Spill {
857*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
858*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
859*4cc286f3SDominic Spill 
860*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA);
861*4cc286f3SDominic Spill }
862*4cc286f3SDominic Spill 
863*4cc286f3SDominic Spill void
dissect_sres(proto_tree * tree,tvbuff_t * tvb,int offset,int len)864*4cc286f3SDominic Spill dissect_sres(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
865*4cc286f3SDominic Spill {
866*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 5);
867*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4);
868*4cc286f3SDominic Spill 
869*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_authres, tvb, offset, 4, ENC_NA);
870*4cc286f3SDominic Spill }
871*4cc286f3SDominic Spill 
872*4cc286f3SDominic Spill void
dissect_temp_rand(proto_tree * tree,tvbuff_t * tvb,int offset,int len)873*4cc286f3SDominic Spill dissect_temp_rand(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
874*4cc286f3SDominic Spill {
875*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
876*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
877*4cc286f3SDominic Spill 
878*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA);
879*4cc286f3SDominic Spill }
880*4cc286f3SDominic Spill 
881*4cc286f3SDominic Spill void
dissect_temp_key(proto_tree * tree,tvbuff_t * tvb,int offset,int len)882*4cc286f3SDominic Spill dissect_temp_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
883*4cc286f3SDominic Spill {
884*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
885*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
886*4cc286f3SDominic Spill 
887*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_key, tvb, offset, 16, ENC_NA);
888*4cc286f3SDominic Spill }
889*4cc286f3SDominic Spill 
890*4cc286f3SDominic Spill void
dissect_encryption_mode_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)891*4cc286f3SDominic Spill dissect_encryption_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
892*4cc286f3SDominic Spill {
893*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
894*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
895*4cc286f3SDominic Spill 
896*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_cryptmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
897*4cc286f3SDominic Spill }
898*4cc286f3SDominic Spill 
899*4cc286f3SDominic Spill void
dissect_encryption_key_size_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)900*4cc286f3SDominic Spill dissect_encryption_key_size_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
901*4cc286f3SDominic Spill {
902*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
903*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
904*4cc286f3SDominic Spill 
905*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_keysz, tvb, offset, 1, ENC_LITTLE_ENDIAN);
906*4cc286f3SDominic Spill }
907*4cc286f3SDominic Spill 
908*4cc286f3SDominic Spill void
dissect_start_encryption_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)909*4cc286f3SDominic Spill dissect_start_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
910*4cc286f3SDominic Spill {
911*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
912*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
913*4cc286f3SDominic Spill 
914*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rand, tvb, offset, 16, ENC_NA);
915*4cc286f3SDominic Spill }
916*4cc286f3SDominic Spill 
917*4cc286f3SDominic Spill void
dissect_stop_encryption_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)918*4cc286f3SDominic Spill dissect_stop_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
919*4cc286f3SDominic Spill {
920*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
921*4cc286f3SDominic Spill }
922*4cc286f3SDominic Spill 
923*4cc286f3SDominic Spill void
dissect_switch_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)924*4cc286f3SDominic Spill dissect_switch_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
925*4cc286f3SDominic Spill {
926*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 5);
927*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4);
928*4cc286f3SDominic Spill 
929*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_swinst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
930*4cc286f3SDominic Spill }
931*4cc286f3SDominic Spill 
932*4cc286f3SDominic Spill void
dissect_hold(proto_tree * tree,tvbuff_t * tvb,int offset,int len)933*4cc286f3SDominic Spill dissect_hold(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
934*4cc286f3SDominic Spill {
935*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 7);
936*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6);
937*4cc286f3SDominic Spill 
938*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_htime, tvb, offset, 2, ENC_LITTLE_ENDIAN);
939*4cc286f3SDominic Spill 	offset += 2;
940*4cc286f3SDominic Spill 
941*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_hinst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
942*4cc286f3SDominic Spill }
943*4cc286f3SDominic Spill 
944*4cc286f3SDominic Spill void
dissect_hold_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)945*4cc286f3SDominic Spill dissect_hold_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
946*4cc286f3SDominic Spill {
947*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 7);
948*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6);
949*4cc286f3SDominic Spill 
950*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_htime, tvb, offset, 2, ENC_LITTLE_ENDIAN);
951*4cc286f3SDominic Spill 	offset += 2;
952*4cc286f3SDominic Spill 
953*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_hinst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
954*4cc286f3SDominic Spill }
955*4cc286f3SDominic Spill 
956*4cc286f3SDominic Spill void
dissect_sniff_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)957*4cc286f3SDominic Spill dissect_sniff_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
958*4cc286f3SDominic Spill {
959*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 10);
960*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9);
961*4cc286f3SDominic Spill 
962*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
963*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
964*4cc286f3SDominic Spill 	offset += 1;
965*4cc286f3SDominic Spill 
966*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_dsniff, tvb, offset, 2, ENC_LITTLE_ENDIAN);
967*4cc286f3SDominic Spill 	offset += 2;
968*4cc286f3SDominic Spill 
969*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_tsniff, tvb, offset, 2, ENC_LITTLE_ENDIAN);
970*4cc286f3SDominic Spill 	offset += 2;
971*4cc286f3SDominic Spill 
972*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_sniffatt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
973*4cc286f3SDominic Spill 	offset += 2;
974*4cc286f3SDominic Spill 
975*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_sniffto, tvb, offset, 2, ENC_LITTLE_ENDIAN);
976*4cc286f3SDominic Spill }
977*4cc286f3SDominic Spill 
978*4cc286f3SDominic Spill void
dissect_unsniff_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)979*4cc286f3SDominic Spill dissect_unsniff_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
980*4cc286f3SDominic Spill {
981*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
982*4cc286f3SDominic Spill }
983*4cc286f3SDominic Spill 
984*4cc286f3SDominic Spill void
dissect_park_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)985*4cc286f3SDominic Spill dissect_park_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
986*4cc286f3SDominic Spill {
987*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
988*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
989*4cc286f3SDominic Spill 
990*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
991*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
992*4cc286f3SDominic Spill 	offset += 1;
993*4cc286f3SDominic Spill 
994*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN);
995*4cc286f3SDominic Spill 	offset += 2;
996*4cc286f3SDominic Spill 
997*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_tb, tvb, offset, 2, ENC_LITTLE_ENDIAN);
998*4cc286f3SDominic Spill 	offset += 2;
999*4cc286f3SDominic Spill 
1000*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nb, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1001*4cc286f3SDominic Spill 	offset += 1;
1002*4cc286f3SDominic Spill 
1003*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_deltab, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1004*4cc286f3SDominic Spill 	offset += 1;
1005*4cc286f3SDominic Spill 
1006*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1007*4cc286f3SDominic Spill 	offset += 1;
1008*4cc286f3SDominic Spill 
1009*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_araddr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1010*4cc286f3SDominic Spill 	offset += 1;
1011*4cc286f3SDominic Spill 
1012*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nbsleep, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1013*4cc286f3SDominic Spill 	offset += 1;
1014*4cc286f3SDominic Spill 
1015*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_dbsleep, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1016*4cc286f3SDominic Spill 	offset += 1;
1017*4cc286f3SDominic Spill 
1018*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_daccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1019*4cc286f3SDominic Spill 	offset += 1;
1020*4cc286f3SDominic Spill 
1021*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_taccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1022*4cc286f3SDominic Spill 	offset += 1;
1023*4cc286f3SDominic Spill 
1024*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_naccslots, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1025*4cc286f3SDominic Spill 	offset += 1;
1026*4cc286f3SDominic Spill 
1027*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_npoll, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1028*4cc286f3SDominic Spill 	offset += 1;
1029*4cc286f3SDominic Spill 
1030*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1031*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_accscheme, tvb, offset, 1, ENC_NA);
1032*4cc286f3SDominic Spill }
1033*4cc286f3SDominic Spill 
1034*4cc286f3SDominic Spill void
dissect_set_broadcast_scan_window(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1035*4cc286f3SDominic Spill dissect_set_broadcast_scan_window(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1036*4cc286f3SDominic Spill {
1037*4cc286f3SDominic Spill 	int db_present;
1038*4cc286f3SDominic Spill 
1039*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1040*4cc286f3SDominic Spill 
1041*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1042*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1043*4cc286f3SDominic Spill 
1044*4cc286f3SDominic Spill 	/* bit0 of timing control flags indicates presence of db */
1045*4cc286f3SDominic Spill 	db_present = tvb_get_guint8(tvb, offset) & 0x01;
1046*4cc286f3SDominic Spill 	offset += 1;
1047*4cc286f3SDominic Spill 
1048*4cc286f3SDominic Spill 	if (db_present) {
1049*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 6);
1050*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 4);
1051*4cc286f3SDominic Spill 
1052*4cc286f3SDominic Spill 		proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1053*4cc286f3SDominic Spill 		offset += 2;
1054*4cc286f3SDominic Spill 	} else {
1055*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 4);
1056*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1057*4cc286f3SDominic Spill 	}
1058*4cc286f3SDominic Spill 
1059*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_bsw, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1060*4cc286f3SDominic Spill }
1061*4cc286f3SDominic Spill 
1062*4cc286f3SDominic Spill void
dissect_modify_beacon(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1063*4cc286f3SDominic Spill dissect_modify_beacon(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1064*4cc286f3SDominic Spill {
1065*4cc286f3SDominic Spill 	int db_present;
1066*4cc286f3SDominic Spill 
1067*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1068*4cc286f3SDominic Spill 
1069*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1070*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1071*4cc286f3SDominic Spill 
1072*4cc286f3SDominic Spill 	/* bit0 of timing control flags indicates presence of db */
1073*4cc286f3SDominic Spill 	db_present = tvb_get_guint8(tvb, offset) & 0x01;
1074*4cc286f3SDominic Spill 	offset += 1;
1075*4cc286f3SDominic Spill 
1076*4cc286f3SDominic Spill 	if (db_present) {
1077*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 13);
1078*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 11);
1079*4cc286f3SDominic Spill 
1080*4cc286f3SDominic Spill 		proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1081*4cc286f3SDominic Spill 		offset += 2;
1082*4cc286f3SDominic Spill 	} else {
1083*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 11);
1084*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9);
1085*4cc286f3SDominic Spill 	}
1086*4cc286f3SDominic Spill 
1087*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_tb, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1088*4cc286f3SDominic Spill 	offset += 2;
1089*4cc286f3SDominic Spill 
1090*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nb, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1091*4cc286f3SDominic Spill 	offset += 1;
1092*4cc286f3SDominic Spill 
1093*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_deltab, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1094*4cc286f3SDominic Spill 	offset += 1;
1095*4cc286f3SDominic Spill 
1096*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_daccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1097*4cc286f3SDominic Spill 	offset += 1;
1098*4cc286f3SDominic Spill 
1099*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_taccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1100*4cc286f3SDominic Spill 	offset += 1;
1101*4cc286f3SDominic Spill 
1102*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_naccslots, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1103*4cc286f3SDominic Spill 	offset += 1;
1104*4cc286f3SDominic Spill 
1105*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_npoll, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1106*4cc286f3SDominic Spill 	offset += 1;
1107*4cc286f3SDominic Spill 
1108*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maccess, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1109*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_accscheme, tvb, offset, 1, ENC_NA);
1110*4cc286f3SDominic Spill }
1111*4cc286f3SDominic Spill 
1112*4cc286f3SDominic Spill void
dissect_unpark_bd_addr_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1113*4cc286f3SDominic Spill dissect_unpark_bd_addr_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1114*4cc286f3SDominic Spill {
1115*4cc286f3SDominic Spill 	int db_present;
1116*4cc286f3SDominic Spill 	proto_item *item;
1117*4cc286f3SDominic Spill 
1118*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1119*4cc286f3SDominic Spill 
1120*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1121*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1122*4cc286f3SDominic Spill 
1123*4cc286f3SDominic Spill 	/* bit0 of timing control flags indicates presence of db */
1124*4cc286f3SDominic Spill 	db_present = tvb_get_guint8(tvb, offset) & 0x01;
1125*4cc286f3SDominic Spill 	offset += 1;
1126*4cc286f3SDominic Spill 
1127*4cc286f3SDominic Spill 	if (db_present) {
1128*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 17);
1129*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 15);
1130*4cc286f3SDominic Spill 
1131*4cc286f3SDominic Spill 		proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1132*4cc286f3SDominic Spill 		offset += 2;
1133*4cc286f3SDominic Spill 	} else {
1134*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 15);
1135*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 13);
1136*4cc286f3SDominic Spill 	}
1137*4cc286f3SDominic Spill 
1138*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1139*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1140*4cc286f3SDominic Spill 	offset += 1;
1141*4cc286f3SDominic Spill 
1142*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_bdaddr1, tvb, offset, 6, ENC_LITTLE_ENDIAN);
1143*4cc286f3SDominic Spill 	offset += 6;
1144*4cc286f3SDominic Spill 
1145*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_bdaddr2, tvb, offset, 6, ENC_LITTLE_ENDIAN);
1146*4cc286f3SDominic Spill 	offset += 6;
1147*4cc286f3SDominic Spill }
1148*4cc286f3SDominic Spill 
1149*4cc286f3SDominic Spill void
dissect_unpark_pm_addr_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1150*4cc286f3SDominic Spill dissect_unpark_pm_addr_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1151*4cc286f3SDominic Spill {
1152*4cc286f3SDominic Spill 	int db_present;
1153*4cc286f3SDominic Spill 
1154*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1155*4cc286f3SDominic Spill 
1156*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1157*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1158*4cc286f3SDominic Spill 
1159*4cc286f3SDominic Spill 	/* bit0 of timing control flags indicates presence of db */
1160*4cc286f3SDominic Spill 	db_present = tvb_get_guint8(tvb, offset) & 0x01;
1161*4cc286f3SDominic Spill 	offset += 1;
1162*4cc286f3SDominic Spill 
1163*4cc286f3SDominic Spill 	if (db_present) {
1164*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 15);
1165*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 13);
1166*4cc286f3SDominic Spill 
1167*4cc286f3SDominic Spill 		proto_tree_add_item(tree, hf_lmp_db, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1168*4cc286f3SDominic Spill 		offset += 2;
1169*4cc286f3SDominic Spill 	} else {
1170*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len == 13);
1171*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 11);
1172*4cc286f3SDominic Spill 	}
1173*4cc286f3SDominic Spill 
1174*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1175*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1176*4cc286f3SDominic Spill 	offset += 1;
1177*4cc286f3SDominic Spill 
1178*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1179*4cc286f3SDominic Spill 	offset += 1;
1180*4cc286f3SDominic Spill 
1181*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr2, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1182*4cc286f3SDominic Spill 	offset += 1;
1183*4cc286f3SDominic Spill 
1184*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr3, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1185*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr4, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1186*4cc286f3SDominic Spill 	offset += 1;
1187*4cc286f3SDominic Spill 
1188*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr3, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1189*4cc286f3SDominic Spill 	offset += 1;
1190*4cc286f3SDominic Spill 
1191*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr4, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1192*4cc286f3SDominic Spill 	offset += 1;
1193*4cc286f3SDominic Spill 
1194*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr5, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1195*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr6, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1196*4cc286f3SDominic Spill 	offset += 1;
1197*4cc286f3SDominic Spill 
1198*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr5, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1199*4cc286f3SDominic Spill 	offset += 1;
1200*4cc286f3SDominic Spill 
1201*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr6, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1202*4cc286f3SDominic Spill 	offset += 1;
1203*4cc286f3SDominic Spill 
1204*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ltaddr7, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1205*4cc286f3SDominic Spill 	offset += 1;
1206*4cc286f3SDominic Spill 
1207*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pmaddr7, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1208*4cc286f3SDominic Spill }
1209*4cc286f3SDominic Spill 
1210*4cc286f3SDominic Spill void
dissect_incr_power_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1211*4cc286f3SDominic Spill dissect_incr_power_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1212*4cc286f3SDominic Spill {
1213*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1214*4cc286f3SDominic Spill 
1215*4cc286f3SDominic Spill 	/* skipping one byte "for future use" */
1216*4cc286f3SDominic Spill }
1217*4cc286f3SDominic Spill 
1218*4cc286f3SDominic Spill void
dissect_decr_power_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1219*4cc286f3SDominic Spill dissect_decr_power_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1220*4cc286f3SDominic Spill {
1221*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1222*4cc286f3SDominic Spill 
1223*4cc286f3SDominic Spill 	/* skipping one byte "for future use" */
1224*4cc286f3SDominic Spill }
1225*4cc286f3SDominic Spill 
1226*4cc286f3SDominic Spill void
dissect_max_power(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1227*4cc286f3SDominic Spill dissect_max_power(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1228*4cc286f3SDominic Spill {
1229*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1230*4cc286f3SDominic Spill }
1231*4cc286f3SDominic Spill 
1232*4cc286f3SDominic Spill void
dissect_min_power(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1233*4cc286f3SDominic Spill dissect_min_power(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1234*4cc286f3SDominic Spill {
1235*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1236*4cc286f3SDominic Spill }
1237*4cc286f3SDominic Spill 
1238*4cc286f3SDominic Spill void
dissect_auto_rate(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1239*4cc286f3SDominic Spill dissect_auto_rate(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1240*4cc286f3SDominic Spill {
1241*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1242*4cc286f3SDominic Spill }
1243*4cc286f3SDominic Spill 
1244*4cc286f3SDominic Spill void
dissect_preferred_rate(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1245*4cc286f3SDominic Spill dissect_preferred_rate(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1246*4cc286f3SDominic Spill {
1247*4cc286f3SDominic Spill 	proto_item *rate_item;
1248*4cc286f3SDominic Spill 	proto_tree *rate_tree;
1249*4cc286f3SDominic Spill 
1250*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1251*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1252*4cc286f3SDominic Spill 
1253*4cc286f3SDominic Spill 	rate_item = proto_tree_add_item(tree, hf_lmp_rate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1254*4cc286f3SDominic Spill 	rate_tree = proto_item_add_subtree(rate_item, ett_lmp_rate);
1255*4cc286f3SDominic Spill 
1256*4cc286f3SDominic Spill 	proto_tree_add_item(rate_tree, hf_lmp_rate_fec, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1257*4cc286f3SDominic Spill 	proto_tree_add_item(rate_tree, hf_lmp_rate_size, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1258*4cc286f3SDominic Spill 	proto_tree_add_item(rate_tree, hf_lmp_rate_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1259*4cc286f3SDominic Spill 	proto_tree_add_item(rate_tree, hf_lmp_rate_edrsize, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1260*4cc286f3SDominic Spill }
1261*4cc286f3SDominic Spill 
1262*4cc286f3SDominic Spill void
dissect_version_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1263*4cc286f3SDominic Spill dissect_version_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1264*4cc286f3SDominic Spill {
1265*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 6);
1266*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5);
1267*4cc286f3SDominic Spill 
1268*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_versnr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1269*4cc286f3SDominic Spill 	offset += 1;
1270*4cc286f3SDominic Spill 
1271*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_compid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1272*4cc286f3SDominic Spill 	offset += 2;
1273*4cc286f3SDominic Spill 
1274*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_subversnr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1275*4cc286f3SDominic Spill }
1276*4cc286f3SDominic Spill 
1277*4cc286f3SDominic Spill void
dissect_version_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1278*4cc286f3SDominic Spill dissect_version_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1279*4cc286f3SDominic Spill {
1280*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 6);
1281*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5);
1282*4cc286f3SDominic Spill 
1283*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_versnr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1284*4cc286f3SDominic Spill 	offset += 1;
1285*4cc286f3SDominic Spill 
1286*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_compid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1287*4cc286f3SDominic Spill 	offset += 2;
1288*4cc286f3SDominic Spill 
1289*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_subversnr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1290*4cc286f3SDominic Spill }
1291*4cc286f3SDominic Spill 
1292*4cc286f3SDominic Spill void
dissect_features_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1293*4cc286f3SDominic Spill dissect_features_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1294*4cc286f3SDominic Spill {
1295*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 9);
1296*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8);
1297*4cc286f3SDominic Spill 
1298*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_features, tvb, offset, 8, ENC_NA);
1299*4cc286f3SDominic Spill }
1300*4cc286f3SDominic Spill 
1301*4cc286f3SDominic Spill void
dissect_features_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1302*4cc286f3SDominic Spill dissect_features_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1303*4cc286f3SDominic Spill {
1304*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 9);
1305*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8);
1306*4cc286f3SDominic Spill 
1307*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_features, tvb, offset, 8, ENC_NA);
1308*4cc286f3SDominic Spill }
1309*4cc286f3SDominic Spill 
1310*4cc286f3SDominic Spill void
dissect_quality_of_service(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1311*4cc286f3SDominic Spill dissect_quality_of_service(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1312*4cc286f3SDominic Spill {
1313*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1314*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3);
1315*4cc286f3SDominic Spill 
1316*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pollintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1317*4cc286f3SDominic Spill 	offset += 2;
1318*4cc286f3SDominic Spill 
1319*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nbc, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1320*4cc286f3SDominic Spill }
1321*4cc286f3SDominic Spill 
1322*4cc286f3SDominic Spill void
dissect_quality_of_service_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1323*4cc286f3SDominic Spill dissect_quality_of_service_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1324*4cc286f3SDominic Spill {
1325*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1326*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3);
1327*4cc286f3SDominic Spill 
1328*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pollintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1329*4cc286f3SDominic Spill 	offset += 2;
1330*4cc286f3SDominic Spill 
1331*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nbc, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1332*4cc286f3SDominic Spill }
1333*4cc286f3SDominic Spill 
1334*4cc286f3SDominic Spill void
dissect_sco_link_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1335*4cc286f3SDominic Spill dissect_sco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1336*4cc286f3SDominic Spill {
1337*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 7);
1338*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 6);
1339*4cc286f3SDominic Spill 
1340*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_scohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1341*4cc286f3SDominic Spill 	offset += 1;
1342*4cc286f3SDominic Spill 
1343*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1344*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1345*4cc286f3SDominic Spill 	offset += 1;
1346*4cc286f3SDominic Spill 
1347*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_dsco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1348*4cc286f3SDominic Spill 	offset += 1;
1349*4cc286f3SDominic Spill 
1350*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_tsco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1351*4cc286f3SDominic Spill 	offset += 1;
1352*4cc286f3SDominic Spill 
1353*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_scopkt, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1354*4cc286f3SDominic Spill 	offset += 1;
1355*4cc286f3SDominic Spill 
1356*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_airmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1357*4cc286f3SDominic Spill }
1358*4cc286f3SDominic Spill 
1359*4cc286f3SDominic Spill void
dissect_remove_sco_link_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1360*4cc286f3SDominic Spill dissect_remove_sco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1361*4cc286f3SDominic Spill {
1362*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1363*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1364*4cc286f3SDominic Spill 
1365*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_scohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1366*4cc286f3SDominic Spill 	offset += 1;
1367*4cc286f3SDominic Spill 
1368*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA);
1369*4cc286f3SDominic Spill }
1370*4cc286f3SDominic Spill 
1371*4cc286f3SDominic Spill void
dissect_max_slot(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1372*4cc286f3SDominic Spill dissect_max_slot(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1373*4cc286f3SDominic Spill {
1374*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1375*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1376*4cc286f3SDominic Spill 
1377*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxslots, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1378*4cc286f3SDominic Spill }
1379*4cc286f3SDominic Spill 
1380*4cc286f3SDominic Spill void
dissect_max_slot_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1381*4cc286f3SDominic Spill dissect_max_slot_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1382*4cc286f3SDominic Spill {
1383*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1384*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1385*4cc286f3SDominic Spill 
1386*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxslots, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1387*4cc286f3SDominic Spill }
1388*4cc286f3SDominic Spill 
1389*4cc286f3SDominic Spill void
dissect_timing_accuracy_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1390*4cc286f3SDominic Spill dissect_timing_accuracy_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1391*4cc286f3SDominic Spill {
1392*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1393*4cc286f3SDominic Spill }
1394*4cc286f3SDominic Spill 
1395*4cc286f3SDominic Spill void
dissect_timing_accuracy_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1396*4cc286f3SDominic Spill dissect_timing_accuracy_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1397*4cc286f3SDominic Spill {
1398*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1399*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1400*4cc286f3SDominic Spill 
1401*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_drift, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1402*4cc286f3SDominic Spill 	offset += 1;
1403*4cc286f3SDominic Spill 
1404*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_jitter, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1405*4cc286f3SDominic Spill }
1406*4cc286f3SDominic Spill 
1407*4cc286f3SDominic Spill void
dissect_setup_complete(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1408*4cc286f3SDominic Spill dissect_setup_complete(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1409*4cc286f3SDominic Spill {
1410*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1411*4cc286f3SDominic Spill }
1412*4cc286f3SDominic Spill 
1413*4cc286f3SDominic Spill void
dissect_use_semi_permanent_key(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1414*4cc286f3SDominic Spill dissect_use_semi_permanent_key(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1415*4cc286f3SDominic Spill {
1416*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1417*4cc286f3SDominic Spill }
1418*4cc286f3SDominic Spill 
1419*4cc286f3SDominic Spill void
dissect_host_connection_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1420*4cc286f3SDominic Spill dissect_host_connection_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1421*4cc286f3SDominic Spill {
1422*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1423*4cc286f3SDominic Spill }
1424*4cc286f3SDominic Spill 
1425*4cc286f3SDominic Spill void
dissect_slot_offset(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1426*4cc286f3SDominic Spill dissect_slot_offset(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1427*4cc286f3SDominic Spill {
1428*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 9);
1429*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 8);
1430*4cc286f3SDominic Spill 
1431*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_slotoffset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1432*4cc286f3SDominic Spill 	offset += 2;
1433*4cc286f3SDominic Spill 
1434*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_bdaddr, tvb, offset, 6, ENC_LITTLE_ENDIAN);
1435*4cc286f3SDominic Spill }
1436*4cc286f3SDominic Spill 
1437*4cc286f3SDominic Spill void
dissect_page_mode_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1438*4cc286f3SDominic Spill dissect_page_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1439*4cc286f3SDominic Spill {
1440*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1441*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1442*4cc286f3SDominic Spill 
1443*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pagesch, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1444*4cc286f3SDominic Spill 	offset += 1;
1445*4cc286f3SDominic Spill 
1446*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pssettings, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1447*4cc286f3SDominic Spill }
1448*4cc286f3SDominic Spill 
1449*4cc286f3SDominic Spill void
dissect_page_scan_mode_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1450*4cc286f3SDominic Spill dissect_page_scan_mode_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1451*4cc286f3SDominic Spill {
1452*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1453*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1454*4cc286f3SDominic Spill 
1455*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pagesch, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1456*4cc286f3SDominic Spill 	offset += 1;
1457*4cc286f3SDominic Spill 
1458*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pssettings, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1459*4cc286f3SDominic Spill }
1460*4cc286f3SDominic Spill 
1461*4cc286f3SDominic Spill void
dissect_supervision_timeout(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1462*4cc286f3SDominic Spill dissect_supervision_timeout(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1463*4cc286f3SDominic Spill {
1464*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1465*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1466*4cc286f3SDominic Spill 
1467*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_suptimeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1468*4cc286f3SDominic Spill }
1469*4cc286f3SDominic Spill 
1470*4cc286f3SDominic Spill void
dissect_test_activate(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1471*4cc286f3SDominic Spill dissect_test_activate(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1472*4cc286f3SDominic Spill {
1473*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1474*4cc286f3SDominic Spill }
1475*4cc286f3SDominic Spill 
1476*4cc286f3SDominic Spill void
dissect_test_control(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1477*4cc286f3SDominic Spill dissect_test_control(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1478*4cc286f3SDominic Spill {
1479*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 10);
1480*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 9);
1481*4cc286f3SDominic Spill 
1482*4cc286f3SDominic Spill 	/* FIXME these fields should all be XORed with 0x55. . . */
1483*4cc286f3SDominic Spill 
1484*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_testscen, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1485*4cc286f3SDominic Spill 	offset += 1;
1486*4cc286f3SDominic Spill 
1487*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_hopmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1488*4cc286f3SDominic Spill 	offset += 1;
1489*4cc286f3SDominic Spill 
1490*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_txfreq, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1491*4cc286f3SDominic Spill 	offset += 1;
1492*4cc286f3SDominic Spill 
1493*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_rxfreq, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1494*4cc286f3SDominic Spill 	offset += 1;
1495*4cc286f3SDominic Spill 
1496*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pcmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1497*4cc286f3SDominic Spill 	offset += 1;
1498*4cc286f3SDominic Spill 
1499*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pollper, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1500*4cc286f3SDominic Spill 	offset += 1;
1501*4cc286f3SDominic Spill 
1502*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pkttype, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1503*4cc286f3SDominic Spill 	offset += 1;
1504*4cc286f3SDominic Spill 
1505*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_testlen, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1506*4cc286f3SDominic Spill }
1507*4cc286f3SDominic Spill 
1508*4cc286f3SDominic Spill void
dissect_encryption_key_size_mask_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1509*4cc286f3SDominic Spill dissect_encryption_key_size_mask_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1510*4cc286f3SDominic Spill {
1511*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 1);
1512*4cc286f3SDominic Spill }
1513*4cc286f3SDominic Spill 
1514*4cc286f3SDominic Spill void
dissect_encryption_key_size_mask_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1515*4cc286f3SDominic Spill dissect_encryption_key_size_mask_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1516*4cc286f3SDominic Spill {
1517*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1518*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1519*4cc286f3SDominic Spill 
1520*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_ksmask, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1521*4cc286f3SDominic Spill }
1522*4cc286f3SDominic Spill 
1523*4cc286f3SDominic Spill void
dissect_set_afh(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1524*4cc286f3SDominic Spill dissect_set_afh(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1525*4cc286f3SDominic Spill {
1526*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 16);
1527*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 15);
1528*4cc286f3SDominic Spill 
1529*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhinst, tvb, offset, 4, ENC_LITTLE_ENDIAN);
1530*4cc286f3SDominic Spill 	offset += 4;
1531*4cc286f3SDominic Spill 
1532*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1533*4cc286f3SDominic Spill 	offset += 1;
1534*4cc286f3SDominic Spill 
1535*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhchmap, tvb, offset, 10, ENC_NA);
1536*4cc286f3SDominic Spill }
1537*4cc286f3SDominic Spill 
1538*4cc286f3SDominic Spill void
dissect_encapsulated_header(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1539*4cc286f3SDominic Spill dissect_encapsulated_header(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1540*4cc286f3SDominic Spill {
1541*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1542*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3);
1543*4cc286f3SDominic Spill 
1544*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_encmaj, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1545*4cc286f3SDominic Spill 	offset += 1;
1546*4cc286f3SDominic Spill 
1547*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_encmin, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1548*4cc286f3SDominic Spill 	offset += 1;
1549*4cc286f3SDominic Spill 
1550*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_enclen, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1551*4cc286f3SDominic Spill }
1552*4cc286f3SDominic Spill 
1553*4cc286f3SDominic Spill void
dissect_encapsulated_payload(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1554*4cc286f3SDominic Spill dissect_encapsulated_payload(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1555*4cc286f3SDominic Spill {
1556*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
1557*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
1558*4cc286f3SDominic Spill 
1559*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_encdata, tvb, offset, 16, ENC_NA);
1560*4cc286f3SDominic Spill }
1561*4cc286f3SDominic Spill 
1562*4cc286f3SDominic Spill void
dissect_simple_pairing_confirm(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1563*4cc286f3SDominic Spill dissect_simple_pairing_confirm(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1564*4cc286f3SDominic Spill {
1565*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
1566*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
1567*4cc286f3SDominic Spill 
1568*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_commit, tvb, offset, 16, ENC_NA);
1569*4cc286f3SDominic Spill }
1570*4cc286f3SDominic Spill 
1571*4cc286f3SDominic Spill void
dissect_simple_pairing_number(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1572*4cc286f3SDominic Spill dissect_simple_pairing_number(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1573*4cc286f3SDominic Spill {
1574*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
1575*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
1576*4cc286f3SDominic Spill 
1577*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nonce, tvb, offset, 16, ENC_NA);
1578*4cc286f3SDominic Spill }
1579*4cc286f3SDominic Spill 
1580*4cc286f3SDominic Spill void
dissect_dhkey_check(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1581*4cc286f3SDominic Spill dissect_dhkey_check(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1582*4cc286f3SDominic Spill {
1583*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 17);
1584*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 16);
1585*4cc286f3SDominic Spill 
1586*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_confirm, tvb, offset, 16, ENC_NA);
1587*4cc286f3SDominic Spill }
1588*4cc286f3SDominic Spill 
1589*4cc286f3SDominic Spill /* LMP PDUs with extended opcodes */
1590*4cc286f3SDominic Spill 
1591*4cc286f3SDominic Spill void
dissect_accepted_ext(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1592*4cc286f3SDominic Spill dissect_accepted_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1593*4cc286f3SDominic Spill {
1594*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1595*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1596*4cc286f3SDominic Spill 
1597*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1598*4cc286f3SDominic Spill 	offset += 1;
1599*4cc286f3SDominic Spill 
1600*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_eopinre, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1601*4cc286f3SDominic Spill }
1602*4cc286f3SDominic Spill 
1603*4cc286f3SDominic Spill void
dissect_not_accepted_ext(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1604*4cc286f3SDominic Spill dissect_not_accepted_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1605*4cc286f3SDominic Spill {
1606*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1607*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1608*4cc286f3SDominic Spill 
1609*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_opinre, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1610*4cc286f3SDominic Spill 	offset += 1;
1611*4cc286f3SDominic Spill 
1612*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_eopinre, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1613*4cc286f3SDominic Spill 	offset += 1;
1614*4cc286f3SDominic Spill 
1615*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA);
1616*4cc286f3SDominic Spill }
1617*4cc286f3SDominic Spill 
1618*4cc286f3SDominic Spill void
dissect_features_req_ext(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1619*4cc286f3SDominic Spill dissect_features_req_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1620*4cc286f3SDominic Spill {
1621*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 12);
1622*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10);
1623*4cc286f3SDominic Spill 
1624*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_fpage, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1625*4cc286f3SDominic Spill 	offset += 1;
1626*4cc286f3SDominic Spill 
1627*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxsp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1628*4cc286f3SDominic Spill 	offset += 1;
1629*4cc286f3SDominic Spill 
1630*4cc286f3SDominic Spill 	/*
1631*4cc286f3SDominic Spill 	 * extended features might need to be different from hf_lmp_features
1632*4cc286f3SDominic Spill 	 * if hf_lmp_features is broken out
1633*4cc286f3SDominic Spill 	 */
1634*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_features, tvb, offset, 8, ENC_NA);
1635*4cc286f3SDominic Spill }
1636*4cc286f3SDominic Spill 
1637*4cc286f3SDominic Spill void
dissect_features_res_ext(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1638*4cc286f3SDominic Spill dissect_features_res_ext(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1639*4cc286f3SDominic Spill {
1640*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 12);
1641*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10);
1642*4cc286f3SDominic Spill 
1643*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_fpage, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1644*4cc286f3SDominic Spill 	offset += 1;
1645*4cc286f3SDominic Spill 
1646*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxsp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1647*4cc286f3SDominic Spill 	offset += 1;
1648*4cc286f3SDominic Spill 
1649*4cc286f3SDominic Spill 	/*
1650*4cc286f3SDominic Spill 	 * extended features might need to be different from hf_lmp_features
1651*4cc286f3SDominic Spill 	 * if hf_lmp_features is broken out
1652*4cc286f3SDominic Spill 	 */
1653*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_features, tvb, offset, 8, ENC_NA);
1654*4cc286f3SDominic Spill }
1655*4cc286f3SDominic Spill 
1656*4cc286f3SDominic Spill void
dissect_packet_type_table_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1657*4cc286f3SDominic Spill dissect_packet_type_table_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1658*4cc286f3SDominic Spill {
1659*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1660*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1661*4cc286f3SDominic Spill 
1662*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pkttypetbl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1663*4cc286f3SDominic Spill }
1664*4cc286f3SDominic Spill 
1665*4cc286f3SDominic Spill void
dissect_esco_link_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1666*4cc286f3SDominic Spill dissect_esco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1667*4cc286f3SDominic Spill {
1668*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 16);
1669*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 14);
1670*4cc286f3SDominic Spill 
1671*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1672*4cc286f3SDominic Spill 	offset += 1;
1673*4cc286f3SDominic Spill 
1674*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escoltaddr, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1675*4cc286f3SDominic Spill 	offset += 1;
1676*4cc286f3SDominic Spill 
1677*4cc286f3SDominic Spill 	proto_tree_add_bitmask(tree, tvb, offset, hf_lmp_timectrl,
1678*4cc286f3SDominic Spill 			ett_lmp_timectrl, timectrl_fields, ENC_LITTLE_ENDIAN);
1679*4cc286f3SDominic Spill 	offset += 1;
1680*4cc286f3SDominic Spill 
1681*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_desco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1682*4cc286f3SDominic Spill 	offset += 1;
1683*4cc286f3SDominic Spill 
1684*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_tesco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1685*4cc286f3SDominic Spill 	offset += 1;
1686*4cc286f3SDominic Spill 
1687*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_wesco, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1688*4cc286f3SDominic Spill 	offset += 1;
1689*4cc286f3SDominic Spill 
1690*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escotypems, tvb, offset, 1, ENC_NA);
1691*4cc286f3SDominic Spill 	offset += 1;
1692*4cc286f3SDominic Spill 
1693*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escotypesm, tvb, offset, 1, ENC_NA);
1694*4cc286f3SDominic Spill 	offset += 1;
1695*4cc286f3SDominic Spill 
1696*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escolenms, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1697*4cc286f3SDominic Spill 	offset += 2;
1698*4cc286f3SDominic Spill 
1699*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escolensm, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1700*4cc286f3SDominic Spill 	offset += 2;
1701*4cc286f3SDominic Spill 
1702*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_airmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1703*4cc286f3SDominic Spill 	offset += 1;
1704*4cc286f3SDominic Spill 
1705*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_negstate, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1706*4cc286f3SDominic Spill }
1707*4cc286f3SDominic Spill 
1708*4cc286f3SDominic Spill void
dissect_remove_esco_link_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1709*4cc286f3SDominic Spill dissect_remove_esco_link_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1710*4cc286f3SDominic Spill {
1711*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 4);
1712*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 2);
1713*4cc286f3SDominic Spill 
1714*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_escohdl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1715*4cc286f3SDominic Spill 	offset += 1;
1716*4cc286f3SDominic Spill 
1717*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_err, tvb, offset, 1, ENC_NA);
1718*4cc286f3SDominic Spill }
1719*4cc286f3SDominic Spill 
1720*4cc286f3SDominic Spill void
dissect_channel_classification_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1721*4cc286f3SDominic Spill dissect_channel_classification_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1722*4cc286f3SDominic Spill {
1723*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 7);
1724*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 5);
1725*4cc286f3SDominic Spill 
1726*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhrptmode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1727*4cc286f3SDominic Spill 	offset += 1;
1728*4cc286f3SDominic Spill 
1729*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhminintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1730*4cc286f3SDominic Spill 	offset += 2;
1731*4cc286f3SDominic Spill 
1732*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhmaxintvl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1733*4cc286f3SDominic Spill }
1734*4cc286f3SDominic Spill 
1735*4cc286f3SDominic Spill void
dissect_channel_classification(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1736*4cc286f3SDominic Spill dissect_channel_classification(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1737*4cc286f3SDominic Spill {
1738*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 12);
1739*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 10);
1740*4cc286f3SDominic Spill 
1741*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_afhclass, tvb, offset, 10, ENC_NA);
1742*4cc286f3SDominic Spill }
1743*4cc286f3SDominic Spill 
1744*4cc286f3SDominic Spill void
dissect_sniff_subrating_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1745*4cc286f3SDominic Spill dissect_sniff_subrating_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1746*4cc286f3SDominic Spill {
1747*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 9);
1748*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 7);
1749*4cc286f3SDominic Spill 
1750*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxss, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1751*4cc286f3SDominic Spill 	offset += 1;
1752*4cc286f3SDominic Spill 
1753*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_minsmt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1754*4cc286f3SDominic Spill 	offset += 2;
1755*4cc286f3SDominic Spill 
1756*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_sniffsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1757*4cc286f3SDominic Spill }
1758*4cc286f3SDominic Spill 
1759*4cc286f3SDominic Spill void
dissect_sniff_subrating_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1760*4cc286f3SDominic Spill dissect_sniff_subrating_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1761*4cc286f3SDominic Spill {
1762*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 9);
1763*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 7);
1764*4cc286f3SDominic Spill 
1765*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_maxss, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1766*4cc286f3SDominic Spill 	offset += 1;
1767*4cc286f3SDominic Spill 
1768*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_minsmt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1769*4cc286f3SDominic Spill 	offset += 2;
1770*4cc286f3SDominic Spill 
1771*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_sniffsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
1772*4cc286f3SDominic Spill }
1773*4cc286f3SDominic Spill 
1774*4cc286f3SDominic Spill void
dissect_pause_encryption_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1775*4cc286f3SDominic Spill dissect_pause_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1776*4cc286f3SDominic Spill {
1777*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1778*4cc286f3SDominic Spill }
1779*4cc286f3SDominic Spill 
1780*4cc286f3SDominic Spill void
dissect_resume_encryption_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1781*4cc286f3SDominic Spill dissect_resume_encryption_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1782*4cc286f3SDominic Spill {
1783*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1784*4cc286f3SDominic Spill }
1785*4cc286f3SDominic Spill 
1786*4cc286f3SDominic Spill void
dissect_io_capability_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1787*4cc286f3SDominic Spill dissect_io_capability_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1788*4cc286f3SDominic Spill {
1789*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 5);
1790*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3);
1791*4cc286f3SDominic Spill 
1792*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_iocaps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1793*4cc286f3SDominic Spill 	offset += 1;
1794*4cc286f3SDominic Spill 
1795*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_oobauthdata, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1796*4cc286f3SDominic Spill 	offset += 1;
1797*4cc286f3SDominic Spill 
1798*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_authreqs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1799*4cc286f3SDominic Spill }
1800*4cc286f3SDominic Spill 
1801*4cc286f3SDominic Spill void
dissect_io_capability_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1802*4cc286f3SDominic Spill dissect_io_capability_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1803*4cc286f3SDominic Spill {
1804*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 5);
1805*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 3);
1806*4cc286f3SDominic Spill 
1807*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_iocaps, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1808*4cc286f3SDominic Spill 	offset += 1;
1809*4cc286f3SDominic Spill 
1810*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_oobauthdata, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1811*4cc286f3SDominic Spill 	offset += 1;
1812*4cc286f3SDominic Spill 
1813*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_authreqs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1814*4cc286f3SDominic Spill }
1815*4cc286f3SDominic Spill 
1816*4cc286f3SDominic Spill void
dissect_numeric_comparison_failed(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1817*4cc286f3SDominic Spill dissect_numeric_comparison_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1818*4cc286f3SDominic Spill {
1819*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1820*4cc286f3SDominic Spill }
1821*4cc286f3SDominic Spill 
1822*4cc286f3SDominic Spill void
dissect_passkey_failed(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1823*4cc286f3SDominic Spill dissect_passkey_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1824*4cc286f3SDominic Spill {
1825*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1826*4cc286f3SDominic Spill }
1827*4cc286f3SDominic Spill 
1828*4cc286f3SDominic Spill void
dissect_oob_failed(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1829*4cc286f3SDominic Spill dissect_oob_failed(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1830*4cc286f3SDominic Spill {
1831*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 2);
1832*4cc286f3SDominic Spill }
1833*4cc286f3SDominic Spill 
1834*4cc286f3SDominic Spill void
dissect_keypress_notification(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1835*4cc286f3SDominic Spill dissect_keypress_notification(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1836*4cc286f3SDominic Spill {
1837*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1838*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1839*4cc286f3SDominic Spill 
1840*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_nottype, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1841*4cc286f3SDominic Spill }
1842*4cc286f3SDominic Spill 
1843*4cc286f3SDominic Spill void
dissect_power_control_req(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1844*4cc286f3SDominic Spill dissect_power_control_req(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1845*4cc286f3SDominic Spill {
1846*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1847*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1848*4cc286f3SDominic Spill 
1849*4cc286f3SDominic Spill 	proto_tree_add_item(tree, hf_lmp_pwradjreq, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1850*4cc286f3SDominic Spill }
1851*4cc286f3SDominic Spill 
1852*4cc286f3SDominic Spill void
dissect_power_control_res(proto_tree * tree,tvbuff_t * tvb,int offset,int len)1853*4cc286f3SDominic Spill dissect_power_control_res(proto_tree *tree, tvbuff_t *tvb, int offset, int len)
1854*4cc286f3SDominic Spill {
1855*4cc286f3SDominic Spill 	proto_item *pa_item;
1856*4cc286f3SDominic Spill 	proto_tree *pa_tree;
1857*4cc286f3SDominic Spill 
1858*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len == 3);
1859*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(tvb_reported_length_remaining(tvb, offset) >= 1);
1860*4cc286f3SDominic Spill 
1861*4cc286f3SDominic Spill 	pa_item = proto_tree_add_item(tree, hf_lmp_pwradjres, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1862*4cc286f3SDominic Spill 	pa_tree = proto_item_add_subtree(pa_item, ett_lmp_pwradjres);
1863*4cc286f3SDominic Spill 
1864*4cc286f3SDominic Spill 	proto_tree_add_item(pa_tree, hf_lmp_pwradj_gfsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1865*4cc286f3SDominic Spill 	proto_tree_add_item(pa_tree, hf_lmp_pwradj_dqpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1866*4cc286f3SDominic Spill 	proto_tree_add_item(pa_tree, hf_lmp_pwradj_8dpsk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1867*4cc286f3SDominic Spill }
1868*4cc286f3SDominic Spill 
1869*4cc286f3SDominic Spill /* Link Manager Protocol */
1870*4cc286f3SDominic Spill static void
dissect_btlmp(tvbuff_t * tvb,packet_info * pinfo,proto_tree * tree)1871*4cc286f3SDominic Spill dissect_btlmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1872*4cc286f3SDominic Spill {
1873*4cc286f3SDominic Spill 	proto_item *lmp_item;
1874*4cc286f3SDominic Spill 	proto_tree *lmp_tree;
1875*4cc286f3SDominic Spill 	int offset;
1876*4cc286f3SDominic Spill 	int len;
1877*4cc286f3SDominic Spill 	int op;     /* opcode */
1878*4cc286f3SDominic Spill 	int eop;    /* extended opcode */
1879*4cc286f3SDominic Spill 
1880*4cc286f3SDominic Spill 	offset = 0;
1881*4cc286f3SDominic Spill 	len = tvb_reported_length(tvb);
1882*4cc286f3SDominic Spill 
1883*4cc286f3SDominic Spill 	DISSECTOR_ASSERT(len >= 1);
1884*4cc286f3SDominic Spill 
1885*4cc286f3SDominic Spill 	/* make entries in protocol column and info column on summary display */
1886*4cc286f3SDominic Spill 	col_set_str(pinfo->cinfo, COL_PROTOCOL, "LMP");
1887*4cc286f3SDominic Spill 
1888*4cc286f3SDominic Spill 	/* clear the info column first just in case of type fetching failure. */
1889*4cc286f3SDominic Spill 	col_clear(pinfo->cinfo, COL_INFO);
1890*4cc286f3SDominic Spill 
1891*4cc286f3SDominic Spill 	op = tvb_get_guint8(tvb, offset) >> 1;
1892*4cc286f3SDominic Spill 
1893*4cc286f3SDominic Spill 	if (op == LMP_ESCAPE_4) {
1894*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len >= 2);
1895*4cc286f3SDominic Spill 
1896*4cc286f3SDominic Spill 		eop = tvb_get_guint8(tvb, offset + 1);
1897*4cc286f3SDominic Spill 
1898*4cc286f3SDominic Spill 		col_add_str(pinfo->cinfo, COL_INFO, val_to_str(eop,
1899*4cc286f3SDominic Spill 			opcode, "Unknown Extended Opcode (%d)"));
1900*4cc286f3SDominic Spill 	} else {
1901*4cc286f3SDominic Spill 		col_add_str(pinfo->cinfo, COL_INFO, val_to_str(op,
1902*4cc286f3SDominic Spill 			opcode, "Unknown Opcode (%d)"));
1903*4cc286f3SDominic Spill 	}
1904*4cc286f3SDominic Spill 
1905*4cc286f3SDominic Spill 	/* see if we are being asked for details */
1906*4cc286f3SDominic Spill 	if (!tree)
1907*4cc286f3SDominic Spill 		return;
1908*4cc286f3SDominic Spill 
1909*4cc286f3SDominic Spill 	lmp_item = proto_tree_add_item(tree, proto_btlmp, tvb, offset, -1, ENC_NA);
1910*4cc286f3SDominic Spill 	lmp_tree = proto_item_add_subtree(lmp_item, ett_lmp);
1911*4cc286f3SDominic Spill 
1912*4cc286f3SDominic Spill 	proto_tree_add_item(lmp_tree, hf_lmp_tid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1913*4cc286f3SDominic Spill 
1914*4cc286f3SDominic Spill 	proto_tree_add_item(lmp_tree, hf_lmp_op, tvb, offset, 1, ENC_LITTLE_ENDIAN);
1915*4cc286f3SDominic Spill 	offset += 1;
1916*4cc286f3SDominic Spill 
1917*4cc286f3SDominic Spill 	switch (op) {
1918*4cc286f3SDominic Spill 	case LMP_NAME_REQ:
1919*4cc286f3SDominic Spill 		dissect_name_req(lmp_tree, tvb, offset, len);
1920*4cc286f3SDominic Spill 		break;
1921*4cc286f3SDominic Spill 	case LMP_NAME_RES:
1922*4cc286f3SDominic Spill 		dissect_name_res(lmp_tree, tvb, offset, len);
1923*4cc286f3SDominic Spill 		break;
1924*4cc286f3SDominic Spill 	case LMP_ACCEPTED:
1925*4cc286f3SDominic Spill 		dissect_accepted(lmp_tree, tvb, offset, len);
1926*4cc286f3SDominic Spill 		break;
1927*4cc286f3SDominic Spill 	case LMP_NOT_ACCEPTED:
1928*4cc286f3SDominic Spill 		dissect_not_accepted(lmp_tree, tvb, offset, len);
1929*4cc286f3SDominic Spill 		break;
1930*4cc286f3SDominic Spill 	case LMP_CLKOFFSET_REQ:
1931*4cc286f3SDominic Spill 		dissect_clkoffset_req(lmp_tree, tvb, offset, len);
1932*4cc286f3SDominic Spill 		break;
1933*4cc286f3SDominic Spill 	case LMP_CLKOFFSET_RES:
1934*4cc286f3SDominic Spill 		dissect_clkoffset_res(lmp_tree, tvb, offset, len);
1935*4cc286f3SDominic Spill 		break;
1936*4cc286f3SDominic Spill 	case LMP_DETACH:
1937*4cc286f3SDominic Spill 		dissect_detach(lmp_tree, tvb, offset, len);
1938*4cc286f3SDominic Spill 		break;
1939*4cc286f3SDominic Spill 	case LMP_IN_RAND:
1940*4cc286f3SDominic Spill 		dissect_in_rand(lmp_tree, tvb, offset, len);
1941*4cc286f3SDominic Spill 		break;
1942*4cc286f3SDominic Spill 	case LMP_COMB_KEY:
1943*4cc286f3SDominic Spill 		dissect_comb_key(lmp_tree, tvb, offset, len);
1944*4cc286f3SDominic Spill 		break;
1945*4cc286f3SDominic Spill 	case LMP_UNIT_KEY:
1946*4cc286f3SDominic Spill 		dissect_unit_key(lmp_tree, tvb, offset, len);
1947*4cc286f3SDominic Spill 		break;
1948*4cc286f3SDominic Spill 	case LMP_AU_RAND:
1949*4cc286f3SDominic Spill 		dissect_au_rand(lmp_tree, tvb, offset, len);
1950*4cc286f3SDominic Spill 		break;
1951*4cc286f3SDominic Spill 	case LMP_SRES:
1952*4cc286f3SDominic Spill 		dissect_sres(lmp_tree, tvb, offset, len);
1953*4cc286f3SDominic Spill 		break;
1954*4cc286f3SDominic Spill 	case LMP_TEMP_RAND:
1955*4cc286f3SDominic Spill 		dissect_temp_rand(lmp_tree, tvb, offset, len);
1956*4cc286f3SDominic Spill 		break;
1957*4cc286f3SDominic Spill 	case LMP_TEMP_KEY:
1958*4cc286f3SDominic Spill 		dissect_temp_key(lmp_tree, tvb, offset, len);
1959*4cc286f3SDominic Spill 		break;
1960*4cc286f3SDominic Spill 	case LMP_ENCRYPTION_MODE_REQ:
1961*4cc286f3SDominic Spill 		dissect_encryption_mode_req(lmp_tree, tvb, offset, len);
1962*4cc286f3SDominic Spill 		break;
1963*4cc286f3SDominic Spill 	case LMP_ENCRYPTION_KEY_SIZE_REQ:
1964*4cc286f3SDominic Spill 		dissect_encryption_key_size_req(lmp_tree, tvb, offset, len);
1965*4cc286f3SDominic Spill 		break;
1966*4cc286f3SDominic Spill 	case LMP_START_ENCRYPTION_REQ:
1967*4cc286f3SDominic Spill 		dissect_start_encryption_req(lmp_tree, tvb, offset, len);
1968*4cc286f3SDominic Spill 		break;
1969*4cc286f3SDominic Spill 	case LMP_STOP_ENCRYPTION_REQ:
1970*4cc286f3SDominic Spill 		dissect_stop_encryption_req(lmp_tree, tvb, offset, len);
1971*4cc286f3SDominic Spill 		break;
1972*4cc286f3SDominic Spill 	case LMP_SWITCH_REQ:
1973*4cc286f3SDominic Spill 		dissect_switch_req(lmp_tree, tvb, offset, len);
1974*4cc286f3SDominic Spill 		break;
1975*4cc286f3SDominic Spill 	case LMP_HOLD:
1976*4cc286f3SDominic Spill 		dissect_hold(lmp_tree, tvb, offset, len);
1977*4cc286f3SDominic Spill 		break;
1978*4cc286f3SDominic Spill 	case LMP_HOLD_REQ:
1979*4cc286f3SDominic Spill 		dissect_hold_req(lmp_tree, tvb, offset, len);
1980*4cc286f3SDominic Spill 		break;
1981*4cc286f3SDominic Spill 	case LMP_SNIFF_REQ:
1982*4cc286f3SDominic Spill 		dissect_sniff_req(lmp_tree, tvb, offset, len);
1983*4cc286f3SDominic Spill 		break;
1984*4cc286f3SDominic Spill 	case LMP_UNSNIFF_REQ:
1985*4cc286f3SDominic Spill 		dissect_unsniff_req(lmp_tree, tvb, offset, len);
1986*4cc286f3SDominic Spill 		break;
1987*4cc286f3SDominic Spill 	case LMP_PARK_REQ:
1988*4cc286f3SDominic Spill 		dissect_park_req(lmp_tree, tvb, offset, len);
1989*4cc286f3SDominic Spill 		break;
1990*4cc286f3SDominic Spill 	case LMP_SET_BROADCAST_SCAN_WINDOW:
1991*4cc286f3SDominic Spill 		dissect_set_broadcast_scan_window(lmp_tree, tvb, offset, len);
1992*4cc286f3SDominic Spill 		break;
1993*4cc286f3SDominic Spill 	case LMP_MODIFY_BEACON:
1994*4cc286f3SDominic Spill 		dissect_modify_beacon(lmp_tree, tvb, offset, len);
1995*4cc286f3SDominic Spill 		break;
1996*4cc286f3SDominic Spill 	case LMP_UNPARK_BD_ADDR_REQ:
1997*4cc286f3SDominic Spill 		dissect_unpark_bd_addr_req(lmp_tree, tvb, offset, len);
1998*4cc286f3SDominic Spill 		break;
1999*4cc286f3SDominic Spill 	case LMP_UNPARK_PM_ADDR_REQ:
2000*4cc286f3SDominic Spill 		dissect_unpark_pm_addr_req(lmp_tree, tvb, offset, len);
2001*4cc286f3SDominic Spill 		break;
2002*4cc286f3SDominic Spill 	case LMP_INCR_POWER_REQ:
2003*4cc286f3SDominic Spill 		dissect_incr_power_req(lmp_tree, tvb, offset, len);
2004*4cc286f3SDominic Spill 		break;
2005*4cc286f3SDominic Spill 	case LMP_DECR_POWER_REQ:
2006*4cc286f3SDominic Spill 		dissect_decr_power_req(lmp_tree, tvb, offset, len);
2007*4cc286f3SDominic Spill 		break;
2008*4cc286f3SDominic Spill 	case LMP_MAX_POWER:
2009*4cc286f3SDominic Spill 		dissect_max_power(lmp_tree, tvb, offset, len);
2010*4cc286f3SDominic Spill 		break;
2011*4cc286f3SDominic Spill 	case LMP_MIN_POWER:
2012*4cc286f3SDominic Spill 		dissect_min_power(lmp_tree, tvb, offset, len);
2013*4cc286f3SDominic Spill 		break;
2014*4cc286f3SDominic Spill 	case LMP_AUTO_RATE:
2015*4cc286f3SDominic Spill 		dissect_auto_rate(lmp_tree, tvb, offset, len);
2016*4cc286f3SDominic Spill 		break;
2017*4cc286f3SDominic Spill 	case LMP_PREFERRED_RATE:
2018*4cc286f3SDominic Spill 		dissect_preferred_rate(lmp_tree, tvb, offset, len);
2019*4cc286f3SDominic Spill 		break;
2020*4cc286f3SDominic Spill 	case LMP_VERSION_REQ:
2021*4cc286f3SDominic Spill 		dissect_version_req(lmp_tree, tvb, offset, len);
2022*4cc286f3SDominic Spill 		break;
2023*4cc286f3SDominic Spill 	case LMP_VERSION_RES:
2024*4cc286f3SDominic Spill 		dissect_version_res(lmp_tree, tvb, offset, len);
2025*4cc286f3SDominic Spill 		break;
2026*4cc286f3SDominic Spill 	case LMP_FEATURES_REQ:
2027*4cc286f3SDominic Spill 		dissect_features_req(lmp_tree, tvb, offset, len);
2028*4cc286f3SDominic Spill 		break;
2029*4cc286f3SDominic Spill 	case LMP_FEATURES_RES:
2030*4cc286f3SDominic Spill 		dissect_features_res(lmp_tree, tvb, offset, len);
2031*4cc286f3SDominic Spill 		break;
2032*4cc286f3SDominic Spill 	case LMP_QUALITY_OF_SERVICE:
2033*4cc286f3SDominic Spill 		dissect_quality_of_service(lmp_tree, tvb, offset, len);
2034*4cc286f3SDominic Spill 		break;
2035*4cc286f3SDominic Spill 	case LMP_QUALITY_OF_SERVICE_REQ:
2036*4cc286f3SDominic Spill 		dissect_quality_of_service_req(lmp_tree, tvb, offset, len);
2037*4cc286f3SDominic Spill 		break;
2038*4cc286f3SDominic Spill 	case LMP_SCO_LINK_REQ:
2039*4cc286f3SDominic Spill 		dissect_sco_link_req(lmp_tree, tvb, offset, len);
2040*4cc286f3SDominic Spill 		break;
2041*4cc286f3SDominic Spill 	case LMP_REMOVE_SCO_LINK_REQ:
2042*4cc286f3SDominic Spill 		dissect_remove_sco_link_req(lmp_tree, tvb, offset, len);
2043*4cc286f3SDominic Spill 		break;
2044*4cc286f3SDominic Spill 	case LMP_MAX_SLOT:
2045*4cc286f3SDominic Spill 		dissect_max_slot(lmp_tree, tvb, offset, len);
2046*4cc286f3SDominic Spill 		break;
2047*4cc286f3SDominic Spill 	case LMP_MAX_SLOT_REQ:
2048*4cc286f3SDominic Spill 		dissect_max_slot_req(lmp_tree, tvb, offset, len);
2049*4cc286f3SDominic Spill 		break;
2050*4cc286f3SDominic Spill 	case LMP_TIMING_ACCURACY_REQ:
2051*4cc286f3SDominic Spill 		dissect_timing_accuracy_req(lmp_tree, tvb, offset, len);
2052*4cc286f3SDominic Spill 		break;
2053*4cc286f3SDominic Spill 	case LMP_TIMING_ACCURACY_RES:
2054*4cc286f3SDominic Spill 		dissect_timing_accuracy_res(lmp_tree, tvb, offset, len);
2055*4cc286f3SDominic Spill 		break;
2056*4cc286f3SDominic Spill 	case LMP_SETUP_COMPLETE:
2057*4cc286f3SDominic Spill 		dissect_setup_complete(lmp_tree, tvb, offset, len);
2058*4cc286f3SDominic Spill 		break;
2059*4cc286f3SDominic Spill 	case LMP_USE_SEMI_PERMANENT_KEY:
2060*4cc286f3SDominic Spill 		dissect_use_semi_permanent_key(lmp_tree, tvb, offset, len);
2061*4cc286f3SDominic Spill 		break;
2062*4cc286f3SDominic Spill 	case LMP_HOST_CONNECTION_REQ:
2063*4cc286f3SDominic Spill 		dissect_host_connection_req(lmp_tree, tvb, offset, len);
2064*4cc286f3SDominic Spill 		break;
2065*4cc286f3SDominic Spill 	case LMP_SLOT_OFFSET:
2066*4cc286f3SDominic Spill 		dissect_slot_offset(lmp_tree, tvb, offset, len);
2067*4cc286f3SDominic Spill 		break;
2068*4cc286f3SDominic Spill 	case LMP_PAGE_MODE_REQ:
2069*4cc286f3SDominic Spill 		dissect_page_mode_req(lmp_tree, tvb, offset, len);
2070*4cc286f3SDominic Spill 		break;
2071*4cc286f3SDominic Spill 	case LMP_PAGE_SCAN_MODE_REQ:
2072*4cc286f3SDominic Spill 		dissect_page_scan_mode_req(lmp_tree, tvb, offset, len);
2073*4cc286f3SDominic Spill 		break;
2074*4cc286f3SDominic Spill 	case LMP_SUPERVISION_TIMEOUT:
2075*4cc286f3SDominic Spill 		dissect_supervision_timeout(lmp_tree, tvb, offset, len);
2076*4cc286f3SDominic Spill 		break;
2077*4cc286f3SDominic Spill 	case LMP_TEST_ACTIVATE:
2078*4cc286f3SDominic Spill 		dissect_test_activate(lmp_tree, tvb, offset, len);
2079*4cc286f3SDominic Spill 		break;
2080*4cc286f3SDominic Spill 	case LMP_TEST_CONTROL:
2081*4cc286f3SDominic Spill 		dissect_test_control(lmp_tree, tvb, offset, len);
2082*4cc286f3SDominic Spill 		break;
2083*4cc286f3SDominic Spill 	case LMP_ENCRYPTION_KEY_SIZE_MASK_REQ:
2084*4cc286f3SDominic Spill 		dissect_encryption_key_size_mask_req(lmp_tree, tvb, offset, len);
2085*4cc286f3SDominic Spill 		break;
2086*4cc286f3SDominic Spill 	case LMP_ENCRYPTION_KEY_SIZE_MASK_RES:
2087*4cc286f3SDominic Spill 		dissect_encryption_key_size_mask_res(lmp_tree, tvb, offset, len);
2088*4cc286f3SDominic Spill 		break;
2089*4cc286f3SDominic Spill 	case LMP_SET_AFH:
2090*4cc286f3SDominic Spill 		dissect_set_afh(lmp_tree, tvb, offset, len);
2091*4cc286f3SDominic Spill 		break;
2092*4cc286f3SDominic Spill 	case LMP_ENCAPSULATED_HEADER:
2093*4cc286f3SDominic Spill 		dissect_encapsulated_header(lmp_tree, tvb, offset, len);
2094*4cc286f3SDominic Spill 		break;
2095*4cc286f3SDominic Spill 	case LMP_ENCAPSULATED_PAYLOAD:
2096*4cc286f3SDominic Spill 		dissect_encapsulated_payload(lmp_tree, tvb, offset, len);
2097*4cc286f3SDominic Spill 		break;
2098*4cc286f3SDominic Spill 	case LMP_SIMPLE_PAIRING_CONFIRM:
2099*4cc286f3SDominic Spill 		dissect_simple_pairing_confirm(lmp_tree, tvb, offset, len);
2100*4cc286f3SDominic Spill 		break;
2101*4cc286f3SDominic Spill 	case LMP_SIMPLE_PAIRING_NUMBER:
2102*4cc286f3SDominic Spill 		dissect_simple_pairing_number(lmp_tree, tvb, offset, len);
2103*4cc286f3SDominic Spill 		break;
2104*4cc286f3SDominic Spill 	case LMP_DHKEY_CHECK:
2105*4cc286f3SDominic Spill 		dissect_dhkey_check(lmp_tree, tvb, offset, len);
2106*4cc286f3SDominic Spill 		break;
2107*4cc286f3SDominic Spill 	case LMP_ESCAPE_1:
2108*4cc286f3SDominic Spill 		break;
2109*4cc286f3SDominic Spill 	case LMP_ESCAPE_2:
2110*4cc286f3SDominic Spill 		break;
2111*4cc286f3SDominic Spill 	case LMP_ESCAPE_3:
2112*4cc286f3SDominic Spill 		break;
2113*4cc286f3SDominic Spill 	case LMP_ESCAPE_4:
2114*4cc286f3SDominic Spill 		/* extended opcode */
2115*4cc286f3SDominic Spill 		DISSECTOR_ASSERT(len >= 2);
2116*4cc286f3SDominic Spill 		proto_tree_add_item(lmp_tree, hf_lmp_eop, tvb, offset, 1, ENC_NA);
2117*4cc286f3SDominic Spill 		offset += 1;
2118*4cc286f3SDominic Spill 
2119*4cc286f3SDominic Spill 		switch (eop) {
2120*4cc286f3SDominic Spill 		case LMP_ACCEPTED_EXT:
2121*4cc286f3SDominic Spill 			dissect_accepted_ext(lmp_tree, tvb, offset, len);
2122*4cc286f3SDominic Spill 			break;
2123*4cc286f3SDominic Spill 		case LMP_NOT_ACCEPTED_EXT:
2124*4cc286f3SDominic Spill 			dissect_not_accepted_ext(lmp_tree, tvb, offset, len);
2125*4cc286f3SDominic Spill 			break;
2126*4cc286f3SDominic Spill 		case LMP_FEATURES_REQ_EXT:
2127*4cc286f3SDominic Spill 			dissect_features_req_ext(lmp_tree, tvb, offset, len);
2128*4cc286f3SDominic Spill 			break;
2129*4cc286f3SDominic Spill 		case LMP_FEATURES_RES_EXT:
2130*4cc286f3SDominic Spill 			dissect_features_res_ext(lmp_tree, tvb, offset, len);
2131*4cc286f3SDominic Spill 			break;
2132*4cc286f3SDominic Spill 		case LMP_PACKET_TYPE_TABLE_REQ:
2133*4cc286f3SDominic Spill 			dissect_packet_type_table_req(lmp_tree, tvb, offset, len);
2134*4cc286f3SDominic Spill 			break;
2135*4cc286f3SDominic Spill 		case LMP_ESCO_LINK_REQ:
2136*4cc286f3SDominic Spill 			dissect_esco_link_req(lmp_tree, tvb, offset, len);
2137*4cc286f3SDominic Spill 			break;
2138*4cc286f3SDominic Spill 		case LMP_REMOVE_ESCO_LINK_REQ:
2139*4cc286f3SDominic Spill 			dissect_remove_esco_link_req(lmp_tree, tvb, offset, len);
2140*4cc286f3SDominic Spill 			break;
2141*4cc286f3SDominic Spill 		case LMP_CHANNEL_CLASSIFICATION_REQ:
2142*4cc286f3SDominic Spill 			dissect_channel_classification_req(lmp_tree, tvb, offset, len);
2143*4cc286f3SDominic Spill 			break;
2144*4cc286f3SDominic Spill 		case LMP_CHANNEL_CLASSIFICATION:
2145*4cc286f3SDominic Spill 			dissect_channel_classification(lmp_tree, tvb, offset, len);
2146*4cc286f3SDominic Spill 			break;
2147*4cc286f3SDominic Spill 		case LMP_SNIFF_SUBRATING_REQ:
2148*4cc286f3SDominic Spill 			dissect_sniff_subrating_req(lmp_tree, tvb, offset, len);
2149*4cc286f3SDominic Spill 			break;
2150*4cc286f3SDominic Spill 		case LMP_SNIFF_SUBRATING_RES:
2151*4cc286f3SDominic Spill 			dissect_sniff_subrating_res(lmp_tree, tvb, offset, len);
2152*4cc286f3SDominic Spill 			break;
2153*4cc286f3SDominic Spill 		case LMP_PAUSE_ENCRYPTION_REQ:
2154*4cc286f3SDominic Spill 			dissect_pause_encryption_req(lmp_tree, tvb, offset, len);
2155*4cc286f3SDominic Spill 			break;
2156*4cc286f3SDominic Spill 		case LMP_RESUME_ENCRYPTION_REQ:
2157*4cc286f3SDominic Spill 			dissect_resume_encryption_req(lmp_tree, tvb, offset, len);
2158*4cc286f3SDominic Spill 			break;
2159*4cc286f3SDominic Spill 		case LMP_IO_CAPABILITY_REQ:
2160*4cc286f3SDominic Spill 			dissect_io_capability_req(lmp_tree, tvb, offset, len);
2161*4cc286f3SDominic Spill 			break;
2162*4cc286f3SDominic Spill 		case LMP_IO_CAPABILITY_RES:
2163*4cc286f3SDominic Spill 			dissect_io_capability_res(lmp_tree, tvb, offset, len);
2164*4cc286f3SDominic Spill 			break;
2165*4cc286f3SDominic Spill 		case LMP_NUMERIC_COMPARISON_FAILED:
2166*4cc286f3SDominic Spill 			dissect_numeric_comparison_failed(lmp_tree, tvb, offset, len);
2167*4cc286f3SDominic Spill 			break;
2168*4cc286f3SDominic Spill 		case LMP_PASSKEY_FAILED:
2169*4cc286f3SDominic Spill 			dissect_passkey_failed(lmp_tree, tvb, offset, len);
2170*4cc286f3SDominic Spill 			break;
2171*4cc286f3SDominic Spill 		case LMP_OOB_FAILED:
2172*4cc286f3SDominic Spill 			dissect_oob_failed(lmp_tree, tvb, offset, len);
2173*4cc286f3SDominic Spill 			break;
2174*4cc286f3SDominic Spill 		case LMP_KEYPRESS_NOTIFICATION:
2175*4cc286f3SDominic Spill 			dissect_keypress_notification(lmp_tree, tvb, offset, len);
2176*4cc286f3SDominic Spill 			break;
2177*4cc286f3SDominic Spill 		case LMP_POWER_CONTROL_REQ:
2178*4cc286f3SDominic Spill 			dissect_power_control_req(lmp_tree, tvb, offset, len);
2179*4cc286f3SDominic Spill 			break;
2180*4cc286f3SDominic Spill 		case LMP_POWER_CONTROL_RES:
2181*4cc286f3SDominic Spill 			dissect_power_control_res(lmp_tree, tvb, offset, len);
2182*4cc286f3SDominic Spill 			break;
2183*4cc286f3SDominic Spill 		default:
2184*4cc286f3SDominic Spill 			break;
2185*4cc286f3SDominic Spill 		}
2186*4cc286f3SDominic Spill 	default:
2187*4cc286f3SDominic Spill 		break;
2188*4cc286f3SDominic Spill 	}
2189*4cc286f3SDominic Spill };
2190*4cc286f3SDominic Spill 
2191*4cc286f3SDominic Spill /* register the protocol with Wireshark */
2192*4cc286f3SDominic Spill void
proto_register_btlmp(void)2193*4cc286f3SDominic Spill proto_register_btlmp(void)
2194*4cc286f3SDominic Spill {
2195*4cc286f3SDominic Spill 
2196*4cc286f3SDominic Spill 	/* list of fields */
2197*4cc286f3SDominic Spill 	static hf_register_info hf[] = {
2198*4cc286f3SDominic Spill 		{ &hf_lmp_accscheme,
2199*4cc286f3SDominic Spill 			{ "Access Scheme", "btlmp.accscheme",
2200*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(access_scheme), 0xf0,
2201*4cc286f3SDominic Spill 			NULL, HFILL }
2202*4cc286f3SDominic Spill 		},
2203*4cc286f3SDominic Spill 		{ &hf_lmp_afhchmap,
2204*4cc286f3SDominic Spill 			{ "AFH Channel Map", "btlmp.afhchmap",
2205*4cc286f3SDominic Spill 			/* could break out individual channels but long */
2206*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2207*4cc286f3SDominic Spill 			"Adaptive Frequency Hopping Channel Map", HFILL }
2208*4cc286f3SDominic Spill 		},
2209*4cc286f3SDominic Spill 		{ &hf_lmp_afhclass,
2210*4cc286f3SDominic Spill 			{ "AFH Channel Classification", "btlmp.afhclass",
2211*4cc286f3SDominic Spill 			/* could break out individual channels but long */
2212*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2213*4cc286f3SDominic Spill 			"Adaptive Frequency Hopping Channel Classification", HFILL }
2214*4cc286f3SDominic Spill 		},
2215*4cc286f3SDominic Spill 		{ &hf_lmp_afhinst,
2216*4cc286f3SDominic Spill 			{ "AFH Instant", "btlmp.afhinst",
2217*4cc286f3SDominic Spill 			FT_UINT32, BASE_HEX, NULL, 0x0,
2218*4cc286f3SDominic Spill 			"Adaptive Frequency Hopping Instant (slot)", HFILL }
2219*4cc286f3SDominic Spill 		},
2220*4cc286f3SDominic Spill 		{ &hf_lmp_afhmaxintvl,
2221*4cc286f3SDominic Spill 			{ "AFH Max Interval", "btlmp.maxintvl",
2222*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2223*4cc286f3SDominic Spill 			"Adaptive Maximum Interval in slots", HFILL }
2224*4cc286f3SDominic Spill 		},
2225*4cc286f3SDominic Spill 		{ &hf_lmp_afhminintvl,
2226*4cc286f3SDominic Spill 			{ "AFH Min Interval", "btlmp.minintvl",
2227*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2228*4cc286f3SDominic Spill 			"Adaptive Minimum Interval in slots", HFILL }
2229*4cc286f3SDominic Spill 		},
2230*4cc286f3SDominic Spill 		{ &hf_lmp_afhmode,
2231*4cc286f3SDominic Spill 			{ "AFH Mode", "btlmp.afhmode",
2232*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(afh_mode), 0x0,
2233*4cc286f3SDominic Spill 			"Adaptive Frequency Hopping Mode", HFILL }
2234*4cc286f3SDominic Spill 		},
2235*4cc286f3SDominic Spill 		{ &hf_lmp_afhrptmode,
2236*4cc286f3SDominic Spill 			{ "AFH Reporting Mode", "btlmp.afhrptmode",
2237*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(afh_reporting_mode), 0x0,
2238*4cc286f3SDominic Spill 			"Adaptive Frequency Hopping Reporting Mode", HFILL }
2239*4cc286f3SDominic Spill 		},
2240*4cc286f3SDominic Spill 		{ &hf_lmp_airmode,
2241*4cc286f3SDominic Spill 			{ "Air Mode", "btlmp.airmode",
2242*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(air_mode), 0x0,
2243*4cc286f3SDominic Spill 			NULL, HFILL }
2244*4cc286f3SDominic Spill 		},
2245*4cc286f3SDominic Spill 		{ &hf_lmp_araddr,
2246*4cc286f3SDominic Spill 			{ "AR_ADDR", "btlmp.araddr",
2247*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0xfe,
2248*4cc286f3SDominic Spill 			NULL, HFILL }
2249*4cc286f3SDominic Spill 		},
2250*4cc286f3SDominic Spill 		{ &hf_lmp_authreqs,
2251*4cc286f3SDominic Spill 			{ "Authentication Requirements", "btlmp.authreqs",
2252*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(auth_requirements), 0xf0,
2253*4cc286f3SDominic Spill 			NULL, HFILL }
2254*4cc286f3SDominic Spill 		},
2255*4cc286f3SDominic Spill 		{ &hf_lmp_authres,
2256*4cc286f3SDominic Spill 			{ "Authentication Response", "btlmp.authres",
2257*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2258*4cc286f3SDominic Spill 			NULL, HFILL }
2259*4cc286f3SDominic Spill 		},
2260*4cc286f3SDominic Spill 		{ &hf_lmp_bdaddr,
2261*4cc286f3SDominic Spill 			{ "BD_ADDR", "btlmp.bdaddr",
2262*4cc286f3SDominic Spill 			FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff,
2263*4cc286f3SDominic Spill 			NULL, HFILL }
2264*4cc286f3SDominic Spill 		},
2265*4cc286f3SDominic Spill 		{ &hf_lmp_bdaddr1,
2266*4cc286f3SDominic Spill 			{ "BD_ADDR 1", "btlmp.bdaddr",
2267*4cc286f3SDominic Spill 			FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff,
2268*4cc286f3SDominic Spill 			NULL, HFILL }
2269*4cc286f3SDominic Spill 		},
2270*4cc286f3SDominic Spill 		{ &hf_lmp_bdaddr2,
2271*4cc286f3SDominic Spill 			{ "BD_ADDR2", "btlmp.bdaddr",
2272*4cc286f3SDominic Spill 			FT_UINT64, BASE_HEX, NULL, 0x0000ffffffffffff,
2273*4cc286f3SDominic Spill 			"BD_ADDR 2", HFILL }
2274*4cc286f3SDominic Spill 		},
2275*4cc286f3SDominic Spill 		{ &hf_lmp_bsw,
2276*4cc286f3SDominic Spill 			{ "Broadcast Scan Window", "btlmp.bsw",
2277*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2278*4cc286f3SDominic Spill 			"Broadcast Scan Window in slots", HFILL }
2279*4cc286f3SDominic Spill 		},
2280*4cc286f3SDominic Spill 		{ &hf_lmp_clkoffset,
2281*4cc286f3SDominic Spill 			{ "Clock Offset", "btlmp.clkoffset",
2282*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2283*4cc286f3SDominic Spill 			"Clock Offset in units of 1.25 ms", HFILL }
2284*4cc286f3SDominic Spill 		},
2285*4cc286f3SDominic Spill 		{ &hf_lmp_commit,
2286*4cc286f3SDominic Spill 			{ "Commitment Value", "btlmp.commit",
2287*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2288*4cc286f3SDominic Spill 			NULL, HFILL }
2289*4cc286f3SDominic Spill 		},
2290*4cc286f3SDominic Spill 		{ &hf_lmp_confirm,
2291*4cc286f3SDominic Spill 			{ "Confirmation Value", "btlmp.confirm",
2292*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2293*4cc286f3SDominic Spill 			NULL, HFILL }
2294*4cc286f3SDominic Spill 		},
2295*4cc286f3SDominic Spill 		{ &hf_lmp_compid,
2296*4cc286f3SDominic Spill 			{ "Company ID", "btlmp.compid",
2297*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, VALS(compid), 0x0,
2298*4cc286f3SDominic Spill 			NULL, HFILL }
2299*4cc286f3SDominic Spill 		},
2300*4cc286f3SDominic Spill 		{ &hf_lmp_cryptmode,
2301*4cc286f3SDominic Spill 			{ "Encryption Mode", "btlmp.cryptmode",
2302*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(encryption_mode), 0x0,
2303*4cc286f3SDominic Spill 			NULL, HFILL }
2304*4cc286f3SDominic Spill 		},
2305*4cc286f3SDominic Spill 		{ &hf_lmp_daccess,
2306*4cc286f3SDominic Spill 			{ "Daccess", "btlmp.daccess",
2307*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2308*4cc286f3SDominic Spill 			"Daccess in slots", HFILL }
2309*4cc286f3SDominic Spill 		},
2310*4cc286f3SDominic Spill 		{ &hf_lmp_db,
2311*4cc286f3SDominic Spill 			{ "Db", "btlmp.db",
2312*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2313*4cc286f3SDominic Spill 			"Db in slots", HFILL }
2314*4cc286f3SDominic Spill 		},
2315*4cc286f3SDominic Spill 		{ &hf_lmp_dbsleep,
2316*4cc286f3SDominic Spill 			{ "Dbsleep", "btlmp.dbsleep",
2317*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2318*4cc286f3SDominic Spill 			NULL, HFILL }
2319*4cc286f3SDominic Spill 		},
2320*4cc286f3SDominic Spill 		{ &hf_lmp_deltab,
2321*4cc286f3SDominic Spill 			{ "Deltab", "btlmp.deltab",
2322*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2323*4cc286f3SDominic Spill 			"Deltab in slots", HFILL }
2324*4cc286f3SDominic Spill 		},
2325*4cc286f3SDominic Spill 		{ &hf_lmp_desco,
2326*4cc286f3SDominic Spill 			{ "Desco", "btlmp.desco",
2327*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2328*4cc286f3SDominic Spill 			"Desco in slots", HFILL }
2329*4cc286f3SDominic Spill 		},
2330*4cc286f3SDominic Spill 		{ &hf_lmp_drift,
2331*4cc286f3SDominic Spill 			{ "Drift", "btlmp.drift",
2332*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2333*4cc286f3SDominic Spill 			"Drift in ppm", HFILL }
2334*4cc286f3SDominic Spill 		},
2335*4cc286f3SDominic Spill 		{ &hf_lmp_dsco,
2336*4cc286f3SDominic Spill 			{ "Dsco", "btlmp.dsco",
2337*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2338*4cc286f3SDominic Spill 			"Dsco in slots", HFILL }
2339*4cc286f3SDominic Spill 		},
2340*4cc286f3SDominic Spill 		{ &hf_lmp_dsniff,
2341*4cc286f3SDominic Spill 			{ "Dsniff", "btlmp.dsniff",
2342*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2343*4cc286f3SDominic Spill 			"Dsniff in slots", HFILL }
2344*4cc286f3SDominic Spill 		},
2345*4cc286f3SDominic Spill 		{ &hf_lmp_encdata,
2346*4cc286f3SDominic Spill 			{ "Encapsulated Data", "btlmp.encdata",
2347*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2348*4cc286f3SDominic Spill 			NULL, HFILL }
2349*4cc286f3SDominic Spill 		},
2350*4cc286f3SDominic Spill 		{ &hf_lmp_enclen,
2351*4cc286f3SDominic Spill 			{ "Encapsulated Length", "btlmp.enclen",
2352*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2353*4cc286f3SDominic Spill 			NULL, HFILL }
2354*4cc286f3SDominic Spill 		},
2355*4cc286f3SDominic Spill 		{ &hf_lmp_encmaj,
2356*4cc286f3SDominic Spill 			{ "Encapsulated Major Type", "btlmp.encmaj",
2357*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2358*4cc286f3SDominic Spill 			NULL, HFILL }
2359*4cc286f3SDominic Spill 		},
2360*4cc286f3SDominic Spill 		{ &hf_lmp_encmin,
2361*4cc286f3SDominic Spill 			{ "Encapsulated Minor Type", "btlmp.encmin",
2362*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2363*4cc286f3SDominic Spill 			NULL, HFILL }
2364*4cc286f3SDominic Spill 		},
2365*4cc286f3SDominic Spill 		{ &hf_lmp_eop,
2366*4cc286f3SDominic Spill 			{ "Extended Opcode", "btlmp.eop",
2367*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(ext_opcode), 0x0,
2368*4cc286f3SDominic Spill 			NULL, HFILL }
2369*4cc286f3SDominic Spill 		},
2370*4cc286f3SDominic Spill 		{ &hf_lmp_eopinre,
2371*4cc286f3SDominic Spill 			{ "In Response To", "btlmp.eopinre",
2372*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(ext_opcode), 0x0,
2373*4cc286f3SDominic Spill 			"Extended Opcode this is in response to", HFILL }
2374*4cc286f3SDominic Spill 		},
2375*4cc286f3SDominic Spill 		{ &hf_lmp_escolenms,
2376*4cc286f3SDominic Spill 			{ "Packet Length M -> S", "btlmp.escolenms",
2377*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2378*4cc286f3SDominic Spill 			"Packet Length in bytes Master to Slave", HFILL }
2379*4cc286f3SDominic Spill 		},
2380*4cc286f3SDominic Spill 		{ &hf_lmp_escolensm,
2381*4cc286f3SDominic Spill 			{ "Packet Length S -> M", "btlmp.escolensm",
2382*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2383*4cc286f3SDominic Spill 			"Packet Length in bytes Slave to Master", HFILL }
2384*4cc286f3SDominic Spill 		},
2385*4cc286f3SDominic Spill 		{ &hf_lmp_escotypems,
2386*4cc286f3SDominic Spill 			{ "eSCO Packet Type M -> S", "btlmp.escotypems",
2387*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(esco_packet_type), 0x0,
2388*4cc286f3SDominic Spill 			"eSCO Packet Type Master to Slave", HFILL }
2389*4cc286f3SDominic Spill 		},
2390*4cc286f3SDominic Spill 		{ &hf_lmp_escotypesm,
2391*4cc286f3SDominic Spill 			{ "eSCO Packet Type S -> M", "btlmp.escotypesm",
2392*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(esco_packet_type), 0x0,
2393*4cc286f3SDominic Spill 			"eSCO Packet Type Slave to Master", HFILL }
2394*4cc286f3SDominic Spill 		},
2395*4cc286f3SDominic Spill 		{ &hf_lmp_err,
2396*4cc286f3SDominic Spill 			{ "Error Code", "btlmp.err",
2397*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(error_code), 0x0,
2398*4cc286f3SDominic Spill 			NULL, HFILL }
2399*4cc286f3SDominic Spill 		},
2400*4cc286f3SDominic Spill 		{ &hf_lmp_escohdl,
2401*4cc286f3SDominic Spill 			{ "eSCO Handle", "btlmp.escohdl",
2402*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2403*4cc286f3SDominic Spill 			NULL, HFILL }
2404*4cc286f3SDominic Spill 		},
2405*4cc286f3SDominic Spill 		{ &hf_lmp_escoltaddr,
2406*4cc286f3SDominic Spill 			{ "eSCO LT_ADDR", "btlmp.escoltaddr",
2407*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2408*4cc286f3SDominic Spill 			"eSCO Logical Transport Address", HFILL }
2409*4cc286f3SDominic Spill 		},
2410*4cc286f3SDominic Spill 		{ &hf_lmp_features,
2411*4cc286f3SDominic Spill 			{ "Features", "btlmp.features",
2412*4cc286f3SDominic Spill 			/* could break out individual features but long */
2413*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2414*4cc286f3SDominic Spill 			"Feature Mask", HFILL }
2415*4cc286f3SDominic Spill 		},
2416*4cc286f3SDominic Spill 		{ &hf_lmp_fpage,
2417*4cc286f3SDominic Spill 			{ "Features Page", "btlmp.fpage",
2418*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(features_page), 0x0,
2419*4cc286f3SDominic Spill 			NULL, HFILL }
2420*4cc286f3SDominic Spill 		},
2421*4cc286f3SDominic Spill 		{ &hf_lmp_htime,
2422*4cc286f3SDominic Spill 			{ "Hold Time", "btlmp.htime",
2423*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2424*4cc286f3SDominic Spill 			"Hold Time in slots", HFILL }
2425*4cc286f3SDominic Spill 		},
2426*4cc286f3SDominic Spill 		{ &hf_lmp_hinst,
2427*4cc286f3SDominic Spill 			{ "Hold Instant", "btlmp.hinst",
2428*4cc286f3SDominic Spill 			FT_UINT32, BASE_HEX, NULL, 0x0,
2429*4cc286f3SDominic Spill 			"Hold Instant (slot)", HFILL }
2430*4cc286f3SDominic Spill 		},
2431*4cc286f3SDominic Spill 		{ &hf_lmp_hopmode,
2432*4cc286f3SDominic Spill 			{ "Hopping Mode", "btlmp.hopmode",
2433*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(hopping_mode), 0x0,
2434*4cc286f3SDominic Spill 			NULL, HFILL }
2435*4cc286f3SDominic Spill 		},
2436*4cc286f3SDominic Spill 		{ &hf_lmp_iocaps,
2437*4cc286f3SDominic Spill 			{ "IO Capabilities", "btlmp.iocaps",
2438*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(io_capabilities), 0x0,
2439*4cc286f3SDominic Spill 			"Input/Output Capabilities", HFILL }
2440*4cc286f3SDominic Spill 		},
2441*4cc286f3SDominic Spill 		{ &hf_lmp_jitter,
2442*4cc286f3SDominic Spill 			{ "Jitter", "btlmp.jitter",
2443*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2444*4cc286f3SDominic Spill 			"Jitter in microseconds", HFILL }
2445*4cc286f3SDominic Spill 		},
2446*4cc286f3SDominic Spill 		{ &hf_lmp_key,
2447*4cc286f3SDominic Spill 			{ "Key", "btlmp.key",
2448*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2449*4cc286f3SDominic Spill 			NULL, HFILL }
2450*4cc286f3SDominic Spill 		},
2451*4cc286f3SDominic Spill 		{ &hf_lmp_keysz,
2452*4cc286f3SDominic Spill 			{ "Key Size", "btlmp.keysz",
2453*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2454*4cc286f3SDominic Spill 			"Key Size in bytes", HFILL }
2455*4cc286f3SDominic Spill 		},
2456*4cc286f3SDominic Spill 		{ &hf_lmp_ksmask,
2457*4cc286f3SDominic Spill 			{ "Key Size Mask", "btlmp.ksmask",
2458*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2459*4cc286f3SDominic Spill 			NULL, HFILL }
2460*4cc286f3SDominic Spill 		},
2461*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr1,
2462*4cc286f3SDominic Spill 			{ "LT_ADDR 1", "btlmp.ltaddr",
2463*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0f,
2464*4cc286f3SDominic Spill 			"Logical Transport Address 1", HFILL }
2465*4cc286f3SDominic Spill 		},
2466*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr2,
2467*4cc286f3SDominic Spill 			{ "LT_ADDR 2", "btlmp.ltaddr",
2468*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0xf0,
2469*4cc286f3SDominic Spill 			"Logical Transport Address 2", HFILL }
2470*4cc286f3SDominic Spill 		},
2471*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr3,
2472*4cc286f3SDominic Spill 			{ "LT_ADDR 3", "btlmp.ltaddr",
2473*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0f,
2474*4cc286f3SDominic Spill 			"Logical Transport Address 3", HFILL }
2475*4cc286f3SDominic Spill 		},
2476*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr4,
2477*4cc286f3SDominic Spill 			{ "LT_ADDR 4", "btlmp.ltaddr",
2478*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0xf0,
2479*4cc286f3SDominic Spill 			"Logical Transport Address 4", HFILL }
2480*4cc286f3SDominic Spill 		},
2481*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr5,
2482*4cc286f3SDominic Spill 			{ "LT_ADDR 5", "btlmp.ltaddr",
2483*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0f,
2484*4cc286f3SDominic Spill 			"Logical Transport Address 5", HFILL }
2485*4cc286f3SDominic Spill 		},
2486*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr6,
2487*4cc286f3SDominic Spill 			{ "LT_ADDR 6", "btlmp.ltaddr",
2488*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0xf0,
2489*4cc286f3SDominic Spill 			"Logical Transport Address 6", HFILL }
2490*4cc286f3SDominic Spill 		},
2491*4cc286f3SDominic Spill 		{ &hf_lmp_ltaddr7,
2492*4cc286f3SDominic Spill 			{ "LT_ADDR 7", "btlmp.ltaddr",
2493*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0f,
2494*4cc286f3SDominic Spill 			"Logical Transport Address 7", HFILL }
2495*4cc286f3SDominic Spill 		},
2496*4cc286f3SDominic Spill 		{ &hf_lmp_maccess,
2497*4cc286f3SDominic Spill 			{ "Maccess", "btlmp.maccess",
2498*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0f,
2499*4cc286f3SDominic Spill 			"Number of access windows", HFILL }
2500*4cc286f3SDominic Spill 		},
2501*4cc286f3SDominic Spill 		{ &hf_lmp_maxslots,
2502*4cc286f3SDominic Spill 			{ "Max Slots", "btlmp.maxslots",
2503*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2504*4cc286f3SDominic Spill 			NULL, HFILL }
2505*4cc286f3SDominic Spill 		},
2506*4cc286f3SDominic Spill 		{ &hf_lmp_maxsp,
2507*4cc286f3SDominic Spill 			{ "Max Supported Page", "btlmp.maxsp",
2508*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2509*4cc286f3SDominic Spill 			"Highest extended features page with non-zero bit", HFILL }
2510*4cc286f3SDominic Spill 		},
2511*4cc286f3SDominic Spill 		{ &hf_lmp_maxss,
2512*4cc286f3SDominic Spill 			{ "Max Sniff Subrate", "btlmp.maxss",
2513*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2514*4cc286f3SDominic Spill 			NULL, HFILL }
2515*4cc286f3SDominic Spill 		},
2516*4cc286f3SDominic Spill 		{ &hf_lmp_minsmt,
2517*4cc286f3SDominic Spill 			{ "Min Sniff Mode Timeout", "btlmp.minsmt",
2518*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2519*4cc286f3SDominic Spill 			"Min Sniff Mode Timeout in slots", HFILL }
2520*4cc286f3SDominic Spill 		},
2521*4cc286f3SDominic Spill 		{ &hf_lmp_naccslots,
2522*4cc286f3SDominic Spill 			{ "Nacc-slots", "btlmp.naccslots",
2523*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2524*4cc286f3SDominic Spill 			NULL, HFILL }
2525*4cc286f3SDominic Spill 		},
2526*4cc286f3SDominic Spill 		{ &hf_lmp_namefrag,
2527*4cc286f3SDominic Spill 			{ "Name Fragment", "btlmp.namefrag",
2528*4cc286f3SDominic Spill 			FT_STRING, BASE_NONE, NULL, 0x0,
2529*4cc286f3SDominic Spill 			NULL, HFILL }
2530*4cc286f3SDominic Spill 		},
2531*4cc286f3SDominic Spill 		{ &hf_lmp_namelen,
2532*4cc286f3SDominic Spill 			{ "Name Length", "btlmp.namelen",
2533*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2534*4cc286f3SDominic Spill 			"Name Length in bytes", HFILL }
2535*4cc286f3SDominic Spill 		},
2536*4cc286f3SDominic Spill 		{ &hf_lmp_nameoffset,
2537*4cc286f3SDominic Spill 			{ "Name Offset", "btlmp.nameoffset",
2538*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2539*4cc286f3SDominic Spill 			"Name Offset in bytes", HFILL }
2540*4cc286f3SDominic Spill 		},
2541*4cc286f3SDominic Spill 		{ &hf_lmp_nb,
2542*4cc286f3SDominic Spill 			{ "Nb", "btlmp.nb",
2543*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2544*4cc286f3SDominic Spill 			NULL, HFILL }
2545*4cc286f3SDominic Spill 		},
2546*4cc286f3SDominic Spill 		{ &hf_lmp_nbc,
2547*4cc286f3SDominic Spill 			{ "Nbc", "btlmp.nbc",
2548*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2549*4cc286f3SDominic Spill 			NULL, HFILL }
2550*4cc286f3SDominic Spill 		},
2551*4cc286f3SDominic Spill 		{ &hf_lmp_nbsleep,
2552*4cc286f3SDominic Spill 			{ "Nbsleep", "btlmp.nbsleep",
2553*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2554*4cc286f3SDominic Spill 			NULL, HFILL }
2555*4cc286f3SDominic Spill 		},
2556*4cc286f3SDominic Spill 		{ &hf_lmp_negstate,
2557*4cc286f3SDominic Spill 			{ "Negotiation State", "btlmp.negstate",
2558*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(negotiation_state), 0x0,
2559*4cc286f3SDominic Spill 			NULL, HFILL }
2560*4cc286f3SDominic Spill 		},
2561*4cc286f3SDominic Spill 		{ &hf_lmp_nonce,
2562*4cc286f3SDominic Spill 			{ "Nonce Value", "btlmp.nonce",
2563*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2564*4cc286f3SDominic Spill 			NULL, HFILL }
2565*4cc286f3SDominic Spill 		},
2566*4cc286f3SDominic Spill 		{ &hf_lmp_nottype,
2567*4cc286f3SDominic Spill 			{ "Notification Type", "btlmp.nottype",
2568*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(notification_value), 0x0,
2569*4cc286f3SDominic Spill 			NULL, HFILL }
2570*4cc286f3SDominic Spill 		},
2571*4cc286f3SDominic Spill 		{ &hf_lmp_npoll,
2572*4cc286f3SDominic Spill 			{ "Npoll", "btlmp.npoll",
2573*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2574*4cc286f3SDominic Spill 			NULL, HFILL }
2575*4cc286f3SDominic Spill 		},
2576*4cc286f3SDominic Spill 		{ &hf_lmp_oobauthdata,
2577*4cc286f3SDominic Spill 			{ "OOB Authentication Data", "btlmp.oobauthdata",
2578*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(oob_auth_data), 0xfe,
2579*4cc286f3SDominic Spill 			NULL, HFILL }
2580*4cc286f3SDominic Spill 		},
2581*4cc286f3SDominic Spill 		{ &hf_lmp_op,
2582*4cc286f3SDominic Spill 			{ "Opcode", "btlmp.op",
2583*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(opcode), 0xfe,
2584*4cc286f3SDominic Spill 			NULL, HFILL }
2585*4cc286f3SDominic Spill 		},
2586*4cc286f3SDominic Spill 		{ &hf_lmp_opinre,
2587*4cc286f3SDominic Spill 			{ "In Response To", "btlmp.opinre",
2588*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(opcode), 0x7f,
2589*4cc286f3SDominic Spill 			"Opcode this is in response to", HFILL }
2590*4cc286f3SDominic Spill 		},
2591*4cc286f3SDominic Spill 		{ &hf_lmp_pagesch,
2592*4cc286f3SDominic Spill 			{ "Paging Scheme", "btlmp.pagesch",
2593*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(paging_scheme), 0x0,
2594*4cc286f3SDominic Spill 			NULL, HFILL }
2595*4cc286f3SDominic Spill 		},
2596*4cc286f3SDominic Spill 		{ &hf_lmp_pcmode,
2597*4cc286f3SDominic Spill 			{ "Power Control Mode", "btlmp.pcmode",
2598*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(power_control_mode), 0x0,
2599*4cc286f3SDominic Spill 			NULL, HFILL }
2600*4cc286f3SDominic Spill 		},
2601*4cc286f3SDominic Spill 		{ &hf_lmp_pkttype,
2602*4cc286f3SDominic Spill 			{ "Packet Type", "btlmp.pkttype",
2603*4cc286f3SDominic Spill 			/* FIXME break out further */
2604*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2605*4cc286f3SDominic Spill 			"Packet Type", HFILL }
2606*4cc286f3SDominic Spill 		},
2607*4cc286f3SDominic Spill 		{ &hf_lmp_pkttypetbl,
2608*4cc286f3SDominic Spill 			{ "Packet Type Table", "btlmp.pkttypetbl",
2609*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(packet_type_table), 0x0,
2610*4cc286f3SDominic Spill 			NULL, HFILL }
2611*4cc286f3SDominic Spill 		},
2612*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr,
2613*4cc286f3SDominic Spill 			{ "PM_ADDR", "btlmp.pmaddr",
2614*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2615*4cc286f3SDominic Spill 			NULL, HFILL }
2616*4cc286f3SDominic Spill 		},
2617*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr1,
2618*4cc286f3SDominic Spill 			{ "PM_ADDR 1", "btlmp.pmaddr1",
2619*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2620*4cc286f3SDominic Spill 			NULL, HFILL }
2621*4cc286f3SDominic Spill 		},
2622*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr2,
2623*4cc286f3SDominic Spill 			{ "PM_ADDR 2", "btlmp.pmaddr2",
2624*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2625*4cc286f3SDominic Spill 			NULL, HFILL }
2626*4cc286f3SDominic Spill 		},
2627*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr3,
2628*4cc286f3SDominic Spill 			{ "PM_ADDR 3", "btlmp.pmaddr3",
2629*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2630*4cc286f3SDominic Spill 			NULL, HFILL }
2631*4cc286f3SDominic Spill 		},
2632*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr4,
2633*4cc286f3SDominic Spill 			{ "PM_ADDR 4", "btlmp.pmaddr4",
2634*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2635*4cc286f3SDominic Spill 			NULL, HFILL }
2636*4cc286f3SDominic Spill 		},
2637*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr5,
2638*4cc286f3SDominic Spill 			{ "PM_ADDR 5", "btlmp.pmaddr5",
2639*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2640*4cc286f3SDominic Spill 			NULL, HFILL }
2641*4cc286f3SDominic Spill 		},
2642*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr6,
2643*4cc286f3SDominic Spill 			{ "PM_ADDR 6", "btlmp.pmaddr6",
2644*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2645*4cc286f3SDominic Spill 			NULL, HFILL }
2646*4cc286f3SDominic Spill 		},
2647*4cc286f3SDominic Spill 		{ &hf_lmp_pmaddr7,
2648*4cc286f3SDominic Spill 			{ "PM_ADDR 7", "btlmp.pmaddr7",
2649*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2650*4cc286f3SDominic Spill 			NULL, HFILL }
2651*4cc286f3SDominic Spill 		},
2652*4cc286f3SDominic Spill 		{ &hf_lmp_pollintvl,
2653*4cc286f3SDominic Spill 			{ "Poll Interval", "btlmp.pollintvl",
2654*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2655*4cc286f3SDominic Spill 			"Poll Interval in slots", HFILL }
2656*4cc286f3SDominic Spill 		},
2657*4cc286f3SDominic Spill 		{ &hf_lmp_pollper,
2658*4cc286f3SDominic Spill 			{ "Poll Period", "btlmp.pollper",
2659*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2660*4cc286f3SDominic Spill 			"Poll Period in units of 1.25 ms", HFILL }
2661*4cc286f3SDominic Spill 		},
2662*4cc286f3SDominic Spill 		{ &hf_lmp_pssettings,
2663*4cc286f3SDominic Spill 			{ "Paging Scheme Settings", "btlmp.pssettings",
2664*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(paging_scheme_settings), 0x0,
2665*4cc286f3SDominic Spill 			NULL, HFILL }
2666*4cc286f3SDominic Spill 		},
2667*4cc286f3SDominic Spill 		{ &hf_lmp_pwradjreq,
2668*4cc286f3SDominic Spill 			{ "Power Adjustment Request", "btlmp.pwradjreq",
2669*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(power_adjust_req), 0x0,
2670*4cc286f3SDominic Spill 			NULL, HFILL }
2671*4cc286f3SDominic Spill 		},
2672*4cc286f3SDominic Spill 		{ &hf_lmp_pwradjres,
2673*4cc286f3SDominic Spill 			{ "Power Adjustment Response", "btlmp.pwradjres",
2674*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2675*4cc286f3SDominic Spill 			NULL, HFILL }
2676*4cc286f3SDominic Spill 		},
2677*4cc286f3SDominic Spill 		{ &hf_lmp_pwradj_8dpsk,
2678*4cc286f3SDominic Spill 			{ "8DPSK", "btlmp.pwradj_8dpsk",
2679*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x30,
2680*4cc286f3SDominic Spill 			"8DPSK Power Adjustment Response", HFILL }
2681*4cc286f3SDominic Spill 		},
2682*4cc286f3SDominic Spill 		{ &hf_lmp_pwradj_dqpsk,
2683*4cc286f3SDominic Spill 			{ "DQPSK", "btlmp.pwradj_dqpsk",
2684*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x0C,
2685*4cc286f3SDominic Spill 			"DQPSK Power Adjustment Response", HFILL }
2686*4cc286f3SDominic Spill 		},
2687*4cc286f3SDominic Spill 		{ &hf_lmp_pwradj_gfsk,
2688*4cc286f3SDominic Spill 			{ "GFSK", "btlmp.pwradj_gfsk",
2689*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(power_adjust_res), 0x03,
2690*4cc286f3SDominic Spill 			"GFSK Power Adjustment Response", HFILL }
2691*4cc286f3SDominic Spill 		},
2692*4cc286f3SDominic Spill 		{ &hf_lmp_rand,
2693*4cc286f3SDominic Spill 			{ "Random Number", "btlmp.rand",
2694*4cc286f3SDominic Spill 			FT_BYTES, BASE_NONE, NULL, 0x0,
2695*4cc286f3SDominic Spill 			NULL, HFILL }
2696*4cc286f3SDominic Spill 		},
2697*4cc286f3SDominic Spill 		{ &hf_lmp_rate,
2698*4cc286f3SDominic Spill 			{ "Data Rate", "btlmp.rate",
2699*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2700*4cc286f3SDominic Spill 			NULL, HFILL }
2701*4cc286f3SDominic Spill 		},
2702*4cc286f3SDominic Spill 		{ &hf_lmp_rate_fec,
2703*4cc286f3SDominic Spill 			{ "FEC", "btlmp.rate.fec",
2704*4cc286f3SDominic Spill 			FT_BOOLEAN, BASE_DEC, TFS(&fec), 0x01,
2705*4cc286f3SDominic Spill 			"Forward Error Correction", HFILL }
2706*4cc286f3SDominic Spill 		},
2707*4cc286f3SDominic Spill 		{ &hf_lmp_rate_size,
2708*4cc286f3SDominic Spill 			{ "Packet Size", "btlmp.rate.size",
2709*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(packet_size), 0x06,
2710*4cc286f3SDominic Spill 			"Basic Rate Packet Size", HFILL }
2711*4cc286f3SDominic Spill 		},
2712*4cc286f3SDominic Spill 		{ &hf_lmp_rate_type,
2713*4cc286f3SDominic Spill 			{ "EDR Type", "btlmp.rate.type",
2714*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(edr_type), 0x18,
2715*4cc286f3SDominic Spill 			"Enhanced Data Rate type", HFILL }
2716*4cc286f3SDominic Spill 		},
2717*4cc286f3SDominic Spill 		{ &hf_lmp_rate_edrsize,
2718*4cc286f3SDominic Spill 			{ "EDR Size", "btlmp.rate.edrsize",
2719*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, VALS(packet_size), 0x60,
2720*4cc286f3SDominic Spill 			"Enhanced Data Rate packet size", HFILL }
2721*4cc286f3SDominic Spill 		},
2722*4cc286f3SDominic Spill 		{ &hf_lmp_rxfreq,
2723*4cc286f3SDominic Spill 			{ "RX Frequency", "btlmp.rxfreq",
2724*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2725*4cc286f3SDominic Spill 			"Receive Frequency in MHz above 2402", HFILL }
2726*4cc286f3SDominic Spill 		},
2727*4cc286f3SDominic Spill 		{ &hf_lmp_scohdl,
2728*4cc286f3SDominic Spill 			{ "SCO Handle", "btlmp.scohdl",
2729*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2730*4cc286f3SDominic Spill 			NULL, HFILL }
2731*4cc286f3SDominic Spill 		},
2732*4cc286f3SDominic Spill 		{ &hf_lmp_scopkt,
2733*4cc286f3SDominic Spill 			{ "SCO Packet", "btlmp.scopkt",
2734*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(sco_packet), 0x0,
2735*4cc286f3SDominic Spill 			NULL, HFILL }
2736*4cc286f3SDominic Spill 		},
2737*4cc286f3SDominic Spill 		{ &hf_lmp_slotoffset,
2738*4cc286f3SDominic Spill 			{ "Slot Offset", "btlmp.slotoffset",
2739*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2740*4cc286f3SDominic Spill 			"Slot Offset in microseconds", HFILL }
2741*4cc286f3SDominic Spill 		},
2742*4cc286f3SDominic Spill 		{ &hf_lmp_sniffatt,
2743*4cc286f3SDominic Spill 			{ "Sniff Attempt", "btlmp.sniffatt",
2744*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2745*4cc286f3SDominic Spill 			"Number of receive slots", HFILL }
2746*4cc286f3SDominic Spill 		},
2747*4cc286f3SDominic Spill 		{ &hf_lmp_sniffsi,
2748*4cc286f3SDominic Spill 			{ "Sniff Subrating Instant", "btlmp.sniffsi",
2749*4cc286f3SDominic Spill 			FT_UINT32, BASE_HEX, NULL, 0x0,
2750*4cc286f3SDominic Spill 			"Sniff Subrating Instant (slot)", HFILL }
2751*4cc286f3SDominic Spill 		},
2752*4cc286f3SDominic Spill 		{ &hf_lmp_sniffto,
2753*4cc286f3SDominic Spill 			{ "Sniff Timeout", "btlmp.sniffto",
2754*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2755*4cc286f3SDominic Spill 			"Number of receive slots", HFILL }
2756*4cc286f3SDominic Spill 		},
2757*4cc286f3SDominic Spill 		{ &hf_lmp_subversnr,
2758*4cc286f3SDominic Spill 			{ "SubVersNr", "btlmp.subversnr",
2759*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2760*4cc286f3SDominic Spill 			"SubVersion", HFILL }
2761*4cc286f3SDominic Spill 		},
2762*4cc286f3SDominic Spill 		{ &hf_lmp_suptimeout,
2763*4cc286f3SDominic Spill 			{ "Supervision Timeout", "btlmp.suptimeout",
2764*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2765*4cc286f3SDominic Spill 			"Supervision Timeout in slots", HFILL }
2766*4cc286f3SDominic Spill 		},
2767*4cc286f3SDominic Spill 		{ &hf_lmp_swinst,
2768*4cc286f3SDominic Spill 			{ "Switch Instant", "btlmp.swinst",
2769*4cc286f3SDominic Spill 			FT_UINT32, BASE_HEX, NULL, 0x0,
2770*4cc286f3SDominic Spill 			"Switch Instant (slot)", HFILL }
2771*4cc286f3SDominic Spill 		},
2772*4cc286f3SDominic Spill 		{ &hf_lmp_taccess,
2773*4cc286f3SDominic Spill 			{ "Taccess", "btlmp.taccess",
2774*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2775*4cc286f3SDominic Spill 			"Taccess in slots", HFILL }
2776*4cc286f3SDominic Spill 		},
2777*4cc286f3SDominic Spill 		{ &hf_lmp_tb,
2778*4cc286f3SDominic Spill 			{ "Tb", "btlmp.tb",
2779*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2780*4cc286f3SDominic Spill 			"Tb in slots", HFILL }
2781*4cc286f3SDominic Spill 		},
2782*4cc286f3SDominic Spill 		{ &hf_lmp_tesco,
2783*4cc286f3SDominic Spill 			{ "Tesco", "btlmp.tesco",
2784*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2785*4cc286f3SDominic Spill 			"Tesco in slots", HFILL }
2786*4cc286f3SDominic Spill 		},
2787*4cc286f3SDominic Spill 		{ &hf_lmp_testlen,
2788*4cc286f3SDominic Spill 			{ "Test Length", "btlmp.testlen",
2789*4cc286f3SDominic Spill 			FT_UINT16, BASE_DEC, NULL, 0x0,
2790*4cc286f3SDominic Spill 			"Length of test sequence in bytes", HFILL }
2791*4cc286f3SDominic Spill 		},
2792*4cc286f3SDominic Spill 		{ &hf_lmp_testscen,
2793*4cc286f3SDominic Spill 			{ "Test Scenario", "btlmp.testscen",
2794*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(test_scenario), 0x0,
2795*4cc286f3SDominic Spill 			NULL, HFILL }
2796*4cc286f3SDominic Spill 		},
2797*4cc286f3SDominic Spill 		{ &hf_lmp_tid,
2798*4cc286f3SDominic Spill 			{ "TID", "btlmp.tid",
2799*4cc286f3SDominic Spill 			FT_BOOLEAN, BASE_DEC, TFS(&tid), 0x01,
2800*4cc286f3SDominic Spill 			"Transaction ID", HFILL }
2801*4cc286f3SDominic Spill 		},
2802*4cc286f3SDominic Spill 		{ &hf_lmp_timectrl,
2803*4cc286f3SDominic Spill 			{ "Timing Control Flags", "btlmp.timectrl",
2804*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2805*4cc286f3SDominic Spill 			NULL, HFILL }
2806*4cc286f3SDominic Spill 		},
2807*4cc286f3SDominic Spill 		{ &hf_lmp_time_change,
2808*4cc286f3SDominic Spill 			{ "Timing Change", "btlmp.time.change",
2809*4cc286f3SDominic Spill 			FT_BOOLEAN, 8, TFS(&time_change), 0x01,
2810*4cc286f3SDominic Spill 			NULL, HFILL }
2811*4cc286f3SDominic Spill 		},
2812*4cc286f3SDominic Spill 		{ &hf_lmp_time_init,
2813*4cc286f3SDominic Spill 			{ "Initialization", "btlmp.time.init",
2814*4cc286f3SDominic Spill 			FT_BOOLEAN, 8, TFS(&time_init), 0x02,
2815*4cc286f3SDominic Spill 			NULL, HFILL }
2816*4cc286f3SDominic Spill 		},
2817*4cc286f3SDominic Spill 		{ &hf_lmp_time_accwin,
2818*4cc286f3SDominic Spill 			{ "Access Window", "btlmp.time.accwin",
2819*4cc286f3SDominic Spill 			FT_BOOLEAN, 8, TFS(&time_accwin), 0x04,
2820*4cc286f3SDominic Spill 			NULL, HFILL }
2821*4cc286f3SDominic Spill 		},
2822*4cc286f3SDominic Spill 		{ &hf_lmp_tsco,
2823*4cc286f3SDominic Spill 			{ "Tsco", "btlmp.tsco",
2824*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2825*4cc286f3SDominic Spill 			"Tsco in slots", HFILL }
2826*4cc286f3SDominic Spill 		},
2827*4cc286f3SDominic Spill 		{ &hf_lmp_tsniff,
2828*4cc286f3SDominic Spill 			{ "Tsniff", "btlmp.tsniff",
2829*4cc286f3SDominic Spill 			FT_UINT16, BASE_HEX, NULL, 0x0,
2830*4cc286f3SDominic Spill 			"Tsniff in slots", HFILL }
2831*4cc286f3SDominic Spill 		},
2832*4cc286f3SDominic Spill 		{ &hf_lmp_txfreq,
2833*4cc286f3SDominic Spill 			{ "TX Frequency", "btlmp.txfreq",
2834*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, NULL, 0x0,
2835*4cc286f3SDominic Spill 			"Transmit Frequency in MHz above 2402", HFILL }
2836*4cc286f3SDominic Spill 		},
2837*4cc286f3SDominic Spill 		{ &hf_lmp_versnr,
2838*4cc286f3SDominic Spill 			{ "VersNr", "btlmp.versnr",
2839*4cc286f3SDominic Spill 			FT_UINT8, BASE_DEC, VALS(versnr), 0x0,
2840*4cc286f3SDominic Spill 			"Version", HFILL }
2841*4cc286f3SDominic Spill 		},
2842*4cc286f3SDominic Spill 		{ &hf_lmp_wesco,
2843*4cc286f3SDominic Spill 			{ "Wesco", "btlmp.wesco",
2844*4cc286f3SDominic Spill 			FT_UINT8, BASE_HEX, NULL, 0x0,
2845*4cc286f3SDominic Spill 			"Number of slots in retransmission window", HFILL }
2846*4cc286f3SDominic Spill 		},
2847*4cc286f3SDominic Spill 	};
2848*4cc286f3SDominic Spill 
2849*4cc286f3SDominic Spill 	/* protocol subtree arrays */
2850*4cc286f3SDominic Spill 	static gint *ett[] = {
2851*4cc286f3SDominic Spill 		&ett_lmp,
2852*4cc286f3SDominic Spill 		&ett_lmp_pwradjres,
2853*4cc286f3SDominic Spill 		&ett_lmp_rate,
2854*4cc286f3SDominic Spill 		&ett_lmp_timectrl,
2855*4cc286f3SDominic Spill 	};
2856*4cc286f3SDominic Spill 
2857*4cc286f3SDominic Spill 	/* register the protocol name and description */
2858*4cc286f3SDominic Spill 	proto_btlmp = proto_register_protocol(
2859*4cc286f3SDominic Spill 		"Bluetooth Link Manager Protocol",	/* full name */
2860*4cc286f3SDominic Spill 		"btlmp",		/* short name */
2861*4cc286f3SDominic Spill 		"btlmp"			/* abbreviation (e.g. for filters) */
2862*4cc286f3SDominic Spill 		);
2863*4cc286f3SDominic Spill 
2864*4cc286f3SDominic Spill 	register_dissector("btlmp", dissect_btlmp, proto_btlmp);
2865*4cc286f3SDominic Spill 
2866*4cc286f3SDominic Spill 	/* register the header fields and subtrees used */
2867*4cc286f3SDominic Spill 	proto_register_field_array(proto_btlmp, hf, array_length(hf));
2868*4cc286f3SDominic Spill 	proto_register_subtree_array(ett, array_length(ett));
2869*4cc286f3SDominic Spill }
2870*4cc286f3SDominic Spill 
2871*4cc286f3SDominic Spill void
proto_reg_handoff_btlmp(void)2872*4cc286f3SDominic Spill proto_reg_handoff_btlmp(void)
2873*4cc286f3SDominic Spill {
2874*4cc286f3SDominic Spill }
2875*4cc286f3SDominic Spill 
2876*4cc286f3SDominic Spill /*
2877*4cc286f3SDominic Spill  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
2878*4cc286f3SDominic Spill  *
2879*4cc286f3SDominic Spill  * Local variables:
2880*4cc286f3SDominic Spill  * c-basic-offset: 4
2881*4cc286f3SDominic Spill  * tab-width: 8
2882*4cc286f3SDominic Spill  * indent-tabs-mode: nil
2883*4cc286f3SDominic Spill  * End:
2884*4cc286f3SDominic Spill  *
2885*4cc286f3SDominic Spill  * vi: set shiftwidth=4 tabstop=8 expandtab:
2886*4cc286f3SDominic Spill  * :indentSize=4:tabSize=8:noTabs=true:
2887*4cc286f3SDominic Spill  */
2888