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