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