Starting cleanup in earnest
[obnox/wireshark/wip.git] / epan / dissectors / packet-dect.c
1 /* packet-dect.c
2  *
3  * Dissector for the Digital Enhanced Cordless Telecommunications
4  * protocol.
5  *
6  * $Id$
7  *
8  * Copyright 2008-2009:
9  * - Andreas Schuler <krater (A) badterrorist.com>
10  * - Matthias Wenzel <dect (A) mazzoo.de>
11  *
12  * Wireshark - Network traffic analyzer
13  * By Gerald Combs <gerald@wireshark.org>
14  * Copyright 1998 Gerald Combs
15  *
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29  */
30
31 /*
32  TODO (roughly in that order)
33  - Don't use structs to access the elements in the datastream.
34  - Use tvb_..._item wherever possible
35  - Add references to documentation (ETSI EN 300 175 parts 1-8)
36  - Make things stateful
37  - Once the capture format has stabilized, get rid of the Ethernet
38  hack and use a proper capture type.
39  */
40
41 #ifdef HAVE_CONFIG_H
42 # include "config.h"
43 #endif
44
45 #include <epan/packet.h>
46 #include <epan/etypes.h>
47 #include <string.h>
48
49 #define ETHERTYPE_DECT 0x2323                           /* move to epan/etypes.h */
50
51 #define DECT_PACKET_PP  0
52 #define DECT_PACKET_FP  1
53
54 /* scramble table with corrections by Jakub Hruska */
55 static guint8 scrt[8][31]=
56 {
57         {0x3B, 0xCD, 0x21, 0x5D, 0x88, 0x65, 0xBD, 0x44, 0xEF, 0x34, 0x85, 0x76, 0x21, 0x96, 0xF5, 0x13, 0xBC, 0xD2, 0x15, 0xD8, 0x86, 0x5B, 0xD4, 0x4E, 0xF3, 0x48, 0x57, 0x62, 0x19, 0x6F, 0x51},
58         {0x32, 0xDE, 0xA2, 0x77, 0x9A, 0x42, 0xBB, 0x10, 0xCB, 0x7A, 0x89, 0xDE, 0x69, 0x0A, 0xEC, 0x43, 0x2D, 0xEA, 0x27, 0x79, 0xA4, 0x2B, 0xB1, 0x0C, 0xB7, 0xA8, 0x9D, 0xE6, 0x90, 0xAE, 0xC4},
59         {0x2D, 0xEA, 0x27, 0x79, 0xA4, 0x2B, 0xB1, 0x0C, 0xB7, 0xA8, 0x9D, 0xE6, 0x90, 0xAE, 0xC4, 0x32, 0xDE, 0xA2, 0x77, 0x9A, 0x42, 0xBB, 0x10, 0xCB, 0x7A, 0x89, 0xDE, 0x69, 0x0A, 0xEC, 0x43},
60         {0x27, 0x79, 0xA4, 0x2B, 0xB1, 0x0C, 0xB7, 0xA8, 0x9D, 0xE6, 0x90, 0xAE, 0xC4, 0x32, 0xDE, 0xA2, 0x77, 0x9A, 0x42, 0xBB, 0x10, 0xCB, 0x7A, 0x89, 0xDE, 0x69, 0x0A, 0xEC, 0x43, 0x2D, 0xEA},
61         {0x19, 0x6F, 0x51, 0x3B, 0xCD, 0x21, 0x5D, 0x88, 0x65, 0xBD, 0x44, 0xEF, 0x34, 0x85, 0x76, 0x21, 0x96, 0xF5, 0x13, 0xBC, 0xD2, 0x15, 0xD8, 0x86, 0x5B, 0xD4, 0x4E, 0xF3, 0x48, 0x57, 0x62},
62         {0x13, 0xBC, 0xD2, 0x15, 0xD8, 0x86, 0x5B, 0xD4, 0x4E, 0xF3, 0x48, 0x57, 0x62, 0x19, 0x6F, 0x51, 0x3B, 0xCD, 0x21, 0x5D, 0x88, 0x65, 0xBD, 0x44, 0xEF, 0x34, 0x85, 0x76, 0x21, 0x96, 0xF5},
63         {0x0C, 0xB7, 0xA8, 0x9D, 0xE6, 0x90, 0xAE, 0xC4, 0x32, 0xDE, 0xA2, 0x77, 0x9A, 0x42, 0xBB, 0x10, 0xCB, 0x7A, 0x89, 0xDE, 0x69, 0x0A, 0xEC, 0x43, 0x2D, 0xEA, 0x27, 0x79, 0xA4, 0x2B, 0xB1},
64         {0x79, 0xA4, 0x2B, 0xB1, 0x0C, 0xB7, 0xA8, 0x9D, 0xE6, 0x90, 0xAE, 0xC4, 0x32, 0xDE, 0xA2, 0x77, 0x9A, 0x42, 0xBB, 0x10, 0xCB, 0x7A, 0x89, 0xDE, 0x69, 0x0A, 0xEC, 0x43, 0x2D, 0xEA, 0x27}
65 };
66
67 struct dect_afield
68 {
69         guint8  Header;
70         guint8  Tail[5];
71         guint16 RCRC;
72 };
73
74 struct dect_bfield
75 {
76         guint8  Data[128];
77         guint8  Length;
78 };
79
80 static int proto_dect = -1;
81
82 #if 0
83 static int proto_dect2 = -1;
84 #endif
85
86
87 static gint ett_dect                            = -1;
88 static gint ett_afield                          = -1;
89 static gint ett_ahead                           = -1;
90 static gint ett_atail                           = -1;
91 static gint ett_aqt                             = -1;
92 static gint ett_bfield                          = -1;
93
94 static int hf_dect_transceivermode              = -1;
95 static int hf_dect_preamble                     = -1;
96 static int hf_dect_type                         = -1;
97 static int hf_dect_channel                      = -1;
98 static int hf_dect_framenumber                  = -1;
99 static int hf_dect_rssi                         = -1;
100 static int hf_dect_slot                         = -1;
101 static int hf_dect_A                            = -1;
102 static int hf_dect_A_Head                       = -1;
103 static int hf_dect_A_Head_TA_FP                 = -1;
104 static int hf_dect_A_Head_TA_PP                 = -1;
105 static int hf_dect_A_Head_Q1                    = -1;
106 static int hf_dect_A_Head_BA                    = -1;
107 static int hf_dect_A_Head_Q2                    = -1;
108 static int hf_dect_A_Tail                       = -1;
109 static int hf_dect_A_Tail_Nt                    = -1;
110 static int hf_dect_A_Tail_Qt_Qh                 = -1;
111 static int hf_dect_A_Tail_Qt_0_Sn               = -1;
112 static int hf_dect_A_Tail_Qt_0_Nr               = -1;
113 static int hf_dect_A_Tail_Qt_0_Sp               = -1;
114 static int hf_dect_A_Tail_Qt_0_Esc              = -1;
115 static int hf_dect_A_Tail_Qt_0_Txs              = -1;
116 static int hf_dect_A_Tail_Qt_0_Mc               = -1;
117 static int hf_dect_A_Tail_Qt_0_Spr1             = -1;
118 static int hf_dect_A_Tail_Qt_0_Cn               = -1;
119 static int hf_dect_A_Tail_Qt_0_Spr2             = -1;
120 static int hf_dect_A_Tail_Qt_0_PSCN             = -1;
121 static int hf_dect_A_Tail_Qt_3_A12              = -1;
122 static int hf_dect_A_Tail_Qt_3_A13              = -1;
123 static int hf_dect_A_Tail_Qt_3_A14              = -1;
124 static int hf_dect_A_Tail_Qt_3_A15              = -1;
125 static int hf_dect_A_Tail_Qt_3_A16              = -1;
126 static int hf_dect_A_Tail_Qt_3_A17              = -1;
127 static int hf_dect_A_Tail_Qt_3_A18              = -1;
128 static int hf_dect_A_Tail_Qt_3_A19              = -1;
129 static int hf_dect_A_Tail_Qt_3_A20              = -1;
130 static int hf_dect_A_Tail_Qt_3_A21              = -1;
131 static int hf_dect_A_Tail_Qt_3_A22              = -1;
132 static int hf_dect_A_Tail_Qt_3_A23              = -1;
133 static int hf_dect_A_Tail_Qt_3_A24              = -1;
134 static int hf_dect_A_Tail_Qt_3_A25              = -1;
135 static int hf_dect_A_Tail_Qt_3_A26              = -1;
136 static int hf_dect_A_Tail_Qt_3_A27              = -1;
137 static int hf_dect_A_Tail_Qt_3_A28              = -1;
138 static int hf_dect_A_Tail_Qt_3_A29              = -1;
139 static int hf_dect_A_Tail_Qt_3_A30              = -1;
140 static int hf_dect_A_Tail_Qt_3_A31              = -1;
141 static int hf_dect_A_Tail_Qt_3_A32              = -1;
142 static int hf_dect_A_Tail_Qt_3_A33              = -1;
143 static int hf_dect_A_Tail_Qt_3_A34              = -1;
144 static int hf_dect_A_Tail_Qt_3_A35              = -1;
145 static int hf_dect_A_Tail_Qt_3_A36              = -1;
146 static int hf_dect_A_Tail_Qt_3_A37              = -1;
147 static int hf_dect_A_Tail_Qt_3_A38              = -1;
148 static int hf_dect_A_Tail_Qt_3_A39              = -1;
149 static int hf_dect_A_Tail_Qt_3_A40              = -1;
150 static int hf_dect_A_Tail_Qt_3_A41              = -1;
151 static int hf_dect_A_Tail_Qt_3_A42              = -1;
152 static int hf_dect_A_Tail_Qt_3_A43              = -1;
153 static int hf_dect_A_Tail_Qt_3_A44              = -1;
154 static int hf_dect_A_Tail_Qt_3_A45              = -1;
155 static int hf_dect_A_Tail_Qt_3_A46              = -1;
156 static int hf_dect_A_Tail_Qt_3_A47              = -1;
157 static int hf_dect_A_Tail_Qt_4_CRFPHops         = -1;
158 static int hf_dect_A_Tail_Qt_4_CRFPEnc          = -1;
159 static int hf_dect_A_Tail_Qt_4_REFHops          = -1;
160 static int hf_dect_A_Tail_Qt_4_REPCap           = -1;
161 static int hf_dect_A_Tail_Qt_4_Sync             = -1;
162 static int hf_dect_A_Tail_Qt_4_A20              = -1;
163 static int hf_dect_A_Tail_Qt_4_MACSusp          = -1;
164 static int hf_dect_A_Tail_Qt_4_MACIpq           = -1;
165 static int hf_dect_A_Tail_Qt_4_A23              = -1;
166 static int hf_dect_A_Tail_Qt_4_A24              = -1;
167 static int hf_dect_A_Tail_Qt_4_A25              = -1;
168 static int hf_dect_A_Tail_Qt_4_A26              = -1;
169 static int hf_dect_A_Tail_Qt_4_A27              = -1;
170 static int hf_dect_A_Tail_Qt_4_A28              = -1;
171 static int hf_dect_A_Tail_Qt_4_A29              = -1;
172 static int hf_dect_A_Tail_Qt_4_A30              = -1;
173 static int hf_dect_A_Tail_Qt_4_A31              = -1;
174 static int hf_dect_A_Tail_Qt_4_A32              = -1;
175 static int hf_dect_A_Tail_Qt_4_A33              = -1;
176 static int hf_dect_A_Tail_Qt_4_A34              = -1;
177 static int hf_dect_A_Tail_Qt_4_A35              = -1;
178 static int hf_dect_A_Tail_Qt_4_A36              = -1;
179 static int hf_dect_A_Tail_Qt_4_A37              = -1;
180 static int hf_dect_A_Tail_Qt_4_A38              = -1;
181 static int hf_dect_A_Tail_Qt_4_A39              = -1;
182 static int hf_dect_A_Tail_Qt_4_A40              = -1;
183 static int hf_dect_A_Tail_Qt_4_A41              = -1;
184 static int hf_dect_A_Tail_Qt_4_A42              = -1;
185 static int hf_dect_A_Tail_Qt_4_A43              = -1;
186 static int hf_dect_A_Tail_Qt_4_A44              = -1;
187 static int hf_dect_A_Tail_Qt_4_A45              = -1;
188 static int hf_dect_A_Tail_Qt_4_A46              = -1;
189 static int hf_dect_A_Tail_Qt_4_A47              = -1;
190 static int hf_dect_A_Tail_Qt_6_Spare            = -1;
191 static int hf_dect_A_Tail_Qt_6_Mfn              = -1;
192 static int hf_dect_A_Tail_Mt_Mh                 = -1;
193 static int hf_dect_A_Tail_Mt_Mh_fmid            = -1;
194 static int hf_dect_A_Tail_Mt_Mh_pmid            = -1;
195 static int hf_dect_A_Tail_Mt_BasicConCtrl       = -1;
196 static int hf_dect_A_Tail_Mt_Encr_Cmd1          = -1;
197 static int hf_dect_A_Tail_Mt_Encr_Cmd2          = -1;
198 static int hf_dect_A_Tail_Pt_ExtFlag            = -1;
199 static int hf_dect_A_Tail_Pt_SDU                = -1;
200 static int hf_dect_A_Tail_Pt_InfoType           = -1;
201 static int hf_dect_A_Tail_Pt_Fill_Fillbits      = -1;
202 static int hf_dect_A_Tail_Pt_Bearer_Sn          = -1;
203 static int hf_dect_A_Tail_Pt_Bearer_Cn          = -1;
204 static int hf_dect_A_Tail_Pt_Bearer_Sp          = -1;
205 static int hf_dect_A_RCRC                       = -1;
206 static int hf_dect_B                            = -1;
207 static int hf_dect_B_Data                       = -1;
208 static int hf_dect_B_fn                         = -1;
209 static int hf_dect_B_XCRC                       = -1;
210
211 static const value_string tranceiver_mode[]=
212 {
213         {0, "Receive"},
214         {1, "Send"},
215         {0, NULL}
216 };
217
218 static const value_string TA_vals_FP[]=
219 {
220         {0, "Ct Next Data Packet"},
221         {1, "Ct First Data Packet"},
222         {2, "Nt Identities Information on Connectionless Bearer"},
223         {3, "Nt Identities Information"},
224         {4, "Qt Multiframe Synchronisation and System Information"},
225         {5, "Escape"},
226         {6, "Mt MAC Layer Control"},
227         {7, "Pt Paging Tail"},
228         {0, NULL}
229 };
230
231 static const value_string TA_vals_PP[]=
232 {
233         {0, "Ct Next Data Packet"},
234         {1, "Ct First Data Packet"},
235         {2, "Nt Identities Information on Connectionless Bearer"},
236         {3, "Nt Identities Information"},
237         {4, "Qt Multiframe Synchronisation and System Information"},
238         {5, "Escape"},
239         {6, "Mt MAC Layer Control"},
240         {7, "Mt MAC Layer Control,first packet"},
241         {0, NULL}
242 };
243
244 static const value_string BA_vals[]=
245 {
246         {0, "U-Type, In, SIn or Ip Packet No. 0 or No Valid Ip_error_detect Channel Data"},
247         {1, "U-Type, Ip_error_detect or Ip Packet No. 1 or SIn or No Valid In Channel Data"},
248         {2, "Double-Slot Required / E-Type, all Cf or CLf, Packet No. 0"},
249         {3, "E-Type, All Cf, Packet No. 1"},
250         {4, "Half-Slot Required / E-Type, not all Cf or CLf, Cf Packet No. 0"},
251         {5, "E-Type, not all Cf, Cf Packet No. 1"},
252         {6, "E-Type, All MAC control (unnumbered)"},
253         {7, "No B-Field"},
254         {0, NULL}
255 };
256
257 static const value_string QTHead_vals[]=
258 {
259         {0, "Static System Info"},
260         {1, "Static System Info"},
261         {2, "Extended RF Carriers Part 1"},
262         {3, "Fixed Part Capabilities"},
263         {4, "Extended Fixed Part Capabilities"},
264         {5, "SARI List Contents"},
265         {6, "Multi-Frame No."},
266         {7, "Escape"},
267         {8, "Obsolete"},
268         {9, "Extended RF Carriers Part 2"},
269         {10, "Reserved(?)"},
270         {11, "Transmit Information(?)"},
271         {12, "Reserved"},
272         {13, "Reserved"},
273         {14, "Reserved"},
274         {15, "Reserved"},
275         {0, NULL}
276 };
277
278 static const value_string QTNormalReverse_vals[]=
279 {
280         {0, "Normal RFP Transmit Half-Frame"},
281         {1, "Normal PP Transmit Half-Frame"},
282         {0, NULL}
283 };
284
285 static const value_string QTSlotNumber_vals[]=
286 {
287         {0, "Slot Pair 0/12"},
288         {1, "Slot Pair 1/13"},
289         {2, "Slot Pair 2/14"},
290         {3, "Slot Pair 3/15"},
291         {4, "Slot Pair 4/16"},
292         {5, "Slot Pair 5/17"},
293         {6, "Slot Pair 6/18"},
294         {7, "Slot Pair 7/19"},
295         {8, "Slot Pair 8/20"},
296         {9, "Slot Pair 9/21"},
297         {10, "Slot Pair 10/22"},
298         {11, "Slot Pair 11/23"},
299         {12, "Reserved"},
300         {13, "Reserved"},
301         {14, "Reserved"},
302         {15, "Reserved"},
303         {0, NULL}
304 };
305
306 static const value_string QTStartPosition_vals[]=
307 {
308         {0, "S-Field starts at Bit F0"},
309         {1, "Reserved for Future Use"},
310         {2, "S-Field starts at Bit F240"},
311         {3, "Reserved for Future Use"},
312         {0, NULL}
313 };
314
315 static const value_string QTEscape_vals[]=
316 {
317         {0, "No QT Escape is broadcast"},
318         {1, "The QT Escape is broadcast"},
319         {0, NULL}
320 };
321
322 static const value_string QTTranceiver_vals[]=
323 {
324         {0, "RFP has 1 Transceiver"},
325         {1, "RFP has 2 Transceiver"},
326         {2, "RFP has 3 Transceiver"},
327         {3, "RFP has 4 or more Transceiver"},
328         {0, NULL}
329 };
330
331 static const value_string QTExtendedCarrier_vals[]=
332 {
333         {0, "No Extended RF Carrier Information Message"},
334         {1, "Extended RF Carrier Information Message shall be transmitted in the next Multiframe"},
335         {0, NULL}
336 };
337
338 static const value_string QTSpr_vals[]=
339 {
340         {0, "OK"},
341         {1, "Reserved"},
342         {2, "Reserved"},
343         {3, "Reserved"},
344         {0, NULL}
345 };
346
347 static const value_string QTCarrierNumber_vals[]=
348 {
349         {0, "RF Carrier 0"},
350         {1, "RF Carrier 1"},
351         {2, "RF Carrier 2"},
352         {3, "RF Carrier 3"},
353         {4, "RF Carrier 4"},
354         {5, "RF Carrier 5"},
355         {6, "RF Carrier 6"},
356         {7, "RF Carrier 7"},
357         {8, "RF Carrier 8"},
358         {9, "RF Carrier 9"},
359         {10, "RF Carrier 10"},
360         {11, "RF Carrier 11"},
361         {12, "RF Carrier 12"},
362         {13, "RF Carrier 13"},
363         {14, "RF Carrier 14"},
364         {15, "RF Carrier 15"},
365         {16, "RF Carrier 16"},
366         {17, "RF Carrier 17"},
367         {18, "RF Carrier 18"},
368         {19, "RF Carrier 19"},
369         {20, "RF Carrier 20"},
370         {21, "RF Carrier 21"},
371         {22, "RF Carrier 22"},
372         {23, "RF Carrier 23"},
373         {24, "RF Carrier 24"},
374         {25, "RF Carrier 25"},
375         {26, "RF Carrier 26"},
376         {27, "RF Carrier 27"},
377         {28, "RF Carrier 28"},
378         {29, "RF Carrier 29"},
379         {30, "RF Carrier 30"},
380         {31, "RF Carrier 31"},
381         {32, "RF Carrier 32"},
382         {33, "RF Carrier 33"},
383         {34, "RF Carrier 34"},
384         {35, "RF Carrier 35"},
385         {36, "RF Carrier 36"},
386         {37, "RF Carrier 37"},
387         {38, "RF Carrier 38"},
388         {39, "RF Carrier 39"},
389         {40, "RF Carrier 40"},
390         {41, "RF Carrier 41"},
391         {42, "RF Carrier 42"},
392         {43, "RF Carrier 43"},
393         {44, "RF Carrier 44"},
394         {45, "RF Carrier 45"},
395         {46, "RF Carrier 46"},
396         {47, "RF Carrier 47"},
397         {48, "RF Carrier 48"},
398         {49, "RF Carrier 49"},
399         {50, "RF Carrier 50"},
400         {51, "RF Carrier 51"},
401         {52, "RF Carrier 52"},
402         {53, "RF Carrier 53"},
403         {54, "RF Carrier 54"},
404         {55, "RF Carrier 55"},
405         {56, "RF Carrier 56"},
406         {57, "RF Carrier 57"},
407         {58, "RF Carrier 58"},
408         {59, "RF Carrier 59"},
409         {60, "RF Carrier 60"},
410         {61, "RF Carrier 61"},
411         {62, "RF Carrier 62"},
412         {63, "RF Carrier 63"},
413         {0, NULL}
414 };
415
416 static const value_string QTScanCarrierNum_vals[]=
417 {
418         {0, "Primary Scan next on RF Carrier 0"},
419         {1, "Primary Scan next on RF Carrier 1"},
420         {2, "Primary Scan next on RF Carrier 2"},
421         {3, "Primary Scan next on RF Carrier 3"},
422         {4, "Primary Scan next on RF Carrier 4"},
423         {5, "Primary Scan next on RF Carrier 5"},
424         {6, "Primary Scan next on RF Carrier 6"},
425         {7, "Primary Scan next on RF Carrier 7"},
426         {8, "Primary Scan next on RF Carrier 8"},
427         {9, "Primary Scan next on RF Carrier 9"},
428         {10, "Primary Scan next on RF Carrier 10"},
429         {11, "Primary Scan next on RF Carrier 11"},
430         {12, "Primary Scan next on RF Carrier 12"},
431         {13, "Primary Scan next on RF Carrier 13"},
432         {14, "Primary Scan next on RF Carrier 14"},
433         {15, "Primary Scan next on RF Carrier 15"},
434         {16, "Primary Scan next on RF Carrier 16"},
435         {17, "Primary Scan next on RF Carrier 17"},
436         {18, "Primary Scan next on RF Carrier 18"},
437         {19, "Primary Scan next on RF Carrier 19"},
438         {20, "Primary Scan next on RF Carrier 20"},
439         {21, "Primary Scan next on RF Carrier 21"},
440         {22, "Primary Scan next on RF Carrier 22"},
441         {23, "Primary Scan next on RF Carrier 23"},
442         {24, "Primary Scan next on RF Carrier 24"},
443         {25, "Primary Scan next on RF Carrier 25"},
444         {26, "Primary Scan next on RF Carrier 26"},
445         {27, "Primary Scan next on RF Carrier 27"},
446         {28, "Primary Scan next on RF Carrier 28"},
447         {29, "Primary Scan next on RF Carrier 29"},
448         {30, "Primary Scan next on RF Carrier 30"},
449         {31, "Primary Scan next on RF Carrier 31"},
450         {32, "Primary Scan next on RF Carrier 32"},
451         {33, "Primary Scan next on RF Carrier 33"},
452         {34, "Primary Scan next on RF Carrier 34"},
453         {35, "Primary Scan next on RF Carrier 35"},
454         {36, "Primary Scan next on RF Carrier 36"},
455         {37, "Primary Scan next on RF Carrier 37"},
456         {38, "Primary Scan next on RF Carrier 38"},
457         {39, "Primary Scan next on RF Carrier 39"},
458         {40, "Primary Scan next on RF Carrier 40"},
459         {41, "Primary Scan next on RF Carrier 41"},
460         {42, "Primary Scan next on RF Carrier 42"},
461         {43, "Primary Scan next on RF Carrier 43"},
462         {44, "Primary Scan next on RF Carrier 44"},
463         {45, "Primary Scan next on RF Carrier 45"},
464         {46, "Primary Scan next on RF Carrier 46"},
465         {47, "Primary Scan next on RF Carrier 47"},
466         {48, "Primary Scan next on RF Carrier 48"},
467         {49, "Primary Scan next on RF Carrier 49"},
468         {50, "Primary Scan next on RF Carrier 50"},
469         {51, "Primary Scan next on RF Carrier 51"},
470         {52, "Primary Scan next on RF Carrier 52"},
471         {53, "Primary Scan next on RF Carrier 53"},
472         {54, "Primary Scan next on RF Carrier 54"},
473         {55, "Primary Scan next on RF Carrier 55"},
474         {56, "Primary Scan next on RF Carrier 56"},
475         {57, "Primary Scan next on RF Carrier 57"},
476         {58, "Primary Scan next on RF Carrier 58"},
477         {59, "Primary Scan next on RF Carrier 59"},
478         {60, "Primary Scan next on RF Carrier 60"},
479         {61, "Primary Scan next on RF Carrier 61"},
480         {62, "Primary Scan next on RF Carrier 62"},
481         {63, "Primary Scan next on RF Carrier 63"},
482         {0, NULL}
483 };
484
485 static const value_string Qt_A12_vals[]=
486 {
487         {0, "   Extended FP Info"},
488         {1, "Extended FP Info"},
489         {0, NULL}
490 };
491
492 static const value_string Qt_A13_vals[]=
493 {
494         {0, "   Double Duplex Bearer Connections"},
495         {1, "Double Duplex Bearer Connections"},
496         {0, NULL}
497 };
498
499 static const value_string Qt_A14_vals[]=
500 {
501         {0, "   Reserved"},
502         {1, "Reserved"},
503         {0, NULL}
504 };
505
506 static const value_string Qt_A15_vals[]=
507 {
508         {0, "   Double Slot"},
509         {1, "Double Slot"},
510         {0, NULL}
511 };
512
513 static const value_string Qt_A16_vals[]=
514 {
515         {0, "   Half Slot"},
516         {1, "Half Slot"},
517         {0, NULL}
518 };
519
520 static const value_string Qt_A17_vals[]=
521 {
522         {0, "   Full Slot"},
523         {1, "Full Slot"},
524         {0, NULL}
525 };
526
527 static const value_string Qt_A18_vals[]=
528 {
529         {0, "   Frequency Control"},
530         {1, "Frequency Control"},
531         {0, NULL}
532 };
533
534 static const value_string Qt_A19_vals[]=
535 {
536         {0, "   Page Repetition"},
537         {1, "Page Repetition"},
538         {0, NULL}
539 };
540
541 static const value_string Qt_A20_vals[]=
542 {
543         {0, "   C/O Setup on Dummy allowed"},
544         {1, "C/O Setup on Dummy allowed"},
545         {0, NULL}
546 };
547
548 static const value_string Qt_A21_vals[]=
549 {
550         {0, "   C/L Uplink"},
551         {1, "C/L Uplink"},
552         {0, NULL}
553 };
554
555 static const value_string Qt_A22_vals[]=
556 {
557         {0, "   C/L Downlink"},
558         {1, "C/L Downlink"},
559         {0, NULL}
560 };
561
562 static const value_string Qt_A23_vals[]=
563 {
564         {0, "   Basic A-Field Set-Up"},
565         {1, "Basic A-Field Set-Up"},
566         {0, NULL}
567 };
568
569 static const value_string Qt_A24_vals[]=
570 {
571         {0, "   Advanced A-Field Set-Up"},
572         {1, "Advanced A-Field Set-Up"},
573         {0, NULL}
574 };
575
576 static const value_string Qt_A25_vals[]=
577 {
578         {0, "   B-field Set-Up"},
579         {1, "B-field Set-Up"},
580         {0, NULL}
581 };
582
583 static const value_string Qt_A26_vals[]=
584 {
585         {0, "   Cf Messages"},
586         {1, "Cf Messages"},
587         {0, NULL}
588 };
589
590 static const value_string Qt_A27_vals[]=
591 {
592         {0, "   In Minimum Delay"},
593         {1, "In Minimum Delay"},
594         {0, NULL}
595 };
596
597 static const value_string Qt_A28_vals[]=
598 {
599         {0, "   In Normal Delay"},
600         {1, "In Normal Delay"},
601         {0, NULL}
602 };
603
604 static const value_string Qt_A29_vals[]=
605 {
606         {0, "   Ip Error Detection"},
607         {1, "Ip Error Detection"},
608         {0, NULL}
609 };
610
611 static const value_string Qt_A30_vals[]=
612 {
613         {0, "   Ip Error Correction"},
614         {1, "Ip Error Correction"},
615         {0, NULL}
616 };
617
618 static const value_string Qt_A31_vals[]=
619 {
620         {0, "   Multibearer Connections"},
621         {1, "Multibearer Connections"},
622         {0, NULL}
623 };
624
625 static const value_string Qt_A32_vals[]=
626 {
627         {0, "   ADPCM/G.726 Voice service"},
628         {1, "ADPCM/G.726 Voice service"},
629         {0, NULL}
630 };
631
632 static const value_string Qt_A33_vals[]=
633 {
634         {0, "   GAP basic speech"},
635         {1, "GAP basic speech"},
636         {0, NULL}
637 };
638
639 static const value_string Qt_A34_vals[]=
640 {
641         {0, "   Non-voice circuit switched service"},
642         {1, "Non-voice circuit switched service"},
643         {0, NULL}
644 };
645
646 static const value_string Qt_A35_vals[]=
647 {
648         {0, "   Non-voice packet switched service"},
649         {1, "Non-voice packet switched service"},
650         {0, NULL}
651 };
652
653 static const value_string Qt_A36_vals[]=
654 {
655         {0, "   Standard authentication required"},
656         {1, "Standard authentication required"},
657         {0, NULL}
658 };
659
660 static const value_string Qt_A37_vals[]=
661 {
662         {0, "   Standard ciphering supported"},
663         {1, "Standard ciphering supported"},
664         {0, NULL}
665 };
666
667 static const value_string Qt_A38_vals[]=
668 {
669         {0, "   Location registration supported"},
670         {1, "Location registration supported"},
671         {0, NULL}
672 };
673
674 static const value_string Qt_A39_vals[]=
675 {
676         {0, "   SIM services available"},
677         {1, "SIM services available"},
678         {0, NULL}
679 };
680
681 static const value_string Qt_A40_vals[]=
682 {
683         {0, "   Non-static Fixed Part (FP)"},
684         {1, "Non-static Fixed Part (FP)"},
685         {0, NULL}
686 };
687
688 static const value_string Qt_A41_vals[]=
689 {
690         {0, "   CISS services available"},
691         {1, "CISS services available"},
692         {0, NULL}
693 };
694
695 static const value_string Qt_A42_vals[]=
696 {
697         {0, "   CLMS service available"},
698         {1, "CLMS service available"},
699         {0, NULL}
700 };
701
702 static const value_string Qt_A43_vals[]=
703 {
704         {0, "   COMS service available"},
705         {1, "COMS service available"},
706         {0, NULL}
707 };
708
709 static const value_string Qt_A44_vals[]=
710 {
711         {0, "   Access rights requests supported"},
712         {1, "Access rights requests supported"},
713         {0, NULL}
714 };
715
716 static const value_string Qt_A45_vals[]=
717 {
718         {0, "   External handover supported"},
719         {1, "External handover supported"},
720         {0, NULL}
721 };
722
723 static const value_string Qt_A46_vals[]=
724 {
725         {0, "   Connection handover supported"},
726         {1, "Connection handover supported"},
727         {0, NULL}
728 };
729
730 static const value_string Qt_A47_vals[]=
731 {
732         {0, "   Reserved"},
733         {1, "Reserved"},
734         {0, NULL}
735 };
736
737
738 static const value_string Qt_EA20_vals[]=
739 {
740         {0, "   Reserved"},
741         {1, "Reserved"},
742         {0, NULL}
743 };
744
745 static const value_string Qt_CRFPHops_vals[]=
746 {
747         {0, "1 CRFP is allowed"},
748         {1, "2 CRFP allowed in cascade"},
749         {2, "3 CRFP allowed in cascade"},
750         {3, "No CRFP allowed"},
751         {0, NULL}
752 };
753
754 static const value_string Qt_CRFPEnc_vals[]=
755 {
756         {0, "CRFP encryption not supported"},
757         {1, "CRFP encryption supported"},
758         {0, NULL}
759 };
760
761 static const value_string Qt_REPHops_vals[]=
762 {
763         {0, "REP not supported"},
764         {1, "1 REP is allowed"},
765         {2, "2 REP are allowed in cascade"},
766         {3, "3 REP are allowed in cascade"},
767         {0, NULL}
768 };
769
770 static const value_string Qt_REPCap_vals[]=
771 {
772         {0, "REP interlacing not supported"},
773         {1, "REP interlacing supported"},
774         {0, NULL}
775 };
776
777 static const value_string Qt_Sync_vals[]=
778 {
779         {0, "standard, see EN 300 175-2 [2], clauses 4.6 and 5.2"},
780         {1, "prolonged preamble, see EN 300 175-2 [2], annex C (see note)"},
781         {2, "reserved"},
782         {3, "reserved"},
783         {0, NULL}
784 };
785
786 static const value_string Qt_MACSusp_vals[]=
787 {
788         {0, "Suspend and Resume not supported"},
789         {1, "Suspend and Resume supported"},
790         {0, NULL}
791 };
792
793 static const value_string Qt_MACIpq_vals[]=
794 {
795         {0, "Ipq not supported"},
796         {1, "Ipq supported"},
797         {0, NULL}
798 };
799
800 static const value_string Qt_EA23_vals[]=
801 {
802         {0, "   Extended Fixed Part Info 2"},
803         {1, "Extended Fixed Part Info 2"},
804         {0, NULL}
805 };
806
807 static const value_string Qt_EA24_vals[]=
808 {
809         {0, "   Unused"},
810         {1, "Unused"},
811         {0, NULL}
812 };
813
814 static const value_string Qt_EA25_vals[]=
815 {
816         {0, "   F-MMS Interworking profile supported"},
817         {1, "F-MMS Interworking profile supported"},
818         {0, NULL}
819 };
820
821 static const value_string Qt_EA26_vals[]=
822 {
823         {0, "   Basic ODAP supported"},
824         {1, "Basic ODAP supported"},
825         {0, NULL}
826 };
827
828 static const value_string Qt_EA27_vals[]=
829 {
830         {0, "   Generic Media Encapsulation transport (DPRS) supported"},
831         {1, "Generic Media Encapsulation transport (DPRS) supported"},
832         {0, NULL}
833 };
834
835 static const value_string Qt_EA28_vals[]=
836 {
837         {0, "   IP Roaming unrestricted supported"},
838         {1, "IP Roaming unrestricted supported"},
839         {0, NULL}
840 };
841
842 static const value_string Qt_EA29_vals[]=
843 {
844         {0, "   Ethernet"},
845         {1, "Ethernet"},
846         {0, NULL}
847 };
848
849 static const value_string Qt_EA30_vals[]=
850 {
851         {0, "   Token Ring"},
852         {1, "Token Ring"},
853         {0, NULL}
854 };
855
856 static const value_string Qt_EA31_vals[]=
857 {
858         {0, "   IP"},
859         {1, "IP"},
860         {0, NULL}
861 };
862
863 static const value_string Qt_EA32_vals[]=
864 {
865         {0, "   PPP"},
866         {1, "PPP"},
867         {0, NULL}
868 };
869
870 static const value_string Qt_EA33_vals[]=
871 {
872         {0, "   V.24"},
873         {1, "V.24"},
874         {0, NULL}
875 };
876
877 static const value_string Qt_EA34_vals[]=
878 {
879         {0, "   Reserved"},
880         {1, "Reserved"},
881         {0, NULL}
882 };
883
884 static const value_string Qt_EA35_vals[]=
885 {
886         {0, "   Reserved"},
887         {1, "Reserved"},
888         {0, NULL}
889 };
890
891 static const value_string Qt_EA36_vals[]=
892 {
893         {0, "   RAP Part 1 Profile"},
894         {1, "RAP Part 1 Profile"},
895         {0, NULL}
896 };
897
898 static const value_string Qt_EA37_vals[]=
899 {
900         {0, "   ISDN intermediate system"},
901         {1, "ISDN intermediate system"},
902         {0, NULL}
903 };
904
905 static const value_string Qt_EA38_vals[]=
906 {
907         {0, "   Synchronization to GPS achieved"},
908         {1, "Synchronization to GPS achieved"},
909         {0, NULL}
910 };
911
912 static const value_string Qt_EA39_vals[]=
913 {
914         {0, "   Location registration with TPUI allowed"},
915         {1, "Location registration with TPUI allowed"},
916         {0, NULL}
917 };
918
919 static const value_string Qt_EA40_vals[]=
920 {
921         {0, "   Emergency call supported"},
922         {1, "Emergency call supported"},
923         {0, NULL}
924 };
925
926 static const value_string Qt_EA41_vals[]=
927 {
928         {0, "   Asymmetric bearers supported"},
929         {1, "Asymmetric bearers supported"},
930         {0, NULL}
931 };
932
933 static const value_string Qt_EA42_vals[]=
934 {
935         {0, "   Reserved"},
936         {1, "Reserved"},
937         {0, NULL}
938 };
939
940 static const value_string Qt_EA43_vals[]=
941 {
942         {0, "   LRMS"},
943         {1, "LRMS"},
944         {0, NULL}
945 };
946
947 static const value_string Qt_EA44_vals[]=
948 {
949         {0, "   Data Service Profile D"},
950         {1, "Data Service Profile D"},
951         {0, NULL}
952 };
953
954 static const value_string Qt_EA45_vals[]=
955 {
956         {0, "   DPRS Stream"},
957         {1, "DPRS Stream"},
958         {0, NULL}
959 };
960
961 static const value_string Qt_EA46_vals[]=
962 {
963         {0, "   DPRS FREL"},
964         {1, "DPRS FREL"},
965         {0, NULL}
966 };
967
968 static const value_string Qt_EA47_vals[]=
969 {
970         {0, "   ISDN Data Services"},
971         {1, "ISDN Data Services"},
972         {0, NULL}
973 };
974
975
976
977
978 static const value_string MTHead_vals[]=
979 {
980         {0, "Basic Connection Control"},
981         {1, "Advanced Connection Control"},
982         {2, "MAC Layer Test Messages"},
983         {3, "Quality Control"},
984         {4, "Broadcast and Connectionless Services"},
985         {5, "Encryption Control"},
986         {6, "Tail for use with the first Transmission of a B-Field \"bearer request\" Message"},
987         {7, "Escape"},
988         {8, "TARI Message"},
989         {9, "REP Connection Control"},
990         {10, "Reserved"},
991         {11, "Reserved"},
992         {12, "Reserved"},
993         {13, "Reserved"},
994         {14, "Reserved"},
995         {15, "Reserved"},
996         {0, NULL}
997 };
998
999 static const value_string MTBasicConCtrl_vals[]=
1000 {
1001         {0, "Access Request"},
1002         {1, "Bearer Handover Request"},
1003         {2, "Connection Handover Request"},
1004         {3, "Unconfirmed Access Request"},
1005         {4, "Bearer Confirm"},
1006         {5, "Wait"},
1007         {6, "Attributes T Request"},
1008         {7, "Attributes T Confirm"},
1009         {8, "Reserved"},
1010         {9, "Reserved"},
1011         {10, "Reserved"},
1012         {11, "Reserved"},
1013         {12, "Reserved"},
1014         {13, "Reserved"},
1015         {14, "Reserved"},
1016         {15, "Release"},
1017         {0, NULL}
1018 };
1019
1020 static const value_string MTEncrCmd1_vals[]=
1021 {
1022         {0, "Start Encryption"},
1023         {1, "Stop Encryption"},
1024         {2, "reserved"},
1025         {3, "reserved"},
1026         {0, NULL}
1027 };
1028
1029 static const value_string MTEncrCmd2_vals[]=
1030 {
1031         {0, "Request"},
1032         {1, "Confirm"},
1033         {2, "Grant"},
1034         {3, "Reserved"},
1035         {0, NULL}
1036 };
1037
1038 static const value_string PTExtFlag_vals[]=
1039 {
1040         {0, "bla1"},
1041         {1, "bla2"},
1042         {0, NULL}
1043 };
1044
1045 static const value_string PTSDU_vals[]=
1046 {
1047         {0, "Zero Length Page"},
1048         {1, "Short Page"},
1049         {2, "Full Page"},
1050         {3, "MAC resume page"},
1051         {4, "Not the last 36 Bits of a Long Page"},
1052         {5, "The first 36 Bits of a Long Page"},
1053         {6, "The last 36 Bits of a Long Page"},
1054         {7, "All of a Long Page (first and last)"},
1055         {0, NULL}
1056 };
1057
1058 static const value_string PTInfoType_vals[]=
1059 {
1060         {0, "Fill Bits"},
1061         {1, "Blind Full Slot Information for Circuit Mode Service"},
1062         {2, "Other Bearer"},
1063         {3, "Recommended Other Bearer"},
1064         {4, "Good RFP Bearer"},
1065         {5, "Dummy or connectionless Bearer Position"},
1066         {6, "Extended Modulation Types"},
1067         {7, "Escape"},
1068         {8, "Dummy or connectionless Bearer Marker"},
1069         {9, "Bearer Handover/Replacement Information"},
1070         {10, "RFP Status and Modulation Types"},
1071         {11, "Active Carriers"},
1072         {12, "Connectionless Bearer Position"},
1073         {13, "RFP Power Level"},
1074         {14, "Blind Double Slot/RFP-FP Interface Resource Information"},
1075         {15, "Blind Full Slot Information for Packet Mode Service"},
1076         {0, NULL}
1077 };
1078
1079 static const value_string PTRFPPower_vals[]=
1080 {
1081         {0, "0 dBm"},
1082         {1, "2 dBm"},
1083         {2, "4 dBm"},
1084         {3, "6 dBm"},
1085         {4, "8 dBm"},
1086         {5, "10 dBm"},
1087         {6, "12 dBm"},
1088         {7, "14 dBm"},
1089         {8, "16 dBm"},
1090         {9, "18 dBm"},
1091         {10, "20 dBm"},
1092         {11, "22 dBm"},
1093         {12, "24 dBm"},
1094         {13, "26 dBm"},
1095         {14, "28 dBm"},
1096         {15, "30 dBm"},
1097         {0, NULL}
1098 };
1099
1100 static unsigned char
1101 getbit(guint8 *data, int bit)
1102 {
1103         guint8 c;
1104         guint8 byte=data[bit/8];
1105
1106         c=1;
1107         c<<=bit%8;
1108
1109         return (byte&c)>>bit%8;
1110 }
1111
1112 static void
1113 setbit(guint8 *data, int bit, guint8 value)
1114 {
1115         if(!value)
1116                 data[bit/8]&=~(1<<(bit%8));
1117         else
1118                 data[bit/8]|=(1<<(bit%8));
1119 }
1120
1121 static guint8
1122 calc_xcrc(guint8* data, guint8 length)
1123 {
1124         guint8 bits[21];
1125         guint8 gp=0x1;
1126         guint8 crc;
1127         guint8 next;
1128         int y, x;
1129
1130         for(y=0;y<80;y++)
1131         {
1132                 setbit(bits, y, getbit(data, y+48*(1+(int)(y/16))));
1133         }
1134         length=10;
1135         crc=bits[0];
1136         y=0;
1137         while(y<length)
1138         {
1139                 if(y<(length-1))
1140                         next=bits[y+1];
1141                 else
1142                         next=0;
1143                 y++;
1144                 x=0;
1145                 while(x<8)
1146                 {
1147                         while(!(crc&0x80))
1148                         {
1149                                 crc<<=1;
1150                                 crc|=!!(next&0x80);
1151                                 next<<=1;
1152                                 x++;
1153                                 if(x>7)
1154                                         break;
1155                         }
1156                         if(x>7)
1157                                 break;
1158                         crc<<=1;
1159                         crc|=!!(next&0x80);
1160                         next<<=1;
1161                         x++;
1162                         crc^=(gp<<4);
1163                 }
1164         }
1165 /*      crc^=0x10; */
1166         return crc;
1167 }
1168
1169 static guint16
1170 calc_rcrc(guint8* data)
1171 {
1172         guint16 gp=0x0589;              /* 10000010110001001 without the leading 1 */
1173
1174         guint16 crc;
1175         guint8 next;
1176         int y, x;
1177
1178         crc=data[0]<<8|data[1];
1179         y=0;
1180         while(y<6)
1181         {
1182                 next=data[2+y];
1183                 y++;
1184                 x=0;
1185                 while(x<8)
1186                 {
1187                         while(!(crc&0x8000))
1188                         {
1189                                 crc<<=1;
1190                                 crc|=!!(next&0x80);
1191                                 next<<=1;
1192                                 x++;
1193                                 if(x>7)
1194                                         break;
1195                         }
1196                         if(x>7)
1197                                 break;
1198                         crc<<=1;
1199                         crc|=!!(next&0x80);
1200                         next<<=1;
1201                         x++;
1202                         crc^=gp;
1203                 }
1204         }
1205         crc^=1;
1206         return crc;
1207 }
1208
1209 static gint
1210 dissect_bfield(gboolean dect_packet_type _U_, guint8 a_header,
1211         struct dect_bfield *pkt_bfield, packet_info *pinfo, const guint8 *pkt_ptr _U_,
1212         tvbuff_t *tvb, proto_item *ti _U_, proto_tree *DectTree, gint offset)
1213 {
1214         guint8 xcrc, xcrclen;
1215         guint16 blen;
1216         gint oldoffset, fn;
1217         proto_item *bfieldti    =NULL;
1218 #if 0
1219         proto_item *bxcrc       =NULL;
1220 #endif
1221         proto_tree *BField      =NULL;
1222
1223         /* B-Feld */
1224         switch((a_header&0x0E)>>1)
1225         {
1226         case 0:
1227         case 1:
1228         case 3:
1229         case 5:
1230         case 6:
1231                 blen=40;
1232                 xcrclen=4;
1233
1234                 if(check_col(pinfo->cinfo, COL_INFO /*Type1*/))
1235                 {
1236                         col_append_str(pinfo->cinfo, COL_INFO /*Type1*/, "Full Slot");
1237                 }
1238                 break;
1239         case 2:
1240                 blen=100;
1241                 xcrclen=4;
1242
1243                 if(check_col(pinfo->cinfo, COL_INFO /*Type1*/))
1244                 {
1245                         col_append_str(pinfo->cinfo, COL_INFO /*Type1*/, "Double Slot");
1246                 }
1247                 break;
1248         case 4:
1249                 blen=10;
1250                 xcrclen=4;
1251
1252                 if(check_col(pinfo->cinfo, COL_INFO /*Type1*/))
1253                 {
1254                         col_append_str(pinfo->cinfo, COL_INFO /*Type1*/, "Half Slot");
1255                 }
1256                 break;
1257         case 7:
1258         default:
1259                 blen=0;
1260                 xcrclen=0;
1261
1262                 if(check_col(pinfo->cinfo, COL_INFO /*Type1*/))
1263                 {
1264                         col_append_str(pinfo->cinfo, COL_INFO /*Type1*/, "No B-Field");
1265                 }
1266                 break;
1267
1268         }
1269         if(blen)
1270         {
1271                 bfieldti        = proto_tree_add_item(DectTree, hf_dect_B, tvb, offset, 40, FALSE);
1272                 BField          = proto_item_add_subtree(bfieldti, ett_bfield);
1273         }
1274
1275         oldoffset=offset;
1276
1277         if((blen+(xcrclen/8)+1)<=pkt_bfield->Length)
1278         {
1279                 guint16 x, y;
1280                 for(x=0;x<blen;x+=16)
1281                 {
1282                         /*
1283                          * XXX - should this just be an FTYPE_BYTES field,
1284                          * and possibly just displayed as "Data: N bytes"
1285                          * rather than giving all the bytes of data?
1286                          */
1287                         for(y=0;y<16;y++)
1288                         {
1289                                 if((x+y)>=blen)
1290                                         break;
1291                         }
1292                         proto_tree_add_item(BField, hf_dect_B_Data, tvb, offset, y, FALSE);
1293                         if(y==16)
1294                                 offset+=16;
1295                         else
1296                                 /* XXX: Why 16-y and not y??? */
1297                                 offset+=16-y;
1298                 }
1299                 for(fn=0;fn<8;fn++)
1300                 {
1301                         guint16 bytecount=0;
1302
1303                         offset=oldoffset;
1304
1305                         proto_tree_add_none_format(BField, hf_dect_B_fn, tvb, offset, 0, "\nFramenumber %u/%u", fn, fn+8);
1306                         for(x=0;x<blen;x+=16)
1307                         {
1308                                 /*
1309                                  * XXX - should this just be an FTYPE_BYTES
1310                                  * field, and possibly just displayed as
1311                                  * "Data: N bytes" rather than giving all
1312                                  * the bytes of data?
1313                                  */
1314                                 emem_strbuf_t *string;
1315                                 string = ep_strbuf_new(NULL);
1316                                 for(y=0;y<16;y++)
1317                                 {
1318                                         if((x+y)>=blen)
1319                                                 break;
1320
1321                                         ep_strbuf_append_printf(string,"%.2x ", pkt_bfield->Data[x+y]^scrt[fn][bytecount%31]);
1322                                         bytecount++;
1323                                 }
1324                                 proto_tree_add_uint_format(BField, hf_dect_B_Data, tvb, offset, y, 0x2323, "Data: %s", string->str);
1325                                 if(y==16)
1326                                         offset+=16;
1327                                 else
1328                                         offset+=16-y;
1329                         }
1330                 }
1331                 xcrc=calc_xcrc(pkt_bfield->Data, 83);
1332
1333                 if(xcrc!=(pkt_bfield->Data[40]&0xf0))
1334                         /* XXX: pkt_bfield->Data[40]&0xf0 isn't really the Recv value?? */
1335                         proto_tree_add_uint_format(bfieldti, hf_dect_B_XCRC, tvb, offset, 1, 0, "X-CRC Error (Calc:%.2x, Recv:%.2x)", xcrc, pkt_bfield->Data[40]&0xf0);
1336                 else
1337                         /* XXX: pkt_bfield->Data[40]&0xf0 isn't really the Recv value?? */
1338                         proto_tree_add_uint_format(bfieldti, hf_dect_B_XCRC, tvb, offset, 1, 1, "X-CRC Match (Calc:%.2x, Recv:%.2x)", xcrc, pkt_bfield->Data[40]&0xf0);
1339         }
1340         else
1341                 proto_tree_add_uint_format(BField, hf_dect_B_Data, tvb, offset, 0, 0x2323, "Data too Short");
1342         return offset;
1343 }
1344
1345 static void
1346 dissect_decttype(gboolean dect_packet_type, struct dect_afield *pkt_afield,
1347         struct dect_bfield *pkt_bfield, packet_info *pinfo, const guint8 *pkt_ptr,
1348         tvbuff_t *tvb, proto_item *ti, proto_tree *DectTree)
1349 {
1350         guint16 rcrc;
1351         guint8 rcrcdat[8];
1352         gint offset             =11;
1353         guint8 tailtype         =0;
1354         proto_item *afieldti    =NULL;
1355         proto_item *aheadti     =NULL;
1356         proto_item *atailti     =NULL;
1357 #if 0
1358         proto_item *arcrc       =NULL;
1359         proto_item *aqtti       =NULL;
1360 #endif
1361         proto_tree *AField      =NULL;
1362         proto_tree *AHead       =NULL;
1363         proto_tree *ATail       =NULL;
1364
1365         guint8  header, tail_0, tail_1, tail_2, tail_3, tail_4;
1366 #if 0
1367         proto_tree *AQT         =NULL;
1368 #endif
1369
1370         /************************** A-Field ***********************************/
1371
1372         /* A-Feld */
1373         header=tvb_get_guint8(tvb, offset+0);
1374         tail_0=tvb_get_guint8(tvb, offset+1);
1375         tail_1=tvb_get_guint8(tvb, offset+2);
1376         tail_2=tvb_get_guint8(tvb, offset+3);
1377         tail_3=tvb_get_guint8(tvb, offset+4);
1378         tail_4=tvb_get_guint8(tvb, offset+5);
1379         tailtype        = header >> 5;
1380         afieldti        = proto_tree_add_item(DectTree, hf_dect_A, tvb, offset, 8, FALSE);
1381         AField          = proto_item_add_subtree(afieldti, ett_afield);
1382
1383         /* Header */
1384         aheadti         = proto_tree_add_item(afieldti, hf_dect_A_Head, tvb, offset, 1, FALSE);
1385         AHead           = proto_item_add_subtree(aheadti, ett_ahead);
1386
1387         if(dect_packet_type==DECT_PACKET_FP)
1388                 proto_tree_add_item(AHead, hf_dect_A_Head_TA_FP, tvb, offset, 1, FALSE);
1389         else
1390                 proto_tree_add_item(AHead, hf_dect_A_Head_TA_PP, tvb, offset, 1, FALSE);
1391
1392         proto_tree_add_item(AHead, hf_dect_A_Head_Q1, tvb, offset, 1, FALSE);
1393         proto_tree_add_item(AHead, hf_dect_A_Head_BA, tvb, offset, 1, FALSE);
1394         proto_tree_add_item(AHead, hf_dect_A_Head_Q2, tvb, offset, 1, FALSE);
1395         offset++;
1396
1397         /* Tail */
1398         if(dect_packet_type==DECT_PACKET_FP)
1399         {
1400                 atailti = proto_tree_add_uint_format(afieldti, hf_dect_A_Tail, tvb, offset, 5, 0x2323, "FP-Tail: %s", val_to_str(tailtype, TA_vals_FP, "Error, please report: %d"));
1401         }
1402         else
1403         {
1404                 atailti = proto_tree_add_uint_format(afieldti, hf_dect_A_Tail, tvb, offset, 5, 0x2323, "PP-Tail: %s", val_to_str(tailtype, TA_vals_PP, "Error, please report: %d"));
1405         }
1406
1407         ATail = proto_item_add_subtree(atailti, ett_atail);
1408
1409         if((tailtype==0)||(tailtype==1))                /* Ct */
1410         {
1411                 if(check_col(pinfo->cinfo, COL_INFO))
1412                         col_set_str(pinfo->cinfo, COL_INFO, "[Ct]");
1413         }
1414         else if((tailtype==2)||(tailtype==3))           /* Nt, Nt connectionless bearer */
1415         {
1416                 if(check_col(pinfo->cinfo, COL_INFO))
1417                         col_set_str(pinfo->cinfo, COL_INFO, "[Nt]");
1418                 if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1419                         col_append_fstr(pinfo->cinfo, COL_INFO /*Type2*/, "RFPI: %s",
1420                                 tvb_bytes_to_str(tvb, offset, 5));
1421
1422                 proto_tree_add_item(atailti, hf_dect_A_Tail_Nt, tvb, offset, 5, FALSE);
1423         }
1424         else if(tailtype==4)                            /* Qt */
1425         {
1426                 if(check_col(pinfo->cinfo, COL_INFO))
1427                         col_set_str(pinfo->cinfo, COL_INFO, "[Qt]");
1428
1429                 proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_Qh, tvb, offset, 1, FALSE);
1430
1431                 switch(tail_0>>4)
1432                 {
1433                 case 0:         /* Static System Info */
1434                 case 1:
1435                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1436                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Static System Info");
1437
1438                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Nr, tvb, offset, 1, FALSE);
1439                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Sn, tvb, offset, 1, FALSE);
1440                         offset++;
1441
1442                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Sp, tvb, offset, 1, FALSE);
1443                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Esc, tvb, offset, 1, FALSE);
1444                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Txs, tvb, offset, 1, FALSE);
1445                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Mc, tvb, offset, 1, FALSE);
1446                         offset++;
1447
1448                         proto_tree_add_uint_format(ATail, hf_dect_A_Tail_Mt_Mh, tvb, offset, 2, 0x2323, " Carrier%s%s%s%s%s%s%s%s%s%s available",
1449                                 (tail_1&0x02)?" 0":"", (tail_1&0x01)?" 1":"", (tail_2&0x80)?" 2":"",
1450                                 (tail_2&0x40)?" 3":"", (tail_2&0x20)?" 4":"", (tail_2&0x10)?" 5":"",
1451                                 (tail_2&0x08)?" 6":"", (tail_2&0x04)?" 7":"", (tail_2&0x02)?" 8":"",
1452                                 (tail_2&0x01)?" 9":"");
1453                         offset++;
1454
1455                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Spr1, tvb, offset, 1, FALSE);
1456                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Cn, tvb, offset, 1, FALSE);
1457                         offset++;
1458
1459                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_Spr2, tvb, offset, 1, FALSE);
1460                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_0_PSCN, tvb, offset, 1, FALSE);
1461                         offset++;
1462                         /* due to addition further down */
1463                         offset-=5;
1464                         break;
1465                 case 2:         /* Extended RF Carriers Part 1 */
1466                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1467                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Extended RF Carriers Part 1");
1468                         break;
1469                 case 3:         /* Fixed Part Capabilities */
1470                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1471                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Fixed Part Capabilities");
1472
1473                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A12, tvb, offset, 1, FALSE);
1474                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A13, tvb, offset, 1, FALSE);
1475                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A14, tvb, offset, 1, FALSE);
1476                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A15, tvb, offset, 1, FALSE);
1477                         offset++;
1478
1479                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A16, tvb, offset, 1, FALSE);
1480                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A17, tvb, offset, 1, FALSE);
1481                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A18, tvb, offset, 1, FALSE);
1482                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A19, tvb, offset, 1, FALSE);
1483                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A20, tvb, offset, 1, FALSE);
1484                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A21, tvb, offset, 1, FALSE);
1485                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A22, tvb, offset, 1, FALSE);
1486                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A23, tvb, offset, 1, FALSE);
1487                         offset++;
1488
1489                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A24, tvb, offset, 1, FALSE);
1490                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A25, tvb, offset, 1, FALSE);
1491                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A26, tvb, offset, 1, FALSE);
1492                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A27, tvb, offset, 1, FALSE);
1493                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A28, tvb, offset, 1, FALSE);
1494                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A29, tvb, offset, 1, FALSE);
1495                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A30, tvb, offset, 1, FALSE);
1496                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A31, tvb, offset, 1, FALSE);
1497                         offset++;
1498
1499
1500                         /* higher layer capabilities */
1501                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A32, tvb, offset, 1, FALSE);
1502                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A33, tvb, offset, 1, FALSE);
1503                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A34, tvb, offset, 1, FALSE);
1504                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A35, tvb, offset, 1, FALSE);
1505                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A36, tvb, offset, 1, FALSE);
1506                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A37, tvb, offset, 1, FALSE);
1507                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A38, tvb, offset, 1, FALSE);
1508                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A39, tvb, offset, 1, FALSE);
1509                         offset++;
1510
1511                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A40, tvb, offset, 1, FALSE);
1512                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A41, tvb, offset, 1, FALSE);
1513                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A42, tvb, offset, 1, FALSE);
1514                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A43, tvb, offset, 1, FALSE);
1515                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A44, tvb, offset, 1, FALSE);
1516                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A45, tvb, offset, 1, FALSE);
1517                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A46, tvb, offset, 1, FALSE);
1518                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_3_A47, tvb, offset, 1, FALSE);
1519                         offset++;
1520
1521                         /* due to addition further down */
1522                         offset-=5;
1523                         break;
1524                 case 4:         /* Extended Fixed Part Capabilities */
1525                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1526                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Extended Fixed Part Capabilities");
1527
1528                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_CRFPHops, tvb, offset, 1, FALSE);
1529                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_CRFPEnc, tvb, offset, 1, FALSE);
1530                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_REFHops, tvb, offset, 2, FALSE);
1531                         offset++;
1532
1533                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_REPCap, tvb, offset, 1, FALSE);
1534                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_Sync, tvb, offset, 1, FALSE);
1535                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A20, tvb, offset, 1, FALSE);
1536                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_MACSusp, tvb, offset, 1, FALSE);
1537                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_MACIpq, tvb, offset, 1, FALSE);
1538                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A23, tvb, offset, 1, FALSE);
1539                         offset++;
1540
1541
1542                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A24, tvb, offset, 1, FALSE);
1543
1544                         /* higher layer capabilities */
1545                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A25, tvb, offset, 1, FALSE);
1546                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A26, tvb, offset, 1, FALSE);
1547                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A27, tvb, offset, 1, FALSE);
1548                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A28, tvb, offset, 1, FALSE);
1549                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A29, tvb, offset, 1, FALSE);
1550                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A30, tvb, offset, 1, FALSE);
1551                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A31, tvb, offset, 1, FALSE);
1552                         offset++;
1553
1554
1555                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A32, tvb, offset, 1, FALSE);
1556                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A33, tvb, offset, 1, FALSE);
1557                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A34, tvb, offset, 1, FALSE);
1558                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A35, tvb, offset, 1, FALSE);
1559                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A36, tvb, offset, 1, FALSE);
1560                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A37, tvb, offset, 1, FALSE);
1561                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A38, tvb, offset, 1, FALSE);
1562                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A39, tvb, offset, 1, FALSE);
1563                         offset++;
1564
1565                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A40, tvb, offset, 1, FALSE);
1566                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A41, tvb, offset, 1, FALSE);
1567                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A42, tvb, offset, 1, FALSE);
1568                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A43, tvb, offset, 1, FALSE);
1569                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A44, tvb, offset, 1, FALSE);
1570                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A45, tvb, offset, 1, FALSE);
1571                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A46, tvb, offset, 1, FALSE);
1572                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_4_A47, tvb, offset, 1, FALSE);
1573                         offset++;
1574
1575                         /* due to addition further down */
1576                         offset-=5;
1577                         break;
1578                 case 5:         /* SARI List Contents */
1579                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1580                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "SARI List Contents");
1581                         break;
1582                 case 6:         /* Multi-Frame No. */
1583                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1584                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Multi-Frame No.");
1585
1586                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_6_Spare, tvb, offset, 2, FALSE);
1587                         offset+=2;
1588
1589                         proto_tree_add_item(ATail, hf_dect_A_Tail_Qt_6_Mfn, tvb, offset, 3, FALSE);
1590                         offset+=3;
1591
1592                         /* due to addition further down */
1593                         offset-=5;
1594                         break;
1595                 case 7:         /* Escape */
1596                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1597                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Escape");
1598                         break;
1599                 case 8:         /* Obsolete */
1600                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1601                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Obsolete");
1602                         break;
1603                 case 9:         /* Extended RF Carriers Part 2 */
1604                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1605                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Extended RF Carriers Part 2");
1606                         break;
1607                 case 10:        /* Reserved(?) */
1608                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1609                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Reserved(?)");
1610                         break;
1611                 case 11:        /* Transmit Information(?) */
1612                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1613                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Transmit Information(?)");
1614                         break;
1615                 case 12:        /* Extended Fixed Part Capabilities 2 */
1616                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1617                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Extended Fixed Part Capabilities 2");
1618                         break;
1619                 case 13:
1620                 case 14:
1621                 case 15:
1622                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1623                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Reserved");
1624                         break;
1625                 }
1626         }
1627         else if(tailtype==5)                            /* Escape */
1628         {
1629         }
1630         else if((tailtype==6)||((tailtype==7)&&(dect_packet_type==DECT_PACKET_PP)))     /* Mt */
1631         {
1632                 if(check_col(pinfo->cinfo, COL_INFO))
1633                         col_set_str(pinfo->cinfo, COL_INFO, "[Mt]");
1634
1635                 proto_tree_add_uint(ATail, hf_dect_A_Tail_Mt_Mh, tvb, offset, 1, tail_0);
1636
1637                 switch(tail_0>>4)
1638                 {
1639                 case 0:         /* Basic Connection Control */
1640                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1641                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Basic Connection Control");
1642                         proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_BasicConCtrl, tvb, offset, 1, FALSE);
1643                         offset++;
1644
1645                         if(((tail_0 && 0x0f)==6)||((tail_0 && 0x0f)==7))
1646                         {
1647                                 proto_tree_add_uint_format(ATail, hf_dect_A_Tail_Mt_Mh, tvb, offset, 4, 0x2323, "here should be attributes...");
1648                                 offset +=4;
1649                         }
1650                         else
1651                         {
1652                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Mh_fmid, tvb, offset, 2, FALSE);
1653                                 offset++;
1654
1655                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Mh_pmid, tvb, offset, 3, FALSE);
1656                                 offset+=3;
1657                         }
1658
1659                         /* due to addition further down */
1660                         offset-=5;
1661                         break;
1662                 case 1:         /* Advanced Connection Control */
1663                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1664                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Advanced Connection Control");
1665                         break;
1666                 case 2:         /* MAC Layer Test Messages */
1667                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1668                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "MAC Layer Test Messages");
1669                         break;
1670                 case 3:         /* Quality Control */
1671                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1672                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Quality Control");
1673                         break;
1674                 case 4:         /* Broadcast and Connectionless Services */
1675                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1676                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Broadcast and Connectionless Services");
1677                         break;
1678                 case 5:         /* Encryption Control */
1679                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1680                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Encryption Control");
1681
1682                         proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Encr_Cmd1, tvb, offset, 1, FALSE);
1683                         proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Encr_Cmd2, tvb, offset, 1, FALSE);
1684                         offset++;
1685
1686                         proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Mh_fmid, tvb, offset, 2, FALSE);
1687                         offset++;
1688
1689                         proto_tree_add_item(ATail, hf_dect_A_Tail_Mt_Mh_pmid, tvb, offset, 3, FALSE);
1690                         offset+=3;
1691
1692                         /* wegen addition weiter unten */
1693                         offset-=5;
1694                         break;
1695                 case 6:         /* Tail for use with the first Transmission of a B-Field \"bearer request\" Message */
1696                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1697                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Tail for use with the first Transmission of a B-Field \"bearer request\" Message");
1698                         break;
1699                 case 7:         /* Escape */
1700                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1701                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Escape");
1702                         break;
1703                 case 8:         /* TARI Message */
1704                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1705                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "TARI Message");
1706                         break;
1707                 case 9:         /* REP Connection Control */
1708                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1709                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "REP Connection Control");
1710                         break;
1711                 case 10:        /* Reserved */
1712                 case 11:
1713                 case 12:
1714                 case 13:
1715                 case 14:
1716                 case 15:
1717                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1718                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Reserved");
1719                         break;
1720                 }
1721         }
1722         else if((tailtype==7)&&(dect_packet_type==DECT_PACKET_FP))      /* Pt */
1723         {
1724                 if(check_col(pinfo->cinfo, COL_INFO))
1725                         col_set_str(pinfo->cinfo, COL_INFO, "[Pt]");
1726
1727                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_ExtFlag, tvb, offset, 1, FALSE);
1728                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_SDU, tvb, offset, 1, FALSE);
1729                 switch((tail_0&0x70)>>4)
1730                 {
1731                 case 0:         /* Zero Length Page */
1732                 case 1:         /* Short Page */
1733                         if(((tail_0&0x70)>>4)==0)
1734 #if 0
1735 XXX: Hier weitermachen
1736 #endif
1737                         {
1738                                 if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1739                                         col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Zero Length Page: ");
1740                                 proto_tree_add_uint_format(atailti, hf_dect_A_Tail_Pt_InfoType, tvb, offset, 3, 0x2323, "RFPI:xxxxx%.1x%.2x%.2x", (pkt_afield->Tail[0]&0x0f), pkt_afield->Tail[1], pkt_afield->Tail[2]);
1741                                 offset+=3;
1742
1743                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_InfoType, tvb, offset, 1, FALSE);
1744                         }
1745                         else
1746                         {
1747                                 if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1748                                         col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Short Page: ");
1749                                 proto_tree_add_uint_format(atailti, hf_dect_A_Tail_Pt_InfoType, tvb, offset, 3, 0x2323, "Bs Data:%.1x%.2x%.2x", (pkt_afield->Tail[0]&0x0f), pkt_afield->Tail[1], pkt_afield->Tail[2]);
1750                                 offset+=3;
1751
1752                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_InfoType, tvb, offset, 1, FALSE);
1753                         }
1754                         switch(pkt_afield->Tail[3]>>4)
1755                         {
1756                         case 0: /* Fill Bits */
1757                                 proto_tree_add_uint_format(ATail, hf_dect_A_Tail_Pt_Fill_Fillbits, tvb, offset, 2, 0x2323, "Fillbits:%.1x%.2x", pkt_afield->Tail[3]&0x0f, pkt_afield->Tail[4]);
1758                                 offset+=2;
1759                                 break;
1760                         case 1: /* Blind Full Slot Information for Circuit Mode Service */
1761                         case 7: /* Escape */
1762                         case 8: /* Dummy or connectionless Bearer Marker */
1763                                 proto_tree_add_uint_format(ATail, hf_dect_A_Tail_Pt_InfoType, tvb, offset, 2, 0x2323, " Slot-Pairs:%s%s%s%s%s%s%s%s%s%s%s%s available",
1764                                         (pkt_afield->Tail[3]&0x08)?" 0/12":"", (pkt_afield->Tail[3]&0x04)?" 1/13":"", (pkt_afield->Tail[3]&0x02)?" 2/14":"",
1765                                         (pkt_afield->Tail[3]&0x01)?" 3/15":"", (pkt_afield->Tail[4]&0x80)?" 4/16":"", (pkt_afield->Tail[4]&0x40)?" 5/17":"",
1766                                         (pkt_afield->Tail[4]&0x20)?" 6/18":"", (pkt_afield->Tail[4]&0x10)?" 7/19":"", (pkt_afield->Tail[4]&0x08)?" 8/20":"",
1767                                         (pkt_afield->Tail[4]&0x04)?" 9/21":"", (pkt_afield->Tail[4]&0x02)?" 10/22":"", (pkt_afield->Tail[4]&0x01)?" 11/23":"");
1768
1769                                 offset+=2;
1770                                 break;
1771                         case 2: /* Other Bearer */
1772                         case 3: /* Recommended Other Bearer */
1773                         case 4: /* Good RFP Bearer */
1774                         case 5: /* Dummy or connectionless Bearer Position */
1775                         case 12: /* Connectionless Bearer Position */
1776                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_Bearer_Sn, tvb, offset, 1, FALSE);
1777                                 offset++;
1778
1779                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_Bearer_Sp, tvb, offset, 1, FALSE);
1780                                 proto_tree_add_item(ATail, hf_dect_A_Tail_Pt_Bearer_Cn, tvb, offset, 1, FALSE);
1781                                 offset++;
1782                                 break;
1783                         case 6: /* Extended Modulation Types */
1784                                 offset+=2;
1785                                 break;
1786
1787                         case 9: /* Bearer Handover/Replacement Information */
1788                                 offset+=2;
1789                                 break;
1790                         case 10: /* RFP Status and Modulation Types */
1791                                 offset+=2;
1792                                 break;
1793                         case 11: /* Active Carriers */
1794                                 offset+=2;
1795                                 break;
1796                         case 13: /* RFP Power Level */
1797                                 offset+=2;
1798                                 break;
1799                         case 14: /* Blind Double Slot/RFP-FP Interface Resource Information */
1800                                 offset+=2;
1801                                 break;
1802                         case 15: /* Blind Full Slot Information for Packet Mode Service */
1803                                 offset+=2;
1804                                 break;
1805                         }
1806                         /* due to addition further down */
1807                         offset-=5;
1808                         break;
1809                 case 2:         /* Full Page */
1810                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1811                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Full Page: ");
1812                         break;
1813                 case 3:         /* MAC Resume Page */
1814                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1815                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "MAC Resume Page: ");
1816                         break;
1817                 case 4:         /* Not the Last 36 Bits of a Long Page */
1818                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1819                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "Not the Last 36 Bits: ");
1820                         break;
1821                 case 5:         /* The First 36 Bits of a Long Page */
1822                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1823                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "The First 36 Bits: ");
1824                         break;
1825                 case 6:         /* The Last 36 Bits of a Long Page */
1826                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1827                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "The Last 36 Bits: ");
1828                         break;
1829                 case 7:         /* All of a Long Page */
1830                         if(check_col(pinfo->cinfo, COL_INFO /*Type2*/))
1831                                 col_append_str(pinfo->cinfo, COL_INFO /*Type2*/, "All of a Long Page: ");
1832                         break;
1833                 }
1834         }
1835
1836         offset+=5;
1837
1838         /* R-CRC */
1839
1840         memcpy(rcrcdat, pkt_ptr, 6);
1841         rcrcdat[6]=0;
1842         rcrcdat[7]=0;
1843         rcrc=calc_rcrc(rcrcdat);
1844         if(rcrc!=pkt_afield->RCRC)
1845                 proto_tree_add_uint_format(afieldti, hf_dect_A_RCRC, tvb, offset, 2, 0, "R-CRC Error (Calc:%.4x, Recv:%.4x)", rcrc, pkt_afield->RCRC);
1846         else
1847                 proto_tree_add_uint_format(afieldti, hf_dect_A_RCRC, tvb, offset, 2, 1, "R-CRC Match (Calc:%.4x, Recv:%.4x)", rcrc, pkt_afield->RCRC);
1848
1849         offset+=2;
1850
1851         /* **************** B-Field ************************************/
1852         offset=dissect_bfield(dect_packet_type, header, pkt_bfield, pinfo, pkt_ptr, tvb, ti, DectTree, offset);
1853 }
1854
1855 static void
1856 dissect_dect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1857 {
1858         guint16                 type;
1859         guint                   pkt_len;
1860         const guint8            *pkt_ptr;
1861         struct dect_afield      pkt_afield;
1862         struct dect_bfield      pkt_bfield;
1863
1864         /* Packetpointer */
1865         pkt_len=tvb_length(tvb);
1866
1867         if(pkt_len>140)
1868                         pkt_len=140;
1869
1870         if(pkt_len<13)
1871         {
1872                 if(check_col(pinfo->cinfo, COL_PROTOCOL))
1873                 {
1874                         col_set_str(pinfo->cinfo, COL_PROTOCOL, "No Data");
1875                 }
1876                 return;
1877         }
1878
1879         pkt_ptr=tvb_get_ptr(tvb, 11, pkt_len-11);
1880
1881         /* fill A-Field */
1882         pkt_afield.Header=pkt_ptr[0];
1883         memcpy((char*)(&(pkt_afield.Tail)), (char*)(pkt_ptr+1), 5);
1884         pkt_afield.RCRC=(((guint16)pkt_ptr[6])<<8)|pkt_ptr[7];
1885
1886
1887         /* fill B-Field */
1888         if(pkt_len>13)
1889                 memcpy((char*)(&(pkt_bfield.Data)), (char*)(pkt_ptr+8), pkt_len-5-8);
1890         else
1891                 memset((char*)(&(pkt_bfield.Data)), 0, 128);
1892         pkt_bfield.Length=pkt_len-13;
1893
1894         if(check_col(pinfo->cinfo, COL_PROTOCOL))
1895                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DECT");
1896
1897         /* Clear out stuff in the info column */
1898         if(check_col(pinfo->cinfo, COL_INFO))
1899         {
1900                 col_clear(pinfo->cinfo, COL_INFO);
1901         }
1902         if(tree)
1903         {
1904                 proto_item *ti          =NULL;
1905                 proto_item *typeti      =NULL;
1906                 proto_tree *DectTree    =NULL;
1907                 gint offset             =0;
1908
1909                 ti=proto_tree_add_item(tree, proto_dect, tvb, 0, -1, FALSE);
1910
1911                 DectTree=proto_item_add_subtree(ti, ett_dect);
1912                 proto_tree_add_item(DectTree, hf_dect_transceivermode, tvb, offset, 1, FALSE);
1913                 offset++;
1914
1915                 proto_tree_add_item(DectTree, hf_dect_channel, tvb, offset, 1, FALSE);
1916                 offset++;
1917
1918                 proto_tree_add_item(DectTree, hf_dect_slot, tvb, offset, 2, FALSE);
1919                 offset+=2;
1920
1921                 proto_tree_add_item(DectTree, hf_dect_framenumber, tvb, offset, 1, FALSE);
1922                 offset++;
1923
1924                 proto_tree_add_item(DectTree, hf_dect_rssi, tvb, offset, 1, FALSE);
1925                 offset++;
1926
1927                 proto_tree_add_item(DectTree, hf_dect_preamble, tvb, offset, 3, FALSE);
1928                 offset+=3;
1929
1930                 typeti=proto_tree_add_item(DectTree, hf_dect_type, tvb, offset, 2, FALSE);
1931
1932                 type=tvb_get_ntohs(tvb, offset);
1933                 offset+=2;
1934
1935                 switch(type) {
1936                 case 0x1675:
1937                         if(check_col(pinfo->cinfo, COL_PROTOCOL))
1938                         {
1939                                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DECT PP");
1940                         }
1941                         proto_item_append_text(typeti, " Phone Packet");
1942                         dissect_decttype(DECT_PACKET_PP, &pkt_afield, &pkt_bfield, pinfo, pkt_ptr, tvb, ti, DectTree);
1943                         break;
1944                 case 0xe98a:
1945                         if(check_col(pinfo->cinfo, COL_PROTOCOL))
1946                         {
1947                                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DECT RFP");
1948                         }
1949                         proto_item_append_text(typeti, " Station Packet");
1950                         dissect_decttype(DECT_PACKET_FP, &pkt_afield, &pkt_bfield, pinfo, pkt_ptr, tvb, ti, DectTree);
1951                         break;
1952                 default:
1953                         if(check_col(pinfo->cinfo, COL_PROTOCOL))
1954                         {
1955                                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "DECT Unk");
1956                         }
1957                         proto_item_append_text(typeti, " Unknown Packet");
1958                         break;
1959                 }
1960         }
1961 }
1962
1963 void
1964 proto_register_dect(void)
1965 {
1966         static hf_register_info hf[]=
1967         {
1968                 { &hf_dect_transceivermode,
1969                 {"Tranceiver-Mode", "dect.tranceivermode", FT_UINT8, BASE_HEX, VALS(tranceiver_mode),
1970                         0x0, NULL, HFILL}},
1971
1972                 { &hf_dect_channel,
1973                 {"Channel", "dect.channel", FT_UINT8, BASE_DEC, NULL,
1974                         0x0, NULL, HFILL}},
1975
1976                 { &hf_dect_framenumber,
1977                 {"Frame#", "dect.framenumber", FT_UINT16, BASE_DEC, NULL,
1978                         0x0, NULL, HFILL}},
1979
1980                 { &hf_dect_rssi,
1981                 {"RSSI", "dect.rssi", FT_UINT8, BASE_DEC, NULL,
1982                         0x0, NULL, HFILL}},
1983
1984                 { &hf_dect_slot,
1985                 {"Slot", "dect.slot", FT_UINT16, BASE_DEC, NULL,
1986                         0x0, NULL, HFILL}},
1987
1988                 { &hf_dect_preamble,
1989                 {"Preamble", "dect.preamble", FT_BYTES, BASE_NONE, NULL,
1990                         0x0, NULL, HFILL}},
1991
1992                 { &hf_dect_type,
1993                 {"Packet-Type", "dect.type", FT_BYTES, BASE_NONE, NULL,
1994                         0x0, NULL, HFILL}},
1995
1996         /* **************** A-Field ******************************/
1997         /* ***** Header ***** */
1998                 { &hf_dect_A,
1999                 {"A-Field", "dect.afield", FT_BYTES, BASE_NONE, NULL,
2000                         0x0, NULL, HFILL}},
2001
2002                 { &hf_dect_A_Head,
2003                 {"A-Field Header", "dect.afield.head", FT_UINT8, BASE_HEX, NULL,
2004                         0x0, NULL, HFILL}},
2005
2006                 { &hf_dect_A_Head_TA_FP,
2007                 {"TA", "dect.afield.head.TA", FT_UINT8, BASE_DEC, VALS(TA_vals_FP),
2008                         0xE0, NULL, HFILL}},
2009
2010                 { &hf_dect_A_Head_TA_PP,
2011                 {"TA", "dect.afield.head.TA", FT_UINT8, BASE_DEC, VALS(TA_vals_PP),
2012                         0xE0, NULL, HFILL}},
2013
2014                 { &hf_dect_A_Head_Q1,
2015                 {"Q1", "dect.afield.head.Q1", FT_UINT8, BASE_DEC, NULL,
2016                         0x10, NULL, HFILL}},
2017
2018                 { &hf_dect_A_Head_BA,
2019                 {"BA", "dect.afield.head.BA", FT_UINT8, BASE_DEC, VALS(BA_vals),
2020                         0x0E, NULL, HFILL}},
2021
2022                 { &hf_dect_A_Head_Q2,
2023                 {"Q2", "dect.afield.head.Q2", FT_UINT8, BASE_DEC, NULL,
2024                         0x01, NULL, HFILL}},
2025
2026         /* ***** Tail ***** */
2027                 { &hf_dect_A_Tail,
2028                 {"A-Field Tail", "dect.afield.tail", FT_UINT8, BASE_DEC, NULL,
2029                         0xE0, NULL, HFILL}},
2030
2031         /* Nt */
2032                 { &hf_dect_A_Tail_Nt,
2033                 {"Nt/RFPI", "dect.afield.tail.Nt", FT_BYTES, BASE_NONE, NULL,
2034                         0x0, "A-Field Tail: Nt/RFPI", HFILL}},
2035
2036         /* Qt */
2037                 { &hf_dect_A_Tail_Qt_Qh,
2038                 {"Qh", "dect.afield.tail.Qt.Qh", FT_UINT8, BASE_DEC, VALS(QTHead_vals),
2039                         0xF0, NULL, HFILL}},
2040
2041         /* Qt Static System Information */
2042         /* Byte 0 */
2043                 { &hf_dect_A_Tail_Qt_0_Nr,
2044                 {"NR", "dect.afield.tail.Qt.NR", FT_UINT8, BASE_DEC, VALS(QTNormalReverse_vals),
2045                         0x10, NULL, HFILL}},
2046
2047                 { &hf_dect_A_Tail_Qt_0_Sn,
2048                 {"SN", "dect.afield.tail.Qt.SN", FT_UINT8, BASE_DEC, VALS(QTSlotNumber_vals),
2049                         0x0F, NULL, HFILL}},
2050
2051         /* Byte 1 */
2052                 { &hf_dect_A_Tail_Qt_0_Sp,
2053                 {"SP", "dect.afield.tail.Qt.SP", FT_UINT8, BASE_DEC, VALS(QTStartPosition_vals),
2054                         0xC0, NULL, HFILL}},
2055
2056                 { &hf_dect_A_Tail_Qt_0_Esc,
2057                 {"Esc", "dect.afield.tail.Qt.Esc", FT_UINT8, BASE_DEC, VALS(QTEscape_vals),
2058                         0x20, NULL, HFILL}},
2059
2060                 { &hf_dect_A_Tail_Qt_0_Txs,
2061                 {"Txs", "dect.afield.tail.Qt.Txs", FT_UINT8, BASE_DEC, VALS(QTTranceiver_vals),
2062                         0x18, NULL, HFILL}},
2063
2064                 { &hf_dect_A_Tail_Qt_0_Mc,
2065                 {"Mc", "dect.afield.tail.Qt.Mc", FT_UINT8, BASE_DEC, VALS(QTExtendedCarrier_vals),
2066                         0x04, NULL, HFILL}},
2067
2068         /* Byte 3 */
2069                 { &hf_dect_A_Tail_Qt_0_Spr1,
2070                 {"Spr", "dect.afield.tail.Qt.Spr1", FT_UINT8, BASE_DEC, VALS(QTSpr_vals),
2071                         0xC0, NULL, HFILL}},
2072
2073                 { &hf_dect_A_Tail_Qt_0_Cn,
2074                 {"CN", "dect.afield.tail.Qt.CN", FT_UINT8, BASE_DEC, VALS(QTCarrierNumber_vals),
2075                         0x3F, NULL, HFILL}},
2076
2077         /* Byte 4 */
2078                 { &hf_dect_A_Tail_Qt_0_Spr2,
2079                 {"Spr", "dect.afield.tail.Qt.Spr2", FT_UINT8, BASE_DEC, VALS(QTSpr_vals),
2080                         0xC0, NULL, HFILL}},
2081
2082                 { &hf_dect_A_Tail_Qt_0_PSCN,
2083                 {"PSCN", "dect.afield.tail.Qt.PSCN", FT_UINT8, BASE_DEC, VALS(QTScanCarrierNum_vals),
2084                         0x3F, NULL, HFILL}},
2085
2086         /* Qt Fixed Part Capabilities */
2087                 { &hf_dect_A_Tail_Qt_3_A12,
2088                 {"A12", "dect.afield.tail.Qt.Fp.A12", FT_UINT8, BASE_DEC, VALS(Qt_A12_vals),
2089                         0x08, NULL, HFILL}},
2090
2091                 { &hf_dect_A_Tail_Qt_3_A13,
2092                 {"A13", "dect.afield.tail.Qt.Fp.A13", FT_UINT8, BASE_DEC, VALS(Qt_A13_vals),
2093                         0x04, NULL, HFILL}},
2094
2095                 { &hf_dect_A_Tail_Qt_3_A14,
2096                 {"A14", "dect.afield.tail.Qt.Fp.A14", FT_UINT8, BASE_DEC, VALS(Qt_A14_vals),
2097                         0x02, NULL, HFILL}},
2098
2099                 { &hf_dect_A_Tail_Qt_3_A15,
2100                 {"A15", "dect.afield.tail.Qt.Fp.A15", FT_UINT8, BASE_DEC, VALS(Qt_A15_vals),
2101                         0x01, NULL, HFILL}},
2102
2103                 { &hf_dect_A_Tail_Qt_3_A16,
2104                 {"A16", "dect.afield.tail.Qt.Fp.A16", FT_UINT8, BASE_DEC, VALS(Qt_A16_vals),
2105                         0x80, NULL, HFILL}},
2106
2107                 { &hf_dect_A_Tail_Qt_3_A17,
2108                 {"A17", "dect.afield.tail.Qt.Fp.A17", FT_UINT8, BASE_DEC, VALS(Qt_A17_vals),
2109                         0x40, NULL, HFILL}},
2110
2111                 { &hf_dect_A_Tail_Qt_3_A18,
2112                 {"A18", "dect.afield.tail.Qt.Fp.A18", FT_UINT8, BASE_DEC, VALS(Qt_A18_vals),
2113                         0x20, NULL, HFILL}},
2114
2115                 { &hf_dect_A_Tail_Qt_3_A19,
2116                 {"A19", "dect.afield.tail.Qt.Fp.A19", FT_UINT8, BASE_DEC, VALS(Qt_A19_vals),
2117                         0x10, NULL, HFILL}},
2118
2119                 { &hf_dect_A_Tail_Qt_3_A20,
2120                 {"A20", "dect.afield.tail.Qt.Fp.A20", FT_UINT8, BASE_DEC, VALS(Qt_A20_vals),
2121                         0x08, NULL, HFILL}},
2122
2123                 { &hf_dect_A_Tail_Qt_3_A21,
2124                 {"A21", "dect.afield.tail.Qt.Fp.A21", FT_UINT8, BASE_DEC, VALS(Qt_A21_vals),
2125                         0x04, NULL, HFILL}},
2126
2127                 { &hf_dect_A_Tail_Qt_3_A22,
2128                 {"A22", "dect.afield.tail.Qt.Fp.A22", FT_UINT8, BASE_DEC, VALS(Qt_A22_vals),
2129                         0x02, NULL, HFILL}},
2130
2131                 { &hf_dect_A_Tail_Qt_3_A23,
2132                 {"A23", "dect.afield.tail.Qt.Fp.A23", FT_UINT8, BASE_DEC, VALS(Qt_A23_vals),
2133                         0x01, NULL, HFILL}},
2134
2135                 { &hf_dect_A_Tail_Qt_3_A24,
2136                 {"A24", "dect.afield.tail.Qt.Fp.A24", FT_UINT8, BASE_DEC, VALS(Qt_A24_vals),
2137                         0x80, NULL, HFILL}},
2138
2139                 { &hf_dect_A_Tail_Qt_3_A25,
2140                 {"A25", "dect.afield.tail.Qt.Fp.A25", FT_UINT8, BASE_DEC, VALS(Qt_A25_vals),
2141                         0x40, NULL, HFILL}},
2142
2143                 { &hf_dect_A_Tail_Qt_3_A26,
2144                 {"A26", "dect.afield.tail.Qt.Fp.A26", FT_UINT8, BASE_DEC, VALS(Qt_A26_vals),
2145                         0x20, NULL, HFILL}},
2146
2147                 { &hf_dect_A_Tail_Qt_3_A27,
2148                 {"A27", "dect.afield.tail.Qt.Fp.A27", FT_UINT8, BASE_DEC, VALS(Qt_A27_vals),
2149                         0x10, NULL, HFILL}},
2150
2151                 { &hf_dect_A_Tail_Qt_3_A28,
2152                 {"A28", "dect.afield.tail.Qt.Fp.A28", FT_UINT8, BASE_DEC, VALS(Qt_A28_vals),
2153                         0x08, NULL, HFILL}},
2154
2155                 { &hf_dect_A_Tail_Qt_3_A29,
2156                 {"A29", "dect.afield.tail.Qt.Fp.A29", FT_UINT8, BASE_DEC, VALS(Qt_A29_vals),
2157                         0x04, NULL, HFILL}},
2158
2159                 { &hf_dect_A_Tail_Qt_3_A30,
2160                 {"A30", "dect.afield.tail.Qt.Fp.A30", FT_UINT8, BASE_DEC, VALS(Qt_A30_vals),
2161                         0x02, NULL, HFILL}},
2162
2163                 { &hf_dect_A_Tail_Qt_3_A31,
2164                 {"A31", "dect.afield.tail.Qt.Fp.A31", FT_UINT8, BASE_DEC, VALS(Qt_A31_vals),
2165                         0x01, NULL, HFILL}},
2166
2167
2168                 /* higher layer capabilities */
2169                 { &hf_dect_A_Tail_Qt_3_A32,
2170                 {"A32", "dect.afield.tail.Qt.Fp.A32", FT_UINT8, BASE_DEC, VALS(Qt_A32_vals),
2171                         0x80, NULL, HFILL}},
2172
2173                 { &hf_dect_A_Tail_Qt_3_A33,
2174                 {"A33", "dect.afield.tail.Qt.Fp.A33", FT_UINT8, BASE_DEC, VALS(Qt_A33_vals),
2175                         0x40, NULL, HFILL}},
2176
2177                 { &hf_dect_A_Tail_Qt_3_A34,
2178                 {"A34", "dect.afield.tail.Qt.Fp.A34", FT_UINT8, BASE_DEC, VALS(Qt_A34_vals),
2179                         0x20, NULL, HFILL}},
2180
2181                 { &hf_dect_A_Tail_Qt_3_A35,
2182                 {"A35", "dect.afield.tail.Qt.Fp.A35", FT_UINT8, BASE_DEC, VALS(Qt_A35_vals),
2183                         0x10, NULL, HFILL}},
2184
2185                 { &hf_dect_A_Tail_Qt_3_A36,
2186                 {"A36", "dect.afield.tail.Qt.Fp.A36", FT_UINT8, BASE_DEC, VALS(Qt_A36_vals),
2187                         0x08, NULL, HFILL}},
2188
2189                 { &hf_dect_A_Tail_Qt_3_A37,
2190                 {"A37", "dect.afield.tail.Qt.Fp.A37", FT_UINT8, BASE_DEC, VALS(Qt_A37_vals),
2191                         0x04, NULL, HFILL}},
2192
2193                 { &hf_dect_A_Tail_Qt_3_A38,
2194                 {"A38", "dect.afield.tail.Qt.Fp.A38", FT_UINT8, BASE_DEC, VALS(Qt_A38_vals),
2195                         0x02, NULL, HFILL}},
2196
2197                 { &hf_dect_A_Tail_Qt_3_A39,
2198                 {"A39", "dect.afield.tail.Qt.Fp.A39", FT_UINT8, BASE_DEC, VALS(Qt_A39_vals),
2199                         0x01, NULL, HFILL}},
2200
2201                 { &hf_dect_A_Tail_Qt_3_A40,
2202                 {"A40", "dect.afield.tail.Qt.Fp.A40", FT_UINT8, BASE_DEC, VALS(Qt_A40_vals),
2203                         0x80, NULL, HFILL}},
2204
2205                 { &hf_dect_A_Tail_Qt_3_A41,
2206                 {"A41", "dect.afield.tail.Qt.Fp.A41", FT_UINT8, BASE_DEC, VALS(Qt_A41_vals),
2207                         0x40, NULL, HFILL}},
2208
2209                 { &hf_dect_A_Tail_Qt_3_A42,
2210                 {"A42", "dect.afield.tail.Qt.Fp.A42", FT_UINT8, BASE_DEC, VALS(Qt_A42_vals),
2211                         0x20, NULL, HFILL}},
2212
2213                 { &hf_dect_A_Tail_Qt_3_A43,
2214                 {"A43", "dect.afield.tail.Qt.Fp.A43", FT_UINT8, BASE_DEC, VALS(Qt_A43_vals),
2215                         0x10, NULL, HFILL}},
2216
2217                 { &hf_dect_A_Tail_Qt_3_A44,
2218                 {"A44", "dect.afield.tail.Qt.Fp.A44", FT_UINT8, BASE_DEC, VALS(Qt_A44_vals),
2219                         0x08, NULL, HFILL}},
2220
2221                 { &hf_dect_A_Tail_Qt_3_A45,
2222                 {"A45", "dect.afield.tail.Qt.Fp.A45", FT_UINT8, BASE_DEC, VALS(Qt_A45_vals),
2223                         0x04, NULL, HFILL}},
2224
2225                 { &hf_dect_A_Tail_Qt_3_A46,
2226                 {"A46", "dect.afield.tail.Qt.Fp.A46", FT_UINT8, BASE_DEC, VALS(Qt_A46_vals),
2227                         0x02, NULL, HFILL}},
2228
2229                 { &hf_dect_A_Tail_Qt_3_A47,
2230                 {"A47", "dect.afield.tail.Qt.Fp.A47", FT_UINT8, BASE_DEC, VALS(Qt_A47_vals),
2231                         0x01, NULL, HFILL}},
2232
2233         /* Qt Extended Fixed Part Capabilities */
2234
2235                 { &hf_dect_A_Tail_Qt_4_CRFPHops,
2236                 {"CRFP Hops", "dect.afield.tail.Qt.Efp.CRFPHops", FT_UINT8, BASE_DEC, VALS(Qt_CRFPHops_vals),
2237                         0x0C, NULL, HFILL}},
2238
2239                 { &hf_dect_A_Tail_Qt_4_CRFPEnc,
2240                 {"CRFP Enc", "dect.afield.tail.Qt.Efp.CRFPEnc", FT_UINT8, BASE_DEC, VALS(Qt_CRFPEnc_vals),
2241                         0x02, NULL, HFILL}},
2242
2243                 { &hf_dect_A_Tail_Qt_4_REFHops,
2244                 {"REP Hops", "dect.afield.tail.Qt.Efp.REPHops", FT_UINT16, BASE_DEC, VALS(Qt_REPHops_vals),
2245                         0x0180, NULL, HFILL}},
2246
2247                 { &hf_dect_A_Tail_Qt_4_REPCap,
2248                 {"REP Cap.", "dect.afield.tail.Qt.Efp.REPCap", FT_UINT8, BASE_DEC, VALS(Qt_REPCap_vals),
2249                         0x40, NULL, HFILL}},
2250
2251                 { &hf_dect_A_Tail_Qt_4_Sync,
2252                 {"Sync", "dect.afield.tail.Qt.Efp.Sync", FT_UINT8, BASE_DEC, VALS(Qt_Sync_vals),
2253                         0x30, NULL, HFILL}},
2254
2255                 { &hf_dect_A_Tail_Qt_4_A20,
2256                 {"A20", "dect.afield.tail.Qt.Efp.A20", FT_UINT8, BASE_DEC, VALS(Qt_EA20_vals),
2257                         0x08, NULL, HFILL}},
2258
2259                 { &hf_dect_A_Tail_Qt_4_MACSusp,
2260                 {"MAC Suspend", "dect.afield.tail.Qt.Efp.MACSusp", FT_UINT8, BASE_DEC, VALS(Qt_MACSusp_vals),
2261                         0x04, NULL, HFILL}},
2262
2263                 { &hf_dect_A_Tail_Qt_4_MACIpq,
2264                 {"MAC Ipq", "dect.afield.tail.Qt.Efp.MACIpq", FT_UINT8, BASE_DEC, VALS(Qt_MACIpq_vals),
2265                         0x02, NULL, HFILL}},
2266
2267                 { &hf_dect_A_Tail_Qt_4_A23,
2268                 {"A23", "dect.afield.tail.Qt.Efp.A23", FT_UINT8, BASE_DEC, VALS(Qt_EA23_vals),
2269                         0x01, NULL, HFILL}},
2270
2271                 { &hf_dect_A_Tail_Qt_4_A24,
2272                 {"A24", "dect.afield.tail.Qt.Efp.A24", FT_UINT8, BASE_DEC, VALS(Qt_EA24_vals),
2273                         0x80, NULL, HFILL}},
2274
2275
2276                 /* Higher Layer Capabilities */
2277
2278                 { &hf_dect_A_Tail_Qt_4_A25,
2279                 {"A25", "dect.afield.tail.Qt.Efp.A25", FT_UINT8, BASE_DEC, VALS(Qt_EA25_vals),
2280                         0x40, NULL, HFILL}},
2281
2282                 { &hf_dect_A_Tail_Qt_4_A26,
2283                 {"A26", "dect.afield.tail.Qt.Efp.A26", FT_UINT8, BASE_DEC, VALS(Qt_EA26_vals),
2284                         0x20, NULL, HFILL}},
2285
2286                 { &hf_dect_A_Tail_Qt_4_A27,
2287                 {"A27", "dect.afield.tail.Qt.Efp.A27", FT_UINT8, BASE_DEC, VALS(Qt_EA27_vals),
2288                         0x10, NULL, HFILL}},
2289
2290                 { &hf_dect_A_Tail_Qt_4_A28,
2291                 {"A28", "dect.afield.tail.Qt.Efp.A28", FT_UINT8, BASE_DEC, VALS(Qt_EA28_vals),
2292                         0x08, NULL, HFILL}},
2293
2294                 { &hf_dect_A_Tail_Qt_4_A29,
2295                 {"A29", "dect.afield.tail.Qt.Efp.A29", FT_UINT8, BASE_DEC, VALS(Qt_EA29_vals),
2296                         0x04, NULL, HFILL}},
2297
2298                 { &hf_dect_A_Tail_Qt_4_A30,
2299                 {"A30", "dect.afield.tail.Qt.Efp.A30", FT_UINT8, BASE_DEC, VALS(Qt_EA30_vals),
2300                         0x02, NULL, HFILL}},
2301
2302                 { &hf_dect_A_Tail_Qt_4_A31,
2303                 {"A31", "dect.afield.tail.Qt.Efp.A31", FT_UINT8, BASE_DEC, VALS(Qt_EA31_vals),
2304                         0x01, NULL, HFILL}},
2305
2306                 { &hf_dect_A_Tail_Qt_4_A32,
2307                 {"A32", "dect.afield.tail.Qt.Efp.A32", FT_UINT8, BASE_DEC, VALS(Qt_EA32_vals),
2308                         0x80, NULL, HFILL}},
2309
2310                 { &hf_dect_A_Tail_Qt_4_A33,
2311                 {"A33", "dect.afield.tail.Qt.Efp.A33", FT_UINT8, BASE_DEC, VALS(Qt_EA33_vals),
2312                         0x40, NULL, HFILL}},
2313
2314                 { &hf_dect_A_Tail_Qt_4_A34,
2315                 {"A34", "dect.afield.tail.Qt.Efp.A34", FT_UINT8, BASE_DEC, VALS(Qt_EA34_vals),
2316                         0x20, NULL, HFILL}},
2317
2318                 { &hf_dect_A_Tail_Qt_4_A35,
2319                 {"A35", "dect.afield.tail.Qt.Efp.A35", FT_UINT8, BASE_DEC, VALS(Qt_EA35_vals),
2320                         0x10, NULL, HFILL}},
2321
2322                 { &hf_dect_A_Tail_Qt_4_A36,
2323                 {"A36", "dect.afield.tail.Qt.Efp.A36", FT_UINT8, BASE_DEC, VALS(Qt_EA36_vals),
2324                         0x08, NULL, HFILL}},
2325
2326                 { &hf_dect_A_Tail_Qt_4_A37,
2327                 {"A37", "dect.afield.tail.Qt.Efp.A37", FT_UINT8, BASE_DEC, VALS(Qt_EA37_vals),
2328                         0x04, NULL, HFILL}},
2329
2330                 { &hf_dect_A_Tail_Qt_4_A38,
2331                 {"A38", "dect.afield.tail.Qt.Efp.A38", FT_UINT8, BASE_DEC, VALS(Qt_EA38_vals),
2332                         0x02, NULL, HFILL}},
2333
2334                 { &hf_dect_A_Tail_Qt_4_A39,
2335                 {"A39", "dect.afield.tail.Qt.Efp.A39", FT_UINT8, BASE_DEC, VALS(Qt_EA39_vals),
2336                         0x01, NULL, HFILL}},
2337
2338                 { &hf_dect_A_Tail_Qt_4_A40,
2339                 {"A40", "dect.afield.tail.Qt.Efp.A40", FT_UINT8, BASE_DEC, VALS(Qt_EA40_vals),
2340                         0x80, NULL, HFILL}},
2341
2342                 { &hf_dect_A_Tail_Qt_4_A41,
2343                 {"A41", "dect.afield.tail.Qt.Efp.A41", FT_UINT8, BASE_DEC, VALS(Qt_EA41_vals),
2344                         0x40, NULL, HFILL}},
2345
2346                 { &hf_dect_A_Tail_Qt_4_A42,
2347                 {"A42", "dect.afield.tail.Qt.Efp.A42", FT_UINT8, BASE_DEC, VALS(Qt_EA42_vals),
2348                         0x20, NULL, HFILL}},
2349
2350                 { &hf_dect_A_Tail_Qt_4_A43,
2351                 {"A43", "dect.afield.tail.Qt.Efp.A43", FT_UINT8, BASE_DEC, VALS(Qt_EA43_vals),
2352                         0x10, NULL, HFILL}},
2353
2354                 { &hf_dect_A_Tail_Qt_4_A44,
2355                 {"A44", "dect.afield.tail.Qt.Efp.A44", FT_UINT8, BASE_DEC, VALS(Qt_EA44_vals),
2356                         0x08, NULL, HFILL}},
2357
2358                 { &hf_dect_A_Tail_Qt_4_A45,
2359                 {"A45", "dect.afield.tail.Qt.Efp.A45", FT_UINT8, BASE_DEC, VALS(Qt_EA45_vals),
2360                         0x04, NULL, HFILL}},
2361
2362                 { &hf_dect_A_Tail_Qt_4_A46,
2363                 {"A46", "dect.afield.tail.Qt.Efp.A46", FT_UINT8, BASE_DEC, VALS(Qt_EA46_vals),
2364                         0x02, NULL, HFILL}},
2365
2366                 { &hf_dect_A_Tail_Qt_4_A47,
2367                 {"A47", "dect.afield.tail.Qt.Efp.A47", FT_UINT8, BASE_DEC, VALS(Qt_EA47_vals),
2368                         0x01, NULL, HFILL}},
2369
2370
2371         /* Qt Multiframe  Number */
2372                 { &hf_dect_A_Tail_Qt_6_Spare,
2373                 {"Spare Bits", "dect.afield.tail.Qt.Mfn.Spare", FT_UINT16, BASE_HEX, NULL,
2374                         0x0FFF, NULL, HFILL}},
2375
2376                 { &hf_dect_A_Tail_Qt_6_Mfn,
2377                 {"Multiframe Number", "dect.afield.tail.Qt.Mfn.Mfn", FT_BYTES, BASE_NONE, NULL,
2378                         0, NULL, HFILL}},
2379
2380
2381         /* Mt */
2382                 { &hf_dect_A_Tail_Mt_Mh,
2383                 {"Mh", "dect.afield.tail.Mt.Mh", FT_UINT8, BASE_DEC, VALS(MTHead_vals),
2384                         0xF0, NULL, HFILL}},
2385
2386                 { &hf_dect_A_Tail_Mt_Mh_fmid,
2387                 {"Mh/FMID", "dect.afield.tail.Mt.Mh.fmid", FT_UINT16, BASE_HEX, BASE_NONE,
2388                         0x0FF0, NULL, HFILL}},
2389
2390                 { &hf_dect_A_Tail_Mt_Mh_pmid,
2391                 {"Mh/PMID", "dect.afield.tail.Mt.Mh.pmid", FT_UINT24, BASE_HEX, BASE_NONE,
2392                         0x0FFFFF, NULL, HFILL}},
2393
2394         /* Mt Basic Connection Control */
2395                 { &hf_dect_A_Tail_Mt_BasicConCtrl,
2396                 {"Cmd", "dect.afield.tail.Mt.BasicConCtrl", FT_UINT8, BASE_DEC, VALS(MTBasicConCtrl_vals),
2397                         0x0F, NULL, HFILL}},
2398
2399         /* Mt Encryption Control */
2400                 { &hf_dect_A_Tail_Mt_Encr_Cmd1,
2401                 {"Cmd1", "dect.afield.tail.Mt.Encr.Cmd1", FT_UINT8, BASE_DEC, VALS(MTEncrCmd1_vals),
2402                         0x0C, NULL, HFILL}},
2403
2404                 { &hf_dect_A_Tail_Mt_Encr_Cmd2,
2405                 {"Cmd2", "dect.afield.tail.Mt.Encr.Cmd2", FT_UINT8, BASE_DEC, VALS(MTEncrCmd2_vals),
2406                         0x03, NULL, HFILL}},
2407
2408         /* Pt */
2409                 { &hf_dect_A_Tail_Pt_ExtFlag,
2410                 {"ExtFlag", "dect.afield.tail.Pt.ExtFlag", FT_UINT8, BASE_DEC, VALS(PTExtFlag_vals),
2411                         0x80, NULL, HFILL}},
2412
2413                 { &hf_dect_A_Tail_Pt_SDU,
2414                 {"SDU", "dect.afield.tail.Pt.SDU", FT_UINT8, BASE_DEC, VALS(PTSDU_vals),
2415                         0x70, NULL, HFILL}},
2416
2417                 { &hf_dect_A_Tail_Pt_InfoType,
2418                 {"InfoType", "dect.afield.tail.Pt.InfoType", FT_UINT8, BASE_DEC, VALS(PTInfoType_vals),
2419                         0xF0, NULL, HFILL}},
2420
2421                 { &hf_dect_A_Tail_Pt_Fill_Fillbits,
2422                 {"FillBits", "dect.afield.tail.Pt.InfoType.FillBits", FT_UINT8, BASE_DEC, NULL,
2423                         0x0, NULL, HFILL}},
2424
2425                 { &hf_dect_A_Tail_Pt_Bearer_Sn,
2426                 {"SN", "dect.afield.tail.Pt.SN", FT_UINT8, BASE_DEC, VALS(QTSlotNumber_vals),
2427                         0x0F, NULL, HFILL}},
2428
2429                 { &hf_dect_A_Tail_Pt_Bearer_Sp,
2430                 {"SP", "dect.afield.tail.Pt.SP", FT_UINT8, BASE_DEC, VALS(QTStartPosition_vals),
2431                         0xC0, NULL, HFILL}},
2432
2433                 { &hf_dect_A_Tail_Pt_Bearer_Cn,
2434                 {"CN", "dect.afield.tail.Pt.CN", FT_UINT8, BASE_DEC, VALS(QTCarrierNumber_vals),
2435                         0x3F, NULL, HFILL}},
2436
2437         /* ***** R-CRC ***** */
2438                 { &hf_dect_A_RCRC,
2439                 {"A-Field R-CRC", "dect.afield.rcrc", FT_UINT8, BASE_DEC, NULL,
2440                         0x0, NULL, HFILL}},
2441
2442         /* ***************** B-Field *************************** */
2443                 { &hf_dect_B,
2444                 {"B-Field", "dect.bfield", FT_BYTES, BASE_NONE,
2445                         NULL, 0x0, NULL, HFILL}},
2446
2447                 { &hf_dect_B_Data,
2448                 {"B-Field", "dect.bfield.data", FT_BYTES, BASE_NONE, NULL,
2449                         0x0, NULL, HFILL}},
2450
2451                 { &hf_dect_B_fn,
2452                 {"B-Field", "dect.bfield.framenumber", FT_NONE, BASE_NONE, NULL,
2453                         0x0, NULL, HFILL}},
2454
2455         /* ***** X-CRC ***** */
2456                 { &hf_dect_B_XCRC,
2457                 {"B-Field X-CRC", "dect.bfield.xcrc", FT_UINT8, BASE_DEC, NULL,
2458                         0x0, NULL, HFILL}}
2459         };
2460
2461
2462         /* Setup protocol subtree array */
2463         static gint *ett[]=
2464         {
2465                 &ett_dect,
2466                 &ett_ahead,
2467                 &ett_afield,
2468                 &ett_atail,
2469                 &ett_aqt,
2470                 &ett_bfield
2471         };
2472
2473         proto_dect=proto_register_protocol("DECT Protocol", "DECT", "dect");
2474         proto_register_field_array(proto_dect, hf, array_length(hf));
2475         proto_register_subtree_array(ett, array_length(ett));
2476 }
2477
2478 void
2479 proto_reg_handoff_dect(void)
2480 {
2481         dissector_handle_t dect_handle;
2482
2483         dect_handle = create_dissector_handle(dissect_dect, proto_dect);
2484         dissector_add("ethertype", ETHERTYPE_DECT , dect_handle);
2485 }
2486