Coverage Report

Created: 2025-12-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
 */