/src/wireshark/epan/dissectors/packet-kdsp.c
Line | Count | Source |
1 | | /* packet-kdsp.c |
2 | | * Routines for Kismet Drone/Server Protocol packet disassembly |
3 | | * By Kyle Feuz <kyle.feuz@aggiemail.usu.edu> |
4 | | * Copyright 2011 Kyle Feuz |
5 | | * |
6 | | * Wireshark - Network traffic analyzer |
7 | | * By Gerald Combs <gerald@wireshark.org> |
8 | | * Copyright 1998 Gerald Combs |
9 | | * |
10 | | * SPDX-License-Identifier: GPL-2.0-or-later |
11 | | */ |
12 | | |
13 | | #include "config.h" |
14 | | |
15 | | #include <epan/packet.h> |
16 | | #include <epan/expert.h> |
17 | | #include "packet-tcp.h" |
18 | | |
19 | | void proto_register_kdsp(void); |
20 | | void proto_reg_handoff_kdsp(void); |
21 | | |
22 | | static dissector_handle_t kdsp_handle; |
23 | | |
24 | 16 | #define KDSP_PORT 2502 /* Not IANA registered */ |
25 | 123 | #define FRAME_HEADER_LEN 12 |
26 | | |
27 | 50 | #define CMD_NULL 0 |
28 | 1 | #define HELLO 1 |
29 | 0 | #define STRING 2 |
30 | 0 | #define CAPPACKET 3 |
31 | 17 | #define CHANNELSET 4 |
32 | 1 | #define SOURCE 5 |
33 | 0 | #define REPORT 6 |
34 | | |
35 | 16 | #define CPT_FLAG 0x80000000 |
36 | 16 | #define FCS_FLAG 0x00000004 |
37 | 16 | #define GPS_FLAG 0x00000002 |
38 | 16 | #define RADIO_FLAG 0x00000001 |
39 | | |
40 | | #define RADIO_ACCURACY_FLAG 0x000000 |
41 | | #define RADIO_FREQ_MHZ_FLAG 0x000000 |
42 | | #define RADIO_SIGNAL_DBM_FLAG 0x000000 |
43 | | #define RADIO_NOISE_DBM_FLAG 0x000000 |
44 | | #define RADIO_CARRIER_FLAG 0x000000 |
45 | | #define RADIO_ENCODING_FLAG 0x000000 |
46 | | #define RADIO_DATARATE_FLAG 0x000000 |
47 | | #define RADIO_SIGNAL_RSSI_FLAG 0x000000 |
48 | | #define RADIO_NOISE_RSSI_FLAG 0x000000 |
49 | | |
50 | | #define GPS_FIX_FLAG 0x000000 |
51 | | #define GPS_LAT_FLAG 0x000000 |
52 | | #define GPS_LON_FLAG 0x000000 |
53 | | #define GPS_ALT_FLAG 0x000000 |
54 | | #define GPS_SPD_FLAG 0x000000 |
55 | | #define GPS_HEADING_FLAG 0x000000 |
56 | | |
57 | 16 | #define DATA_UUID_FLAG 0x00000010 |
58 | 16 | #define DATA_PACKLEN_FLAG 0x00000008 |
59 | 16 | #define DATA_TVSEC_FLAG 0x00000004 |
60 | 16 | #define DATA_TVUSEC_FLAG 0x00000002 |
61 | 16 | #define DATA_DLT_FLAG 0x00000001 |
62 | | |
63 | 16 | #define CH_UUID_FLAG 0x00000001 |
64 | 16 | #define CH_CMD_FLAG 0x00000002 |
65 | 16 | #define CH_CURCH_FLAG 0x00000004 |
66 | 16 | #define CH_HOP_FLAG 0x00000008 |
67 | 16 | #define CH_NUMCH_FLAG 0x00000010 |
68 | 16 | #define CH_CHANNELS_FLAG 0x00000020 |
69 | 16 | #define CH_DWELL_FLAG 0x00000040 |
70 | 16 | #define CH_RATE_FLAG 0x00000080 |
71 | 16 | #define CH_HOPDWELL_FLAG 0x00000100 |
72 | | |
73 | | #define SRC_UUID_FLAG 0x00000001 |
74 | | #define SRC_INVALID_FLAG 0x00000002 |
75 | | #define SRC_NAMESTR_FLAG 0x00000004 |
76 | | #define SRC_INTSTR_FLAG 0x00000008 |
77 | | #define SRC_TYPESTR_FLAG 0x00000010 |
78 | | #define SRC_HOP_FLAG 0x00000020 |
79 | | #define SRC_DWELL_FLAG 0x00000040 |
80 | | #define SRC_RATE_FLAG 0x00000080 |
81 | | |
82 | | #define REPORT_UUID_FLAG 0x000000 |
83 | | #define REPORT_FLAGS_FLAG 0x000000 |
84 | | #define REPORT_HOP_TM_SEC_FLAG 0x000000 |
85 | | #define REPORT_HOP_TM_USEC_FLAG 0x000000 |
86 | | |
87 | 16 | #define DATALINK_WLAN 0x69 |
88 | 16 | #define DATALINK_RADIOTAP 0x7F |
89 | | |
90 | | static int proto_kdsp; |
91 | | |
92 | | static dissector_table_t subdissector_dlt_table; |
93 | | |
94 | | static const value_string packettypenames[] = { |
95 | | {0, "NULL"}, |
96 | | {1, "HELLO"}, |
97 | | {2, "STRING"}, |
98 | | {3, "CAPPACKET"}, |
99 | | {4, "CHANNELSET"}, |
100 | | {5, "SOURCE"}, |
101 | | {6, "REPORT"}, |
102 | | {0, NULL} |
103 | | }; |
104 | | |
105 | | static const value_string payloadtypenames[] = { |
106 | | {DATALINK_WLAN, "802.11"}, |
107 | | {DATALINK_RADIOTAP, "RADIOTAP"}, |
108 | | {0, NULL} |
109 | | }; |
110 | | |
111 | | static const value_string channelcmds[] = { |
112 | | {0, "NONE"}, |
113 | | {1, "SET HOP"}, |
114 | | {2, "SET VECTOR"}, |
115 | | {3, "SET CURRENT"}, |
116 | | {4, "SET HOP/DWELL"}, |
117 | | {0, NULL} |
118 | | }; |
119 | | |
120 | | |
121 | | static int hf_kdsp_sentinel; |
122 | | static int hf_kdsp_cmdnum; |
123 | | static int hf_kdsp_length; |
124 | | |
125 | | static int hf_kdsp_version; |
126 | | static int hf_kdsp_server_version; |
127 | | static int hf_kdsp_hostname; |
128 | | |
129 | | static int hf_kdsp_str_flags; |
130 | | static int hf_kdsp_str_len; |
131 | | static int hf_kdsp_str_msg; |
132 | | |
133 | | static int hf_kdsp_cpt_bitmap; |
134 | | static int hf_kdsp_cpt_flag_cpt; |
135 | | static int hf_kdsp_cpt_flag_fcs; |
136 | | static int hf_kdsp_cpt_flag_gps; |
137 | | static int hf_kdsp_cpt_flag_radio; |
138 | | static int hf_kdsp_cpt_offset; |
139 | | |
140 | | static int hf_kdsp_fcs; |
141 | | static int hf_kdsp_fcs_data; |
142 | | |
143 | | static int hf_kdsp_radio_hdr; |
144 | | static int hf_kdsp_radio_hdr_len; |
145 | | static int hf_kdsp_radio_content_bitmap; |
146 | | static int hf_kdsp_radio_accuracy; |
147 | | static int hf_kdsp_radio_freq_mhz; |
148 | | static int hf_kdsp_radio_signal_dbm; |
149 | | static int hf_kdsp_radio_noise_dbm; |
150 | | static int hf_kdsp_radio_carrier; |
151 | | static int hf_kdsp_radio_encoding; |
152 | | static int hf_kdsp_radio_datarate; |
153 | | static int hf_kdsp_radio_signal_rssi; |
154 | | static int hf_kdsp_radio_noise_rssi; |
155 | | |
156 | | static int hf_kdsp_gps_hdr; |
157 | | static int hf_kdsp_gps_hdr_len; |
158 | | static int hf_kdsp_gps_content_bitmap; |
159 | | static int hf_kdsp_gps_fix; |
160 | | static int hf_kdsp_gps_lat; |
161 | | static int hf_kdsp_gps_lon; |
162 | | static int hf_kdsp_gps_alt; |
163 | | static int hf_kdsp_gps_spd; |
164 | | static int hf_kdsp_gps_heading; |
165 | | |
166 | | static int hf_kdsp_cpt_data_hdr; |
167 | | static int hf_kdsp_cpt_data_hdr_len; |
168 | | static int hf_kdsp_cpt_data_content_bitmap; |
169 | | static int hf_kdsp_cpt_dc_flag_uuid; |
170 | | static int hf_kdsp_cpt_dc_flag_len; |
171 | | static int hf_kdsp_cpt_dc_flag_sec; |
172 | | static int hf_kdsp_cpt_dc_flag_usec; |
173 | | static int hf_kdsp_cpt_dc_flag_dlt; |
174 | | static int hf_kdsp_cpt_uuid; |
175 | | static int hf_kdsp_cpt_packet_len; |
176 | | static int hf_kdsp_cpt_tv; |
177 | | static int hf_kdsp_cpt_tv_sec; |
178 | | static int hf_kdsp_cpt_tv_usec; |
179 | | static int hf_kdsp_cpt_dlt; |
180 | | |
181 | | static int hf_kdsp_ch_length; |
182 | | static int hf_kdsp_ch_bitmap; |
183 | | static int hf_kdsp_ch_flag_uuid; |
184 | | static int hf_kdsp_ch_flag_cmd; |
185 | | static int hf_kdsp_ch_flag_curch; |
186 | | static int hf_kdsp_ch_flag_hop; |
187 | | static int hf_kdsp_ch_flag_numch; |
188 | | static int hf_kdsp_ch_flag_channels; |
189 | | static int hf_kdsp_ch_flag_dwell; |
190 | | static int hf_kdsp_ch_flag_rate; |
191 | | static int hf_kdsp_ch_flag_hopdwell; |
192 | | static int hf_kdsp_ch_uuid; |
193 | | static int hf_kdsp_ch_cmd; |
194 | | static int hf_kdsp_ch_cur_ch; |
195 | | static int hf_kdsp_ch_hop; |
196 | | static int hf_kdsp_ch_num_ch; |
197 | | static int hf_kdsp_ch_data; |
198 | | static int hf_kdsp_ch_ch; |
199 | | static int hf_kdsp_ch_dwell; |
200 | | static int hf_kdsp_ch_start; |
201 | | static int hf_kdsp_ch_end; |
202 | | static int hf_kdsp_ch_width; |
203 | | static int hf_kdsp_ch_iter; |
204 | | static int hf_kdsp_ch_rate; |
205 | | static int hf_kdsp_ch_ch_dwell; |
206 | | |
207 | | static int hf_kdsp_source_length; |
208 | | static int hf_kdsp_source_bitmap; |
209 | | static int hf_kdsp_source_uuid; |
210 | | static int hf_kdsp_source_invalidate; |
211 | | static int hf_kdsp_source_name; |
212 | | static int hf_kdsp_source_interface; |
213 | | static int hf_kdsp_source_type; |
214 | | static int hf_kdsp_source_hop; |
215 | | static int hf_kdsp_source_dwell; |
216 | | static int hf_kdsp_source_rate; |
217 | | |
218 | | static int hf_kdsp_report_hdr_len; |
219 | | static int hf_kdsp_report_content_bitmap; |
220 | | static int hf_kdsp_report_uuid; |
221 | | static int hf_kdsp_report_flags; |
222 | | static int hf_kdsp_report_hop_tm_sec; |
223 | | static int hf_kdsp_report_hop_tm_usec; |
224 | | |
225 | | static int ett_kdsp_pdu; |
226 | | static int ett_cpt_bitmap; |
227 | | static int ett_cpt_data_content_bitmap; |
228 | | static int ett_cpt_tv; |
229 | | static int ett_ch_bitmap; |
230 | | static int ett_ch_data; |
231 | | static int ett_sub_fcs; |
232 | | static int ett_sub_radio; |
233 | | static int ett_sub_gps; |
234 | | static int ett_sub_cpt; |
235 | | |
236 | | static expert_field ei_kdsp_payload_expected; |
237 | | static expert_field ei_kdsp_payload_unexpected; |
238 | | static expert_field ei_kdsp_cpt_data_hdr_len; |
239 | | static expert_field ei_kdsp_cmdnum; |
240 | | |
241 | | /* determine PDU length of protocol */ |
242 | | static unsigned |
243 | | get_kdsp_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, |
244 | | int offset, void *data _U_) |
245 | 85 | { |
246 | 85 | return tvb_get_ntohl(tvb, offset+8) + FRAME_HEADER_LEN; /* length is at offset 8 */ |
247 | 85 | } |
248 | | |
249 | | /* This method dissects fully reassembled messages */ |
250 | | static int |
251 | | dissect_kdsp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) |
252 | 82 | { |
253 | 82 | uint32_t offset = 0; |
254 | 82 | uint32_t command, length, numChan, bitmap, cptbitmap; |
255 | 82 | uint32_t i, datalink_type=0, payload_len; |
256 | 82 | uint16_t type, reported_payload_len=0, data_hdr_len, data_hdr_len_check; |
257 | 82 | proto_item *kdsp_item, *sub_item, *subsub_item, *data_len_item, *command_item; |
258 | 82 | proto_tree *kdsp_tree, *sub_tree, *subsub_tree; |
259 | 82 | tvbuff_t *payload_tvb; |
260 | 82 | char* str_command; |
261 | | |
262 | 82 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "KDSP"); |
263 | 82 | col_clear(pinfo->cinfo, COL_INFO); |
264 | | |
265 | 82 | kdsp_item = proto_tree_add_item(tree, proto_kdsp, tvb, 0, -1, ENC_NA); |
266 | 82 | kdsp_tree = proto_item_add_subtree(kdsp_item, ett_kdsp_pdu); |
267 | 82 | proto_tree_add_item(kdsp_tree, hf_kdsp_sentinel, tvb, offset, 4, ENC_BIG_ENDIAN); |
268 | 82 | offset += 4; |
269 | 82 | command_item = proto_tree_add_item_ret_uint(kdsp_tree, hf_kdsp_cmdnum, tvb, offset, 4, ENC_BIG_ENDIAN, &command); |
270 | 82 | offset += 4; |
271 | 82 | str_command = val_to_str(pinfo->pool, command, packettypenames, "Unknown (0x%02x)"); |
272 | 82 | proto_item_append_text(kdsp_item, ", Command %s", str_command); |
273 | 82 | col_add_fstr(pinfo->cinfo, COL_INFO, "Command %s; ", str_command); |
274 | 82 | col_set_fence(pinfo->cinfo, COL_INFO); |
275 | | |
276 | 82 | proto_tree_add_item_ret_uint(kdsp_tree, hf_kdsp_length, tvb, offset, 4, ENC_BIG_ENDIAN, &length); |
277 | 82 | offset += 4; |
278 | | |
279 | 82 | switch(command) |
280 | 82 | { |
281 | 50 | case CMD_NULL: |
282 | 50 | break; |
283 | 1 | case HELLO: |
284 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_version, tvb, offset, 4, ENC_BIG_ENDIAN); |
285 | 1 | offset +=4; |
286 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_server_version, |
287 | 1 | tvb, offset, 32, ENC_ASCII); |
288 | 1 | offset +=32; |
289 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_hostname, tvb, offset, 32, ENC_ASCII); |
290 | | /*offset +=32;*/ |
291 | 1 | break; |
292 | 0 | case STRING: |
293 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_str_flags, tvb, offset, 4, ENC_BIG_ENDIAN); |
294 | 0 | offset +=4; |
295 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_str_len, tvb, offset, 4, ENC_BIG_ENDIAN); |
296 | 0 | offset +=4; |
297 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_str_msg, tvb, offset, -1, ENC_ASCII); |
298 | 0 | break; |
299 | 0 | case CAPPACKET: |
300 | 0 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_cpt_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
301 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_cpt_bitmap); |
302 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_flag_cpt, tvb, offset, 4, ENC_BIG_ENDIAN); |
303 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_flag_fcs, tvb, offset, 4, ENC_BIG_ENDIAN); |
304 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_flag_gps, tvb, offset, 4, ENC_BIG_ENDIAN); |
305 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_flag_radio, tvb, offset, 4, ENC_BIG_ENDIAN); |
306 | 0 | bitmap = tvb_get_ntohl(tvb, offset); |
307 | 0 | offset +=4; |
308 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_cpt_offset, tvb, offset, 4, ENC_BIG_ENDIAN); |
309 | 0 | offset +=4; |
310 | 0 | if (bitmap & FCS_FLAG) { |
311 | 0 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_fcs, tvb, offset, 4, ENC_NA); |
312 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_sub_fcs); |
313 | |
|
314 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_fcs_data, tvb, offset, 4, ENC_BIG_ENDIAN); |
315 | 0 | offset += 4; |
316 | 0 | } |
317 | 0 | if (bitmap & RADIO_FLAG) { |
318 | 0 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_radio_hdr, tvb, offset, 30, ENC_NA); |
319 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_sub_radio); |
320 | |
|
321 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_hdr_len, tvb, offset, 2, ENC_BIG_ENDIAN); |
322 | 0 | offset += 2; |
323 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_content_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
324 | 0 | offset += 4; |
325 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_accuracy, tvb, offset, 2, ENC_BIG_ENDIAN); |
326 | 0 | offset += 2; |
327 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_freq_mhz, tvb, offset, 2, ENC_BIG_ENDIAN); |
328 | 0 | offset += 2; |
329 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_signal_dbm, tvb, offset, 2, ENC_BIG_ENDIAN); |
330 | 0 | offset += 2; |
331 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_noise_dbm, tvb, offset, 2, ENC_BIG_ENDIAN); |
332 | 0 | offset += 2; |
333 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_carrier, tvb, offset, 4, ENC_BIG_ENDIAN); |
334 | 0 | offset += 4; |
335 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_encoding, tvb, offset, 4, ENC_BIG_ENDIAN); |
336 | 0 | offset += 4; |
337 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_datarate, tvb, offset, 4, ENC_BIG_ENDIAN); |
338 | 0 | offset += 4; |
339 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_signal_rssi, tvb, offset, 2, ENC_BIG_ENDIAN); |
340 | 0 | offset += 2; |
341 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_radio_noise_rssi, tvb, offset, 2, ENC_BIG_ENDIAN); |
342 | 0 | offset += 2; |
343 | 0 | } |
344 | 0 | if (bitmap & GPS_FLAG) { |
345 | 0 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_gps_hdr, tvb, offset, 68, ENC_NA); |
346 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_sub_gps); |
347 | |
|
348 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_hdr_len, tvb, offset, 2, ENC_BIG_ENDIAN); |
349 | 0 | offset += 2; |
350 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_content_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
351 | 0 | offset += 4; |
352 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_fix, tvb, offset, 2, ENC_BIG_ENDIAN); |
353 | 0 | offset += 2; |
354 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_lat, tvb, offset, 12, ENC_NA); |
355 | 0 | offset += 12; |
356 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_lon, tvb, offset, 12, ENC_NA); |
357 | 0 | offset += 12; |
358 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_alt, tvb, offset, 12, ENC_NA); |
359 | 0 | offset += 12; |
360 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_spd, tvb, offset, 12, ENC_NA); |
361 | 0 | offset += 12; |
362 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_gps_heading, tvb, offset, 12, ENC_NA); |
363 | 0 | offset += 12; |
364 | 0 | } |
365 | 0 | if (bitmap & CPT_FLAG) { |
366 | 0 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_cpt_data_hdr, tvb, offset, 44, ENC_NA); |
367 | 0 | sub_tree = proto_item_add_subtree(sub_item, ett_sub_cpt); |
368 | |
|
369 | 0 | data_len_item = proto_tree_add_item_ret_uint16(sub_tree, hf_kdsp_cpt_data_hdr_len, tvb, offset, 2, ENC_BIG_ENDIAN, &data_hdr_len); |
370 | 0 | offset += 2; |
371 | |
|
372 | 0 | subsub_item = proto_tree_add_item(sub_tree, hf_kdsp_cpt_data_content_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
373 | 0 | subsub_tree = proto_item_add_subtree(subsub_item, ett_cpt_data_content_bitmap); |
374 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_dc_flag_uuid, tvb, offset, 4, ENC_BIG_ENDIAN); |
375 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_dc_flag_len, tvb, offset, 4, ENC_BIG_ENDIAN); |
376 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_dc_flag_sec, tvb, offset, 4, ENC_BIG_ENDIAN); |
377 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_dc_flag_usec, tvb, offset, 4, ENC_BIG_ENDIAN); |
378 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_dc_flag_dlt, tvb, offset, 4, ENC_BIG_ENDIAN); |
379 | 0 | cptbitmap = tvb_get_ntohl(tvb, offset); |
380 | 0 | offset += 4; |
381 | |
|
382 | 0 | data_hdr_len_check = 6; /* len(len) + len(bitmap) */ |
383 | 0 | if (cptbitmap & DATA_UUID_FLAG) data_hdr_len_check += 16; |
384 | 0 | if (cptbitmap & DATA_PACKLEN_FLAG) data_hdr_len_check += 2; |
385 | 0 | if (cptbitmap & DATA_TVSEC_FLAG) data_hdr_len_check += 8; |
386 | 0 | if (cptbitmap & DATA_TVUSEC_FLAG) data_hdr_len_check += 8; |
387 | 0 | if (cptbitmap & DATA_DLT_FLAG) data_hdr_len_check += 4; |
388 | |
|
389 | 0 | if (data_hdr_len_check != data_hdr_len) { |
390 | 0 | expert_add_info(pinfo, data_len_item, &ei_kdsp_cpt_data_hdr_len); |
391 | 0 | } |
392 | |
|
393 | 0 | if (cptbitmap & DATA_UUID_FLAG) { |
394 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_uuid, tvb, offset, 16, ENC_NA); |
395 | 0 | offset += 16; |
396 | 0 | } |
397 | 0 | if (cptbitmap & DATA_PACKLEN_FLAG) { |
398 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_packet_len, tvb, offset, 2, ENC_BIG_ENDIAN); |
399 | 0 | reported_payload_len = tvb_get_ntohs(tvb, offset); |
400 | 0 | offset += 2; |
401 | 0 | } |
402 | 0 | switch (cptbitmap & (DATA_TVSEC_FLAG | DATA_TVUSEC_FLAG)) { |
403 | 0 | case DATA_TVSEC_FLAG | DATA_TVUSEC_FLAG: |
404 | 0 | subsub_item = proto_tree_add_item(sub_tree, hf_kdsp_cpt_tv, tvb, offset, 16, ENC_TIME_SECS_USECS|ENC_BIG_ENDIAN); |
405 | 0 | break; |
406 | 0 | case DATA_TVSEC_FLAG: |
407 | 0 | subsub_item = proto_tree_add_item(sub_tree, hf_kdsp_cpt_tv, tvb, offset, 8, ENC_TIME_SECS|ENC_BIG_ENDIAN); |
408 | 0 | break; |
409 | 0 | case DATA_TVUSEC_FLAG: |
410 | 0 | subsub_item = proto_tree_add_item(sub_tree, hf_kdsp_cpt_tv, tvb, offset, 8, ENC_TIME_USECS|ENC_BIG_ENDIAN); |
411 | 0 | break; |
412 | 0 | default: |
413 | 0 | break; |
414 | 0 | } |
415 | 0 | subsub_tree = proto_item_add_subtree(subsub_item, ett_cpt_tv); |
416 | 0 | if (cptbitmap & DATA_TVSEC_FLAG) { |
417 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_tv_sec, tvb, offset, 8, ENC_BIG_ENDIAN); |
418 | 0 | offset += 8; |
419 | 0 | } |
420 | 0 | if (cptbitmap & DATA_TVUSEC_FLAG) { |
421 | 0 | proto_tree_add_item(subsub_tree, hf_kdsp_cpt_tv_usec, tvb, offset, 8, ENC_BIG_ENDIAN); |
422 | 0 | offset += 8; |
423 | 0 | } |
424 | 0 | if (cptbitmap & DATA_DLT_FLAG) { |
425 | 0 | proto_tree_add_item(sub_tree, hf_kdsp_cpt_dlt, tvb, offset, 4, ENC_BIG_ENDIAN); |
426 | 0 | datalink_type = tvb_get_ntohl(tvb, offset); |
427 | 0 | offset += 4; |
428 | 0 | } |
429 | 0 | payload_len = (length + FRAME_HEADER_LEN) - offset; |
430 | 0 | if (cptbitmap & DATA_PACKLEN_FLAG) { |
431 | 0 | payload_tvb = tvb_new_subset_length(tvb, offset, reported_payload_len); |
432 | 0 | if (cptbitmap & DATA_DLT_FLAG) { |
433 | 0 | dissector_try_uint(subdissector_dlt_table, datalink_type, payload_tvb, pinfo, tree); |
434 | | |
435 | | /* XXX - Restore protocol column */ |
436 | 0 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "KDSP"); |
437 | |
|
438 | 0 | } else if (payload_len > 0) { |
439 | 0 | proto_tree_add_expert(sub_tree, pinfo, &ei_kdsp_payload_expected, tvb, offset, payload_len); |
440 | 0 | } |
441 | 0 | } else if (payload_len > 0) { |
442 | 0 | proto_tree_add_expert(sub_tree, pinfo, &ei_kdsp_payload_unexpected, tvb, offset, payload_len); |
443 | 0 | } |
444 | 0 | } |
445 | 0 | break; |
446 | 17 | case CHANNELSET: |
447 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_length, tvb, offset, 2, ENC_BIG_ENDIAN); |
448 | 17 | offset += 2; |
449 | 17 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_ch_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
450 | 17 | sub_tree = proto_item_add_subtree(sub_item, ett_ch_bitmap); |
451 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_uuid, tvb, offset, 4, ENC_BIG_ENDIAN); |
452 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_cmd, tvb, offset, 4, ENC_BIG_ENDIAN); |
453 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_curch, tvb, offset, 4, ENC_BIG_ENDIAN); |
454 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_hop, tvb, offset, 4, ENC_BIG_ENDIAN); |
455 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_numch, tvb, offset, 4, ENC_BIG_ENDIAN); |
456 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_channels, tvb, offset, 4, ENC_BIG_ENDIAN); |
457 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_dwell, tvb, offset, 4, ENC_BIG_ENDIAN); |
458 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_rate, tvb, offset, 4, ENC_BIG_ENDIAN); |
459 | 17 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_hopdwell, tvb, offset, 4, ENC_BIG_ENDIAN); |
460 | 17 | offset += 4; |
461 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_uuid, tvb, offset, 16, ENC_NA); |
462 | 17 | offset += 16; |
463 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_cmd, tvb, offset, 2, ENC_BIG_ENDIAN); |
464 | 17 | offset += 2; |
465 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_cur_ch, tvb, offset, 2, ENC_BIG_ENDIAN); |
466 | 17 | offset += 2; |
467 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_hop, tvb, offset, 2, ENC_BIG_ENDIAN); |
468 | 17 | offset += 2; |
469 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_num_ch, tvb, offset, 2, ENC_BIG_ENDIAN); |
470 | 17 | numChan = tvb_get_ntohs(tvb, offset); |
471 | 17 | offset += 2; |
472 | 17 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_ch_data, tvb, offset, 2046, ENC_NA); |
473 | 17 | sub_tree = proto_item_add_subtree(sub_item, ett_ch_data); |
474 | | |
475 | 293 | for(i = 0; i<numChan; i++) { |
476 | 276 | type = tvb_get_ntohs(tvb, offset); |
477 | 276 | type = type >> 15; |
478 | 276 | if (!type) {/* Highest bit (1 << 15) == 0 if channel */ |
479 | 162 | proto_tree_add_item(sub_tree, hf_kdsp_ch_ch, tvb, offset, 2, ENC_BIG_ENDIAN); |
480 | 162 | offset += 2; |
481 | 162 | proto_tree_add_item(sub_tree, hf_kdsp_ch_dwell, tvb, offset, 2, ENC_BIG_ENDIAN); |
482 | 162 | offset += 6; |
483 | 162 | } |
484 | 114 | else{/* Highest bit (1 << 15) == 1 if range */ |
485 | 114 | proto_tree_add_item(sub_tree, hf_kdsp_ch_start, tvb, offset, 2, ENC_BIG_ENDIAN); |
486 | 114 | offset += 2; |
487 | 114 | proto_tree_add_item(sub_tree, hf_kdsp_ch_end, tvb, offset, 2, ENC_BIG_ENDIAN); |
488 | 114 | offset += 2; |
489 | 114 | proto_tree_add_item(sub_tree, hf_kdsp_ch_width, tvb, offset, 2, ENC_BIG_ENDIAN); |
490 | 114 | offset += 2; |
491 | 114 | proto_tree_add_item(sub_tree, hf_kdsp_ch_iter, tvb, offset, 2, ENC_BIG_ENDIAN); |
492 | 114 | offset += 2; |
493 | 114 | } |
494 | 276 | } |
495 | 17 | offset = length+FRAME_HEADER_LEN-4; |
496 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_rate, tvb, offset, 2, ENC_BIG_ENDIAN); |
497 | 17 | offset += 2; |
498 | 17 | proto_tree_add_item(kdsp_tree, hf_kdsp_ch_ch_dwell, tvb, offset, 2, ENC_BIG_ENDIAN); |
499 | | /*offset += 2;*/ |
500 | 17 | break; |
501 | 1 | case SOURCE: |
502 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_length, tvb, offset, 2, ENC_BIG_ENDIAN); |
503 | 1 | offset +=2; |
504 | 1 | sub_item = proto_tree_add_item(kdsp_tree, hf_kdsp_ch_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
505 | 1 | sub_tree = proto_item_add_subtree(sub_item, ett_ch_bitmap); |
506 | 1 | proto_tree_add_item(sub_tree, hf_kdsp_ch_flag_uuid, tvb, offset, 4, ENC_BIG_ENDIAN); |
507 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
508 | 1 | offset +=4; |
509 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_uuid, tvb, offset, 16, ENC_NA); |
510 | 1 | offset += 16; |
511 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_invalidate, tvb, offset, 2, ENC_BIG_ENDIAN); |
512 | 1 | offset +=2; |
513 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_name, tvb, offset, 16, ENC_ASCII); |
514 | 1 | offset +=16; |
515 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_interface, tvb, offset, 16, ENC_ASCII); |
516 | 1 | offset += 16; |
517 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_type, tvb, offset, 16, ENC_ASCII); |
518 | 1 | offset +=16; |
519 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_hop, tvb, offset, 1, ENC_BIG_ENDIAN); |
520 | 1 | offset +=1; |
521 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_dwell, tvb, offset, 2, ENC_BIG_ENDIAN); |
522 | 1 | offset += 2; |
523 | 1 | proto_tree_add_item(kdsp_tree, hf_kdsp_source_rate, tvb, offset, 2, ENC_BIG_ENDIAN); |
524 | | /*offset += 2;*/ |
525 | 1 | break; |
526 | 0 | case REPORT: |
527 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_hdr_len, tvb, offset, 2, ENC_BIG_ENDIAN); |
528 | 0 | offset += 2; |
529 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_content_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); |
530 | 0 | offset += 4; |
531 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_uuid, tvb, offset, 16, ENC_NA); |
532 | 0 | offset += 16; |
533 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_flags, tvb, offset, 1, ENC_BIG_ENDIAN); |
534 | 0 | offset += 1; |
535 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_hop_tm_sec, tvb, offset, 4, ENC_BIG_ENDIAN); |
536 | 0 | offset += 4; |
537 | 0 | proto_tree_add_item(kdsp_tree, hf_kdsp_report_hop_tm_usec, tvb, offset, 4, ENC_BIG_ENDIAN); |
538 | | /*offset += 4;*/ |
539 | 0 | break; |
540 | 13 | default: |
541 | 13 | expert_add_info(pinfo, command_item, &ei_kdsp_cmdnum); |
542 | 82 | } |
543 | | |
544 | 68 | return tvb_captured_length(tvb); |
545 | 82 | } |
546 | | |
547 | | static int |
548 | | dissect_kdsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) |
549 | 21 | { |
550 | 21 | tcp_dissect_pdus(tvb, pinfo, tree, true, FRAME_HEADER_LEN, |
551 | 21 | get_kdsp_message_len, dissect_kdsp_message, data); |
552 | 21 | return tvb_captured_length(tvb); |
553 | 21 | } |
554 | | |
555 | | void |
556 | | proto_register_kdsp(void) |
557 | 16 | { |
558 | 16 | static hf_register_info hf[] = { |
559 | 16 | { &hf_kdsp_sentinel, |
560 | 16 | { "Sentinel", "kdsp.sentinel", |
561 | 16 | FT_UINT32, BASE_HEX, |
562 | 16 | NULL, 0x0, |
563 | 16 | NULL, HFILL } |
564 | 16 | }, |
565 | 16 | { &hf_kdsp_cmdnum, |
566 | 16 | { "Command", "kdsp.command", |
567 | 16 | FT_UINT32, BASE_DEC, |
568 | 16 | VALS(packettypenames), 0x0, |
569 | 16 | NULL, HFILL } |
570 | 16 | }, |
571 | 16 | { &hf_kdsp_length, |
572 | 16 | { "Length", "kdsp.length", |
573 | 16 | FT_UINT32, BASE_DEC, |
574 | 16 | NULL, 0x0, |
575 | 16 | NULL, HFILL } |
576 | 16 | }, |
577 | 16 | { &hf_kdsp_version, |
578 | 16 | { "KDSP Version", "kdsp.version", |
579 | 16 | FT_UINT32, BASE_DEC, |
580 | 16 | NULL, 0x0, |
581 | 16 | NULL, HFILL } |
582 | 16 | }, |
583 | 16 | { &hf_kdsp_server_version, |
584 | 16 | { "Server Version", "kdsp.server.version", |
585 | 16 | FT_STRINGZTRUNC, BASE_NONE, |
586 | 16 | NULL, 0x0, |
587 | 16 | NULL, HFILL } |
588 | 16 | }, |
589 | 16 | { &hf_kdsp_hostname, |
590 | 16 | { "Hostname", "kdsp.hostname", |
591 | 16 | FT_STRINGZTRUNC, BASE_NONE, |
592 | 16 | NULL, 0x0, |
593 | 16 | NULL, HFILL } |
594 | 16 | }, |
595 | 16 | { &hf_kdsp_str_flags, |
596 | 16 | { "String Flags", "kdsp.str.flags", |
597 | 16 | FT_UINT32, BASE_HEX, |
598 | 16 | NULL, 0x0, |
599 | 16 | NULL, HFILL } |
600 | 16 | }, |
601 | 16 | { &hf_kdsp_str_len, |
602 | 16 | { "String Length", "kdsp.str.length", |
603 | 16 | FT_UINT32, BASE_DEC, |
604 | 16 | NULL, 0x0, |
605 | 16 | NULL, HFILL } |
606 | 16 | }, |
607 | 16 | { &hf_kdsp_str_msg, |
608 | 16 | { "Message", "kdsp.str.message", |
609 | 16 | FT_STRING, BASE_NONE, |
610 | 16 | NULL, 0x0, |
611 | 16 | NULL, HFILL } |
612 | 16 | }, |
613 | 16 | { &hf_kdsp_cpt_bitmap, |
614 | 16 | { "Bitmap", "kdsp.cpt.bitmap", |
615 | 16 | FT_UINT32, BASE_HEX, |
616 | 16 | NULL, 0x0, |
617 | 16 | NULL, HFILL } |
618 | 16 | }, |
619 | 16 | { &hf_kdsp_cpt_flag_cpt, |
620 | 16 | { "Capture Packet Flag", "kdsp.cpt.flag.cpt", |
621 | 16 | FT_BOOLEAN, 32, |
622 | 16 | NULL, CPT_FLAG, |
623 | 16 | NULL, HFILL } |
624 | 16 | }, |
625 | 16 | { &hf_kdsp_cpt_flag_fcs, |
626 | 16 | { "Capture FCS Flag", "kdsp.cpt.flag.fcs", |
627 | 16 | FT_BOOLEAN, 32, |
628 | 16 | NULL, FCS_FLAG, |
629 | 16 | NULL, HFILL } |
630 | 16 | }, |
631 | 16 | { &hf_kdsp_cpt_flag_gps, |
632 | 16 | { "Capture GPS Flag", "kdsp.cpt.flag.gps", |
633 | 16 | FT_BOOLEAN, 32, |
634 | 16 | NULL, GPS_FLAG, |
635 | 16 | NULL, HFILL } |
636 | 16 | }, |
637 | 16 | { &hf_kdsp_cpt_flag_radio, |
638 | 16 | { "Capture Radio Flag", "kdsp.cpt.flag.radio", |
639 | 16 | FT_BOOLEAN, 32, |
640 | 16 | NULL, RADIO_FLAG, |
641 | 16 | NULL, HFILL } |
642 | 16 | }, |
643 | 16 | { &hf_kdsp_cpt_offset, |
644 | 16 | { "Offset Capture Packet Header", "kdsp.cpt.offset", |
645 | 16 | FT_UINT32, BASE_DEC, |
646 | 16 | NULL, 0x0, |
647 | 16 | NULL, HFILL } |
648 | 16 | }, |
649 | 16 | { &hf_kdsp_fcs, |
650 | 16 | { "Capture FCS Header", "kdsp.fcs", |
651 | 16 | FT_NONE, BASE_NONE, |
652 | 16 | NULL, 0x0, |
653 | 16 | NULL, HFILL } |
654 | 16 | }, |
655 | 16 | { &hf_kdsp_fcs_data, |
656 | 16 | { "Frame Checksum", "kdsp.fcs.data", |
657 | 16 | FT_UINT32, BASE_HEX, |
658 | 16 | NULL, 0x0, |
659 | 16 | NULL, HFILL } |
660 | 16 | }, |
661 | 16 | { &hf_kdsp_radio_hdr, |
662 | 16 | { "Capture Radio Header", "kdsp.radio", |
663 | 16 | FT_NONE, BASE_NONE, |
664 | 16 | NULL, 0x0, |
665 | 16 | NULL, HFILL } |
666 | 16 | }, |
667 | 16 | { &hf_kdsp_radio_hdr_len, |
668 | 16 | { "Length", "kdsp.radio.length", |
669 | 16 | FT_UINT16, BASE_DEC, |
670 | 16 | NULL, 0x0, |
671 | 16 | NULL, HFILL } |
672 | 16 | }, |
673 | 16 | { &hf_kdsp_radio_content_bitmap, |
674 | 16 | { "Bitmap", "kdsp.radio.bitmap", |
675 | 16 | FT_UINT32, BASE_HEX, |
676 | 16 | NULL, 0x0, |
677 | 16 | NULL, HFILL } |
678 | 16 | }, |
679 | 16 | { &hf_kdsp_radio_accuracy, |
680 | 16 | { "Accuracy", "kdsp.radio.accuracy", |
681 | 16 | FT_UINT16, BASE_DEC, |
682 | 16 | NULL, 0x0, |
683 | 16 | NULL, HFILL } |
684 | 16 | }, |
685 | 16 | { &hf_kdsp_radio_freq_mhz, |
686 | 16 | { "Frequency", "kdsp.radio.freq", |
687 | 16 | FT_UINT16, BASE_DEC, |
688 | 16 | NULL, 0x0, |
689 | 16 | NULL, HFILL } |
690 | 16 | }, |
691 | 16 | { &hf_kdsp_radio_signal_dbm, |
692 | 16 | { "Signal dbm", "kdsp.radio.signal_dbm", |
693 | 16 | FT_INT16, BASE_DEC, |
694 | 16 | NULL, 0x0, |
695 | 16 | NULL, HFILL } |
696 | 16 | }, |
697 | 16 | { &hf_kdsp_radio_noise_dbm, |
698 | 16 | { "Noise dbm", "kdsp.radio.noise_dbm", |
699 | 16 | FT_INT16, BASE_DEC, |
700 | 16 | NULL, 0x0, |
701 | 16 | NULL, HFILL } |
702 | 16 | }, |
703 | 16 | { &hf_kdsp_radio_carrier, |
704 | 16 | { "Carrier", "kdsp.radio.car", |
705 | 16 | FT_UINT32, BASE_DEC, |
706 | 16 | NULL, 0x0, |
707 | 16 | NULL, HFILL } |
708 | 16 | }, |
709 | 16 | { &hf_kdsp_radio_encoding, |
710 | 16 | { "Encoding", "kdsp.radio.enc", |
711 | 16 | FT_UINT32, BASE_DEC, |
712 | 16 | NULL, 0x0, |
713 | 16 | NULL, HFILL } |
714 | 16 | }, |
715 | 16 | { &hf_kdsp_radio_datarate, |
716 | 16 | { "Data Rate", "kdsp.radio.datarate", |
717 | 16 | FT_UINT32, BASE_DEC, |
718 | 16 | NULL, 0x0, |
719 | 16 | NULL, HFILL } |
720 | 16 | }, |
721 | 16 | { &hf_kdsp_radio_signal_rssi, |
722 | 16 | { "Signal rssi", "kdsp.radio.signal_rssi", |
723 | 16 | FT_INT16, BASE_DEC, |
724 | 16 | NULL, 0x0, |
725 | 16 | NULL, HFILL } |
726 | 16 | }, |
727 | 16 | { &hf_kdsp_radio_noise_rssi, |
728 | 16 | { "Noise rssi", "kdsp.radio.noise_rssi", |
729 | 16 | FT_INT16, BASE_DEC, |
730 | 16 | NULL, 0x0, |
731 | 16 | NULL, HFILL } |
732 | 16 | }, |
733 | 16 | { &hf_kdsp_gps_hdr, |
734 | 16 | { "Capture GPS Header", "kdsp.gps", |
735 | 16 | FT_NONE, BASE_NONE, |
736 | 16 | NULL, 0x0, |
737 | 16 | NULL, HFILL } |
738 | 16 | }, |
739 | 16 | { &hf_kdsp_gps_hdr_len, |
740 | 16 | { "GPS Length", "kdsp.gps.length", |
741 | 16 | FT_UINT16, BASE_DEC, |
742 | 16 | NULL, 0x0, |
743 | 16 | NULL, HFILL } |
744 | 16 | }, |
745 | 16 | { &hf_kdsp_gps_content_bitmap, |
746 | 16 | { "Bitmap", "kdsp.gps.bitmap", |
747 | 16 | FT_UINT32, BASE_HEX, |
748 | 16 | NULL, 0x0, |
749 | 16 | NULL, HFILL } |
750 | 16 | }, |
751 | 16 | { &hf_kdsp_gps_fix, |
752 | 16 | { "GPS fix", "kdsp.gps.fix", |
753 | 16 | FT_UINT32, BASE_DEC, |
754 | 16 | NULL, 0x0, |
755 | 16 | NULL, HFILL } |
756 | 16 | }, |
757 | 16 | { &hf_kdsp_gps_lat, |
758 | 16 | { "Latitude", "kdsp.gps.lat", |
759 | 16 | FT_NONE, BASE_NONE, |
760 | 16 | NULL, 0x0, |
761 | 16 | NULL, HFILL } |
762 | 16 | }, |
763 | 16 | { &hf_kdsp_gps_lon, |
764 | 16 | { "Longitude", "kdsp.gps.lon", |
765 | 16 | FT_NONE, BASE_NONE, |
766 | 16 | NULL, 0x0, |
767 | 16 | NULL, HFILL } |
768 | 16 | }, |
769 | 16 | { &hf_kdsp_gps_alt, |
770 | 16 | { "Alt", "kdsp.gps.alt", |
771 | 16 | FT_NONE, BASE_NONE, |
772 | 16 | NULL, 0x0, |
773 | 16 | NULL, HFILL } |
774 | 16 | }, |
775 | 16 | { &hf_kdsp_gps_spd, |
776 | 16 | { "Spd", "kdsp.gps.spd", |
777 | 16 | FT_NONE, BASE_NONE, |
778 | 16 | NULL, 0x0, |
779 | 16 | NULL, HFILL } |
780 | 16 | }, |
781 | 16 | { &hf_kdsp_gps_heading, |
782 | 16 | { "Heading", "kdsp.gps.heading", |
783 | 16 | FT_NONE, BASE_NONE, |
784 | 16 | NULL, 0x0, |
785 | 16 | NULL, HFILL } |
786 | 16 | }, |
787 | 16 | { &hf_kdsp_cpt_data_hdr, |
788 | 16 | { "Capture Packet Header", "kdsp.cpt", |
789 | 16 | FT_NONE, BASE_NONE, |
790 | 16 | NULL, 0x0, |
791 | 16 | NULL, HFILL } |
792 | 16 | }, |
793 | 16 | { &hf_kdsp_cpt_data_hdr_len, |
794 | 16 | { "Length", "kdsp.cpt.length", |
795 | 16 | FT_UINT16, BASE_DEC, |
796 | 16 | NULL, 0x0, |
797 | 16 | NULL, HFILL } |
798 | 16 | }, |
799 | 16 | { &hf_kdsp_cpt_data_content_bitmap, |
800 | 16 | { "Bitmap", "kdsp.cpt.bitmap", |
801 | 16 | FT_UINT32, BASE_HEX, |
802 | 16 | NULL, 0x0, |
803 | 16 | NULL, HFILL } |
804 | 16 | }, |
805 | 16 | { &hf_kdsp_cpt_dc_flag_uuid, |
806 | 16 | { "Capture Content UUID Flag", "kdsp.cpt.cd.flag.uuid", |
807 | 16 | FT_BOOLEAN, 32, |
808 | 16 | NULL, DATA_UUID_FLAG, |
809 | 16 | NULL, HFILL } |
810 | 16 | }, |
811 | 16 | { &hf_kdsp_cpt_dc_flag_len, |
812 | 16 | { "Capture Content Length Flag", "kdsp.cpt.cd.flag.len", |
813 | 16 | FT_BOOLEAN, 32, |
814 | 16 | NULL, DATA_PACKLEN_FLAG, |
815 | 16 | NULL, HFILL } |
816 | 16 | }, |
817 | 16 | { &hf_kdsp_cpt_dc_flag_sec, |
818 | 16 | { "Capture Content Second Flag", "kdsp.cpt.cd.flag.sec", |
819 | 16 | FT_BOOLEAN, 32, |
820 | 16 | NULL, DATA_TVSEC_FLAG, |
821 | 16 | NULL, HFILL } |
822 | 16 | }, |
823 | 16 | { &hf_kdsp_cpt_dc_flag_usec, |
824 | 16 | { "Capture Content Microsecond Flag", "kdsp.cpt.cd.flag.usec", |
825 | 16 | FT_BOOLEAN, 32, |
826 | 16 | NULL, DATA_TVUSEC_FLAG, |
827 | 16 | NULL, HFILL } |
828 | 16 | }, |
829 | 16 | { &hf_kdsp_cpt_dc_flag_dlt, |
830 | 16 | { "Capture Content Datalink Type Flag", "kdsp.cpt.cd.flag.dlt", |
831 | 16 | FT_BOOLEAN, 32, |
832 | 16 | NULL, DATA_DLT_FLAG, |
833 | 16 | NULL, HFILL } |
834 | 16 | }, |
835 | 16 | { &hf_kdsp_cpt_uuid, |
836 | 16 | { "UUID", "kdsp.cpt.uuid", |
837 | 16 | FT_BYTES, BASE_NONE, |
838 | 16 | NULL, 0x0, |
839 | 16 | NULL, HFILL } |
840 | 16 | }, |
841 | 16 | { &hf_kdsp_cpt_packet_len, |
842 | 16 | { "Packet Length", "kdsp.cpt.pkt_len", |
843 | 16 | FT_UINT16, BASE_DEC, |
844 | 16 | NULL, 0x0, |
845 | 16 | NULL, HFILL } |
846 | 16 | }, |
847 | 16 | { &hf_kdsp_cpt_tv, |
848 | 16 | { "Packet Timeval", "kdsp.cpt.tv", |
849 | 16 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, |
850 | 16 | NULL, 0x0, |
851 | 16 | NULL, HFILL } |
852 | 16 | }, |
853 | 16 | { &hf_kdsp_cpt_tv_sec, |
854 | 16 | { "TV sec", "kdsp.cpt.tv_sec", |
855 | 16 | FT_UINT64, BASE_DEC, |
856 | 16 | NULL, 0x0, |
857 | 16 | NULL, HFILL } |
858 | 16 | }, |
859 | 16 | { &hf_kdsp_cpt_tv_usec, |
860 | 16 | { "TV usec", "kdsp.cpt.tv_usec", |
861 | 16 | FT_UINT64, BASE_DEC, |
862 | 16 | NULL, 0x0, |
863 | 16 | NULL, HFILL } |
864 | 16 | }, |
865 | 16 | { &hf_kdsp_cpt_dlt, |
866 | 16 | { "Data Link Type", "kdsp.cpt.dlt", |
867 | 16 | FT_UINT32, BASE_DEC, |
868 | 16 | VALS(payloadtypenames), 0x0, |
869 | 16 | NULL, HFILL } |
870 | 16 | }, |
871 | 16 | { &hf_kdsp_ch_length, |
872 | 16 | { "Length", "kdsp.chset.length", |
873 | 16 | FT_UINT16, BASE_DEC, |
874 | 16 | NULL, 0x0, |
875 | 16 | NULL, HFILL } |
876 | 16 | }, |
877 | 16 | { &hf_kdsp_ch_bitmap, |
878 | 16 | { "Bitmap", "kdsp.chset.bitmap", |
879 | 16 | FT_UINT32, BASE_HEX, |
880 | 16 | NULL, 0x0, |
881 | 16 | NULL, HFILL } |
882 | 16 | }, |
883 | 16 | { &hf_kdsp_ch_flag_uuid, |
884 | 16 | { "UUID Flag", "kdsp.ch.flag.uuid", |
885 | 16 | FT_BOOLEAN, 32, |
886 | 16 | NULL, CH_UUID_FLAG, |
887 | 16 | NULL, HFILL } |
888 | 16 | }, |
889 | 16 | { &hf_kdsp_ch_flag_cmd, |
890 | 16 | { "Command Flag", "kdsp.ch.flag.cmd", |
891 | 16 | FT_BOOLEAN, 32, |
892 | 16 | NULL, CH_CMD_FLAG, |
893 | 16 | NULL, HFILL } |
894 | 16 | }, |
895 | 16 | { &hf_kdsp_ch_flag_curch, |
896 | 16 | { "Current Channel Flag", "kdsp.ch.flag.curch", |
897 | 16 | FT_BOOLEAN, 32, |
898 | 16 | NULL, CH_CURCH_FLAG, |
899 | 16 | NULL, HFILL } |
900 | 16 | }, |
901 | 16 | { &hf_kdsp_ch_flag_hop, |
902 | 16 | { "Hop Flag", "kdsp.ch.flag.hop", |
903 | 16 | FT_BOOLEAN, 32, |
904 | 16 | NULL, CH_HOP_FLAG, |
905 | 16 | NULL, HFILL } |
906 | 16 | }, |
907 | 16 | { &hf_kdsp_ch_flag_numch, |
908 | 16 | { "Num Channels Flag", "kdsp.ch.flag.numch", |
909 | 16 | FT_BOOLEAN, 32, |
910 | 16 | NULL, CH_NUMCH_FLAG, |
911 | 16 | NULL, HFILL } |
912 | 16 | }, |
913 | 16 | { &hf_kdsp_ch_flag_channels, |
914 | 16 | { "Channels Flag", "kdsp.ch.flag.channels", |
915 | 16 | FT_BOOLEAN, 32, |
916 | 16 | NULL, CH_CHANNELS_FLAG, |
917 | 16 | NULL, HFILL } |
918 | 16 | }, |
919 | 16 | { &hf_kdsp_ch_flag_dwell, |
920 | 16 | { "Dwell Flag", "kdsp.ch.flag.dwell", |
921 | 16 | FT_BOOLEAN, 32, |
922 | 16 | NULL, CH_DWELL_FLAG, |
923 | 16 | NULL, HFILL } |
924 | 16 | }, |
925 | 16 | { &hf_kdsp_ch_flag_rate, |
926 | 16 | { "Rate Flag", "kdsp.ch.flag.rate", |
927 | 16 | FT_BOOLEAN, 32, |
928 | 16 | NULL, CH_RATE_FLAG, |
929 | 16 | NULL, HFILL } |
930 | 16 | }, |
931 | 16 | { &hf_kdsp_ch_flag_hopdwell, |
932 | 16 | { "Hop-Dwell Flag", "kdsp.ch.flag.hopdwell", |
933 | 16 | FT_BOOLEAN, 32, |
934 | 16 | NULL, CH_HOPDWELL_FLAG, |
935 | 16 | NULL, HFILL } |
936 | 16 | }, |
937 | 16 | { &hf_kdsp_ch_uuid, |
938 | 16 | { "UUID", "kdsp.chset.uuid", |
939 | 16 | FT_NONE, BASE_NONE, |
940 | 16 | NULL, 0x0, |
941 | 16 | NULL, HFILL } |
942 | 16 | }, |
943 | 16 | { &hf_kdsp_ch_cmd, |
944 | 16 | { "Command", "kdsp.chset.cmd", |
945 | 16 | FT_UINT16, BASE_DEC, |
946 | 16 | VALS(channelcmds), 0x0, |
947 | 16 | NULL, HFILL } |
948 | 16 | }, |
949 | 16 | { &hf_kdsp_ch_cur_ch, |
950 | 16 | { "Current Channel", "kdsp.chset.cur_ch", |
951 | 16 | FT_UINT16, BASE_DEC, |
952 | 16 | NULL, 0x0, |
953 | 16 | NULL, HFILL } |
954 | 16 | }, |
955 | 16 | { &hf_kdsp_ch_hop, |
956 | 16 | { "Channel Hop", "kdsp.chset.hop", |
957 | 16 | FT_UINT16, BASE_DEC, |
958 | 16 | NULL, 0x0, |
959 | 16 | NULL, HFILL } |
960 | 16 | }, |
961 | 16 | { &hf_kdsp_ch_num_ch, |
962 | 16 | { "Number of Channels", "kdsp.chset.num_ch", |
963 | 16 | FT_UINT16, BASE_DEC, |
964 | 16 | NULL, 0x0, |
965 | 16 | NULL, HFILL } |
966 | 16 | }, |
967 | 16 | { &hf_kdsp_ch_data, |
968 | 16 | { "Channel Data", "kdsp.chset.data", |
969 | 16 | FT_NONE, BASE_NONE, |
970 | 16 | NULL, 0x0, |
971 | 16 | NULL, HFILL } |
972 | 16 | }, |
973 | 16 | { &hf_kdsp_ch_ch, |
974 | 16 | { "Channel", "kdsp.chset.ch", |
975 | 16 | FT_UINT16, BASE_DEC, |
976 | 16 | NULL, 0x0, |
977 | 16 | NULL, HFILL } |
978 | 16 | }, |
979 | 16 | { &hf_kdsp_ch_dwell, |
980 | 16 | { "Dwell", "kdsp.chset.dwell", |
981 | 16 | FT_UINT16, BASE_DEC, |
982 | 16 | NULL, 0x0, |
983 | 16 | NULL, HFILL } |
984 | 16 | }, |
985 | 16 | { &hf_kdsp_ch_start, |
986 | 16 | { "Start", "kdsp.chset.start", |
987 | 16 | FT_UINT16, BASE_DEC, |
988 | 16 | NULL, 0x0, |
989 | 16 | NULL, HFILL } |
990 | 16 | }, |
991 | 16 | { &hf_kdsp_ch_end, |
992 | 16 | { "End", "kdsp.chset.end", |
993 | 16 | FT_UINT16, BASE_DEC, |
994 | 16 | NULL, 0x0, |
995 | 16 | NULL, HFILL } |
996 | 16 | }, |
997 | 16 | { &hf_kdsp_ch_width, |
998 | 16 | { "Width", "kdsp.chset.width", |
999 | 16 | FT_UINT16, BASE_DEC, |
1000 | 16 | NULL, 0x0, |
1001 | 16 | NULL, HFILL } |
1002 | 16 | }, |
1003 | 16 | { &hf_kdsp_ch_iter, |
1004 | 16 | { "Iter", "kdsp.chset.iter", |
1005 | 16 | FT_UINT16, BASE_DEC, |
1006 | 16 | NULL, 0x0, |
1007 | 16 | NULL, HFILL } |
1008 | 16 | }, |
1009 | 16 | { &hf_kdsp_ch_rate, |
1010 | 16 | { "Rate", "kdsp.chset.rate", |
1011 | 16 | FT_UINT16, BASE_DEC, |
1012 | 16 | NULL, 0x0, |
1013 | 16 | NULL, HFILL } |
1014 | 16 | }, |
1015 | 16 | { &hf_kdsp_ch_ch_dwell, |
1016 | 16 | { "Dwell", "kdsp.chset.dwell", |
1017 | 16 | FT_UINT16, BASE_DEC, |
1018 | 16 | NULL, 0x0, |
1019 | 16 | NULL, HFILL } |
1020 | 16 | }, |
1021 | 16 | { &hf_kdsp_source_length, |
1022 | 16 | { "Length", "kdsp.source.length", |
1023 | 16 | FT_UINT16, BASE_DEC, |
1024 | 16 | NULL, 0x0, |
1025 | 16 | NULL, HFILL } |
1026 | 16 | }, |
1027 | 16 | { &hf_kdsp_source_bitmap, |
1028 | 16 | { "Source Bitmap", "kdsp.source.bitmap", |
1029 | 16 | FT_UINT32, BASE_HEX, |
1030 | 16 | NULL, 0x0, |
1031 | 16 | NULL, HFILL } |
1032 | 16 | }, |
1033 | 16 | { &hf_kdsp_source_uuid, |
1034 | 16 | { "UUID", "kdsp.source.uuid", |
1035 | 16 | FT_NONE, BASE_NONE, |
1036 | 16 | NULL, 0x0, |
1037 | 16 | NULL, HFILL } |
1038 | 16 | }, |
1039 | 16 | { &hf_kdsp_source_invalidate, |
1040 | 16 | { "Source Invalidate", "kdsp.source.invalidate", |
1041 | 16 | FT_UINT16, BASE_HEX, |
1042 | 16 | NULL, 0x0, |
1043 | 16 | NULL, HFILL } |
1044 | 16 | }, |
1045 | 16 | { &hf_kdsp_source_name, |
1046 | 16 | { "Source Name", "kdsp.source.name", |
1047 | 16 | FT_STRING, BASE_NONE, |
1048 | 16 | NULL, 0x0, |
1049 | 16 | NULL, HFILL } |
1050 | 16 | }, |
1051 | 16 | { &hf_kdsp_source_interface, |
1052 | 16 | { "Interface", "kdsp.source.interface", |
1053 | 16 | FT_STRING, BASE_NONE, |
1054 | 16 | NULL, 0x0, |
1055 | 16 | NULL, HFILL } |
1056 | 16 | }, |
1057 | 16 | { &hf_kdsp_source_type, |
1058 | 16 | { "Type", "kdsp.source.type", |
1059 | 16 | FT_STRING, BASE_NONE, |
1060 | 16 | NULL, 0x0, |
1061 | 16 | NULL, HFILL } |
1062 | 16 | }, |
1063 | 16 | { &hf_kdsp_source_hop, |
1064 | 16 | { "Source Hop", "kdsp.source.hop", |
1065 | 16 | FT_UINT8, BASE_DEC, |
1066 | 16 | NULL, 0x0, |
1067 | 16 | NULL, HFILL } |
1068 | 16 | }, |
1069 | 16 | { &hf_kdsp_source_dwell, |
1070 | 16 | { "Source Dwell", "kdsp.source.dwell", |
1071 | 16 | FT_UINT16, BASE_DEC, |
1072 | 16 | NULL, 0x0, |
1073 | 16 | NULL, HFILL } |
1074 | 16 | }, |
1075 | 16 | { &hf_kdsp_source_rate, |
1076 | 16 | { "Source Rate", "kdsp.source.rate", |
1077 | 16 | FT_UINT16, BASE_DEC, |
1078 | 16 | NULL, 0x0, |
1079 | 16 | NULL, HFILL } |
1080 | 16 | }, |
1081 | 16 | { &hf_kdsp_report_hdr_len, |
1082 | 16 | { "Length", "kdsp.report.length", |
1083 | 16 | FT_UINT16, BASE_DEC, |
1084 | 16 | NULL, 0x0, |
1085 | 16 | NULL, HFILL } |
1086 | 16 | }, |
1087 | 16 | { &hf_kdsp_report_content_bitmap, |
1088 | 16 | { "Bitmap", "kdsp.report.bitmap", |
1089 | 16 | FT_UINT32, BASE_HEX, |
1090 | 16 | NULL, 0x0, |
1091 | 16 | NULL, HFILL } |
1092 | 16 | }, |
1093 | 16 | { &hf_kdsp_report_uuid, |
1094 | 16 | { "UUID", "kdsp.report.uuid", |
1095 | 16 | FT_NONE, BASE_NONE, |
1096 | 16 | NULL, 0x0, |
1097 | 16 | NULL, HFILL } |
1098 | 16 | }, |
1099 | 16 | { &hf_kdsp_report_flags, |
1100 | 16 | { "flags", "kdsp.report.flags", |
1101 | 16 | FT_UINT8, BASE_HEX, |
1102 | 16 | NULL, 0x0, |
1103 | 16 | NULL, HFILL } |
1104 | 16 | }, |
1105 | 16 | { &hf_kdsp_report_hop_tm_sec, |
1106 | 16 | { "Hop Time (sec)", "kdsp.report.sec", |
1107 | 16 | FT_UINT32, BASE_DEC, |
1108 | 16 | NULL, 0x0, |
1109 | 16 | NULL, HFILL } |
1110 | 16 | }, |
1111 | 16 | { &hf_kdsp_report_hop_tm_usec, |
1112 | 16 | { "Hop Time (usec)", "kdsp.report.usec", |
1113 | 16 | FT_UINT32, BASE_DEC, |
1114 | 16 | NULL, 0x0, |
1115 | 16 | NULL, HFILL } |
1116 | 16 | } |
1117 | 16 | }; |
1118 | | |
1119 | | |
1120 | | /* Setup protocol subtree array */ |
1121 | 16 | static int *ett[] = { |
1122 | 16 | &ett_kdsp_pdu, |
1123 | 16 | &ett_cpt_bitmap, |
1124 | 16 | &ett_cpt_data_content_bitmap, |
1125 | 16 | &ett_cpt_tv, |
1126 | 16 | &ett_ch_bitmap, |
1127 | 16 | &ett_ch_data, |
1128 | 16 | &ett_sub_fcs, |
1129 | 16 | &ett_sub_radio, |
1130 | 16 | &ett_sub_gps, |
1131 | 16 | &ett_sub_cpt |
1132 | 16 | }; |
1133 | | |
1134 | 16 | static ei_register_info ei[] = { |
1135 | 16 | { &ei_kdsp_payload_expected, { "kdsp.payload_expected", PI_MALFORMED, PI_ERROR, "Payload expected but no link type specified. Can not decode.", EXPFILL }}, |
1136 | 16 | { &ei_kdsp_payload_unexpected, { "kdsp.payload_unexpected", PI_MALFORMED, PI_ERROR, "No payload expected but found some data", EXPFILL }}, |
1137 | 16 | { &ei_kdsp_cpt_data_hdr_len, { "kdsp.cpt.length.invalid", PI_MALFORMED, PI_ERROR, "Calculated header length does not match reported header length. " |
1138 | 16 | "It is likely the dissector does not support all flags", EXPFILL }}, |
1139 | 16 | { &ei_kdsp_cmdnum, { "kdsp.command.unknown", PI_UNDECODED, PI_WARN, "Unknown command, can not parse message", EXPFILL }}, |
1140 | 16 | }; |
1141 | 16 | expert_module_t* expert_kdsp; |
1142 | | |
1143 | 16 | proto_kdsp = proto_register_protocol("Kismet Drone/Server Protocol", "KDSP", "kdsp"); |
1144 | | |
1145 | 16 | proto_register_field_array(proto_kdsp, hf, array_length(hf)); |
1146 | 16 | proto_register_subtree_array(ett, array_length(ett)); |
1147 | | |
1148 | 16 | expert_kdsp = expert_register_protocol(proto_kdsp); |
1149 | 16 | expert_register_field_array(expert_kdsp, ei, array_length(ei)); |
1150 | | |
1151 | 16 | subdissector_dlt_table = register_dissector_table("kdsp.cpt.dlt", "KDSP DLT Type", proto_kdsp, FT_UINT32, BASE_DEC); |
1152 | | |
1153 | 16 | kdsp_handle = register_dissector("kdsp", dissect_kdsp, proto_kdsp); |
1154 | 16 | } |
1155 | | |
1156 | | |
1157 | | void |
1158 | | proto_reg_handoff_kdsp(void) |
1159 | 16 | { |
1160 | 16 | dissector_handle_t dlt_handle; |
1161 | | |
1162 | | /* XXX - Should be done in respective dissectors? */ |
1163 | 16 | dlt_handle = find_dissector("radiotap"); |
1164 | 16 | if (dlt_handle) |
1165 | 16 | dissector_add_uint( "kdsp.cpt.dlt", DATALINK_RADIOTAP, dlt_handle); |
1166 | | |
1167 | 16 | dlt_handle = find_dissector("wlan"); |
1168 | 16 | if (dlt_handle) |
1169 | 16 | dissector_add_uint( "kdsp.cpt.dlt", DATALINK_WLAN, dlt_handle); |
1170 | | |
1171 | 16 | dissector_add_uint_with_preference("tcp.port", KDSP_PORT, kdsp_handle); |
1172 | 16 | } |
1173 | | |
1174 | | /* |
1175 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
1176 | | * |
1177 | | * Local variables: |
1178 | | * c-basic-offset: 2 |
1179 | | * tab-width: 8 |
1180 | | * indent-tabs-mode: nil |
1181 | | * End: |
1182 | | * |
1183 | | * vi: set shiftwidth=2 tabstop=8 expandtab: |
1184 | | * :indentSize=2:tabSize=8:noTabs=true: |
1185 | | */ |