Coverage Report

Created: 2026-11-12 07:01

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