Coverage Report

Created: 2025-02-15 06:25

/src/wireshark/epan/dissectors/packet-llrp.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-llrp.c
2
 * Routines for Low Level Reader Protocol dissection
3
 * Copyright 2012, Evan Huus <eapache@gmail.com>
4
 * Copyright 2012, Martin Kupec <martin.kupec@kupson.cz>
5
 * Copyright 2014, Petr Stetiar <petr.stetiar@gaben.cz>
6
 *
7
 * http://www.gs1.org/gsmp/kc/epcglobal/llrp
8
 *
9
 * Wireshark - Network traffic analyzer
10
 * By Gerald Combs <gerald@wireshark.org>
11
 * Copyright 1998 Gerald Combs
12
 *
13
 * SPDX-License-Identifier: GPL-2.0-or-later
14
 */
15
16
#include "config.h"
17
18
#include <epan/packet.h>
19
#include <epan/expert.h>
20
#include <epan/tfs.h>
21
#include <wsutil/array.h>
22
23
#include "packet-tcp.h"
24
25
void proto_register_llrp(void);
26
void proto_reg_handoff_llrp(void);
27
28
static dissector_handle_t llrp_handle;
29
30
14
#define LLRP_PORT 5084
31
32
/* Initialize the protocol and registered fields */
33
static int proto_llrp;
34
static int hf_llrp_version;
35
static int hf_llrp_type;
36
static int hf_llrp_length;
37
static int hf_llrp_id;
38
static int hf_llrp_cur_ver;
39
static int hf_llrp_sup_ver;
40
static int hf_llrp_req_cap;
41
static int hf_llrp_req_conf;
42
static int hf_llrp_rospec;
43
static int hf_llrp_antenna_id;
44
static int hf_llrp_gpi_port;
45
static int hf_llrp_gpo_port;
46
static int hf_llrp_rest_fact;
47
static int hf_llrp_accessspec;
48
static int hf_llrp_vendor;
49
static int hf_llrp_impinj_msg_type;
50
static int hf_llrp_tlv_type;
51
static int hf_llrp_tv_type;
52
static int hf_llrp_tlv_len;
53
static int hf_llrp_param;
54
static int hf_llrp_num_gpi;
55
static int hf_llrp_num_gpo;
56
static int hf_llrp_microseconds;
57
static int hf_llrp_max_supported_antenna;
58
static int hf_llrp_can_set_antenna_prop;
59
static int hf_llrp_has_utc_clock;
60
static int hf_llrp_device_manufacturer;
61
static int hf_llrp_model;
62
static int hf_llrp_firmware_version;
63
static int hf_llrp_max_receive_sense;
64
static int hf_llrp_index;
65
static int hf_llrp_receive_sense;
66
static int hf_llrp_receive_sense_index_min;
67
static int hf_llrp_receive_sense_index_max;
68
static int hf_llrp_num_protocols;
69
static int hf_llrp_protocol_id;
70
static int hf_llrp_can_do_survey;
71
static int hf_llrp_can_report_buffer_warning;
72
static int hf_llrp_support_client_opspec;
73
static int hf_llrp_can_stateaware;
74
static int hf_llrp_support_holding;
75
static int hf_llrp_max_priority_supported;
76
static int hf_llrp_client_opspec_timeout;
77
static int hf_llrp_max_num_rospec;
78
static int hf_llrp_max_num_spec_per_rospec;
79
static int hf_llrp_max_num_inventory_per_aispec;
80
static int hf_llrp_max_num_accessspec;
81
static int hf_llrp_max_num_opspec_per_accressspec;
82
static int hf_llrp_country_code;
83
static int hf_llrp_comm_standard;
84
static int hf_llrp_transmit_power;
85
static int hf_llrp_hopping;
86
static int hf_llrp_hop_table_id;
87
static int hf_llrp_rfu;
88
static int hf_llrp_num_hops;
89
static int hf_llrp_frequency;
90
static int hf_llrp_num_freqs;
91
static int hf_llrp_min_freq;
92
static int hf_llrp_max_freq;
93
static int hf_llrp_rospec_id;
94
static int hf_llrp_priority;
95
static int hf_llrp_cur_state;
96
static int hf_llrp_rospec_start_trig_type;
97
static int hf_llrp_offset;
98
static int hf_llrp_period;
99
static int hf_llrp_gpi_event;
100
static int hf_llrp_timeout;
101
static int hf_llrp_rospec_stop_trig_type;
102
static int hf_llrp_duration_trig;
103
static int hf_llrp_antenna_count;
104
static int hf_llrp_antenna;
105
static int hf_llrp_aispec_stop_trig_type;
106
static int hf_llrp_trig_type;
107
static int hf_llrp_number_of_tags;
108
static int hf_llrp_number_of_attempts;
109
static int hf_llrp_t;
110
static int hf_llrp_inventory_spec_id;
111
static int hf_llrp_start_freq;
112
static int hf_llrp_stop_freq;
113
static int hf_llrp_stop_trig_type;
114
static int hf_llrp_n_4;
115
static int hf_llrp_duration;
116
static int hf_llrp_accessspec_id;
117
static int hf_llrp_access_cur_state;
118
static int hf_llrp_access_stop_trig_type;
119
static int hf_llrp_operation_count;
120
static int hf_llrp_opspec_id;
121
static int hf_llrp_conf_value;
122
static int hf_llrp_id_type;
123
static int hf_llrp_reader_id;
124
static int hf_llrp_gpo_data;
125
static int hf_llrp_keepalive_trig_type;
126
static int hf_llrp_time_iterval;
127
static int hf_llrp_antenna_connected;
128
static int hf_llrp_antenna_gain;
129
static int hf_llrp_receiver_sense;
130
static int hf_llrp_channel_idx;
131
static int hf_llrp_gpi_config;
132
static int hf_llrp_gpi_state;
133
static int hf_llrp_hold_events_and_reports;
134
static int hf_llrp_ro_report_trig;
135
static int hf_llrp_n_2;
136
static int hf_llrp_enable_rospec_id;
137
static int hf_llrp_enable_spec_idx;
138
static int hf_llrp_enable_inv_spec_id;
139
static int hf_llrp_enable_antenna_id;
140
static int hf_llrp_enable_channel_idx;
141
static int hf_llrp_enable_peak_rssi;
142
static int hf_llrp_enable_first_seen;
143
static int hf_llrp_enable_last_seen;
144
static int hf_llrp_enable_seen_count;
145
static int hf_llrp_enable_accessspec_id;
146
static int hf_llrp_access_report_trig;
147
static int hf_llrp_length_bits;
148
static int hf_llrp_epc;
149
static int hf_llrp_spec_idx;
150
static int hf_llrp_peak_rssi;
151
static int hf_llrp_tag_count;
152
static int hf_llrp_bandwidth;
153
static int hf_llrp_average_rssi;
154
static int hf_llrp_notif_state;
155
static int hf_llrp_event_type;
156
static int hf_llrp_next_chan_idx;
157
static int hf_llrp_roevent_type;
158
static int hf_llrp_prem_rospec_id;
159
static int hf_llrp_buffer_full_percentage;
160
static int hf_llrp_message;
161
static int hf_llrp_rfevent_type;
162
static int hf_llrp_aievent_type;
163
static int hf_llrp_antenna_event_type;
164
static int hf_llrp_conn_status;
165
static int hf_llrp_loop_count;
166
static int hf_llrp_status_code;
167
static int hf_llrp_error_desc;
168
static int hf_llrp_field_num;
169
static int hf_llrp_error_code;
170
static int hf_llrp_parameter_type;
171
static int hf_llrp_can_support_block_erase;
172
static int hf_llrp_can_support_block_write;
173
static int hf_llrp_can_support_block_permalock;
174
static int hf_llrp_can_support_tag_recomm;
175
static int hf_llrp_can_support_UMI_method2;
176
static int hf_llrp_can_support_XPC;
177
static int hf_llrp_max_num_filter_per_query;
178
static int hf_llrp_mode_ident;
179
static int hf_llrp_DR;
180
static int hf_llrp_hag_conformance;
181
static int hf_llrp_mod;
182
static int hf_llrp_flm;
183
static int hf_llrp_m;
184
static int hf_llrp_bdr;
185
static int hf_llrp_pie;
186
static int hf_llrp_min_tari;
187
static int hf_llrp_max_tari;
188
static int hf_llrp_step_tari;
189
static int hf_llrp_inventory_state_aware;
190
static int hf_llrp_trunc;
191
static int hf_llrp_mb;
192
static int hf_llrp_pointer;
193
static int hf_llrp_tag_mask;
194
static int hf_llrp_aware_filter_target;
195
static int hf_llrp_aware_filter_action;
196
static int hf_llrp_unaware_filter_action;
197
static int hf_llrp_mode_idx;
198
static int hf_llrp_tari;
199
static int hf_llrp_session;
200
static int hf_llrp_tag_population;
201
static int hf_llrp_tag_transit_time;
202
static int hf_llrp_sing_i;
203
static int hf_llrp_sing_s;
204
static int hf_llrp_sing_a;
205
static int hf_llrp_match;
206
static int hf_llrp_tag_data;
207
static int hf_llrp_access_pass;
208
static int hf_llrp_word_pointer;
209
static int hf_llrp_word_count;
210
static int hf_llrp_write_data;
211
static int hf_llrp_kill_pass;
212
static int hf_llrp_kill_3;
213
static int hf_llrp_kill_2;
214
static int hf_llrp_kill_l;
215
static int hf_llrp_privilege;
216
static int hf_llrp_data_field;
217
static int hf_llrp_block_pointer;
218
static int hf_llrp_block_mask;
219
static int hf_llrp_length_words;
220
static int hf_llrp_block_range;
221
static int hf_llrp_enable_crc;
222
static int hf_llrp_enable_pc;
223
static int hf_llrp_enable_xpc;
224
static int hf_llrp_pc_bits;
225
static int hf_llrp_xpc_w1;
226
static int hf_llrp_xpc_w2;
227
static int hf_llrp_crc;
228
static int hf_llrp_num_coll;
229
static int hf_llrp_num_empty;
230
static int hf_llrp_access_result;
231
static int hf_llrp_read_data;
232
static int hf_llrp_num_words_written;
233
static int hf_llrp_permlock_status;
234
static int hf_llrp_vendor_id;
235
static int hf_llrp_vendor_unknown;
236
static int hf_llrp_impinj_param_type;
237
static int hf_llrp_save_config;
238
static int hf_llrp_impinj_req_data;
239
static int hf_llrp_impinj_reg_region;
240
static int hf_llrp_impinj_search_mode;
241
static int hf_llrp_impinj_en_tag_dir;
242
static int hf_llrp_impinj_antenna_conf;
243
static int hf_llrp_decision_time;
244
static int hf_llrp_impinj_tag_dir;
245
static int hf_llrp_confidence;
246
static int hf_llrp_impinj_fix_freq_mode;
247
static int hf_llrp_num_channels;
248
static int hf_llrp_channel;
249
static int hf_llrp_impinj_reduce_power_mode;
250
static int hf_llrp_impinj_low_duty_mode;
251
static int hf_llrp_empty_field_timeout;
252
static int hf_llrp_field_ping_interval;
253
static int hf_llrp_model_name;
254
static int hf_llrp_serial_number;
255
static int hf_llrp_soft_ver;
256
static int hf_llrp_firm_ver;
257
static int hf_llrp_fpga_ver;
258
static int hf_llrp_pcba_ver;
259
static int hf_llrp_height_thresh;
260
static int hf_llrp_zero_motion_thresh;
261
static int hf_llrp_board_manufacturer;
262
static int hf_llrp_fw_ver_hex;
263
static int hf_llrp_hw_ver_hex;
264
static int hf_llrp_gpi_debounce;
265
static int hf_llrp_temperature;
266
static int hf_llrp_impinj_link_monitor_mode;
267
static int hf_llrp_link_down_thresh;
268
static int hf_llrp_impinj_report_buff_mode;
269
static int hf_llrp_permalock_result;
270
static int hf_llrp_block_permalock_result;
271
static int hf_llrp_impinj_data_profile;
272
static int hf_llrp_impinj_access_range;
273
static int hf_llrp_impinj_persistence;
274
static int hf_llrp_set_qt_config_result;
275
static int hf_llrp_get_qt_config_result;
276
static int hf_llrp_impinj_serialized_tid_mode;
277
static int hf_llrp_impinj_rf_phase_mode;
278
static int hf_llrp_impinj_peak_rssi_mode;
279
static int hf_llrp_impinj_gps_coordinates_mode;
280
static int hf_llrp_impinj_tid;
281
static int hf_llrp_phase_angle;
282
static int hf_llrp_rssi;
283
static int hf_llrp_latitude;
284
static int hf_llrp_longitude;
285
static int hf_llrp_gga_sentence;
286
static int hf_llrp_rmc_sentence;
287
static int hf_llrp_impinj_optim_read_mode;
288
static int hf_llrp_impinj_rf_doppler_mode;
289
static int hf_llrp_retry_count;
290
static int hf_llrp_impinj_access_spec_ordering;
291
static int hf_llrp_impinj_gpo_mode;
292
static int hf_llrp_gpo_pulse_dur;
293
static int hf_llrp_impinj_hub_id;
294
static int hf_llrp_impinj_hub_fault_type;
295
static int hf_llrp_impinj_hub_connected_type;
296
297
/* Initialize the subtree pointers */
298
static int ett_llrp;
299
static int ett_llrp_param;
300
301
static expert_field ei_llrp_req_conf;
302
static expert_field ei_llrp_invalid_length;
303
304
/* Message Types */
305
0
#define LLRP_TYPE_GET_READER_CAPABILITIES           1
306
0
#define LLRP_TYPE_GET_READER_CONFIG                 2
307
0
#define LLRP_TYPE_SET_READER_CONFIG                 3
308
0
#define LLRP_TYPE_CLOSE_CONNECTION_RESPONSE         4
309
0
#define LLRP_TYPE_GET_READER_CAPABILITIES_RESPONSE 11
310
0
#define LLRP_TYPE_GET_READER_CONFIG_RESPONSE       12
311
0
#define LLRP_TYPE_SET_READER_CONFIG_RESPONSE       13
312
0
#define LLRP_TYPE_CLOSE_CONNECTION                 14
313
0
#define LLRP_TYPE_ADD_ROSPEC                       20
314
0
#define LLRP_TYPE_DELETE_ROSPEC                    21
315
0
#define LLRP_TYPE_START_ROSPEC                     22
316
0
#define LLRP_TYPE_STOP_ROSPEC                      23
317
0
#define LLRP_TYPE_ENABLE_ROSPEC                    24
318
0
#define LLRP_TYPE_DISABLE_ROSPEC                   25
319
0
#define LLRP_TYPE_GET_ROSPECS                      26
320
0
#define LLRP_TYPE_ADD_ROSPEC_RESPONSE              30
321
0
#define LLRP_TYPE_DELETE_ROSPEC_RESPONSE           31
322
0
#define LLRP_TYPE_START_ROSPEC_RESPONSE            32
323
0
#define LLRP_TYPE_STOP_ROSPEC_RESPONSE             33
324
0
#define LLRP_TYPE_ENABLE_ROSPEC_RESPONSE           34
325
0
#define LLRP_TYPE_DISABLE_ROSPEC_RESPONSE          35
326
0
#define LLRP_TYPE_GET_ROSPECS_RESPONSE             36
327
0
#define LLRP_TYPE_ADD_ACCESSSPEC                   40
328
0
#define LLRP_TYPE_DELETE_ACCESSSPEC                41
329
0
#define LLRP_TYPE_ENABLE_ACCESSSPEC                42
330
0
#define LLRP_TYPE_DISABLE_ACCESSSPEC               43
331
0
#define LLRP_TYPE_GET_ACCESSSPECS                  44
332
0
#define LLRP_TYPE_CLIENT_REQUEST_OP                45
333
0
#define LLRP_TYPE_GET_SUPPORTED_VERSION            46
334
0
#define LLRP_TYPE_SET_PROTOCOL_VERSION             47
335
0
#define LLRP_TYPE_ADD_ACCESSSPEC_RESPONSE          50
336
0
#define LLRP_TYPE_DELETE_ACCESSSPEC_RESPONSE       51
337
0
#define LLRP_TYPE_ENABLE_ACCESSSPEC_RESPONSE       52
338
0
#define LLRP_TYPE_DISABLE_ACCESSSPEC_RESPONSE      53
339
0
#define LLRP_TYPE_GET_ACCESSSPECS_RESPONSE         54
340
0
#define LLRP_TYPE_CLIENT_RESQUEST_OP_RESPONSE      55
341
0
#define LLRP_TYPE_GET_SUPPORTED_VERSION_RESPONSE   56
342
0
#define LLRP_TYPE_SET_PROTOCOL_VERSION_RESPONSE    57
343
0
#define LLRP_TYPE_GET_REPORT                       60
344
0
#define LLRP_TYPE_RO_ACCESS_REPORT                 61
345
0
#define LLRP_TYPE_KEEPALIVE                        62
346
0
#define LLRP_TYPE_READER_EVENT_NOTIFICATION        63
347
0
#define LLRP_TYPE_ENABLE_EVENTS_AND_REPORTS        64
348
0
#define LLRP_TYPE_KEEPALIVE_ACK                    72
349
0
#define LLRP_TYPE_ERROR_MESSAGE                   100
350
0
#define LLRP_TYPE_CUSTOM_MESSAGE                 1023
351
352
static const value_string message_types[] = {
353
    { LLRP_TYPE_GET_READER_CAPABILITIES,         "Get Reader Capabilities"         },
354
    { LLRP_TYPE_GET_READER_CONFIG,               "Get Reader Config"               },
355
    { LLRP_TYPE_SET_READER_CONFIG,               "Set Reader Config"               },
356
    { LLRP_TYPE_CLOSE_CONNECTION_RESPONSE,       "Close Connection Response"       },
357
    { LLRP_TYPE_GET_READER_CAPABILITIES_RESPONSE,"Get Reader Capabilities Response"},
358
    { LLRP_TYPE_GET_READER_CONFIG_RESPONSE,      "Get Reader Config Response"      },
359
    { LLRP_TYPE_SET_READER_CONFIG_RESPONSE,      "Set Reader Config Response"      },
360
    { LLRP_TYPE_CLOSE_CONNECTION,                "Close Connection"                },
361
    { LLRP_TYPE_ADD_ROSPEC,                      "Add ROSpec"                      },
362
    { LLRP_TYPE_DELETE_ROSPEC,                   "Delete ROSpec"                   },
363
    { LLRP_TYPE_START_ROSPEC,                    "Start ROSpec"                    },
364
    { LLRP_TYPE_STOP_ROSPEC,                     "Stop ROSpec"                     },
365
    { LLRP_TYPE_ENABLE_ROSPEC,                   "Enable ROSpec"                   },
366
    { LLRP_TYPE_DISABLE_ROSPEC,                  "Disable ROSpec"                  },
367
    { LLRP_TYPE_GET_ROSPECS,                     "Get ROSpecs"                     },
368
    { LLRP_TYPE_ADD_ROSPEC_RESPONSE,             "Add ROSpec Response"             },
369
    { LLRP_TYPE_DELETE_ROSPEC_RESPONSE,          "Delete ROSpec Response"          },
370
    { LLRP_TYPE_START_ROSPEC_RESPONSE,           "Start ROSpec Response"           },
371
    { LLRP_TYPE_STOP_ROSPEC_RESPONSE,            "Stop ROSpec Response"            },
372
    { LLRP_TYPE_ENABLE_ROSPEC_RESPONSE,          "Enable ROSpec Response"          },
373
    { LLRP_TYPE_DISABLE_ROSPEC_RESPONSE,         "Disable ROSpec Response"         },
374
    { LLRP_TYPE_GET_ROSPECS_RESPONSE,            "Get ROSpecs Response"            },
375
    { LLRP_TYPE_ADD_ACCESSSPEC,                  "Add AccessSpec"                  },
376
    { LLRP_TYPE_DELETE_ACCESSSPEC,               "Delete AccessSpec"               },
377
    { LLRP_TYPE_ENABLE_ACCESSSPEC,               "Enable AccessSpec"               },
378
    { LLRP_TYPE_DISABLE_ACCESSSPEC,              "Disable AccessSpec"              },
379
    { LLRP_TYPE_GET_ACCESSSPECS,                 "Get AccessSpecs"                 },
380
    { LLRP_TYPE_CLIENT_REQUEST_OP,               "Client Request OP"               },
381
    { LLRP_TYPE_GET_SUPPORTED_VERSION,           "Get Supported Version"           },
382
    { LLRP_TYPE_SET_PROTOCOL_VERSION,            "Set Protocol Version"            },
383
    { LLRP_TYPE_ADD_ACCESSSPEC_RESPONSE,         "Add AccessSpec Response"         },
384
    { LLRP_TYPE_DELETE_ACCESSSPEC_RESPONSE,      "Delete AccessSpec Response"      },
385
    { LLRP_TYPE_ENABLE_ACCESSSPEC_RESPONSE,      "Enable AccessSpec Response"      },
386
    { LLRP_TYPE_DISABLE_ACCESSSPEC_RESPONSE,     "Disable AccessSpec Response"     },
387
    { LLRP_TYPE_GET_ACCESSSPECS_RESPONSE,        "Get AccessSpecs Response"        },
388
    { LLRP_TYPE_CLIENT_RESQUEST_OP_RESPONSE,     "Client Resquest OP Response"     },
389
    { LLRP_TYPE_GET_SUPPORTED_VERSION_RESPONSE,  "Get Supported Version Response"  },
390
    { LLRP_TYPE_SET_PROTOCOL_VERSION_RESPONSE,   "Set Protocol Version Response"   },
391
    { LLRP_TYPE_GET_REPORT,                      "Get Report"                      },
392
    { LLRP_TYPE_RO_ACCESS_REPORT,                "RO Access Report"                },
393
    { LLRP_TYPE_KEEPALIVE,                       "Keepalive"                       },
394
    { LLRP_TYPE_READER_EVENT_NOTIFICATION,       "Reader Event Notification"       },
395
    { LLRP_TYPE_ENABLE_EVENTS_AND_REPORTS,       "Enable Events And Reports"       },
396
    { LLRP_TYPE_KEEPALIVE_ACK,                   "Keepalive Ack"                   },
397
    { LLRP_TYPE_ERROR_MESSAGE,                   "Error Message"                   },
398
    { LLRP_TYPE_CUSTOM_MESSAGE,                  "Custom Message"                  },
399
    { 0,                                          NULL                             }
400
};
401
static value_string_ext message_types_ext = VALUE_STRING_EXT_INIT(message_types);
402
403
/* Versions */
404
#define LLRP_VERS_1_0_1 0x01
405
#define LLRP_VERS_1_1   0x02
406
407
static const value_string llrp_versions[] = {
408
    { LLRP_VERS_1_0_1, "1.0.1" },
409
    { LLRP_VERS_1_1,   "1.1"   },
410
    { 0,                NULL   }
411
};
412
413
/* Capabilities */
414
#define LLRP_CAP_ALL            0
415
#define LLRP_CAP_GENERAL_DEVICE 1
416
#define LLRP_CAP_LLRP           2
417
#define LLRP_CAP_REGULATORY     3
418
#define LLRP_CAP_AIR_PROTOCOL   4
419
420
static const value_string capabilities_request[] = {
421
    { LLRP_CAP_ALL,            "All"                            },
422
    { LLRP_CAP_GENERAL_DEVICE, "General Device Capabilities"    },
423
    { LLRP_CAP_LLRP,           "LLRP Capabilities"              },
424
    { LLRP_CAP_REGULATORY,     "Regulatory Capabilities"        },
425
    { LLRP_CAP_AIR_PROTOCOL,   "Air Protocol LLRP Capabilities" },
426
    { 0,                        NULL                            }
427
};
428
429
/* Configurations */
430
0
#define LLRP_CONF_ALL                             0
431
0
#define LLRP_CONF_IDENTIFICATION                  1
432
0
#define LLRP_CONF_ANTENNA_PROPERTIES              2
433
0
#define LLRP_CONF_ANTENNA_CONFIGURATION           3
434
0
#define LLRP_CONF_RO_REPORT_SPEC                  4
435
0
#define LLRP_CONF_READER_EVENT_NOTIFICATION_SPEC  5
436
0
#define LLRP_CONF_ACCESS_REPORT_SPEC              6
437
0
#define LLRP_CONF_LLRP_CONFIGURATION_STATE        7
438
0
#define LLRP_CONF_KEEPALIVE_SPEC                  8
439
0
#define LLRP_CONF_GPI_PORT_CURRENT_STATE          9
440
0
#define LLRP_CONF_GPO_WRITE_DATA                 10
441
0
#define LLRP_CONF_EVENTS_AND_REPORTS             11
442
443
static const value_string config_request[] = {
444
    { LLRP_CONF_ALL,                            "All"                            },
445
    { LLRP_CONF_IDENTIFICATION,                 "Identification"                 },
446
    { LLRP_CONF_ANTENNA_PROPERTIES,             "Antenna Properties"             },
447
    { LLRP_CONF_ANTENNA_CONFIGURATION,          "Antenna Configuration"          },
448
    { LLRP_CONF_RO_REPORT_SPEC,                 "RO Report Spec"                 },
449
    { LLRP_CONF_READER_EVENT_NOTIFICATION_SPEC, "Reader Event Notification Spec" },
450
    { LLRP_CONF_ACCESS_REPORT_SPEC,             "Access Report Spec"             },
451
    { LLRP_CONF_LLRP_CONFIGURATION_STATE,       "LLRP Configuration State"       },
452
    { LLRP_CONF_KEEPALIVE_SPEC,                 "Keepalive Spec"                 },
453
    { LLRP_CONF_GPI_PORT_CURRENT_STATE,         "GPI Port Current State"         },
454
    { LLRP_CONF_GPO_WRITE_DATA,                 "GPO Write Data"                 },
455
    { LLRP_CONF_EVENTS_AND_REPORTS,             "Events and Reports"             },
456
    { 0,                                         NULL                            }
457
};
458
static value_string_ext config_request_ext = VALUE_STRING_EXT_INIT(config_request);
459
460
/* TLV Parameter Types */
461
0
#define LLRP_TLV_UTC_TIMESTAMP           128
462
0
#define LLRP_TLV_UPTIME                  129
463
0
#define LLRP_TLV_GENERAL_DEVICE_CAP      137
464
0
#define LLRP_TLV_RECEIVE_SENSE_ENTRY     139
465
0
#define LLRP_TLV_ANTENNA_AIR_PROTO       140
466
0
#define LLRP_TLV_GPIO_CAPABILITIES       141
467
0
#define LLRP_TLV_LLRP_CAPABILITIES       142
468
0
#define LLRP_TLV_REGU_CAPABILITIES       143
469
0
#define LLRP_TLV_UHF_CAPABILITIES        144
470
0
#define LLRP_TLV_XMIT_POWER_LEVEL_ENTRY  145
471
0
#define LLRP_TLV_FREQ_INFORMATION        146
472
0
#define LLRP_TLV_FREQ_HOP_TABLE          147
473
0
#define LLRP_TLV_FIXED_FREQ_TABLE        148
474
0
#define LLRP_TLV_ANTENNA_RCV_SENSE_RANGE 149
475
0
#define LLRP_TLV_RO_SPEC                 177
476
0
#define LLRP_TLV_RO_BOUND_SPEC           178
477
0
#define LLRP_TLV_RO_SPEC_START_TRIGGER   179
478
0
#define LLRP_TLV_PER_TRIGGER_VAL         180
479
0
#define LLRP_TLV_GPI_TRIGGER_VAL         181
480
0
#define LLRP_TLV_RO_SPEC_STOP_TRIGGER    182
481
0
#define LLRP_TLV_AI_SPEC                 183
482
0
#define LLRP_TLV_AI_SPEC_STOP            184
483
0
#define LLRP_TLV_TAG_OBSERV_TRIGGER      185
484
0
#define LLRP_TLV_INVENTORY_PARAM_SPEC    186
485
0
#define LLRP_TLV_RF_SURVEY_SPEC          187
486
0
#define LLRP_TLV_RF_SURVEY_SPEC_STOP_TR  188
487
0
#define LLRP_TLV_ACCESS_SPEC             207
488
0
#define LLRP_TLV_ACCESS_SPEC_STOP_TRIG   208
489
0
#define LLRP_TLV_ACCESS_COMMAND          209
490
0
#define LLRP_TLV_CLIENT_REQ_OP_SPEC      210
491
0
#define LLRP_TLV_CLIENT_REQ_RESPONSE     211
492
0
#define LLRP_TLV_LLRP_CONF_STATE_VAL     217
493
0
#define LLRP_TLV_IDENT                   218
494
0
#define LLRP_TLV_GPO_WRITE_DATA          219
495
0
#define LLRP_TLV_KEEPALIVE_SPEC          220
496
0
#define LLRP_TLV_ANTENNA_PROPS           221
497
0
#define LLRP_TLV_ANTENNA_CONF            222
498
0
#define LLRP_TLV_RF_RECEIVER             223
499
0
#define LLRP_TLV_RF_TRANSMITTER          224
500
0
#define LLRP_TLV_GPI_PORT_CURRENT_STATE  225
501
0
#define LLRP_TLV_EVENTS_AND_REPORTS      226
502
0
#define LLRP_TLV_RO_REPORT_SPEC          237
503
0
#define LLRP_TLV_TAG_REPORT_CONTENT_SEL  238
504
0
#define LLRP_TLV_ACCESS_REPORT_SPEC      239
505
0
#define LLRP_TLV_TAG_REPORT_DATA         240
506
0
#define LLRP_TLV_EPC_DATA                241
507
0
#define LLRP_TLV_RF_SURVEY_REPORT_DATA   242
508
0
#define LLRP_TLV_FREQ_RSSI_LEVEL_ENTRY   243
509
0
#define LLRP_TLV_READER_EVENT_NOTI_SPEC  244
510
0
#define LLRP_TLV_EVENT_NOTIF_STATE       245
511
0
#define LLRP_TLV_READER_EVENT_NOTI_DATA  246
512
0
#define LLRP_TLV_HOPPING_EVENT           247
513
0
#define LLRP_TLV_GPI_EVENT               248
514
0
#define LLRP_TLV_RO_SPEC_EVENT           249
515
0
#define LLRP_TLV_REPORT_BUF_LEVEL_WARN   250
516
0
#define LLRP_TLV_REPORT_BUF_OVERFLOW_ERR 251
517
0
#define LLRP_TLV_READER_EXCEPTION_EVENT  252
518
0
#define LLRP_TLV_RF_SURVEY_EVENT         253
519
0
#define LLRP_TLV_AI_SPEC_EVENT           254
520
0
#define LLRP_TLV_ANTENNA_EVENT           255
521
0
#define LLRP_TLV_CONN_ATTEMPT_EVENT      256
522
0
#define LLRP_TLV_CONN_CLOSE_EVENT        257
523
0
#define LLRP_TLV_LLRP_STATUS             287
524
0
#define LLRP_TLV_FIELD_ERROR             288
525
0
#define LLRP_TLV_PARAM_ERROR             289
526
0
#define LLRP_TLV_C1G2_LLRP_CAP           327
527
0
#define LLRP_TLV_C1G2_UHF_RF_MD_TBL      328
528
0
#define LLRP_TLV_C1G2_UHF_RF_MD_TBL_ENT  329
529
0
#define LLRP_TLV_C1G2_INVENTORY_COMMAND  330
530
0
#define LLRP_TLV_C1G2_FILTER             331
531
0
#define LLRP_TLV_C1G2_TAG_INV_MASK       332
532
0
#define LLRP_TLV_C1G2_TAG_INV_AWARE_FLTR 333
533
0
#define LLRP_TLV_C1G2_TAG_INV_UNAWR_FLTR 334
534
0
#define LLRP_TLV_C1G2_RF_CONTROL         335
535
0
#define LLRP_TLV_C1G2_SINGULATION_CTRL   336
536
0
#define LLRP_TLV_C1G2_TAG_INV_AWARE_SING 337
537
0
#define LLRP_TLV_C1G2_TAG_SPEC           338
538
0
#define LLRP_TLV_C1G2_TARGET_TAG         339
539
0
#define LLRP_TLV_C1G2_READ               341
540
0
#define LLRP_TLV_C1G2_WRITE              342
541
0
#define LLRP_TLV_C1G2_KILL               343
542
0
#define LLRP_TLV_C1G2_LOCK               344
543
0
#define LLRP_TLV_C1G2_LOCK_PAYLOAD       345
544
0
#define LLRP_TLV_C1G2_BLK_ERASE          346
545
0
#define LLRP_TLV_C1G2_BLK_WRITE          347
546
0
#define LLRP_TLV_C1G2_EPC_MEMORY_SLCTOR  348
547
0
#define LLRP_TLV_C1G2_READ_OP_SPEC_RES   349
548
0
#define LLRP_TLV_C1G2_WRT_OP_SPEC_RES    350
549
0
#define LLRP_TLV_C1G2_KILL_OP_SPEC_RES   351
550
0
#define LLRP_TLV_C1G2_LOCK_OP_SPEC_RES   352
551
0
#define LLRP_TLV_C1G2_BLK_ERS_OP_SPC_RES 353
552
0
#define LLRP_TLV_C1G2_BLK_WRT_OP_SPC_RES 354
553
0
#define LLRP_TLV_LOOP_SPEC               355
554
0
#define LLRP_TLV_SPEC_LOOP_EVENT         356
555
0
#define LLRP_TLV_C1G2_RECOMMISSION       357
556
0
#define LLRP_TLV_C1G2_BLK_PERMALOCK      358
557
0
#define LLRP_TLV_C1G2_GET_BLK_PERMALOCK  359
558
0
#define LLRP_TLV_C1G2_RECOM_OP_SPEC_RES  360
559
0
#define LLRP_TLV_C1G2_BLK_PRL_OP_SPC_RES 361
560
0
#define LLRP_TLV_C1G2_BLK_PRL_STAT_RES   362
561
0
#define LLRP_TLV_MAX_RECEIVE_SENSE       363
562
0
#define LLRP_TLV_RF_SURVEY_FREQ_CAP      365
563
0
#define LLRP_TLV_CUSTOM_PARAMETER       1023
564
565
static const value_string tlv_type[] = {
566
    { LLRP_TLV_UTC_TIMESTAMP,           "UTC Timestamp"                                  },
567
    { LLRP_TLV_UPTIME,                  "Uptime"                                         },
568
    { LLRP_TLV_GENERAL_DEVICE_CAP,      "General Device Capabilities"                    },
569
    { LLRP_TLV_RECEIVE_SENSE_ENTRY,     "Receive Sensitivity Entry"                      },
570
    { LLRP_TLV_ANTENNA_AIR_PROTO,       "Antenna Air Protocol"                           },
571
    { LLRP_TLV_GPIO_CAPABILITIES,       "GPIO Capabilities"                              },
572
    { LLRP_TLV_LLRP_CAPABILITIES,       "LLRP Capabilities"                              },
573
    { LLRP_TLV_REGU_CAPABILITIES,       "REGU Capabilities"                              },
574
    { LLRP_TLV_UHF_CAPABILITIES,        "UHF Capabilities"                               },
575
    { LLRP_TLV_XMIT_POWER_LEVEL_ENTRY,  "Transmit Power Level Entry"                     },
576
    { LLRP_TLV_FREQ_INFORMATION,        "Frequency Information"                          },
577
    { LLRP_TLV_FREQ_HOP_TABLE,          "Frequency Hop Table"                            },
578
    { LLRP_TLV_FIXED_FREQ_TABLE,        "Fixed Frequency Table"                          },
579
    { LLRP_TLV_ANTENNA_RCV_SENSE_RANGE, "Antenna RCV Sensitivity Range"                  },
580
    { LLRP_TLV_RO_SPEC,                 "RO Spec"                                        },
581
    { LLRP_TLV_RO_BOUND_SPEC,           "RO Bound Spec"                                  },
582
    { LLRP_TLV_RO_SPEC_START_TRIGGER,   "RO Spec Start Trigger"                          },
583
    { LLRP_TLV_PER_TRIGGER_VAL,         "PER Trigger Value"                              },
584
    { LLRP_TLV_GPI_TRIGGER_VAL,         "GPI Trigger Value"                              },
585
    { LLRP_TLV_RO_SPEC_STOP_TRIGGER,    "RO Spec Stop Trigger"                           },
586
    { LLRP_TLV_AI_SPEC,                 "AI Spec"                                        },
587
    { LLRP_TLV_AI_SPEC_STOP,            "AI Spec Stop"                                   },
588
    { LLRP_TLV_TAG_OBSERV_TRIGGER,      "Tag Observation Trigger"                        },
589
    { LLRP_TLV_INVENTORY_PARAM_SPEC,    "Inventory Parameter Spec ID"                    },
590
    { LLRP_TLV_RF_SURVEY_SPEC,          "RF Survey Spec"                                 },
591
    { LLRP_TLV_RF_SURVEY_SPEC_STOP_TR,  "RF Survey Spec Stop Trigger"                    },
592
    { LLRP_TLV_ACCESS_SPEC,             "Access Spec"                                    },
593
    { LLRP_TLV_ACCESS_SPEC_STOP_TRIG,   "Access Spec Stop Trigger"                       },
594
    { LLRP_TLV_ACCESS_COMMAND,          "Access Command"                                 },
595
    { LLRP_TLV_CLIENT_REQ_OP_SPEC,      "Client Request Op Spec"                         },
596
    { LLRP_TLV_CLIENT_REQ_RESPONSE,     "Client Request Response"                        },
597
    { LLRP_TLV_LLRP_CONF_STATE_VAL,     "LLRP Configuration State Value"                 },
598
    { LLRP_TLV_IDENT,                   "Identification"                                 },
599
    { LLRP_TLV_GPO_WRITE_DATA,          "GPO Write Data"                                 },
600
    { LLRP_TLV_KEEPALIVE_SPEC,          "Keepalive Spec"                                 },
601
    { LLRP_TLV_ANTENNA_PROPS,           "Antenna Properties"                             },
602
    { LLRP_TLV_ANTENNA_CONF,            "Antenna Configuration"                          },
603
    { LLRP_TLV_RF_RECEIVER,             "RF Receiver"                                    },
604
    { LLRP_TLV_RF_TRANSMITTER,          "RF Transmitter"                                 },
605
    { LLRP_TLV_GPI_PORT_CURRENT_STATE,  "GPI Port Current State"                         },
606
    { LLRP_TLV_EVENTS_AND_REPORTS,      "Events And Reports"                             },
607
    { LLRP_TLV_RO_REPORT_SPEC,          "RO Report Spec"                                 },
608
    { LLRP_TLV_TAG_REPORT_CONTENT_SEL,  "Tag Report Content Selector"                    },
609
    { LLRP_TLV_ACCESS_REPORT_SPEC,      "Access Report Spec"                             },
610
    { LLRP_TLV_TAG_REPORT_DATA,         "Tag Report Data"                                },
611
    { LLRP_TLV_EPC_DATA,                "EPC Data"                                       },
612
    { LLRP_TLV_RF_SURVEY_REPORT_DATA,   "RF Survey Report Data"                          },
613
    { LLRP_TLV_FREQ_RSSI_LEVEL_ENTRY,   "Frequency RSSI Level Entry"                     },
614
    { LLRP_TLV_READER_EVENT_NOTI_SPEC,  "Reader Event Notification Spec"                 },
615
    { LLRP_TLV_EVENT_NOTIF_STATE,       "Event Notification State"                       },
616
    { LLRP_TLV_READER_EVENT_NOTI_DATA,  "Reader Event Notification Data"                 },
617
    { LLRP_TLV_HOPPING_EVENT,           "Hopping Event"                                  },
618
    { LLRP_TLV_GPI_EVENT,               "GPI Event"                                      },
619
    { LLRP_TLV_RO_SPEC_EVENT,           "RO Spec Event"                                  },
620
    { LLRP_TLV_REPORT_BUF_LEVEL_WARN,   "Report Buffer Level Warning Event"              },
621
    { LLRP_TLV_REPORT_BUF_OVERFLOW_ERR, "Report Buffer Overflow Error Event"             },
622
    { LLRP_TLV_READER_EXCEPTION_EVENT,  "Reader Exception Event"                         },
623
    { LLRP_TLV_RF_SURVEY_EVENT,         "RF Survey Event"                                },
624
    { LLRP_TLV_AI_SPEC_EVENT,           "AI Spec Event"                                  },
625
    { LLRP_TLV_ANTENNA_EVENT,           "ANTENNA Event"                                  },
626
    { LLRP_TLV_CONN_ATTEMPT_EVENT,      "CONN Attempt Event"                             },
627
    { LLRP_TLV_CONN_CLOSE_EVENT,        "CONN Close Event"                               },
628
    { LLRP_TLV_LLRP_STATUS,             "LLRP Status"                                    },
629
    { LLRP_TLV_FIELD_ERROR,             "Field Error"                                    },
630
    { LLRP_TLV_PARAM_ERROR,             "Param Error"                                    },
631
    { LLRP_TLV_C1G2_LLRP_CAP,           "C1G2 LLRP Capabilities"                         },
632
    { LLRP_TLV_C1G2_UHF_RF_MD_TBL,      "C1G2 UHF RF Mode Table"                         },
633
    { LLRP_TLV_C1G2_UHF_RF_MD_TBL_ENT,  "C1G2 UHF RF Mode Table Entry"                   },
634
    { LLRP_TLV_C1G2_INVENTORY_COMMAND,  "C1G2 Inventory Command"                         },
635
    { LLRP_TLV_C1G2_FILTER,             "C1G2 Filter"                                    },
636
    { LLRP_TLV_C1G2_TAG_INV_MASK,       "C1G2 Tag Inventory Mask"                        },
637
    { LLRP_TLV_C1G2_TAG_INV_AWARE_FLTR, "C1G2 Tag Inventory State-Aware Filter Action"   },
638
    { LLRP_TLV_C1G2_TAG_INV_UNAWR_FLTR, "C1G2 Tag Inventory State-Unaware Filter Action" },
639
    { LLRP_TLV_C1G2_RF_CONTROL,         "C1G2 RF Control"                                },
640
    { LLRP_TLV_C1G2_SINGULATION_CTRL,   "C1G2 Singulation Control"                       },
641
    { LLRP_TLV_C1G2_TAG_INV_AWARE_SING, "C1G2 Tag Inventory State-Aware Singulation"     },
642
    { LLRP_TLV_C1G2_TAG_SPEC,           "C1G2 Tag Spec"                                  },
643
    { LLRP_TLV_C1G2_TARGET_TAG,         "C1G2 Target Tag"                                },
644
    { LLRP_TLV_C1G2_READ,               "C1G2 Read"                                      },
645
    { LLRP_TLV_C1G2_WRITE,              "C1G2 Write"                                     },
646
    { LLRP_TLV_C1G2_KILL,               "C1G2 Kill"                                      },
647
    { LLRP_TLV_C1G2_LOCK,               "C1G2 Lock"                                      },
648
    { LLRP_TLV_C1G2_LOCK_PAYLOAD,       "C1G2 Lock Payload"                              },
649
    { LLRP_TLV_C1G2_BLK_ERASE,          "C1G2 Block Erase"                               },
650
    { LLRP_TLV_C1G2_BLK_WRITE,          "C1G2 Block Write"                               },
651
    { LLRP_TLV_C1G2_EPC_MEMORY_SLCTOR,  "C1G2 EPC Memory Selector"                       },
652
    { LLRP_TLV_C1G2_READ_OP_SPEC_RES,   "C1G2 Read Op Spec Result"                       },
653
    { LLRP_TLV_C1G2_WRT_OP_SPEC_RES,    "C1G2 Write Op Spec Result"                      },
654
    { LLRP_TLV_C1G2_KILL_OP_SPEC_RES,   "C1G2 Kill Op Spec Result"                       },
655
    { LLRP_TLV_C1G2_LOCK_OP_SPEC_RES,   "C1G2 Lock Op Spec Result"                       },
656
    { LLRP_TLV_C1G2_BLK_ERS_OP_SPC_RES, "C1G2 Block Erase Op Spec Result"                },
657
    { LLRP_TLV_C1G2_BLK_WRT_OP_SPC_RES, "C1G2 Block Write Op Spec Result"                },
658
    { LLRP_TLV_LOOP_SPEC,               "Loop Spec"                                      },
659
    { LLRP_TLV_SPEC_LOOP_EVENT,         "Spec loop event"                                },
660
    { LLRP_TLV_C1G2_RECOMMISSION,       "C1G2 Recommission"                              },
661
    { LLRP_TLV_C1G2_BLK_PERMALOCK,      "C1G2 Block Permalock"                           },
662
    { LLRP_TLV_C1G2_GET_BLK_PERMALOCK,  "C1G2 Get Block Permalock Status"                },
663
    { LLRP_TLV_C1G2_RECOM_OP_SPEC_RES,  "C1G2 Recommission Op Spec Result"               },
664
    { LLRP_TLV_C1G2_BLK_PRL_OP_SPC_RES, "C1G2 Block Permalock Op Spec Result"            },
665
    { LLRP_TLV_C1G2_BLK_PRL_STAT_RES,   "C1G2 Block Permalock Status Op Spec Result"     },
666
    { LLRP_TLV_MAX_RECEIVE_SENSE,       "Maximum Receive Sensitivity"                    },
667
    { LLRP_TLV_RF_SURVEY_FREQ_CAP,      "RF Survey Frequency Capabilities"               },
668
    { LLRP_TLV_CUSTOM_PARAMETER,        "Custom parameter"                               },
669
    { 0,                                 NULL                                            }
670
};
671
static value_string_ext tlv_type_ext = VALUE_STRING_EXT_INIT(tlv_type);
672
673
/* TV Parameter Types */
674
0
#define LLRP_TV_ANTENNA_ID               1
675
0
#define LLRP_TV_FIRST_SEEN_TIME_UTC      2
676
0
#define LLRP_TV_FIRST_SEEN_TIME_UPTIME   3
677
0
#define LLRP_TV_LAST_SEEN_TIME_UTC       4
678
0
#define LLRP_TV_LAST_SEEN_TIME_UPTIME    5
679
0
#define LLRP_TV_PEAK_RSSI                6
680
0
#define LLRP_TV_CHANNEL_INDEX            7
681
0
#define LLRP_TV_TAG_SEEN_COUNT           8
682
0
#define LLRP_TV_RO_SPEC_ID               9
683
0
#define LLRP_TV_INVENTORY_PARAM_SPEC_ID 10
684
0
#define LLRP_TV_C1G2_CRC                11
685
0
#define LLRP_TV_C1G2_PC                 12
686
0
#define LLRP_TV_EPC96                   13
687
0
#define LLRP_TV_SPEC_INDEX              14
688
0
#define LLRP_TV_CLIENT_REQ_OP_SPEC_RES  15
689
0
#define LLRP_TV_ACCESS_SPEC_ID          16
690
0
#define LLRP_TV_OP_SPEC_ID              17
691
0
#define LLRP_TV_C1G2_SINGULATION_DET    18
692
0
#define LLRP_TV_C1G2_XPC_W1             19
693
0
#define LLRP_TV_C1G2_XPC_W2             20
694
695
/* Since TV's don't have a length field,
696
 * use these values instead */
697
0
#define LLRP_TV_LEN_ANTENNA_ID               2
698
0
#define LLRP_TV_LEN_FIRST_SEEN_TIME_UTC      8
699
0
#define LLRP_TV_LEN_FIRST_SEEN_TIME_UPTIME   8
700
0
#define LLRP_TV_LEN_LAST_SEEN_TIME_UTC       8
701
0
#define LLRP_TV_LEN_LAST_SEEN_TIME_UPTIME    8
702
0
#define LLRP_TV_LEN_PEAK_RSSI                1
703
0
#define LLRP_TV_LEN_CHANNEL_INDEX            2
704
0
#define LLRP_TV_LEN_TAG_SEEN_COUNT           2
705
0
#define LLRP_TV_LEN_RO_SPEC_ID               4
706
0
#define LLRP_TV_LEN_INVENTORY_PARAM_SPEC_ID  2
707
0
#define LLRP_TV_LEN_C1G2_CRC                 2
708
0
#define LLRP_TV_LEN_C1G2_PC                  2
709
0
#define LLRP_TV_LEN_EPC96                   12
710
0
#define LLRP_TV_LEN_SPEC_INDEX               2
711
0
#define LLRP_TV_LEN_CLIENT_REQ_OP_SPEC_RES   2
712
0
#define LLRP_TV_LEN_ACCESS_SPEC_ID           4
713
0
#define LLRP_TV_LEN_OP_SPEC_ID               2
714
0
#define LLRP_TV_LEN_C1G2_SINGULATION_DET     4
715
0
#define LLRP_TV_LEN_C1G2_XPC_W1              2
716
0
#define LLRP_TV_LEN_C1G2_XPC_W2              2
717
718
static const value_string tv_type[] = {
719
    { LLRP_TV_ANTENNA_ID,              "Antenna ID"                    },
720
    { LLRP_TV_FIRST_SEEN_TIME_UTC,     "First Seen Timestamp UTC"      },
721
    { LLRP_TV_FIRST_SEEN_TIME_UPTIME,  "First Seen Timestamp Uptime"   },
722
    { LLRP_TV_LAST_SEEN_TIME_UTC,      "Last Seen Timestamp UTC"       },
723
    { LLRP_TV_LAST_SEEN_TIME_UPTIME,   "Last Seen Timestamp Uptime"    },
724
    { LLRP_TV_PEAK_RSSI,               "Peak RSSI"                     },
725
    { LLRP_TV_CHANNEL_INDEX,           "Channel Index"                 },
726
    { LLRP_TV_TAG_SEEN_COUNT,          "Tag Seen Count"                },
727
    { LLRP_TV_RO_SPEC_ID,              "RO Spec ID"                    },
728
    { LLRP_TV_INVENTORY_PARAM_SPEC_ID, "Inventory Parameter Spec ID"   },
729
    { LLRP_TV_C1G2_CRC,                "C1G2 CRC"                      },
730
    { LLRP_TV_C1G2_PC,                 "C1G2 PC"                       },
731
    { LLRP_TV_EPC96,                   "EPC-96"                        },
732
    { LLRP_TV_SPEC_INDEX,              "Spec Index"                    },
733
    { LLRP_TV_CLIENT_REQ_OP_SPEC_RES,  "Client Request Op Spec Result" },
734
    { LLRP_TV_ACCESS_SPEC_ID,          "Access Spec ID"                },
735
    { LLRP_TV_OP_SPEC_ID,              "Op Spec ID"                    },
736
    { LLRP_TV_C1G2_SINGULATION_DET,    "C1G2 Singulation Details"      },
737
    { LLRP_TV_C1G2_XPC_W1,             "C1G2 XPC W1"                   },
738
    { LLRP_TV_C1G2_XPC_W2,             "C1G2 XPC W2"                   },
739
    { 0,                                NULL                           }
740
};
741
static value_string_ext tv_type_ext = VALUE_STRING_EXT_INIT(tv_type);
742
743
/* Protocol IDs */
744
#define LLRP_PROT_ID_UNSPECIFIED    0
745
#define LLRP_PROT_ID_EPC_C1G2       1
746
747
static const range_string protocol_id[] = {
748
    { LLRP_PROT_ID_UNSPECIFIED, LLRP_PROT_ID_UNSPECIFIED, "Unspecified protocol"          },
749
    { LLRP_PROT_ID_EPC_C1G2, LLRP_PROT_ID_EPC_C1G2,       "EPCGlobal Class 1 Gen 2"       },
750
    { LLRP_PROT_ID_EPC_C1G2 + 1, 255,                     "Reserved for future use"       },
751
    { 0, 0,                                                NULL                           }
752
};
753
754
/* Communication standards */
755
#define LLRP_COMM_STANDARD_UNSPECIFIED              0
756
#define LLRP_COMM_STANDARD_US_FCC_PART_15           1
757
#define LLRP_COMM_STANDARD_ETSI_302_208             2
758
#define LLRP_COMM_STANDARD_ETSI_300_220             3
759
#define LLRP_COMM_STANDARD_AUSTRALIA_LIPD_1W        4
760
#define LLRP_COMM_STANDARD_AUSTRALIA_LIPD_4W        5
761
#define LLRP_COMM_STANDARD_JAPAN_ARIB_STD_T89       6
762
#define LLRP_COMM_STANDARD_HONG_KONG_OFTA_1049      7
763
#define LLRP_COMM_STANDARD_TAIWAN_DGT_LP0002        8
764
#define LLRP_COMM_STANDARD_KOREA_MIC_ARTICLE_5_2    9
765
766
static const value_string comm_standard[] = {
767
    { LLRP_COMM_STANDARD_UNSPECIFIED,           "Unspecified"           },
768
    { LLRP_COMM_STANDARD_US_FCC_PART_15,        "US FCC Part 15"        },
769
    { LLRP_COMM_STANDARD_ETSI_302_208,          "ETSI 302 208"          },
770
    { LLRP_COMM_STANDARD_ETSI_300_220,          "ETSI 300 220"          },
771
    { LLRP_COMM_STANDARD_AUSTRALIA_LIPD_1W,     "Australia LIPD 1W"     },
772
    { LLRP_COMM_STANDARD_AUSTRALIA_LIPD_4W,     "Australia LIPD 4W"     },
773
    { LLRP_COMM_STANDARD_JAPAN_ARIB_STD_T89,    "Japan_ARIB STD T89"    },
774
    { LLRP_COMM_STANDARD_HONG_KONG_OFTA_1049,   "Hong_Kong OFTA 1049"   },
775
    { LLRP_COMM_STANDARD_TAIWAN_DGT_LP0002,     "Taiwan DGT LP0002"     },
776
    { LLRP_COMM_STANDARD_KOREA_MIC_ARTICLE_5_2, "Korea MIC Article 5 2" },
777
    { 0,                                        NULL                    }
778
};
779
static value_string_ext comm_standard_ext = VALUE_STRING_EXT_INIT(comm_standard);
780
781
/* ID type */
782
#define LLRP_ID_TYPE_MAC    0
783
#define LLRP_ID_TYPE_EPC    1
784
785
static const value_string id_type[] = {
786
    { LLRP_ID_TYPE_MAC,           "MAC"        },
787
    { LLRP_ID_TYPE_EPC,           "EPC"        },
788
    { 0,                          NULL         }
789
};
790
791
/* KeepAlive type */
792
#define LLRP_KEEPALIVE_TYPE_NULL        0
793
#define LLRP_KEEPALIVE_TYPE_PERIODIC    1
794
795
static const value_string keepalive_type[] = {
796
    { LLRP_KEEPALIVE_TYPE_NULL,           "Null"            },
797
    { LLRP_KEEPALIVE_TYPE_PERIODIC,       "Periodic"        },
798
    { 0,                                  NULL              }
799
};
800
801
/* Notification Event type */
802
#define LLRP_NOTIFICATION_EVENT_TYPE_UPON_HOPPING_TO_NEXT_CHANNEL     0
803
#define LLRP_NOTIFICATION_EVENT_TYPE_GPI_EVENT                        1
804
#define LLRP_NOTIFICATION_EVENT_TYPE_ROSPEC_EVENT                     2
805
#define LLRP_NOTIFICATION_EVENT_TYPE_REPORT_BUFFER_FILL_WARNING       3
806
#define LLRP_NOTIFICATION_EVENT_TYPE_READER_EXCEPTION_EVENT           4
807
#define LLRP_NOTIFICATION_EVENT_TYPE_RFSURVEY_EVENT                   5
808
#define LLRP_NOTIFICATION_EVENT_TYPE_AISPEC_EVENT                     6
809
#define LLRP_NOTIFICATION_EVENT_TYPE_AISPEC_EVENT_WITH_DETAILS        7
810
#define LLRP_NOTIFICATION_EVENT_TYPE_ANTENNA_EVENT                    8
811
#define LLRP_NOTIFICATION_EVENT_TYPE_SPEC_LOOP_EVENT                  9
812
813
static const value_string event_type[] = {
814
    { LLRP_NOTIFICATION_EVENT_TYPE_UPON_HOPPING_TO_NEXT_CHANNEL,    "Upon hopping to next channel"  },
815
    { LLRP_NOTIFICATION_EVENT_TYPE_GPI_EVENT,                       "GPI event"                     },
816
    { LLRP_NOTIFICATION_EVENT_TYPE_ROSPEC_EVENT,                    "ROSpec event"                  },
817
    { LLRP_NOTIFICATION_EVENT_TYPE_REPORT_BUFFER_FILL_WARNING,      "Report buffer fill warning"    },
818
    { LLRP_NOTIFICATION_EVENT_TYPE_READER_EXCEPTION_EVENT,          "Reader exception event"        },
819
    { LLRP_NOTIFICATION_EVENT_TYPE_RFSURVEY_EVENT,                  "RFSurvey event"                },
820
    { LLRP_NOTIFICATION_EVENT_TYPE_AISPEC_EVENT,                    "AISpec event"                  },
821
    { LLRP_NOTIFICATION_EVENT_TYPE_AISPEC_EVENT_WITH_DETAILS,       "AISpec event with details"     },
822
    { LLRP_NOTIFICATION_EVENT_TYPE_ANTENNA_EVENT,                   "Antenna event"                 },
823
    { LLRP_NOTIFICATION_EVENT_TYPE_SPEC_LOOP_EVENT,                 "SpecLoop event"                },
824
    { 0,                                                            NULL                            }
825
};
826
static value_string_ext event_type_ext = VALUE_STRING_EXT_INIT(event_type);
827
828
/* ROSpec event type */
829
#define LLRP_ROSPEC_EVENT_TYPE_START_OF_ROSPEC          0
830
#define LLRP_ROSPEC_EVENT_TYPE_END_OF_ROSPEC            1
831
#define LLRP_ROSPEC_EVENT_TYPE_PREEMPTION_OF_ROSPEC     2
832
833
static const value_string roevent_type[] = {
834
    { LLRP_ROSPEC_EVENT_TYPE_START_OF_ROSPEC,         "Start of ROSpec"      },
835
    { LLRP_ROSPEC_EVENT_TYPE_END_OF_ROSPEC,           "End of ROSpec"        },
836
    { LLRP_ROSPEC_EVENT_TYPE_PREEMPTION_OF_ROSPEC,    "Preemption of ROSpec" },
837
    { 0,                                              NULL                   }
838
};
839
840
/* ROSpec event type */
841
#define LLRP_RF_SURVEY_EVENT_TYPE_START_OF_SURVEY     0
842
#define LLRP_RF_SURVEY_EVENT_TYPE_END_OF_SURVEY       1
843
844
static const value_string rfevent_type[] = {
845
    { LLRP_RF_SURVEY_EVENT_TYPE_START_OF_SURVEY,      "Start of survey"      },
846
    { LLRP_RF_SURVEY_EVENT_TYPE_END_OF_SURVEY,        "End of survey"        },
847
    { 0,                                              NULL                   }
848
};
849
850
/* AISpec event type */
851
#define LLRP_AISPEC_EVENT_TYPE_END_OF_AISPEC    0
852
853
static const value_string aievent_type[] = {
854
    { LLRP_AISPEC_EVENT_TYPE_END_OF_AISPEC,          "End of AISpec"        },
855
    { 0,                                              NULL                  }
856
};
857
858
/* Antenna event type */
859
#define LLRP_ANTENNA_EVENT_DISCONNECTED      0
860
#define LLRP_ANTENNA_EVENT_CONNECTED         1
861
862
static const value_string antenna_event_type[] = {
863
    { LLRP_ANTENNA_EVENT_DISCONNECTED,               "Antenna disconnected"  },
864
    { LLRP_ANTENNA_EVENT_CONNECTED,                  "Antenna connected"     },
865
    { 0,                                              NULL                   }
866
};
867
868
/* Connection status */
869
#define LLRP_CONNECTION_SUCCESS                                     0
870
#define LLRP_CONNECTION_FAILED_READER_INITIATE_ALREADY_EXISTS       1
871
#define LLRP_CONNECTION_FAILED_CLIENT_INITIATE_ALREADY_EXISTS       2
872
#define LLRP_CONNECTION_FAILED_OTHER_REASON_THAN_ALREADY_EXISTS     3
873
#define LLRP_CONNECTION_ANOTHER_CONNECTION_ATTEMPTED                4
874
875
static const value_string connection_status[] = {
876
    { LLRP_CONNECTION_SUCCESS,                                    "Success"                                              },
877
    { LLRP_CONNECTION_FAILED_READER_INITIATE_ALREADY_EXISTS,      "Failed a reader initiated connection already exists"  },
878
    { LLRP_CONNECTION_FAILED_CLIENT_INITIATE_ALREADY_EXISTS,      "Failed a client initiated connection already exists"  },
879
    { LLRP_CONNECTION_FAILED_OTHER_REASON_THAN_ALREADY_EXISTS,    "Failed reason other than a connection already exists" },
880
    { LLRP_CONNECTION_ANOTHER_CONNECTION_ATTEMPTED,               "Another connection attempted"                         },
881
    { 0,                                                          NULL                                                   }
882
};
883
884
/* Status code */
885
#define LLRP_STATUS_CODE_M_SUCCESS                0
886
#define LLRP_STATUS_CODE_M_PARAMETERERROR       100
887
#define LLRP_STATUS_CODE_M_FIELDERROR           101
888
#define LLRP_STATUS_CODE_M_UNEXPECTEDPARAMETER  102
889
#define LLRP_STATUS_CODE_M_MISSINGPARAMETER     103
890
#define LLRP_STATUS_CODE_M_DUPLICATEPARAMETER   104
891
#define LLRP_STATUS_CODE_M_OVERFLOWPARAMETER    105
892
#define LLRP_STATUS_CODE_M_OVERFLOWFIELD        106
893
#define LLRP_STATUS_CODE_M_UNKNOWNPARAMETER     107
894
#define LLRP_STATUS_CODE_M_UNKNOWNFIELD         108
895
#define LLRP_STATUS_CODE_M_UNSUPPORTEDMESSAGE   109
896
#define LLRP_STATUS_CODE_M_UNSUPPORTEDVERSION   110
897
#define LLRP_STATUS_CODE_M_UNSUPPORTEDPARAMETER 111
898
#define LLRP_STATUS_CODE_P_PARAMETERERROR       200
899
#define LLRP_STATUS_CODE_P_FIELDERROR           201
900
#define LLRP_STATUS_CODE_P_UNEXPECTEDPARAMETER  202
901
#define LLRP_STATUS_CODE_P_MISSINGPARAMETER     203
902
#define LLRP_STATUS_CODE_P_DUPLICATEPARAMETER   204
903
#define LLRP_STATUS_CODE_P_OVERFLOWPARAMETER    205
904
#define LLRP_STATUS_CODE_P_OVERFLOWFIELD        206
905
#define LLRP_STATUS_CODE_P_UNKNOWNPARAMETER     207
906
#define LLRP_STATUS_CODE_P_UNKNOWNFIELD         208
907
#define LLRP_STATUS_CODE_P_UNSUPPORTEDPARAMETER 209
908
#define LLRP_STATUS_CODE_A_INVALID              300
909
#define LLRP_STATUS_CODE_A_OUTOFRANGE           301
910
#define LLRP_STATUS_CODE_R_DEVICEERROR          401
911
912
static const value_string status_code[] = {
913
    { LLRP_STATUS_CODE_M_SUCCESS,             "M_Success"               },
914
    { LLRP_STATUS_CODE_M_PARAMETERERROR,      "M_ParameterError"        },
915
    { LLRP_STATUS_CODE_M_FIELDERROR,          "M_FieldError"            },
916
    { LLRP_STATUS_CODE_M_UNEXPECTEDPARAMETER, "M_UnexpectedParameter"   },
917
    { LLRP_STATUS_CODE_M_MISSINGPARAMETER,    "M_MissingParameter"      },
918
    { LLRP_STATUS_CODE_M_DUPLICATEPARAMETER,  "M_DuplicateParameter"    },
919
    { LLRP_STATUS_CODE_M_OVERFLOWPARAMETER,   "M_OverflowParameter"     },
920
    { LLRP_STATUS_CODE_M_OVERFLOWFIELD,       "M_OverflowField"         },
921
    { LLRP_STATUS_CODE_M_UNKNOWNPARAMETER,    "M_UnknownParameter"      },
922
    { LLRP_STATUS_CODE_M_UNKNOWNFIELD,        "M_UnknownField"          },
923
    { LLRP_STATUS_CODE_M_UNSUPPORTEDMESSAGE,  "M_UnsupportedMessage"    },
924
    { LLRP_STATUS_CODE_M_UNSUPPORTEDVERSION,  "M_UnsupportedVersion"    },
925
    { LLRP_STATUS_CODE_M_UNSUPPORTEDPARAMETER,"M_UnsupportedParameter"  },
926
    { LLRP_STATUS_CODE_P_PARAMETERERROR,      "P_ParameterError"        },
927
    { LLRP_STATUS_CODE_P_FIELDERROR,          "P_FieldError"            },
928
    { LLRP_STATUS_CODE_P_UNEXPECTEDPARAMETER, "P_UnexpectedParameter"   },
929
    { LLRP_STATUS_CODE_P_MISSINGPARAMETER,    "P_MissingParameter"      },
930
    { LLRP_STATUS_CODE_P_DUPLICATEPARAMETER,  "P_DuplicateParameter"    },
931
    { LLRP_STATUS_CODE_P_OVERFLOWPARAMETER,   "P_OverflowParameter"     },
932
    { LLRP_STATUS_CODE_P_OVERFLOWFIELD,       "P_OverflowField"         },
933
    { LLRP_STATUS_CODE_P_UNKNOWNPARAMETER,    "P_UnknownParameter"      },
934
    { LLRP_STATUS_CODE_P_UNKNOWNFIELD,        "P_UnknownField"          },
935
    { LLRP_STATUS_CODE_P_UNSUPPORTEDPARAMETER,"P_UnsupportedParameter"  },
936
    { LLRP_STATUS_CODE_A_INVALID,             "A_Invalid"               },
937
    { LLRP_STATUS_CODE_A_OUTOFRANGE,          "A_OutOfRange"            },
938
    { LLRP_STATUS_CODE_R_DEVICEERROR,         "R_DeviceError"           },
939
    { 0,                                      NULL                      }
940
};
941
static value_string_ext status_code_ext = VALUE_STRING_EXT_INIT(status_code);
942
943
/* C1G2 tag inventory state aware singulation action */
944
static const true_false_string tfs_state_a_b = { "State B", "State A" };
945
static const true_false_string tfs_sl =        { "~SL",     "SL"      };
946
static const true_false_string tfs_all_no =    { "All",     "No"      };
947
948
/* Vendors */
949
0
#define LLRP_VENDOR_IMPINJ 25882
950
951
static const value_string llrp_vendors[] = {
952
    { LLRP_VENDOR_IMPINJ,  "Impinj" },
953
    { 0,                   NULL     }
954
};
955
956
/* Vendor subtypes */
957
958
/* Impinj custom message types */
959
0
#define LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS            21
960
0
#define LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS_RESPONSE   22
961
0
#define LLRP_IMPINJ_TYPE_SAVE_SETTINGS                23
962
0
#define LLRP_IMPINJ_TYPE_SAVE_SETTINGS_RESPONSE       24
963
964
static const value_string impinj_msg_subtype[] = {
965
    { LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS,          "Enable extensions"          },
966
    { LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS_RESPONSE, "Enable extensions response" },
967
    { LLRP_IMPINJ_TYPE_SAVE_SETTINGS,              "Save settings"              },
968
    { LLRP_IMPINJ_TYPE_SAVE_SETTINGS_RESPONSE,     "Save setting response"      },
969
    { 0,                                           NULL                         }
970
};
971
static value_string_ext impinj_msg_subtype_ext = VALUE_STRING_EXT_INIT(impinj_msg_subtype);
972
973
/* Impinj custom parameter types */
974
0
#define LLRP_IMPINJ_PARAM_REQUESTED_DATA                           21
975
0
#define LLRP_IMPINJ_PARAM_SUBREGULATORY_REGION                     22
976
0
#define LLRP_IMPINJ_PARAM_INVENTORY_SEARCH_MODE                    23
977
0
#define LLRP_IMPINJ_PARAM_TAG_DIRECTION_REPORTING                  24
978
0
#define LLRP_IMPINJ_PARAM_TAG_DIRECTION                            25
979
0
#define LLRP_IMPINJ_PARAM_FIXED_FREQUENCY_LIST                     26
980
0
#define LLRP_IMPINJ_PARAM_REDUCED_POWER_FREQUENCY_LIST             27
981
0
#define LLRP_IMPINJ_PARAM_LOW_DUTY_CYCLE                           28
982
0
#define LLRP_IMPINJ_PARAM_DETAILED_VERSION                         29
983
0
#define LLRP_IMPINJ_PARAM_FREQUENCY_CAPABILITIES                   30
984
0
#define LLRP_IMPINJ_PARAM_TAG_INFORMATION                          31
985
0
#define LLRP_IMPINJ_PARAM_FORKLIFT_CONFIGURATION                   32
986
0
#define LLRP_IMPINJ_PARAM_FORKLIFT_HEIGHT_THRESHOLD                33
987
0
#define LLRP_IMPINJ_PARAM_FORKLIFT_ZEROMOTION_TIME_THRESHOLD       34
988
0
#define LLRP_IMPINJ_PARAM_FORKLIFT_COMPANION_BOARD_INFO            35
989
0
#define LLRP_IMPINJ_PARAM_GPI_DEBOUNCE_CONFIGURATION               36
990
0
#define LLRP_IMPINJ_PARAM_READER_TEMPERATURE                       37
991
0
#define LLRP_IMPINJ_PARAM_LINK_MONITOR_CONFIGURATION               38
992
0
#define LLRP_IMPINJ_PARAM_REPORT_BUFFER_CONFIGURATION              39
993
0
#define LLRP_IMPINJ_PARAM_ACCESS_SPEC_CONFIGURATION                40
994
0
#define LLRP_IMPINJ_PARAM_BLOCK_WRITE_WORD_COUNT                   41
995
0
#define LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK                          42
996
0
#define LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK_OPSPEC_RESULT            43
997
0
#define LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS               44
998
0
#define LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS_OPSPEC_RESULT 45
999
0
#define LLRP_IMPINJ_PARAM_SET_QT_CONFIG                            46
1000
0
#define LLRP_IMPINJ_PARAM_SET_QT_CONFIG_OPSPEC_RESULT              47
1001
0
#define LLRP_IMPINJ_PARAM_GET_QT_CONFIG                            48
1002
0
#define LLRP_IMPINJ_PARAM_GET_QT_CONFIG_OPSPEC_RESULT              49
1003
0
#define LLRP_IMPINJ_PARAM_TAG_REPORT_CONTENT_SELECTOR              50
1004
0
#define LLRP_IMPINJ_PARAM_ENABLE_SERIALIZED_TID                    51
1005
0
#define LLRP_IMPINJ_PARAM_ENABLE_RF_PHASE_ANGLE                    52
1006
0
#define LLRP_IMPINJ_PARAM_ENABLE_PEAK_RSSI                         53
1007
0
#define LLRP_IMPINJ_PARAM_ENABLE_GPS_COORDINATES                   54
1008
0
#define LLRP_IMPINJ_PARAM_SERIALIZED_TID                           55
1009
0
#define LLRP_IMPINJ_PARAM_RF_PHASE_ANGLE                           56
1010
0
#define LLRP_IMPINJ_PARAM_PEAK_RSSI                                57
1011
0
#define LLRP_IMPINJ_PARAM_GPS_COORDINATES                          58
1012
0
#define LLRP_IMPINJ_PARAM_LOOP_SPEC                                59
1013
0
#define LLRP_IMPINJ_PARAM_GPS_NMEA_SENTENCES                       60
1014
0
#define LLRP_IMPINJ_PARAM_GGA_SENTENCE                             61
1015
0
#define LLRP_IMPINJ_PARAM_RMC_SENTENCE                             62
1016
0
#define LLRP_IMPINJ_PARAM_OPSPEC_RETRY_COUNT                       63
1017
0
#define LLRP_IMPINJ_PARAM_ADVANCE_GPO_CONFIG                       64
1018
0
#define LLRP_IMPINJ_PARAM_ENABLE_OPTIM_READ                        65
1019
0
#define LLRP_IMPINJ_PARAM_ACCESS_SPEC_ORDERING                     66
1020
0
#define LLRP_IMPINJ_PARAM_ENABLE_RF_DOPPLER_FREQ                   67
1021
0
#define LLRP_IMPINJ_PARAM_ARRAY_VERSION                            1520
1022
0
#define LLRP_IMPINJ_PARAM_HUB_VERSIONS                             1537
1023
0
#define LLRP_IMPINJ_PARAM_HUB_CONFIGURATION                        1538
1024
1025
static const value_string impinj_param_type[] = {
1026
    { LLRP_IMPINJ_PARAM_REQUESTED_DATA,                          "Requested Data"                           },
1027
    { LLRP_IMPINJ_PARAM_SUBREGULATORY_REGION,                    "Sub regulatory region"                    },
1028
    { LLRP_IMPINJ_PARAM_INVENTORY_SEARCH_MODE,                   "Inventory search mode"                    },
1029
    { LLRP_IMPINJ_PARAM_TAG_DIRECTION_REPORTING,                 "Tag direction reporting"                  },
1030
    { LLRP_IMPINJ_PARAM_TAG_DIRECTION,                           "Tag direction"                            },
1031
    { LLRP_IMPINJ_PARAM_FIXED_FREQUENCY_LIST,                    "Fixed frequency list"                     },
1032
    { LLRP_IMPINJ_PARAM_REDUCED_POWER_FREQUENCY_LIST,            "Reduced power frequency list"             },
1033
    { LLRP_IMPINJ_PARAM_LOW_DUTY_CYCLE,                          "Low duty cycle"                           },
1034
    { LLRP_IMPINJ_PARAM_DETAILED_VERSION,                        "Detailed version"                         },
1035
    { LLRP_IMPINJ_PARAM_FREQUENCY_CAPABILITIES,                  "Frequency capabilities"                   },
1036
    { LLRP_IMPINJ_PARAM_TAG_INFORMATION,                         "Tag information"                          },
1037
    { LLRP_IMPINJ_PARAM_FORKLIFT_CONFIGURATION,                  "Forklift configuration"                   },
1038
    { LLRP_IMPINJ_PARAM_FORKLIFT_HEIGHT_THRESHOLD,               "Forklift height threshold"                },
1039
    { LLRP_IMPINJ_PARAM_FORKLIFT_ZEROMOTION_TIME_THRESHOLD,      "Forklift zero motion time threshold"      },
1040
    { LLRP_IMPINJ_PARAM_FORKLIFT_COMPANION_BOARD_INFO,           "Forklift companion board info"            },
1041
    { LLRP_IMPINJ_PARAM_GPI_DEBOUNCE_CONFIGURATION,              "Gpi debounce configuration"               },
1042
    { LLRP_IMPINJ_PARAM_READER_TEMPERATURE,                      "Reader temperature"                       },
1043
    { LLRP_IMPINJ_PARAM_LINK_MONITOR_CONFIGURATION,              "Link monitor configuration"               },
1044
    { LLRP_IMPINJ_PARAM_REPORT_BUFFER_CONFIGURATION,             "Report buffer configuration"              },
1045
    { LLRP_IMPINJ_PARAM_ACCESS_SPEC_CONFIGURATION,               "Access spec configuration"                },
1046
    { LLRP_IMPINJ_PARAM_BLOCK_WRITE_WORD_COUNT,                  "Block write word count"                   },
1047
    { LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK,                         "Block permalock"                          },
1048
    { LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK_OPSPEC_RESULT,           "Block permalock OpSpec result"            },
1049
    { LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS,              "Get block permalock status"               },
1050
    { LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS_OPSPEC_RESULT,"Get block permalock status OpSpec result" },
1051
    { LLRP_IMPINJ_PARAM_SET_QT_CONFIG,                           "Set QT config"                            },
1052
    { LLRP_IMPINJ_PARAM_SET_QT_CONFIG_OPSPEC_RESULT,             "Set QT config OpSpec result"              },
1053
    { LLRP_IMPINJ_PARAM_GET_QT_CONFIG,                           "Get QT config"                            },
1054
    { LLRP_IMPINJ_PARAM_GET_QT_CONFIG_OPSPEC_RESULT,             "Get QT config OpSpec result"              },
1055
    { LLRP_IMPINJ_PARAM_TAG_REPORT_CONTENT_SELECTOR,             "Tag report content selector"              },
1056
    { LLRP_IMPINJ_PARAM_ENABLE_SERIALIZED_TID,                   "Enable serialized TID"                    },
1057
    { LLRP_IMPINJ_PARAM_ENABLE_RF_PHASE_ANGLE,                   "Enable RF phase angle"                    },
1058
    { LLRP_IMPINJ_PARAM_ENABLE_PEAK_RSSI,                        "Enable peak RSSI"                         },
1059
    { LLRP_IMPINJ_PARAM_ENABLE_GPS_COORDINATES,                  "Enable GPS coordinates"                   },
1060
    { LLRP_IMPINJ_PARAM_SERIALIZED_TID,                          "Serialized TID"                           },
1061
    { LLRP_IMPINJ_PARAM_RF_PHASE_ANGLE,                          "RF phase angle"                           },
1062
    { LLRP_IMPINJ_PARAM_PEAK_RSSI,                               "Peak RSSI"                                },
1063
    { LLRP_IMPINJ_PARAM_GPS_COORDINATES,                         "GPS coordinates"                          },
1064
    { LLRP_IMPINJ_PARAM_LOOP_SPEC,                               "LoopSpec"                                 },
1065
    { LLRP_IMPINJ_PARAM_GPS_NMEA_SENTENCES,                      "GPS NMEA sentences"                       },
1066
    { LLRP_IMPINJ_PARAM_GGA_SENTENCE,                            "GGA sentence"                             },
1067
    { LLRP_IMPINJ_PARAM_RMC_SENTENCE,                            "RMC sentence"                             },
1068
    { LLRP_IMPINJ_PARAM_OPSPEC_RETRY_COUNT,                      "OpSpec retry count"                       },
1069
    { LLRP_IMPINJ_PARAM_ADVANCE_GPO_CONFIG,                      "Advanced GPO configuration"               },
1070
    { LLRP_IMPINJ_PARAM_ENABLE_OPTIM_READ,                       "Enable optimized read"                    },
1071
    { LLRP_IMPINJ_PARAM_ACCESS_SPEC_ORDERING,                    "AccessSpec ordering"                      },
1072
    { LLRP_IMPINJ_PARAM_ENABLE_RF_DOPPLER_FREQ,                  "Enable RF doppler frequency"              },
1073
    { LLRP_IMPINJ_PARAM_ARRAY_VERSION,                           "Array specific HW and version info"       },
1074
    { LLRP_IMPINJ_PARAM_HUB_VERSIONS,                            "Hub specific HW and version info"         },
1075
    { LLRP_IMPINJ_PARAM_HUB_CONFIGURATION,                       "Hub connection and fault state"           },
1076
    { 0,                                                         NULL                                       }
1077
};
1078
static value_string_ext impinj_param_type_ext = VALUE_STRING_EXT_INIT(impinj_param_type);
1079
1080
/* Impinj requested data */
1081
#define LLRP_IMPINJ_REQ_DATA_ALL_CAPABILITIES                1000
1082
#define LLRP_IMPINJ_REQ_DATA_DETAILED_VERSION                1001
1083
#define LLRP_IMPINJ_REQ_DATA_FREQUENCY_CAPABILITIES          1002
1084
#define LLRP_IMPINJ_REQ_DATA_CONFIGURATION                   2000
1085
#define LLRP_IMPINJ_REQ_DATA_SUB_REGULATORY_REGION           2001
1086
#define LLRP_IMPINJ_REQ_DATA_FORKLIFT_CONFIGURATION          2002
1087
#define LLRP_IMPINJ_REQ_DATA_GPI_DEBOUNCE_CONFIGURATION      2003
1088
#define LLRP_IMPINJ_REQ_DATA_READER_TEMPERATURE              2004
1089
#define LLRP_IMPINJ_REQ_DATA_LINK_MONITOR_CONFIGURATION      2005
1090
#define LLRP_IMPINJ_REQ_DATA_REPORT_BUFFER_CONFIGURATION     2006
1091
#define LLRP_IMPINJ_REQ_DATA_ACCESS_SPEC_CONFIGURATION       2007
1092
#define LLRP_IMPINJ_REQ_DATA_GPS_NMEA_SENTENCES              2008
1093
1094
1095
static const value_string impinj_req_data[] = {
1096
    { LLRP_IMPINJ_REQ_DATA_ALL_CAPABILITIES,            "All capabilities"            },
1097
    { LLRP_IMPINJ_REQ_DATA_DETAILED_VERSION,            "Detailed version"            },
1098
    { LLRP_IMPINJ_REQ_DATA_FREQUENCY_CAPABILITIES,      "Frequency capabilities"      },
1099
    { LLRP_IMPINJ_REQ_DATA_CONFIGURATION,               "Configuration"               },
1100
    { LLRP_IMPINJ_REQ_DATA_SUB_REGULATORY_REGION,       "Sub regulatory region"       },
1101
    { LLRP_IMPINJ_REQ_DATA_FORKLIFT_CONFIGURATION,      "Forklift configuration"      },
1102
    { LLRP_IMPINJ_REQ_DATA_GPI_DEBOUNCE_CONFIGURATION,  "GPI debounce configuration"  },
1103
    { LLRP_IMPINJ_REQ_DATA_READER_TEMPERATURE,          "Reader temperature"          },
1104
    { LLRP_IMPINJ_REQ_DATA_LINK_MONITOR_CONFIGURATION,  "Link monitor configuration"  },
1105
    { LLRP_IMPINJ_REQ_DATA_REPORT_BUFFER_CONFIGURATION, "Report buffer configuration" },
1106
    { LLRP_IMPINJ_REQ_DATA_ACCESS_SPEC_CONFIGURATION,   "Access spec configuration"   },
1107
    { LLRP_IMPINJ_REQ_DATA_GPS_NMEA_SENTENCES,          "GPS NMEA sentences"          },
1108
    { 0,                                                NULL                          }
1109
};
1110
static value_string_ext impinj_req_data_ext = VALUE_STRING_EXT_INIT(impinj_req_data);
1111
1112
/* Impinj regulatory region */
1113
#define LLRP_IMPINJ_REG_REGION_FCC_PART_15_247                   0
1114
#define LLRP_IMPINJ_REG_REGION_ETSI_EN_300_220                   1
1115
#define LLRP_IMPINJ_REG_REGION_ETSI_EN_302_208_WITH_LBT          2
1116
#define LLRP_IMPINJ_REG_REGION_HONG_KONG_920_925_MHZ             3
1117
#define LLRP_IMPINJ_REG_REGION_TAIWAN_922_928_MHZ                4
1118
#define LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ                 5
1119
#define LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ_LOW_POWER       6
1120
#define LLRP_IMPINJ_REG_REGION_ETSI_EN_302_208_V1_2_1            7
1121
#define LLRP_IMPINJ_REG_REGION_KOREA_910_914_MHZ                 8
1122
#define LLRP_IMPINJ_REG_REGION_MALAYSIA_919_923_MHZ              9
1123
#define LLRP_IMPINJ_REG_REGION_CHINA_920_925_MHZ                10
1124
#define LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ_WITHOUT_LBT    11
1125
#define LLRP_IMPINJ_REG_REGION_SOUTH_AFRICA_915_919_MHZ         12
1126
#define LLRP_IMPINJ_REG_REGION_BRAZIL_902_907_AND_915_928_MHZ   13
1127
#define LLRP_IMPINJ_REG_REGION_THAILAND_920_925_MHZ             14
1128
#define LLRP_IMPINJ_REG_REGION_SINGAPORE_920_925_MHZ            15
1129
#define LLRP_IMPINJ_REG_REGION_AUSTRALIA_920_926_MHZ            16
1130
#define LLRP_IMPINJ_REG_REGION_INDIA_865_867_MHZ                17
1131
#define LLRP_IMPINJ_REG_REGION_URUGUAY_916_928_MHZ              18
1132
#define LLRP_IMPINJ_REG_REGION_VIETNAM_920_925_MHZ              19
1133
#define LLRP_IMPINJ_REG_REGION_ISRAEL_915_917_MHZ               20
1134
1135
static const value_string impinj_reg_region[] = {
1136
    { LLRP_IMPINJ_REG_REGION_FCC_PART_15_247,                "Fcc part 15 247"                },
1137
    { LLRP_IMPINJ_REG_REGION_ETSI_EN_300_220,                "ETSI EN 300 220"                },
1138
    { LLRP_IMPINJ_REG_REGION_ETSI_EN_302_208_WITH_LBT,       "ETSI EN 302 208 with LBT"       },
1139
    { LLRP_IMPINJ_REG_REGION_HONG_KONG_920_925_MHZ,          "Hong kong 920-925 MHz"          },
1140
    { LLRP_IMPINJ_REG_REGION_TAIWAN_922_928_MHZ,             "Taiwan 922-928 MHz"             },
1141
    { LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ,              "Japan 952-954 MHz"              },
1142
    { LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ_LOW_POWER,    "Japan 952-954 MHz low power"    },
1143
    { LLRP_IMPINJ_REG_REGION_ETSI_EN_302_208_V1_2_1,         "ETSI EN 302 208 v1.2.1"         },
1144
    { LLRP_IMPINJ_REG_REGION_KOREA_910_914_MHZ,              "Korea 910-914 MHz"              },
1145
    { LLRP_IMPINJ_REG_REGION_MALAYSIA_919_923_MHZ,           "Malaysia 919-923 MHz"           },
1146
    { LLRP_IMPINJ_REG_REGION_CHINA_920_925_MHZ,              "China 920-925 MHz"              },
1147
    { LLRP_IMPINJ_REG_REGION_JAPAN_952_954_MHZ_WITHOUT_LBT,  "Japan 952-954 MHz without LBT"  },
1148
    { LLRP_IMPINJ_REG_REGION_SOUTH_AFRICA_915_919_MHZ,       "South africa 915-919 MHz"       },
1149
    { LLRP_IMPINJ_REG_REGION_BRAZIL_902_907_AND_915_928_MHZ, "Brazil 902-907 and 915-928 MHz" },
1150
    { LLRP_IMPINJ_REG_REGION_THAILAND_920_925_MHZ,           "Thailand 920-925 MHz"           },
1151
    { LLRP_IMPINJ_REG_REGION_SINGAPORE_920_925_MHZ,          "Singapore 920-925 MHz"          },
1152
    { LLRP_IMPINJ_REG_REGION_AUSTRALIA_920_926_MHZ,          "Australia 920-926 MHz"          },
1153
    { LLRP_IMPINJ_REG_REGION_INDIA_865_867_MHZ,              "India 865-867 MHz"              },
1154
    { LLRP_IMPINJ_REG_REGION_URUGUAY_916_928_MHZ,            "Uruguay 916-928 MHz"            },
1155
    { LLRP_IMPINJ_REG_REGION_VIETNAM_920_925_MHZ,            "Vietnam 920-925 MHz"            },
1156
    { LLRP_IMPINJ_REG_REGION_ISRAEL_915_917_MHZ,             "Israel 915-917 MHz"             },
1157
    { 0,                                                     NULL                             }
1158
};
1159
static value_string_ext impinj_reg_region_ext = VALUE_STRING_EXT_INIT(impinj_reg_region);
1160
1161
/* Impinj inventory search type */
1162
#define LLRP_IMPINJ_SEARCH_TYPE_READER_SELECTED         0
1163
#define LLRP_IMPINJ_SEARCH_TYPE_SINGLE_TARGET           1
1164
#define LLRP_IMPINJ_SEARCH_TYPE_DUAL_TARGET             2
1165
#define LLRP_IMPINJ_SEARCH_TYPE_SINGLE_TARGET_WITH_SUPP 3
1166
1167
static const value_string impinj_search_mode[] = {
1168
    { LLRP_IMPINJ_SEARCH_TYPE_READER_SELECTED,           "Reader selected"                },
1169
    { LLRP_IMPINJ_SEARCH_TYPE_SINGLE_TARGET,             "Single target"                  },
1170
    { LLRP_IMPINJ_SEARCH_TYPE_DUAL_TARGET,               "Dual target"                    },
1171
    { LLRP_IMPINJ_SEARCH_TYPE_SINGLE_TARGET_WITH_SUPP,   "Single target with suppression" },
1172
    { 0,                                                 NULL                             }
1173
};
1174
1175
/* Impinj antenna configuration */
1176
#define LLRP_IMPINJ_ANT_CONF_DUAL   1
1177
#define LLRP_IMPINJ_ANT_CONF_QUAD   2
1178
1179
static const value_string impinj_ant_conf[] = {
1180
    { LLRP_IMPINJ_ANT_CONF_DUAL, "Dual antenna" },
1181
    { LLRP_IMPINJ_ANT_CONF_QUAD, "Quad antenna" },
1182
    { 0,                        NULL            }
1183
};
1184
1185
/* Impinj tag direction */
1186
#define LLRP_IMPINJ_TAG_DIR_INDETERMINED  0
1187
#define LLRP_IMPINJ_TAG_DIR_FROM_2_TO_1   1
1188
#define LLRP_IMPINJ_TAG_DIR_FROM_1_TO_2   2
1189
1190
static const value_string impinj_tag_dir[] = {
1191
    { LLRP_IMPINJ_TAG_DIR_INDETERMINED, "Indeterminate"       },
1192
    { LLRP_IMPINJ_TAG_DIR_FROM_2_TO_1,  "From side2 to side1" },
1193
    { LLRP_IMPINJ_TAG_DIR_FROM_1_TO_2,  "From side1 to side2" },
1194
    { 0,                                NULL                  }
1195
};
1196
1197
/* Impinj fixed frequency mode */
1198
#define LLRP_IMPINJ_FIX_FREQ_MODE_DISABLED      0
1199
#define LLRP_IMPINJ_FIX_FREQ_MODE_AUTO_SELECT   1
1200
#define LLRP_IMPINJ_FIX_FREQ_MODE_CHANNEL_LIST  2
1201
1202
static const value_string impinj_fix_freq_mode[] = {
1203
    { LLRP_IMPINJ_FIX_FREQ_MODE_DISABLED,      "Disabled"     },
1204
    { LLRP_IMPINJ_FIX_FREQ_MODE_AUTO_SELECT,   "Auto select"  },
1205
    { LLRP_IMPINJ_FIX_FREQ_MODE_CHANNEL_LIST,  "Channel list" },
1206
    { 0,                                       NULL           }
1207
};
1208
1209
/* Impinj enabled/disabled */
1210
#define LLRP_IMPINJ_BOOLEAN_DISABLED      0
1211
#define LLRP_IMPINJ_BOOLEAN_ENABLED       1
1212
1213
static const value_string impinj_boolean[] = {
1214
    { LLRP_IMPINJ_BOOLEAN_DISABLED, "Disabled" },
1215
    { LLRP_IMPINJ_BOOLEAN_ENABLED,  "Enabled"  },
1216
    { 0,                            NULL       }
1217
};
1218
1219
/* Impinj report buffer mode */
1220
#define LLRP_IMPINJ_REPORT_BUFF_MODE_NORMAL      0
1221
#define LLRP_IMPINJ_REPORT_BUFF_MODE_LOW_LATENCY 1
1222
1223
static const value_string impinj_report_buff_mode[] = {
1224
    { LLRP_IMPINJ_REPORT_BUFF_MODE_NORMAL,       "Normal"      },
1225
    { LLRP_IMPINJ_REPORT_BUFF_MODE_LOW_LATENCY,  "Low latency" },
1226
    { 0,                                         NULL          }
1227
};
1228
1229
/* Impinj permalock operation result */
1230
#define LLRP_IMPINJ_PERMALOCK_SUCCESS                      0
1231
#define LLRP_IMPINJ_PERMALOCK_INSUFFICIENT_POWER           1
1232
#define LLRP_IMPINJ_PERMALOCK_NONSPECIFIC_TAG_ERROR        2
1233
#define LLRP_IMPINJ_PERMALOCK_NO_RESPONSE_FROM_TAG         3
1234
#define LLRP_IMPINJ_PERMALOCK_NONSPECIFIC_READER_ERROR     4
1235
#define LLRP_IMPINJ_PERMALOCK_INCORRECT_PASSWORD_ERROR     5
1236
#define LLRP_IMPINJ_PERMALOCK_TAG_MEMORY_OVERRUN_ERROR     6
1237
1238
static const value_string impinj_permalock_result[] = {
1239
    { LLRP_IMPINJ_PERMALOCK_SUCCESS,                  "Success"                  },
1240
    { LLRP_IMPINJ_PERMALOCK_INSUFFICIENT_POWER,       "Insufficient power"       },
1241
    { LLRP_IMPINJ_PERMALOCK_NONSPECIFIC_TAG_ERROR,    "Nonspecific tag error"    },
1242
    { LLRP_IMPINJ_PERMALOCK_NO_RESPONSE_FROM_TAG,     "No response from tag"     },
1243
    { LLRP_IMPINJ_PERMALOCK_NONSPECIFIC_READER_ERROR, "Nonspecific reader error" },
1244
    { LLRP_IMPINJ_PERMALOCK_INCORRECT_PASSWORD_ERROR, "Incorrect password error" },
1245
    { LLRP_IMPINJ_PERMALOCK_TAG_MEMORY_OVERRUN_ERROR, "Tag memory overrun error" },
1246
    { 0,                                              NULL                       }
1247
};
1248
static value_string_ext impinj_permalock_result_ext = VALUE_STRING_EXT_INIT(impinj_permalock_result);
1249
1250
/* Impinj get block permalock operation result */
1251
#define LLRP_IMPINJ_BLOCK_PERMALOCK_SUCCESS                      0
1252
#define LLRP_IMPINJ_BLOCK_PERMALOCK_NONSPECIFIC_TAG_ERROR        1
1253
#define LLRP_IMPINJ_BLOCK_PERMALOCK_NO_RESPONSE_FROM_TAG         2
1254
#define LLRP_IMPINJ_BLOCK_PERMALOCK_NONSPECIFIC_READER_ERROR     3
1255
#define LLRP_IMPINJ_BLOCK_PERMALOCK_INCORRECT_PASSWORD_ERROR     4
1256
#define LLRP_IMPINJ_BLOCK_PERMALOCK_TAG_MEMORY_OVERRUN_ERROR     5
1257
1258
static const value_string impinj_block_permalock_result[] = {
1259
    { LLRP_IMPINJ_BLOCK_PERMALOCK_SUCCESS,                  "Success"                  },
1260
    { LLRP_IMPINJ_BLOCK_PERMALOCK_NONSPECIFIC_TAG_ERROR,    "Nonspecific tag error"    },
1261
    { LLRP_IMPINJ_BLOCK_PERMALOCK_NO_RESPONSE_FROM_TAG,     "No response from tag"     },
1262
    { LLRP_IMPINJ_BLOCK_PERMALOCK_NONSPECIFIC_READER_ERROR, "Nonspecific reader error" },
1263
    { LLRP_IMPINJ_BLOCK_PERMALOCK_INCORRECT_PASSWORD_ERROR, "Incorrect password error" },
1264
    { LLRP_IMPINJ_BLOCK_PERMALOCK_TAG_MEMORY_OVERRUN_ERROR, "Tag memory overrun error" },
1265
    { 0,                                                    NULL                       }
1266
};
1267
static value_string_ext impinj_block_permalock_result_ext = VALUE_STRING_EXT_INIT(impinj_block_permalock_result);
1268
1269
/* Impinj data profile parameter */
1270
#define LLRP_IMPINJ_DATA_PROFILE_UNKNOWN        0
1271
#define LLRP_IMPINJ_DATA_PROFILE_PRIVATE        1
1272
#define LLRP_IMPINJ_DATA_PROFILE_PUBLIC         2
1273
1274
static const value_string impinj_data_profile[] = {
1275
    { LLRP_IMPINJ_DATA_PROFILE_UNKNOWN,  "Unknown" },
1276
    { LLRP_IMPINJ_DATA_PROFILE_PRIVATE,  "Private" },
1277
    { LLRP_IMPINJ_DATA_PROFILE_PUBLIC,   "Public"  },
1278
    { 0,                                 NULL      }
1279
};
1280
1281
/* Impinj access range parameter */
1282
#define LLRP_IMPINJ_ACCESS_RANGE_UNKNOWN        0
1283
#define LLRP_IMPINJ_ACCESS_RANGE_NORMAL_RANGE   1
1284
#define LLRP_IMPINJ_ACCESS_RANGE_SHORT_RANGE    2
1285
1286
static const value_string impinj_access_range[] = {
1287
    { LLRP_IMPINJ_ACCESS_RANGE_UNKNOWN,       "Unknown"      },
1288
    { LLRP_IMPINJ_ACCESS_RANGE_NORMAL_RANGE,  "Normal range" },
1289
    { LLRP_IMPINJ_ACCESS_RANGE_SHORT_RANGE,   "Short range"  },
1290
    { 0,                                      NULL           }
1291
};
1292
1293
/* Impinj persistence parameter */
1294
#define LLRP_IMPINJ_PERSISTENCE_UNKNOWN     0
1295
#define LLRP_IMPINJ_PERSISTENCE_TEMPORARY   1
1296
#define LLRP_IMPINJ_PERSISTENCE_PERMANENT   2
1297
1298
static const value_string impinj_persistence[] = {
1299
    { LLRP_IMPINJ_PERSISTENCE_UNKNOWN,     "Unknown"    },
1300
    { LLRP_IMPINJ_PERSISTENCE_TEMPORARY,   "Temporary"  },
1301
    { LLRP_IMPINJ_PERSISTENCE_PERMANENT,   "Permanent"  },
1302
    { 0,                                   NULL         }
1303
};
1304
1305
/* Impinj set QT config result */
1306
#define LLRP_IMPINJ_SET_QT_CONFIG_SUCCESS                      0
1307
#define LLRP_IMPINJ_SET_QT_CONFIG_INSUFFICIENT_POWER           1
1308
#define LLRP_IMPINJ_SET_QT_CONFIG_NONSPECIFIC_TAG_ERROR        2
1309
#define LLRP_IMPINJ_SET_QT_CONFIG_NO_RESPONSE_FROM_TAG         3
1310
#define LLRP_IMPINJ_SET_QT_CONFIG_NONSPECIFIC_READER_ERROR     4
1311
#define LLRP_IMPINJ_SET_QT_CONFIG_INCORRECT_PASSWORD_ERROR     5
1312
1313
static const value_string impinj_set_qt_config_result[] = {
1314
    { LLRP_IMPINJ_SET_QT_CONFIG_SUCCESS,                  "Success"                  },
1315
    { LLRP_IMPINJ_SET_QT_CONFIG_INSUFFICIENT_POWER,       "Insufficient power"       },
1316
    { LLRP_IMPINJ_SET_QT_CONFIG_NONSPECIFIC_TAG_ERROR,    "Nonspecific tag error"    },
1317
    { LLRP_IMPINJ_SET_QT_CONFIG_NO_RESPONSE_FROM_TAG,     "No response from tag"     },
1318
    { LLRP_IMPINJ_SET_QT_CONFIG_NONSPECIFIC_READER_ERROR, "Nonspecific reader error" },
1319
    { LLRP_IMPINJ_SET_QT_CONFIG_INCORRECT_PASSWORD_ERROR, "Incorrect password error" },
1320
    { 0,                                                  NULL                       }
1321
};
1322
static value_string_ext impinj_set_qt_config_result_ext = VALUE_STRING_EXT_INIT(impinj_set_qt_config_result);
1323
1324
/* Impinj get QT config result */
1325
#define LLRP_IMPINJ_GET_QT_CONFIG_SUCCESS                      0
1326
#define LLRP_IMPINJ_GET_QT_CONFIG_NONSPECIFIC_TAG_ERROR        1
1327
#define LLRP_IMPINJ_GET_QT_CONFIG_NO_RESPONSE_FROM_TAG         2
1328
#define LLRP_IMPINJ_GET_QT_CONFIG_NONSPECIFIC_READER_ERROR     3
1329
#define LLRP_IMPINJ_GET_QT_CONFIG_INCORRECT_PASSWORD_ERROR     4
1330
1331
static const value_string impinj_get_qt_config_result[] = {
1332
    { LLRP_IMPINJ_GET_QT_CONFIG_SUCCESS,                  "Success"                  },
1333
    { LLRP_IMPINJ_GET_QT_CONFIG_NONSPECIFIC_TAG_ERROR,    "Nonspecific tag error"    },
1334
    { LLRP_IMPINJ_GET_QT_CONFIG_NO_RESPONSE_FROM_TAG,     "No response from tag"     },
1335
    { LLRP_IMPINJ_GET_QT_CONFIG_NONSPECIFIC_READER_ERROR, "Nonspecific reader error" },
1336
    { LLRP_IMPINJ_GET_QT_CONFIG_INCORRECT_PASSWORD_ERROR, "Incorrect password error" },
1337
    { 0,                                                  NULL                       }
1338
};
1339
static value_string_ext impinj_get_qt_config_result_ext = VALUE_STRING_EXT_INIT(impinj_get_qt_config_result);
1340
1341
/* Impinj access spec ordering */
1342
#define LLRP_IMPINJ_ACCESS_SPEC_ORDERING_FIFO        0
1343
#define LLRP_IMPINJ_ACCESS_SPEC_ORDERING_ASCENDING   1
1344
1345
static const value_string impinj_access_spec_ordering[] = {
1346
    { LLRP_IMPINJ_ACCESS_SPEC_ORDERING_FIFO,       "FIFO"      },
1347
    { LLRP_IMPINJ_ACCESS_SPEC_ORDERING_ASCENDING,  "Ascending" },
1348
    { 0,                                           NULL        }
1349
};
1350
1351
/* Impinj GPO mode */
1352
#define LLRP_IMPINJ_GPO_MODE_NORMAL                         0
1353
#define LLRP_IMPINJ_GPO_MODE_PULSED                         1
1354
#define LLRP_IMPINJ_GPO_MODE_READER_OPERATIONAL_STATUS      2
1355
#define LLRP_IMPINJ_GPO_MODE_LLRP_CONNECTION_STATUS         3
1356
#define LLRP_IMPINJ_GPO_MODE_READER_INVENTORY_STATUS        4
1357
#define LLRP_IMPINJ_GPO_MODE_NETWORK_CONNECTION_STATUS      5
1358
#define LLRP_IMPINJ_GPO_MODE_READER_INVENTORY_TAGS_STATUS   6
1359
1360
static const value_string impinj_gpo_mode[] = {
1361
    { LLRP_IMPINJ_GPO_MODE_NORMAL,                        "Normal"                       },
1362
    { LLRP_IMPINJ_GPO_MODE_PULSED,                        "Pulsed"                       },
1363
    { LLRP_IMPINJ_GPO_MODE_READER_OPERATIONAL_STATUS,     "Reader operational status"    },
1364
    { LLRP_IMPINJ_GPO_MODE_LLRP_CONNECTION_STATUS,        "LLRP connection status"       },
1365
    { LLRP_IMPINJ_GPO_MODE_READER_INVENTORY_STATUS,       "Reader inventory status"      },
1366
    { LLRP_IMPINJ_GPO_MODE_NETWORK_CONNECTION_STATUS,     "Network connection status"    },
1367
    { LLRP_IMPINJ_GPO_MODE_READER_INVENTORY_TAGS_STATUS,  "Reader inventory tags status" },
1368
    { 0,                                                  NULL                           }
1369
};
1370
static value_string_ext impinj_gpo_mode_ext = VALUE_STRING_EXT_INIT(impinj_gpo_mode);
1371
1372
/* Impinj Hub connected type */
1373
#define LLRP_IMPINJ_HUB_CTYPE_UNKNOWN       0
1374
#define LLRP_IMPINJ_HUB_CTYPE_DISCONNECTED  1
1375
#define LLRP_IMPINJ_HUB_CTYPE_CONNECTED     2
1376
1377
static const value_string impinj_hub_connected_type[] = {
1378
    { LLRP_IMPINJ_HUB_CTYPE_UNKNOWN,        "Unknown"       },
1379
    { LLRP_IMPINJ_HUB_CTYPE_DISCONNECTED,   "Disconnected"  },
1380
    { LLRP_IMPINJ_HUB_CTYPE_CONNECTED,      "Connected"     },
1381
    { 0,                                    NULL            }
1382
};
1383
static value_string_ext impinj_hub_connected_type_ext = VALUE_STRING_EXT_INIT(impinj_hub_connected_type);
1384
1385
/* Impinj Hub fault type */
1386
#define LLRP_IMPINJ_HUB_FTYPE_NO_FAULT          0
1387
#define LLRP_IMPINJ_HUB_FTYPE_RFPOWER           1
1388
#define LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB1      2
1389
#define LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB2      3
1390
#define LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB3      4
1391
#define LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB4      5
1392
#define LLRP_IMPINJ_HUB_FTYPE_NO_INIT           6
1393
#define LLRP_IMPINJ_HUB_FTYPE_SERIAL_OVERFLOW   7
1394
#define LLRP_IMPINJ_HUB_FTYPE_DISCONNECTED      8
1395
1396
static const value_string impinj_hub_fault_type[] = {
1397
    { LLRP_IMPINJ_HUB_FTYPE_NO_FAULT,           "No fault"          },
1398
    { LLRP_IMPINJ_HUB_FTYPE_RFPOWER,            "RF power"          },
1399
    { LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB1,       "RF power on hub 1" },
1400
    { LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB2,       "RF power on hub 2" },
1401
    { LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB3,       "RF power on hub 3" },
1402
    { LLRP_IMPINJ_HUB_FTYPE_RFPOWER_HUB4,       "RF power on hub 4" },
1403
    { LLRP_IMPINJ_HUB_FTYPE_NO_INIT,            "No init"           },
1404
    { LLRP_IMPINJ_HUB_FTYPE_SERIAL_OVERFLOW,    "Serial overflow"   },
1405
    { LLRP_IMPINJ_HUB_FTYPE_DISCONNECTED,       "Disconnected"      },
1406
    { 0,                                        NULL },
1407
};
1408
static value_string_ext impinj_hub_fault_type_ext = VALUE_STRING_EXT_INIT(impinj_hub_fault_type);
1409
1410
/* Misc */
1411
#define LLRP_ROSPEC_ALL      0
1412
#define LLRP_ANTENNA_ALL     0
1413
#define LLRP_GPI_PORT_ALL    0
1414
#define LLRP_GPO_PORT_ALL    0
1415
#define LLRP_ACCESSSPEC_ALL  0
1416
0
#define LLRP_TLV_LEN_MIN     4
1417
0
#define LLRP_HEADER_LENGTH  10
1418
#define LLRP_NO_LIMIT        0
1419
1420
static const value_string unique_no_limit[] = {
1421
    { LLRP_NO_LIMIT, "No Limit" },
1422
    { 0, NULL },
1423
};
1424
1425
static const value_string unique_all_rospecs[] = {
1426
    { LLRP_ROSPEC_ALL, "All ROSpecs" },
1427
    { 0, NULL },
1428
};
1429
1430
static const value_string unique_all_access_specs[] = {
1431
    { LLRP_ACCESSSPEC_ALL, "All Access Specs" },
1432
    { 0, NULL },
1433
};
1434
1435
static const value_string unique_all_antenna[] = {
1436
    { LLRP_ANTENNA_ALL, "All Antenna" },
1437
    { 0, NULL },
1438
};
1439
1440
static const value_string unique_all_gpi_ports[] = {
1441
    { LLRP_GPI_PORT_ALL, "All GPI Ports" },
1442
    { 0, NULL },
1443
};
1444
1445
static const value_string unique_all_gpo_ports[] = {
1446
    { LLRP_GPO_PORT_ALL, "All GPO Ports" },
1447
    { 0, NULL },
1448
};
1449
1450
1451
static unsigned
1452
dissect_llrp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1453
        unsigned offset, const unsigned end, const unsigned depth);
1454
1455
static unsigned dissect_llrp_utf8_parameter(tvbuff_t * const tvb, packet_info *pinfo,
1456
        proto_tree * const tree, const unsigned hfindex, const unsigned offset)
1457
0
{
1458
0
    int len;
1459
1460
0
    len = tvb_get_ntohs(tvb, offset);
1461
0
    if(tvb_reported_length_remaining(tvb, offset) < len) {
1462
0
        expert_add_info_format(pinfo, tree, &ei_llrp_invalid_length,
1463
0
            "invalid length of string: claimed %u, available %u.",
1464
0
            len, tvb_reported_length_remaining(tvb, offset));
1465
0
        return offset + 2;
1466
0
    }
1467
0
    proto_tree_add_item(tree, hfindex, tvb,
1468
0
            offset, 2, ENC_BIG_ENDIAN | ENC_UTF_8);
1469
1470
0
    return offset + len + 2;
1471
0
}
1472
1473
static unsigned dissect_llrp_bit_field(tvbuff_t * const tvb,
1474
        proto_tree * const tree, const unsigned hfindex, const unsigned offset)
1475
0
{
1476
0
    unsigned len;
1477
1478
0
    len = tvb_get_ntohs(tvb, offset);
1479
0
    len = (len + 7) / 8;
1480
0
    proto_tree_add_item(tree, hf_llrp_length_bits, tvb,
1481
0
            offset, 2, ENC_BIG_ENDIAN);
1482
0
    proto_tree_add_item(tree, hfindex, tvb,
1483
0
            offset + 2, len, ENC_NA);
1484
0
    return offset + len + 2;
1485
0
}
1486
1487
static unsigned dissect_llrp_word_array(tvbuff_t * const tvb,
1488
        proto_tree * const tree, const unsigned hfindex, const unsigned offset)
1489
0
{
1490
0
    unsigned len;
1491
1492
0
    len = tvb_get_ntohs(tvb, offset);
1493
0
    len *= 2;
1494
0
    proto_tree_add_item(tree, hf_llrp_length_words, tvb,
1495
0
            offset, 2, ENC_BIG_ENDIAN);
1496
0
    proto_tree_add_item(tree, hfindex, tvb,
1497
0
            offset + 2, len, ENC_NA);
1498
0
    return offset + len + 2;
1499
0
}
1500
1501
static unsigned dissect_llrp_item_array(tvbuff_t * const tvb, packet_info *pinfo,
1502
        proto_tree * const tree, const unsigned hfindex_number,
1503
        const unsigned hfindex_item, const unsigned item_size, unsigned offset)
1504
0
{
1505
0
    unsigned num;
1506
1507
0
    num = tvb_get_ntohs(tvb, offset);
1508
0
    proto_tree_add_item(tree, hfindex_number, tvb,
1509
0
            offset, 2, ENC_BIG_ENDIAN);
1510
0
    offset += 2;
1511
0
    if(tvb_reported_length_remaining(tvb, offset) < ((int)(num*item_size))) {
1512
0
        expert_add_info_format(pinfo, tree, &ei_llrp_invalid_length,
1513
0
                "Array longer than message");
1514
0
        return offset + tvb_reported_length_remaining(tvb, offset);
1515
0
    }
1516
0
    while(num--) {
1517
0
        proto_tree_add_item(tree, hfindex_item, tvb,
1518
0
                offset, item_size, ENC_BIG_ENDIAN);
1519
0
        offset += item_size;
1520
0
    }
1521
0
    return offset;
1522
0
}
1523
1524
static unsigned
1525
// NOLINTNEXTLINE(misc-no-recursion)
1526
dissect_llrp_impinj_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *param_tree,
1527
        unsigned suboffset, const unsigned param_end)
1528
0
{
1529
0
    uint32_t subtype;
1530
1531
0
    subtype = tvb_get_ntohl(tvb, suboffset);
1532
0
    proto_item_append_text(param_tree, " (Impinj - %s)",
1533
0
            val_to_str_ext(subtype, &impinj_param_type_ext, "Unknown Type: %d"));
1534
0
    proto_tree_add_item(param_tree, hf_llrp_impinj_param_type, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1535
0
    suboffset += 4;
1536
1537
0
    switch(subtype) {
1538
0
    case LLRP_IMPINJ_PARAM_TAG_INFORMATION:
1539
0
    case LLRP_IMPINJ_PARAM_FORKLIFT_CONFIGURATION:
1540
0
    case LLRP_IMPINJ_PARAM_ACCESS_SPEC_CONFIGURATION:
1541
0
    case LLRP_IMPINJ_PARAM_TAG_REPORT_CONTENT_SELECTOR:
1542
0
    case LLRP_IMPINJ_PARAM_GPS_NMEA_SENTENCES:
1543
0
    case LLRP_IMPINJ_PARAM_HUB_VERSIONS:
1544
        /* Just parameters */
1545
0
        break;
1546
0
    case LLRP_IMPINJ_PARAM_REQUESTED_DATA:
1547
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_req_data, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1548
0
        suboffset += 4;
1549
0
        break;
1550
0
    case LLRP_IMPINJ_PARAM_SUBREGULATORY_REGION:
1551
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_reg_region, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1552
0
        suboffset += 2;
1553
0
        break;
1554
0
    case LLRP_IMPINJ_PARAM_INVENTORY_SEARCH_MODE:
1555
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_search_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1556
0
        suboffset += 2;
1557
0
        break;
1558
0
    case LLRP_IMPINJ_PARAM_TAG_DIRECTION_REPORTING:
1559
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_en_tag_dir, tvb, suboffset, 2, ENC_NA);
1560
0
        suboffset += 2;
1561
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_antenna_conf, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1562
0
        suboffset += 2;
1563
0
        proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 4, ENC_NA);
1564
0
        suboffset += 4;
1565
0
        break;
1566
0
    case LLRP_IMPINJ_PARAM_TAG_DIRECTION:
1567
0
        proto_tree_add_item(param_tree, hf_llrp_decision_time, tvb, suboffset, 8, ENC_BIG_ENDIAN);
1568
0
        suboffset += 8;
1569
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_tag_dir, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1570
0
        suboffset += 2;
1571
0
        proto_tree_add_item(param_tree, hf_llrp_confidence, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1572
0
        suboffset += 2;
1573
0
        break;
1574
0
    case LLRP_IMPINJ_PARAM_FIXED_FREQUENCY_LIST:
1575
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_fix_freq_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1576
0
        suboffset += 2;
1577
0
        proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 2, ENC_NA);
1578
0
        suboffset += 2;
1579
0
        suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1580
0
                hf_llrp_num_channels, hf_llrp_channel, 2, suboffset);
1581
0
        break;
1582
0
    case LLRP_IMPINJ_PARAM_REDUCED_POWER_FREQUENCY_LIST:
1583
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_reduce_power_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1584
0
        suboffset += 2;
1585
0
        proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 2, ENC_NA);
1586
0
        suboffset += 2;
1587
0
        suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1588
0
                hf_llrp_num_channels, hf_llrp_channel, 2, suboffset);
1589
0
        break;
1590
0
    case LLRP_IMPINJ_PARAM_LOW_DUTY_CYCLE:
1591
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_low_duty_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1592
0
        suboffset += 2;
1593
0
        proto_tree_add_item(param_tree, hf_llrp_empty_field_timeout, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1594
0
        suboffset += 2;
1595
0
        proto_tree_add_item(param_tree, hf_llrp_field_ping_interval, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1596
0
        suboffset += 2;
1597
0
        break;
1598
0
    case LLRP_IMPINJ_PARAM_DETAILED_VERSION:
1599
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_model_name, suboffset);
1600
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_serial_number, suboffset);
1601
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_soft_ver, suboffset);
1602
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_firm_ver, suboffset);
1603
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_fpga_ver, suboffset);
1604
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_pcba_ver, suboffset);
1605
0
        break;
1606
0
    case LLRP_IMPINJ_PARAM_FREQUENCY_CAPABILITIES:
1607
0
        suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1608
0
                hf_llrp_num_freqs, hf_llrp_frequency, 4, suboffset);
1609
0
        break;
1610
0
    case LLRP_IMPINJ_PARAM_FORKLIFT_HEIGHT_THRESHOLD:
1611
0
        proto_tree_add_item(param_tree, hf_llrp_height_thresh, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1612
0
        suboffset += 2;
1613
0
        break;
1614
0
    case LLRP_IMPINJ_PARAM_FORKLIFT_ZEROMOTION_TIME_THRESHOLD:
1615
0
        proto_tree_add_item(param_tree, hf_llrp_zero_motion_thresh, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1616
0
        suboffset += 2;
1617
0
        break;
1618
0
    case LLRP_IMPINJ_PARAM_FORKLIFT_COMPANION_BOARD_INFO:
1619
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_board_manufacturer, suboffset);
1620
0
        proto_tree_add_item(param_tree, hf_llrp_fw_ver_hex, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1621
0
        suboffset += 2;
1622
0
        proto_tree_add_item(param_tree, hf_llrp_hw_ver_hex, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1623
0
        suboffset += 2;
1624
0
        break;
1625
0
    case LLRP_IMPINJ_PARAM_GPI_DEBOUNCE_CONFIGURATION:
1626
0
        proto_tree_add_item(param_tree, hf_llrp_gpi_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1627
0
        suboffset += 2;
1628
0
        proto_tree_add_item(param_tree, hf_llrp_gpi_debounce, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1629
0
        suboffset += 4;
1630
0
        break;
1631
0
    case LLRP_IMPINJ_PARAM_READER_TEMPERATURE:
1632
0
        proto_tree_add_item(param_tree, hf_llrp_temperature, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1633
0
        suboffset += 2;
1634
0
        break;
1635
0
    case LLRP_IMPINJ_PARAM_LINK_MONITOR_CONFIGURATION:
1636
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_link_monitor_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1637
0
        suboffset += 2;
1638
0
        proto_tree_add_item(param_tree, hf_llrp_link_down_thresh, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1639
0
        suboffset += 2;
1640
0
        break;
1641
0
    case LLRP_IMPINJ_PARAM_REPORT_BUFFER_CONFIGURATION:
1642
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_report_buff_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1643
0
        suboffset += 2;
1644
0
        break;
1645
0
    case LLRP_IMPINJ_PARAM_BLOCK_WRITE_WORD_COUNT:
1646
0
        proto_tree_add_item(param_tree, hf_llrp_word_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1647
0
        suboffset += 2;
1648
0
        break;
1649
0
    case LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK:
1650
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1651
0
        suboffset += 2;
1652
0
        proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1653
0
        suboffset += 4;
1654
0
        proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
1655
0
        suboffset += 1;
1656
0
        proto_tree_add_item(param_tree, hf_llrp_block_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1657
0
        suboffset += 2;
1658
0
        proto_tree_add_item(param_tree, hf_llrp_block_mask, tvb, suboffset, 2, ENC_NA);
1659
0
        suboffset += 2;
1660
0
        break;
1661
0
    case LLRP_IMPINJ_PARAM_BLOCK_PERMALOCK_OPSPEC_RESULT:
1662
0
        proto_tree_add_item(param_tree, hf_llrp_permalock_result, tvb, suboffset, 1, ENC_NA);
1663
0
        suboffset += 1;
1664
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1665
0
        suboffset += 2;
1666
0
        break;
1667
0
    case LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS:
1668
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1669
0
        suboffset += 2;
1670
0
        proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1671
0
        suboffset += 4;
1672
0
        proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
1673
0
        suboffset += 1;
1674
0
        proto_tree_add_item(param_tree, hf_llrp_block_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1675
0
        suboffset += 2;
1676
0
        proto_tree_add_item(param_tree, hf_llrp_block_range, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1677
0
        suboffset += 2;
1678
0
        break;
1679
0
    case LLRP_IMPINJ_PARAM_GET_BLOCK_PERMALOCK_STATUS_OPSPEC_RESULT:
1680
0
        proto_tree_add_item(param_tree, hf_llrp_block_permalock_result, tvb, suboffset, 1, ENC_NA);
1681
0
        suboffset += 1;
1682
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1683
0
        suboffset += 2;
1684
0
        break;
1685
0
    case LLRP_IMPINJ_PARAM_SET_QT_CONFIG:
1686
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1687
0
        suboffset += 2;
1688
0
        proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1689
0
        suboffset += 4;
1690
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_data_profile, tvb, suboffset, 1, ENC_NA);
1691
0
        suboffset += 1;
1692
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_access_range, tvb, suboffset, 1, ENC_NA);
1693
0
        suboffset += 1;
1694
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_persistence, tvb, suboffset, 1, ENC_NA);
1695
0
        suboffset += 1;
1696
0
        proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 4, ENC_NA);
1697
0
        suboffset += 4;
1698
0
        break;
1699
0
    case LLRP_IMPINJ_PARAM_SET_QT_CONFIG_OPSPEC_RESULT:
1700
0
        proto_tree_add_item(param_tree, hf_llrp_set_qt_config_result, tvb, suboffset, 1, ENC_NA);
1701
0
        suboffset += 1;
1702
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1703
0
        suboffset += 2;
1704
0
        break;
1705
0
    case LLRP_IMPINJ_PARAM_GET_QT_CONFIG:
1706
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1707
0
        suboffset += 2;
1708
0
        proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1709
0
        suboffset += 4;
1710
0
        break;
1711
0
    case LLRP_IMPINJ_PARAM_GET_QT_CONFIG_OPSPEC_RESULT:
1712
0
        proto_tree_add_item(param_tree, hf_llrp_get_qt_config_result, tvb, suboffset, 1, ENC_NA);
1713
0
        suboffset += 1;
1714
0
        proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1715
0
        suboffset += 2;
1716
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_data_profile, tvb, suboffset, 1, ENC_NA);
1717
0
        suboffset += 1;
1718
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_access_range, tvb, suboffset, 1, ENC_NA);
1719
0
        suboffset += 1;
1720
0
        proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 4, ENC_NA);
1721
0
        suboffset += 4;
1722
0
        break;
1723
0
    case LLRP_IMPINJ_PARAM_ENABLE_SERIALIZED_TID:
1724
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_serialized_tid_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1725
0
        suboffset += 2;
1726
0
        break;
1727
0
    case LLRP_IMPINJ_PARAM_ENABLE_RF_PHASE_ANGLE:
1728
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_rf_phase_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1729
0
        suboffset += 2;
1730
0
        break;
1731
0
    case LLRP_IMPINJ_PARAM_ENABLE_PEAK_RSSI:
1732
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_peak_rssi_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1733
0
        suboffset += 2;
1734
0
        break;
1735
0
    case LLRP_IMPINJ_PARAM_ENABLE_GPS_COORDINATES:
1736
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_gps_coordinates_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1737
0
        suboffset += 2;
1738
0
        break;
1739
0
    case LLRP_IMPINJ_PARAM_SERIALIZED_TID:
1740
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_tid, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1741
0
        suboffset += 2;
1742
0
        break;
1743
0
    case LLRP_IMPINJ_PARAM_RF_PHASE_ANGLE:
1744
0
        proto_tree_add_item(param_tree, hf_llrp_phase_angle, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1745
0
        suboffset += 2;
1746
0
        break;
1747
0
    case LLRP_IMPINJ_PARAM_PEAK_RSSI:
1748
0
        proto_tree_add_item(param_tree, hf_llrp_rssi, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1749
0
        suboffset += 2;
1750
0
        break;
1751
0
    case LLRP_IMPINJ_PARAM_GPS_COORDINATES:
1752
0
        proto_tree_add_item(param_tree, hf_llrp_latitude, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1753
0
        suboffset += 4;
1754
0
        proto_tree_add_item(param_tree, hf_llrp_longitude, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1755
0
        suboffset += 4;
1756
0
        break;
1757
0
    case LLRP_IMPINJ_PARAM_LOOP_SPEC:
1758
0
        proto_tree_add_item(param_tree, hf_llrp_loop_count, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1759
0
        suboffset += 4;
1760
0
        break;
1761
0
    case LLRP_IMPINJ_PARAM_GGA_SENTENCE:
1762
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_gga_sentence, suboffset);
1763
0
        break;
1764
0
    case LLRP_IMPINJ_PARAM_RMC_SENTENCE:
1765
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_rmc_sentence, suboffset);
1766
0
        break;
1767
0
    case LLRP_IMPINJ_PARAM_OPSPEC_RETRY_COUNT:
1768
0
        proto_tree_add_item(param_tree, hf_llrp_retry_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1769
0
        suboffset += 2;
1770
0
        break;
1771
0
    case LLRP_IMPINJ_PARAM_ADVANCE_GPO_CONFIG:
1772
0
        proto_tree_add_item(param_tree, hf_llrp_gpo_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1773
0
        suboffset += 2;
1774
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_gpo_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1775
0
        suboffset += 2;
1776
0
        proto_tree_add_item(param_tree, hf_llrp_gpo_pulse_dur, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1777
0
        suboffset += 4;
1778
0
        break;
1779
0
    case LLRP_IMPINJ_PARAM_ENABLE_OPTIM_READ:
1780
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_optim_read_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1781
0
        suboffset += 2;
1782
0
        break;
1783
0
    case LLRP_IMPINJ_PARAM_ACCESS_SPEC_ORDERING:
1784
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_access_spec_ordering, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1785
0
        suboffset += 2;
1786
0
        break;
1787
0
    case LLRP_IMPINJ_PARAM_ENABLE_RF_DOPPLER_FREQ:
1788
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_rf_doppler_mode, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1789
0
        suboffset += 2;
1790
0
        break;
1791
0
    case LLRP_IMPINJ_PARAM_ARRAY_VERSION:
1792
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_serial_number, suboffset);
1793
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_firm_ver, suboffset);
1794
0
        suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_pcba_ver, suboffset);
1795
0
        break;
1796
0
    case LLRP_IMPINJ_PARAM_HUB_CONFIGURATION:
1797
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_hub_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1798
0
        suboffset += 2;
1799
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_hub_connected_type, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1800
0
        suboffset += 2;
1801
0
        proto_tree_add_item(param_tree, hf_llrp_impinj_hub_fault_type, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1802
0
        suboffset += 2;
1803
0
        break;
1804
0
    default:
1805
0
        return suboffset;
1806
0
    }
1807
    /* Each custom parameters ends with optional custom parameter, disscect it */
1808
0
    return dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, 0);
1809
0
}
1810
1811
static unsigned
1812
// NOLINTNEXTLINE(misc-no-recursion)
1813
dissect_llrp_parameters(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1814
        unsigned offset, const unsigned end, const unsigned depth)
1815
0
{
1816
0
    uint8_t     has_length;
1817
0
    uint16_t    len, type;
1818
0
    unsigned    real_len, param_end;
1819
0
    unsigned    suboffset;
1820
0
    unsigned    num;
1821
0
    proto_item *ti;
1822
0
    proto_tree *param_tree;
1823
1824
0
    while (((int)(end - offset)) > 0)
1825
0
    {
1826
0
        has_length = !(tvb_get_uint8(tvb, offset) & 0x80);
1827
1828
0
        if (has_length)
1829
0
        {
1830
0
            type = tvb_get_ntohs(tvb, offset);
1831
0
            len = tvb_get_ntohs(tvb, offset + 2);
1832
1833
0
            if (len < LLRP_TLV_LEN_MIN)
1834
0
                real_len = LLRP_TLV_LEN_MIN;
1835
0
            else if (len > tvb_reported_length_remaining(tvb, offset))
1836
0
                real_len = tvb_reported_length_remaining(tvb, offset);
1837
0
            else
1838
0
                real_len = len;
1839
1840
0
            param_end = offset + real_len;
1841
1842
0
            if (depth > 16) {
1843
0
                return param_end;
1844
0
            }
1845
1846
0
            ti = proto_tree_add_none_format(tree, hf_llrp_param, tvb,
1847
0
                    offset, real_len, "TLV Parameter: %s",
1848
0
                    val_to_str_ext(type, &tlv_type_ext, "Unknown Type: %d"));
1849
0
            param_tree = proto_item_add_subtree(ti, ett_llrp_param);
1850
1851
0
            proto_tree_add_item(param_tree, hf_llrp_tlv_type, tvb,
1852
0
                    offset, 2, ENC_BIG_ENDIAN);
1853
0
            offset += 2;
1854
1855
0
            ti = proto_tree_add_item(param_tree, hf_llrp_tlv_len, tvb,
1856
0
                    offset, 2, ENC_BIG_ENDIAN);
1857
0
            if (len != real_len)
1858
0
                expert_add_info_format(pinfo, ti, &ei_llrp_invalid_length,
1859
0
                        "Invalid length field: claimed %u, should be %u.",
1860
0
                        len, real_len);
1861
0
            offset += 2;
1862
1863
0
            suboffset = offset;
1864
0
            increment_dissection_depth(pinfo);
1865
0
            switch(type) {
1866
0
            case LLRP_TLV_RO_BOUND_SPEC:
1867
0
            case LLRP_TLV_UHF_CAPABILITIES:
1868
0
            case LLRP_TLV_ACCESS_COMMAND:
1869
0
            case LLRP_TLV_TAG_REPORT_DATA:
1870
0
            case LLRP_TLV_RF_SURVEY_REPORT_DATA:
1871
0
            case LLRP_TLV_READER_EVENT_NOTI_SPEC:
1872
0
            case LLRP_TLV_READER_EVENT_NOTI_DATA:
1873
0
            case LLRP_TLV_C1G2_UHF_RF_MD_TBL:
1874
0
            case LLRP_TLV_C1G2_TAG_SPEC:
1875
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1876
0
                break;
1877
0
            case LLRP_TLV_UTC_TIMESTAMP:
1878
0
            case LLRP_TLV_UPTIME:
1879
0
                proto_tree_add_item(param_tree, hf_llrp_microseconds, tvb, suboffset, 8, ENC_BIG_ENDIAN);
1880
0
                suboffset += 8;
1881
0
                break;
1882
0
            case LLRP_TLV_GENERAL_DEVICE_CAP:
1883
0
                proto_tree_add_item(param_tree, hf_llrp_max_supported_antenna, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1884
0
                proto_tree_add_item(param_tree, hf_llrp_can_set_antenna_prop, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1885
0
                suboffset += 2;
1886
0
                proto_tree_add_item(param_tree, hf_llrp_has_utc_clock, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1887
0
                suboffset += 2;
1888
0
                proto_tree_add_item(param_tree, hf_llrp_device_manufacturer, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1889
0
                suboffset += 4;
1890
0
                proto_tree_add_item(param_tree, hf_llrp_model, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1891
0
                suboffset += 4;
1892
0
                suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_firmware_version, suboffset);
1893
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1894
0
                break;
1895
0
            case LLRP_TLV_MAX_RECEIVE_SENSE:
1896
0
                proto_tree_add_item(param_tree, hf_llrp_max_receive_sense, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1897
0
                suboffset += 2;
1898
0
                break;
1899
0
            case LLRP_TLV_RECEIVE_SENSE_ENTRY:
1900
0
                proto_tree_add_item(param_tree, hf_llrp_index, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1901
0
                suboffset += 2;
1902
0
                proto_tree_add_item(param_tree, hf_llrp_receive_sense, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1903
0
                suboffset += 2;
1904
0
                break;
1905
0
            case LLRP_TLV_ANTENNA_RCV_SENSE_RANGE:
1906
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1907
0
                suboffset += 2;
1908
0
                proto_tree_add_item(param_tree, hf_llrp_receive_sense_index_min, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1909
0
                suboffset += 2;
1910
0
                proto_tree_add_item(param_tree, hf_llrp_receive_sense_index_max, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1911
0
                suboffset += 2;
1912
0
                break;
1913
0
            case LLRP_TLV_ANTENNA_AIR_PROTO:
1914
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1915
0
                suboffset += 2;
1916
0
                suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1917
0
                        hf_llrp_num_protocols, hf_llrp_protocol_id, 1, suboffset);
1918
0
                break;
1919
0
            case LLRP_TLV_GPIO_CAPABILITIES:
1920
0
                proto_tree_add_item(param_tree, hf_llrp_num_gpi, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1921
0
                suboffset += 2;
1922
0
                proto_tree_add_item(param_tree, hf_llrp_num_gpo, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1923
0
                suboffset += 2;
1924
0
                break;
1925
0
            case LLRP_TLV_LLRP_CAPABILITIES:
1926
0
                proto_tree_add_item(param_tree, hf_llrp_can_do_survey, tvb, suboffset, 1, ENC_NA);
1927
0
                proto_tree_add_item(param_tree, hf_llrp_can_report_buffer_warning, tvb, suboffset, 1, ENC_NA);
1928
0
                proto_tree_add_item(param_tree, hf_llrp_support_client_opspec, tvb, suboffset, 1, ENC_NA);
1929
0
                proto_tree_add_item(param_tree, hf_llrp_can_stateaware, tvb, suboffset, 1, ENC_NA);
1930
0
                proto_tree_add_item(param_tree, hf_llrp_support_holding, tvb, suboffset, 1, ENC_NA);
1931
0
                suboffset += 1;
1932
0
                proto_tree_add_item(param_tree, hf_llrp_max_priority_supported, tvb, suboffset, 1, ENC_NA);
1933
0
                suboffset += 1;
1934
0
                proto_tree_add_item(param_tree, hf_llrp_client_opspec_timeout, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1935
0
                suboffset += 2;
1936
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_rospec, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1937
0
                suboffset += 4;
1938
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_spec_per_rospec, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1939
0
                suboffset += 4;
1940
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_inventory_per_aispec, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1941
0
                suboffset += 4;
1942
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_accessspec, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1943
0
                suboffset += 4;
1944
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_opspec_per_accressspec, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1945
0
                suboffset += 4;
1946
1947
0
                break;
1948
0
            case LLRP_TLV_REGU_CAPABILITIES:
1949
0
                proto_tree_add_item(param_tree, hf_llrp_country_code, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1950
0
                suboffset += 2;
1951
0
                proto_tree_add_item(param_tree, hf_llrp_comm_standard, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1952
0
                suboffset += 2;
1953
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1954
0
                break;
1955
0
            case LLRP_TLV_XMIT_POWER_LEVEL_ENTRY:
1956
0
                proto_tree_add_item(param_tree, hf_llrp_index, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1957
0
                suboffset += 2;
1958
0
                proto_tree_add_item(param_tree, hf_llrp_transmit_power, tvb, suboffset, 2, ENC_BIG_ENDIAN);
1959
0
                suboffset += 2;
1960
0
                break;
1961
0
            case LLRP_TLV_FREQ_INFORMATION:
1962
0
                proto_tree_add_item(param_tree, hf_llrp_hopping, tvb, suboffset, 1, ENC_NA);
1963
0
                suboffset += 1;
1964
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1965
0
                break;
1966
0
            case LLRP_TLV_FREQ_HOP_TABLE:
1967
0
                proto_tree_add_item(param_tree, hf_llrp_hop_table_id, tvb, suboffset, 1, ENC_NA);
1968
0
                suboffset += 1;
1969
0
                proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 1, ENC_NA);
1970
0
                suboffset += 1;
1971
0
                suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1972
0
                        hf_llrp_num_hops, hf_llrp_frequency, 4, suboffset);
1973
0
                break;
1974
0
            case LLRP_TLV_FIXED_FREQ_TABLE:
1975
0
                suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
1976
0
                        hf_llrp_num_freqs, hf_llrp_frequency, 4, suboffset);
1977
0
                break;
1978
0
            case LLRP_TLV_RF_SURVEY_FREQ_CAP:
1979
0
                proto_tree_add_item(param_tree, hf_llrp_min_freq, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1980
0
                suboffset += 4;
1981
0
                proto_tree_add_item(param_tree, hf_llrp_max_freq, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1982
0
                suboffset += 4;
1983
0
                break;
1984
0
            case LLRP_TLV_RO_SPEC:
1985
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
1986
0
                suboffset += 4;
1987
0
                proto_tree_add_item(param_tree, hf_llrp_priority, tvb, suboffset, 1, ENC_NA);
1988
0
                suboffset += 1;
1989
0
                proto_tree_add_item(param_tree, hf_llrp_cur_state, tvb, suboffset, 1, ENC_NA);
1990
0
                suboffset += 1;
1991
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1992
0
                break;
1993
0
            case LLRP_TLV_RO_SPEC_START_TRIGGER:
1994
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_start_trig_type, tvb, suboffset, 1, ENC_NA);
1995
0
                suboffset += 1;
1996
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
1997
0
                break;
1998
0
            case LLRP_TLV_PER_TRIGGER_VAL:
1999
0
                proto_tree_add_item(param_tree, hf_llrp_offset, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2000
0
                suboffset += 4;
2001
0
                proto_tree_add_item(param_tree, hf_llrp_period, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2002
0
                suboffset += 4;
2003
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2004
0
                break;
2005
0
            case LLRP_TLV_GPI_TRIGGER_VAL:
2006
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2007
0
                suboffset += 2;
2008
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_event, tvb, suboffset, 1, ENC_NA);
2009
0
                suboffset += 1;
2010
0
                proto_tree_add_item(param_tree, hf_llrp_timeout, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2011
0
                suboffset += 4;
2012
0
                break;
2013
0
            case LLRP_TLV_RO_SPEC_STOP_TRIGGER:
2014
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_stop_trig_type, tvb, suboffset, 1, ENC_NA);
2015
0
                suboffset += 1;
2016
0
                proto_tree_add_item(param_tree, hf_llrp_duration_trig, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2017
0
                suboffset += 4;
2018
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2019
0
                break;
2020
0
            case LLRP_TLV_AI_SPEC:
2021
0
                suboffset = dissect_llrp_item_array(tvb, pinfo, param_tree,
2022
0
                        hf_llrp_antenna_count, hf_llrp_antenna, 2, suboffset);
2023
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2024
0
                break;
2025
0
            case LLRP_TLV_AI_SPEC_STOP:
2026
0
                proto_tree_add_item(param_tree, hf_llrp_aispec_stop_trig_type, tvb, suboffset, 1, ENC_NA);
2027
0
                suboffset += 1;
2028
0
                proto_tree_add_item(param_tree, hf_llrp_duration_trig, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2029
0
                suboffset += 4;
2030
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2031
0
                break;
2032
0
            case LLRP_TLV_TAG_OBSERV_TRIGGER:
2033
0
                proto_tree_add_item(param_tree, hf_llrp_trig_type, tvb, suboffset, 1, ENC_NA);
2034
0
                suboffset += 1;
2035
0
                proto_tree_add_item(param_tree, hf_llrp_rfu, tvb, suboffset, 1, ENC_NA);
2036
0
                suboffset += 1;
2037
0
                proto_tree_add_item(param_tree, hf_llrp_number_of_tags, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2038
0
                suboffset += 2;
2039
0
                proto_tree_add_item(param_tree, hf_llrp_number_of_attempts, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2040
0
                suboffset += 2;
2041
0
                proto_tree_add_item(param_tree, hf_llrp_t, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2042
0
                suboffset += 2;
2043
0
                proto_tree_add_item(param_tree, hf_llrp_timeout, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2044
0
                suboffset += 4;
2045
0
                break;
2046
0
            case LLRP_TLV_INVENTORY_PARAM_SPEC:
2047
0
                proto_tree_add_item(param_tree, hf_llrp_inventory_spec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2048
0
                suboffset += 2;
2049
0
                proto_tree_add_item(param_tree, hf_llrp_protocol_id, tvb, suboffset, 1, ENC_NA);
2050
0
                suboffset += 1;
2051
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2052
0
                break;
2053
0
            case LLRP_TLV_RF_SURVEY_SPEC:
2054
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2055
0
                suboffset += 2;
2056
0
                proto_tree_add_item(param_tree, hf_llrp_start_freq, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2057
0
                suboffset += 4;
2058
0
                proto_tree_add_item(param_tree, hf_llrp_stop_freq, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2059
0
                suboffset += 4;
2060
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2061
0
                break;
2062
0
            case LLRP_TLV_RF_SURVEY_SPEC_STOP_TR:
2063
0
                proto_tree_add_item(param_tree, hf_llrp_stop_trig_type, tvb, suboffset, 1, ENC_NA);
2064
0
                suboffset += 1;
2065
0
                proto_tree_add_item(param_tree, hf_llrp_duration, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2066
0
                suboffset += 4;
2067
0
                proto_tree_add_item(param_tree, hf_llrp_n_4, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2068
0
                suboffset += 4;
2069
0
                break;
2070
0
            case LLRP_TLV_LOOP_SPEC:
2071
0
                proto_tree_add_item(param_tree, hf_llrp_loop_count, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2072
0
                suboffset += 4;
2073
0
                break;
2074
0
            case LLRP_TLV_ACCESS_SPEC:
2075
0
                proto_tree_add_item(param_tree, hf_llrp_accessspec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2076
0
                suboffset += 4;
2077
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2078
0
                suboffset += 2;
2079
0
                proto_tree_add_item(param_tree, hf_llrp_protocol_id, tvb, suboffset, 1, ENC_BIG_ENDIAN);
2080
0
                suboffset += 1;
2081
0
                proto_tree_add_item(param_tree, hf_llrp_access_cur_state, tvb, suboffset, 1, ENC_NA);
2082
0
                suboffset += 1;
2083
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2084
0
                suboffset += 4;
2085
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2086
0
                break;
2087
0
            case LLRP_TLV_ACCESS_SPEC_STOP_TRIG:
2088
0
                proto_tree_add_item(param_tree, hf_llrp_access_stop_trig_type, tvb, suboffset, 1, ENC_NA);
2089
0
                suboffset += 1;
2090
0
                proto_tree_add_item(param_tree, hf_llrp_operation_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2091
0
                suboffset += 2;
2092
0
                break;
2093
0
            case LLRP_TLV_CLIENT_REQ_OP_SPEC:
2094
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2095
0
                suboffset += 2;
2096
0
                break;
2097
0
            case LLRP_TLV_CLIENT_REQ_RESPONSE:
2098
0
                proto_tree_add_item(param_tree, hf_llrp_accessspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2099
0
                suboffset += 2;
2100
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2101
0
                break;
2102
0
            case LLRP_TLV_LLRP_CONF_STATE_VAL:
2103
0
                proto_tree_add_item(param_tree, hf_llrp_conf_value, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2104
0
                suboffset += 4;
2105
0
                break;
2106
0
            case LLRP_TLV_IDENT:
2107
0
                proto_tree_add_item(param_tree, hf_llrp_id_type, tvb, suboffset, 1, ENC_NA);
2108
0
                suboffset += 1;
2109
0
                num = tvb_get_ntohs(tvb, suboffset);
2110
0
                proto_tree_add_item(param_tree, hf_llrp_reader_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2111
0
                suboffset += num;
2112
0
                break;
2113
0
            case LLRP_TLV_GPO_WRITE_DATA:
2114
0
                proto_tree_add_item(param_tree, hf_llrp_gpo_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2115
0
                suboffset += 2;
2116
0
                proto_tree_add_item(param_tree, hf_llrp_gpo_data, tvb, suboffset, 1, ENC_NA);
2117
0
                suboffset += 1;
2118
0
                break;
2119
0
            case LLRP_TLV_KEEPALIVE_SPEC:
2120
0
                proto_tree_add_item(param_tree, hf_llrp_keepalive_trig_type, tvb, suboffset, 1, ENC_NA);
2121
0
                suboffset += 1;
2122
0
                proto_tree_add_item(param_tree, hf_llrp_time_iterval, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2123
0
                suboffset += 4;
2124
0
                break;
2125
0
            case LLRP_TLV_ANTENNA_PROPS:
2126
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_connected, tvb, suboffset, 1, ENC_NA);
2127
0
                suboffset += 1;
2128
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2129
0
                suboffset += 2;
2130
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_gain, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2131
0
                suboffset += 2;
2132
0
                break;
2133
0
            case LLRP_TLV_ANTENNA_CONF:
2134
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2135
0
                suboffset += 2;
2136
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2137
0
                break;
2138
0
            case LLRP_TLV_RF_RECEIVER:
2139
0
                proto_tree_add_item(param_tree, hf_llrp_receiver_sense, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2140
0
                suboffset += 2;
2141
0
                break;
2142
0
            case LLRP_TLV_RF_TRANSMITTER:
2143
0
                proto_tree_add_item(param_tree, hf_llrp_hop_table_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2144
0
                suboffset += 2;
2145
0
                proto_tree_add_item(param_tree, hf_llrp_channel_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2146
0
                suboffset += 2;
2147
0
                proto_tree_add_item(param_tree, hf_llrp_transmit_power, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2148
0
                suboffset += 2;
2149
0
                break;
2150
0
            case LLRP_TLV_GPI_PORT_CURRENT_STATE:
2151
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2152
0
                suboffset += 2;
2153
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_config, tvb, suboffset, 1, ENC_NA);
2154
0
                suboffset += 1;
2155
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_state, tvb, suboffset, 1, ENC_NA);
2156
0
                suboffset += 1;
2157
0
                break;
2158
0
            case LLRP_TLV_EVENTS_AND_REPORTS:
2159
0
                proto_tree_add_item(param_tree, hf_llrp_hold_events_and_reports, tvb, suboffset, 1, ENC_NA);
2160
0
                suboffset += 1;
2161
0
                break;
2162
0
            case LLRP_TLV_RO_REPORT_SPEC:
2163
0
                proto_tree_add_item(param_tree, hf_llrp_ro_report_trig, tvb, suboffset, 1, ENC_NA);
2164
0
                suboffset += 1;
2165
0
                proto_tree_add_item(param_tree, hf_llrp_n_2, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2166
0
                suboffset += 2;
2167
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2168
0
                break;
2169
0
            case LLRP_TLV_TAG_REPORT_CONTENT_SEL:
2170
0
                proto_tree_add_item(param_tree, hf_llrp_enable_rospec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2171
0
                proto_tree_add_item(param_tree, hf_llrp_enable_spec_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2172
0
                proto_tree_add_item(param_tree, hf_llrp_enable_inv_spec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2173
0
                proto_tree_add_item(param_tree, hf_llrp_enable_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2174
0
                proto_tree_add_item(param_tree, hf_llrp_enable_channel_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2175
0
                proto_tree_add_item(param_tree, hf_llrp_enable_peak_rssi, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2176
0
                proto_tree_add_item(param_tree, hf_llrp_enable_first_seen, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2177
0
                proto_tree_add_item(param_tree, hf_llrp_enable_last_seen, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2178
0
                proto_tree_add_item(param_tree, hf_llrp_enable_seen_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2179
0
                proto_tree_add_item(param_tree, hf_llrp_enable_accessspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2180
0
                suboffset += 2;
2181
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2182
0
                break;
2183
0
            case LLRP_TLV_ACCESS_REPORT_SPEC:
2184
0
                proto_tree_add_item(param_tree, hf_llrp_access_report_trig, tvb, suboffset, 1, ENC_NA);
2185
0
                suboffset += 1;
2186
0
                break;
2187
0
            case LLRP_TLV_EPC_DATA:
2188
0
                suboffset = dissect_llrp_bit_field(tvb, param_tree, hf_llrp_epc, suboffset);
2189
0
                break;
2190
0
            case LLRP_TLV_FREQ_RSSI_LEVEL_ENTRY:
2191
0
                proto_tree_add_item(param_tree, hf_llrp_frequency, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2192
0
                suboffset += 4;
2193
0
                proto_tree_add_item(param_tree, hf_llrp_bandwidth, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2194
0
                suboffset += 4;
2195
0
                proto_tree_add_item(param_tree, hf_llrp_average_rssi, tvb, suboffset, 1, ENC_NA);
2196
0
                suboffset += 1;
2197
0
                proto_tree_add_item(param_tree, hf_llrp_peak_rssi, tvb, suboffset, 1, ENC_NA);
2198
0
                suboffset += 1;
2199
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2200
0
                break;
2201
0
            case LLRP_TLV_EVENT_NOTIF_STATE:
2202
0
                proto_tree_add_item(param_tree, hf_llrp_event_type, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2203
0
                suboffset += 2;
2204
0
                proto_tree_add_item(param_tree, hf_llrp_notif_state, tvb, suboffset, 1, ENC_NA);
2205
0
                suboffset += 1;
2206
0
                break;
2207
0
            case LLRP_TLV_HOPPING_EVENT:
2208
0
                proto_tree_add_item(param_tree, hf_llrp_hop_table_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2209
0
                suboffset += 2;
2210
0
                proto_tree_add_item(param_tree, hf_llrp_next_chan_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2211
0
                suboffset += 2;
2212
0
                break;
2213
0
            case LLRP_TLV_GPI_EVENT:
2214
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_port, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2215
0
                suboffset += 2;
2216
0
                proto_tree_add_item(param_tree, hf_llrp_gpi_event, tvb, suboffset, 1, ENC_NA);
2217
0
                suboffset += 1;
2218
0
                break;
2219
0
            case LLRP_TLV_RO_SPEC_EVENT:
2220
0
                proto_tree_add_item(param_tree, hf_llrp_roevent_type, tvb, suboffset, 1, ENC_NA);
2221
0
                suboffset += 1;
2222
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2223
0
                suboffset += 4;
2224
0
                proto_tree_add_item(param_tree, hf_llrp_prem_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2225
0
                suboffset += 4;
2226
0
                break;
2227
0
            case LLRP_TLV_REPORT_BUF_LEVEL_WARN:
2228
0
                proto_tree_add_item(param_tree, hf_llrp_buffer_full_percentage, tvb, suboffset, 1, ENC_NA);
2229
0
                suboffset += 1;
2230
0
                break;
2231
0
            case LLRP_TLV_REPORT_BUF_OVERFLOW_ERR: break;
2232
0
            case LLRP_TLV_READER_EXCEPTION_EVENT:
2233
0
                suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_message, suboffset);
2234
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2235
0
                break;
2236
0
            case LLRP_TLV_RF_SURVEY_EVENT:
2237
0
                proto_tree_add_item(param_tree, hf_llrp_rfevent_type, tvb, suboffset, 1, ENC_NA);
2238
0
                suboffset += 1;
2239
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2240
0
                suboffset += 4;
2241
0
                proto_tree_add_item(param_tree, hf_llrp_spec_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2242
0
                suboffset += 2;
2243
0
                break;
2244
0
            case LLRP_TLV_AI_SPEC_EVENT:
2245
0
                proto_tree_add_item(param_tree, hf_llrp_aievent_type, tvb, suboffset, 1, ENC_NA);
2246
0
                suboffset += 1;
2247
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2248
0
                suboffset += 4;
2249
0
                proto_tree_add_item(param_tree, hf_llrp_spec_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2250
0
                suboffset += 2;
2251
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2252
0
                break;
2253
0
            case LLRP_TLV_ANTENNA_EVENT:
2254
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_event_type, tvb, suboffset, 1, ENC_NA);
2255
0
                suboffset += 1;
2256
0
                proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2257
0
                suboffset += 2;
2258
0
                break;
2259
0
            case LLRP_TLV_CONN_ATTEMPT_EVENT:
2260
0
                proto_tree_add_item(param_tree, hf_llrp_conn_status, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2261
0
                suboffset += 2;
2262
0
                break;
2263
0
            case LLRP_TLV_CONN_CLOSE_EVENT:
2264
0
                break;
2265
0
            case LLRP_TLV_SPEC_LOOP_EVENT:
2266
0
                proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2267
0
                suboffset += 4;
2268
0
                proto_tree_add_item(param_tree, hf_llrp_loop_count, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2269
0
                suboffset += 4;
2270
0
                break;
2271
0
            case LLRP_TLV_LLRP_STATUS:
2272
0
                proto_tree_add_item(param_tree, hf_llrp_status_code, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2273
0
                suboffset += 2;
2274
0
                suboffset = dissect_llrp_utf8_parameter(tvb, pinfo, param_tree, hf_llrp_error_desc, suboffset);
2275
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2276
0
                break;
2277
0
            case LLRP_TLV_FIELD_ERROR:
2278
0
                proto_tree_add_item(param_tree, hf_llrp_field_num, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2279
0
                suboffset += 2;
2280
0
                proto_tree_add_item(param_tree, hf_llrp_error_code, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2281
0
                suboffset += 2;
2282
0
                break;
2283
0
            case LLRP_TLV_PARAM_ERROR:
2284
0
                proto_tree_add_item(param_tree, hf_llrp_parameter_type, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2285
0
                suboffset += 2;
2286
0
                proto_tree_add_item(param_tree, hf_llrp_error_code, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2287
0
                suboffset += 2;
2288
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2289
0
                break;
2290
0
            case LLRP_TLV_C1G2_LLRP_CAP:
2291
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_block_erase, tvb, suboffset, 1, ENC_NA);
2292
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_block_write, tvb, suboffset, 1, ENC_NA);
2293
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_block_permalock, tvb, suboffset, 1, ENC_NA);
2294
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_tag_recomm, tvb, suboffset, 1, ENC_NA);
2295
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_UMI_method2, tvb, suboffset, 1, ENC_NA);
2296
0
                proto_tree_add_item(param_tree, hf_llrp_can_support_XPC, tvb, suboffset, 1, ENC_NA);
2297
0
                suboffset += 1;
2298
0
                proto_tree_add_item(param_tree, hf_llrp_max_num_filter_per_query, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2299
0
                suboffset += 2;
2300
0
                break;
2301
0
            case LLRP_TLV_C1G2_UHF_RF_MD_TBL_ENT:
2302
0
                proto_tree_add_item(param_tree, hf_llrp_mode_ident, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2303
0
                suboffset += 4;
2304
0
                proto_tree_add_item(param_tree, hf_llrp_DR, tvb, suboffset, 1, ENC_NA);
2305
0
                proto_tree_add_item(param_tree, hf_llrp_hag_conformance, tvb, suboffset, 1, ENC_NA);
2306
0
                suboffset += 1;
2307
0
                proto_tree_add_item(param_tree, hf_llrp_mod, tvb, suboffset, 1, ENC_NA);
2308
0
                suboffset += 1;
2309
0
                proto_tree_add_item(param_tree, hf_llrp_flm, tvb, suboffset, 1, ENC_NA);
2310
0
                suboffset += 1;
2311
0
                proto_tree_add_item(param_tree, hf_llrp_m, tvb, suboffset, 1, ENC_NA);
2312
0
                suboffset += 1;
2313
0
                proto_tree_add_item(param_tree, hf_llrp_bdr, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2314
0
                suboffset += 4;
2315
0
                proto_tree_add_item(param_tree, hf_llrp_pie, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2316
0
                suboffset += 4;
2317
0
                proto_tree_add_item(param_tree, hf_llrp_min_tari, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2318
0
                suboffset += 4;
2319
0
                proto_tree_add_item(param_tree, hf_llrp_max_tari, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2320
0
                suboffset += 4;
2321
0
                proto_tree_add_item(param_tree, hf_llrp_step_tari, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2322
0
                suboffset += 4;
2323
0
                break;
2324
0
            case LLRP_TLV_C1G2_INVENTORY_COMMAND:
2325
0
                proto_tree_add_item(param_tree, hf_llrp_inventory_state_aware, tvb, suboffset, 1, ENC_NA);
2326
0
                suboffset += 1;
2327
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2328
0
                break;
2329
0
            case LLRP_TLV_C1G2_FILTER:
2330
0
                proto_tree_add_item(param_tree, hf_llrp_trunc, tvb, suboffset, 1, ENC_NA);
2331
0
                suboffset += 1;
2332
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2333
0
                break;
2334
0
            case LLRP_TLV_C1G2_TAG_INV_MASK:
2335
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2336
0
                suboffset += 1;
2337
0
                proto_tree_add_item(param_tree, hf_llrp_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2338
0
                suboffset += 2;
2339
0
                suboffset = dissect_llrp_bit_field(tvb, param_tree, hf_llrp_tag_mask, suboffset);
2340
0
                break;
2341
0
            case LLRP_TLV_C1G2_TAG_INV_AWARE_FLTR:
2342
0
                proto_tree_add_item(param_tree, hf_llrp_aware_filter_target, tvb, suboffset, 1, ENC_NA);
2343
0
                suboffset += 1;
2344
0
                proto_tree_add_item(param_tree, hf_llrp_aware_filter_action, tvb, suboffset, 1, ENC_NA);
2345
0
                suboffset += 1;
2346
0
                break;
2347
0
            case LLRP_TLV_C1G2_TAG_INV_UNAWR_FLTR:
2348
0
                proto_tree_add_item(param_tree, hf_llrp_unaware_filter_action, tvb, suboffset, 1, ENC_NA);
2349
0
                suboffset += 1;
2350
0
                break;
2351
0
            case LLRP_TLV_C1G2_RF_CONTROL:
2352
0
                proto_tree_add_item(param_tree, hf_llrp_mode_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2353
0
                suboffset += 2;
2354
0
                proto_tree_add_item(param_tree, hf_llrp_tari, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2355
0
                suboffset += 2;
2356
0
                break;
2357
0
            case LLRP_TLV_C1G2_SINGULATION_CTRL:
2358
0
                proto_tree_add_item(param_tree, hf_llrp_session, tvb, suboffset, 1, ENC_NA);
2359
0
                suboffset += 1;
2360
0
                proto_tree_add_item(param_tree, hf_llrp_tag_population, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2361
0
                suboffset += 2;
2362
0
                proto_tree_add_item(param_tree, hf_llrp_tag_transit_time, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2363
0
                suboffset += 4;
2364
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2365
0
                break;
2366
0
            case LLRP_TLV_C1G2_TAG_INV_AWARE_SING:
2367
0
                proto_tree_add_item(param_tree, hf_llrp_sing_i, tvb, suboffset, 1, ENC_NA);
2368
0
                proto_tree_add_item(param_tree, hf_llrp_sing_s, tvb, suboffset, 1, ENC_NA);
2369
0
                proto_tree_add_item(param_tree, hf_llrp_sing_a, tvb, suboffset, 1, ENC_NA);
2370
0
                suboffset += 1;
2371
0
                break;
2372
0
            case LLRP_TLV_C1G2_TARGET_TAG:
2373
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2374
0
                proto_tree_add_item(param_tree, hf_llrp_match, tvb, suboffset, 1, ENC_NA);
2375
0
                suboffset += 1;
2376
0
                proto_tree_add_item(param_tree, hf_llrp_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2377
0
                suboffset += 2;
2378
0
                suboffset = dissect_llrp_bit_field(tvb, param_tree, hf_llrp_tag_mask, suboffset);
2379
0
                suboffset = dissect_llrp_bit_field(tvb, param_tree, hf_llrp_tag_data, suboffset);
2380
0
                break;
2381
0
            case LLRP_TLV_C1G2_READ:
2382
0
            case LLRP_TLV_C1G2_BLK_ERASE:
2383
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2384
0
                suboffset += 2;
2385
0
                proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2386
0
                suboffset += 4;
2387
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2388
0
                suboffset += 1;
2389
0
                proto_tree_add_item(param_tree, hf_llrp_word_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2390
0
                suboffset += 2;
2391
0
                proto_tree_add_item(param_tree, hf_llrp_word_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2392
0
                suboffset += 2;
2393
0
                break;
2394
0
            case LLRP_TLV_C1G2_WRITE:
2395
0
            case LLRP_TLV_C1G2_BLK_WRITE:
2396
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2397
0
                suboffset += 2;
2398
0
                proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2399
0
                suboffset += 4;
2400
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2401
0
                suboffset += 1;
2402
0
                proto_tree_add_item(param_tree, hf_llrp_word_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2403
0
                suboffset += 2;
2404
0
                suboffset = dissect_llrp_word_array(tvb, param_tree, hf_llrp_write_data, suboffset);
2405
0
                break;
2406
0
            case LLRP_TLV_C1G2_KILL:
2407
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2408
0
                suboffset += 2;
2409
0
                proto_tree_add_item(param_tree, hf_llrp_kill_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2410
0
                suboffset += 4;
2411
0
                break;
2412
0
            case LLRP_TLV_C1G2_RECOMMISSION:
2413
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2414
0
                suboffset += 2;
2415
0
                proto_tree_add_item(param_tree, hf_llrp_kill_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2416
0
                suboffset += 4;
2417
0
                proto_tree_add_item(param_tree, hf_llrp_kill_3, tvb, suboffset, 1, ENC_NA);
2418
0
                proto_tree_add_item(param_tree, hf_llrp_kill_2, tvb, suboffset, 1, ENC_NA);
2419
0
                proto_tree_add_item(param_tree, hf_llrp_kill_l, tvb, suboffset, 1, ENC_NA);
2420
0
                suboffset += 1;
2421
0
                break;
2422
0
            case LLRP_TLV_C1G2_LOCK:
2423
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2424
0
                suboffset += 2;
2425
0
                proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2426
0
                suboffset += 4;
2427
0
                suboffset = dissect_llrp_parameters(tvb, pinfo, param_tree, suboffset, param_end, depth+1);
2428
0
                break;
2429
0
            case LLRP_TLV_C1G2_LOCK_PAYLOAD:
2430
0
                proto_tree_add_item(param_tree, hf_llrp_privilege, tvb, suboffset, 1, ENC_NA);
2431
0
                suboffset += 1;
2432
0
                proto_tree_add_item(param_tree, hf_llrp_data_field, tvb, suboffset, 1, ENC_NA);
2433
0
                suboffset += 1;
2434
0
                break;
2435
0
            case LLRP_TLV_C1G2_BLK_PERMALOCK:
2436
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2437
0
                suboffset += 2;
2438
0
                proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2439
0
                suboffset += 4;
2440
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2441
0
                suboffset += 1;
2442
0
                proto_tree_add_item(param_tree, hf_llrp_block_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2443
0
                suboffset += 2;
2444
0
                suboffset = dissect_llrp_word_array(tvb, param_tree, hf_llrp_block_mask, suboffset);
2445
0
                break;
2446
0
            case LLRP_TLV_C1G2_GET_BLK_PERMALOCK:
2447
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2448
0
                suboffset += 2;
2449
0
                proto_tree_add_item(param_tree, hf_llrp_access_pass, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2450
0
                suboffset += 2;
2451
0
                proto_tree_add_item(param_tree, hf_llrp_mb, tvb, suboffset, 1, ENC_NA);
2452
0
                suboffset += 2;
2453
0
                proto_tree_add_item(param_tree, hf_llrp_block_pointer, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2454
0
                suboffset += 2;
2455
0
                proto_tree_add_item(param_tree, hf_llrp_block_range, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2456
0
                suboffset += 2;
2457
0
                break;
2458
0
            case LLRP_TLV_C1G2_EPC_MEMORY_SLCTOR:
2459
0
                proto_tree_add_item(param_tree, hf_llrp_enable_crc, tvb, suboffset, 1, ENC_NA);
2460
0
                proto_tree_add_item(param_tree, hf_llrp_enable_pc, tvb, suboffset, 1, ENC_NA);
2461
0
                proto_tree_add_item(param_tree, hf_llrp_enable_xpc, tvb, suboffset, 1, ENC_NA);
2462
0
                suboffset += 1;
2463
0
                break;
2464
0
            case LLRP_TLV_C1G2_READ_OP_SPEC_RES:
2465
0
                proto_tree_add_item(param_tree, hf_llrp_access_result, tvb, suboffset, 1, ENC_NA);
2466
0
                suboffset += 1;
2467
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2468
0
                suboffset += 2;
2469
0
                suboffset = dissect_llrp_word_array(tvb, param_tree, hf_llrp_read_data, suboffset);
2470
0
                break;
2471
0
            case LLRP_TLV_C1G2_WRT_OP_SPEC_RES:
2472
0
            case LLRP_TLV_C1G2_BLK_WRT_OP_SPC_RES:
2473
0
                proto_tree_add_item(param_tree, hf_llrp_access_result, tvb, suboffset, 1, ENC_NA);
2474
0
                suboffset += 1;
2475
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2476
0
                suboffset += 2;
2477
0
                proto_tree_add_item(param_tree, hf_llrp_num_words_written, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2478
0
                suboffset += 2;
2479
0
                break;
2480
0
            case LLRP_TLV_C1G2_KILL_OP_SPEC_RES:
2481
0
            case LLRP_TLV_C1G2_RECOM_OP_SPEC_RES:
2482
0
            case LLRP_TLV_C1G2_LOCK_OP_SPEC_RES:
2483
0
            case LLRP_TLV_C1G2_BLK_ERS_OP_SPC_RES:
2484
0
            case LLRP_TLV_C1G2_BLK_PRL_OP_SPC_RES:
2485
0
                proto_tree_add_item(param_tree, hf_llrp_access_result, tvb, suboffset, 1, ENC_NA);
2486
0
                suboffset += 1;
2487
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2488
0
                suboffset += 2;
2489
0
                break;
2490
0
            case LLRP_TLV_C1G2_BLK_PRL_STAT_RES:
2491
0
                proto_tree_add_item(param_tree, hf_llrp_access_result, tvb, suboffset, 1, ENC_NA);
2492
0
                suboffset += 1;
2493
0
                proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2494
0
                suboffset += 2;
2495
0
                suboffset = dissect_llrp_word_array(tvb, param_tree, hf_llrp_permlock_status, suboffset);
2496
0
                break;
2497
0
            case LLRP_TLV_CUSTOM_PARAMETER:
2498
0
                proto_tree_add_item_ret_uint(param_tree, hf_llrp_vendor_id, tvb, suboffset, 4, ENC_BIG_ENDIAN, &num);
2499
0
                suboffset += 4;
2500
0
                switch(num) {
2501
0
                case LLRP_VENDOR_IMPINJ:
2502
0
                    suboffset = dissect_llrp_impinj_parameter(tvb, pinfo, param_tree, suboffset, param_end);
2503
0
                    break;
2504
0
                default:
2505
0
                    proto_tree_add_item(param_tree, hf_llrp_vendor_unknown, tvb, suboffset, len-4-2-2, ENC_NA);
2506
0
                    suboffset += len-4-2-2;
2507
0
                    break;
2508
0
                }
2509
0
                break;
2510
0
            }
2511
0
            decrement_dissection_depth(pinfo);
2512
            /* Have we decoded exactly the number of bytes declared in the parameter? */
2513
0
            if(suboffset != param_end) {
2514
                /* Report problem */
2515
0
                expert_add_info_format(pinfo, param_tree, &ei_llrp_invalid_length,
2516
0
                        "Incorrect length of parameter: %u bytes decoded, but %u bytes claimed.",
2517
0
                        suboffset - offset + 4, real_len);
2518
0
            }
2519
            /* The len field includes the 4-byte parameter header that we've
2520
             * already accounted for in offset */
2521
0
            offset += real_len - 4;
2522
0
        }
2523
0
        else
2524
0
        {
2525
0
            type = tvb_get_uint8(tvb, offset) & 0x7F;
2526
2527
0
            switch (type)
2528
0
            {
2529
0
                case LLRP_TV_ANTENNA_ID:
2530
0
                    real_len = LLRP_TV_LEN_ANTENNA_ID; break;
2531
0
                case LLRP_TV_FIRST_SEEN_TIME_UTC:
2532
0
                    real_len = LLRP_TV_LEN_FIRST_SEEN_TIME_UTC; break;
2533
0
                case LLRP_TV_FIRST_SEEN_TIME_UPTIME:
2534
0
                    real_len = LLRP_TV_LEN_FIRST_SEEN_TIME_UPTIME; break;
2535
0
                case LLRP_TV_LAST_SEEN_TIME_UTC:
2536
0
                    real_len = LLRP_TV_LEN_LAST_SEEN_TIME_UTC; break;
2537
0
                case LLRP_TV_LAST_SEEN_TIME_UPTIME:
2538
0
                    real_len = LLRP_TV_LEN_LAST_SEEN_TIME_UPTIME; break;
2539
0
                case LLRP_TV_PEAK_RSSI:
2540
0
                    real_len = LLRP_TV_LEN_PEAK_RSSI; break;
2541
0
                case LLRP_TV_CHANNEL_INDEX:
2542
0
                    real_len = LLRP_TV_LEN_CHANNEL_INDEX; break;
2543
0
                case LLRP_TV_TAG_SEEN_COUNT:
2544
0
                    real_len = LLRP_TV_LEN_TAG_SEEN_COUNT; break;
2545
0
                case LLRP_TV_RO_SPEC_ID:
2546
0
                    real_len = LLRP_TV_LEN_RO_SPEC_ID; break;
2547
0
                case LLRP_TV_INVENTORY_PARAM_SPEC_ID:
2548
0
                    real_len = LLRP_TV_LEN_INVENTORY_PARAM_SPEC_ID; break;
2549
0
                case LLRP_TV_C1G2_CRC:
2550
0
                    real_len = LLRP_TV_LEN_C1G2_CRC; break;
2551
0
                case LLRP_TV_C1G2_PC:
2552
0
                    real_len = LLRP_TV_LEN_C1G2_PC; break;
2553
0
                case LLRP_TV_EPC96:
2554
0
                    real_len = LLRP_TV_LEN_EPC96; break;
2555
0
                case LLRP_TV_SPEC_INDEX:
2556
0
                    real_len = LLRP_TV_LEN_SPEC_INDEX; break;
2557
0
                case LLRP_TV_CLIENT_REQ_OP_SPEC_RES:
2558
0
                    real_len = LLRP_TV_LEN_CLIENT_REQ_OP_SPEC_RES; break;
2559
0
                case LLRP_TV_ACCESS_SPEC_ID:
2560
0
                    real_len = LLRP_TV_LEN_ACCESS_SPEC_ID; break;
2561
0
                case LLRP_TV_OP_SPEC_ID:
2562
0
                    real_len = LLRP_TV_LEN_OP_SPEC_ID; break;
2563
0
                case LLRP_TV_C1G2_SINGULATION_DET:
2564
0
                    real_len = LLRP_TV_LEN_C1G2_SINGULATION_DET; break;
2565
0
                case LLRP_TV_C1G2_XPC_W1:
2566
0
                    real_len = LLRP_TV_LEN_C1G2_XPC_W1; break;
2567
0
                case LLRP_TV_C1G2_XPC_W2:
2568
0
                    real_len = LLRP_TV_LEN_C1G2_XPC_W2; break;
2569
0
                default:
2570
                    /* ???
2571
                     * No need to mark it, since the hf_llrp_tv_type field
2572
                     * will already show up as 'unknown'. */
2573
0
                    real_len = 0;
2574
0
                    break;
2575
0
            }
2576
2577
0
            ti = proto_tree_add_none_format(tree, hf_llrp_param, tvb,
2578
0
                    offset, real_len + 1, "TV Parameter : %s",
2579
0
                    val_to_str_ext(type, &tv_type_ext, "Unknown Type: %d"));
2580
0
            param_tree = proto_item_add_subtree(ti, ett_llrp_param);
2581
2582
0
            proto_tree_add_item(param_tree, hf_llrp_tv_type, tvb,
2583
0
                    offset, 1, ENC_BIG_ENDIAN);
2584
0
            offset++;
2585
2586
0
            suboffset = offset;
2587
0
            switch (type)
2588
0
            {
2589
0
                case LLRP_TV_ANTENNA_ID:
2590
0
                    proto_tree_add_item(param_tree, hf_llrp_antenna_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2591
0
                    break;
2592
0
                case LLRP_TV_FIRST_SEEN_TIME_UTC:
2593
0
                case LLRP_TV_FIRST_SEEN_TIME_UPTIME:
2594
0
                case LLRP_TV_LAST_SEEN_TIME_UTC:
2595
0
                case LLRP_TV_LAST_SEEN_TIME_UPTIME:
2596
0
                    proto_tree_add_item(param_tree, hf_llrp_microseconds, tvb, suboffset, 8, ENC_BIG_ENDIAN);
2597
0
                    break;
2598
0
                case LLRP_TV_PEAK_RSSI:
2599
0
                    proto_tree_add_item(param_tree, hf_llrp_peak_rssi, tvb, suboffset, 1, ENC_NA);
2600
0
                    break;
2601
0
                case LLRP_TV_CHANNEL_INDEX:
2602
0
                    proto_tree_add_item(param_tree, hf_llrp_channel_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2603
0
                    break;
2604
0
                case LLRP_TV_TAG_SEEN_COUNT:
2605
0
                    proto_tree_add_item(param_tree, hf_llrp_tag_count, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2606
0
                    break;
2607
0
                case LLRP_TV_RO_SPEC_ID:
2608
0
                    proto_tree_add_item(param_tree, hf_llrp_rospec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2609
0
                    break;
2610
0
                case LLRP_TV_INVENTORY_PARAM_SPEC_ID:
2611
0
                    proto_tree_add_item(param_tree, hf_llrp_inventory_spec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2612
0
                    break;
2613
0
                case LLRP_TV_C1G2_CRC:
2614
0
                    proto_tree_add_item(param_tree, hf_llrp_crc, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2615
0
                    break;
2616
0
                case LLRP_TV_C1G2_PC:
2617
0
                    proto_tree_add_item(param_tree, hf_llrp_pc_bits, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2618
0
                    break;
2619
0
                case LLRP_TV_EPC96:
2620
0
                    proto_tree_add_item(param_tree, hf_llrp_epc, tvb, suboffset, 96/8, ENC_NA);
2621
0
                    break;
2622
0
                case LLRP_TV_SPEC_INDEX:
2623
0
                    proto_tree_add_item(param_tree, hf_llrp_spec_idx, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2624
0
                    break;
2625
0
                case LLRP_TV_CLIENT_REQ_OP_SPEC_RES:
2626
0
                    proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2627
0
                    break;
2628
0
                case LLRP_TV_ACCESS_SPEC_ID:
2629
0
                    proto_tree_add_item(param_tree, hf_llrp_accessspec_id, tvb, suboffset, 4, ENC_BIG_ENDIAN);
2630
0
                    break;
2631
0
                case LLRP_TV_OP_SPEC_ID:
2632
0
                    proto_tree_add_item(param_tree, hf_llrp_opspec_id, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2633
0
                    break;
2634
0
                case LLRP_TV_C1G2_SINGULATION_DET:
2635
0
                    proto_tree_add_item(param_tree, hf_llrp_num_coll, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2636
0
                    proto_tree_add_item(param_tree, hf_llrp_num_empty, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2637
0
                    break;
2638
0
                case LLRP_TV_C1G2_XPC_W1:
2639
0
                    proto_tree_add_item(param_tree, hf_llrp_xpc_w1, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2640
0
                    break;
2641
0
                case LLRP_TV_C1G2_XPC_W2:
2642
0
                    proto_tree_add_item(param_tree, hf_llrp_xpc_w2, tvb, suboffset, 2, ENC_BIG_ENDIAN);
2643
0
                    break;
2644
0
            };
2645
            /* Unlike for TLV's, real_len for TV's doesn't include the standard
2646
             * header length, so just add it straight to the offset. */
2647
0
            offset += real_len;
2648
0
        }
2649
0
    }
2650
0
    return offset;
2651
0
}
2652
2653
static unsigned
2654
dissect_llrp_impinj_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned offset)
2655
0
{
2656
0
    uint8_t subtype;
2657
2658
0
    subtype = tvb_get_uint8(tvb, offset);
2659
2660
0
    col_append_fstr(pinfo->cinfo, COL_INFO, " (Impinj - %s)",
2661
0
            val_to_str_ext(subtype, &impinj_msg_subtype_ext, "Unknown Type: %d"));
2662
0
    proto_tree_add_item(tree, hf_llrp_impinj_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2663
0
    offset += 1;
2664
2665
0
    switch(subtype) {
2666
0
    case LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS:
2667
0
        proto_tree_add_item(tree, hf_llrp_rfu, tvb, offset, 4, ENC_NA);
2668
0
        offset += 4;
2669
0
        break;
2670
0
    case LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS_RESPONSE:
2671
        /* Just parameters */
2672
0
        break;
2673
0
    case LLRP_IMPINJ_TYPE_SAVE_SETTINGS:
2674
0
        proto_tree_add_item(tree, hf_llrp_save_config, tvb, offset, 1, ENC_NA);
2675
0
        offset += 1;
2676
0
        break;
2677
0
    case LLRP_IMPINJ_TYPE_SAVE_SETTINGS_RESPONSE:
2678
        /* Just parameters */
2679
0
        break;
2680
0
    }
2681
    /* Just return offset, parameters will be dissected by our callee */
2682
0
    return offset;
2683
0
}
2684
2685
static void
2686
dissect_llrp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
2687
        uint16_t type, unsigned offset)
2688
0
{
2689
0
    bool        ends_with_parameters;
2690
0
    uint8_t     requested_data;
2691
0
    uint32_t    vendor;
2692
0
    proto_item *request_item, *antenna_item, *gpi_item, *gpo_item;
2693
0
    unsigned (*dissect_custom_message)(tvbuff_t *tvb,
2694
0
            packet_info *pinfo, proto_tree *tree, unsigned offset) = NULL;
2695
2696
0
    ends_with_parameters = false;
2697
0
    switch (type)
2698
0
    {
2699
        /* Simple cases just have normal TLV or TV parameters */
2700
0
        case LLRP_TYPE_CLOSE_CONNECTION_RESPONSE:
2701
0
        case LLRP_TYPE_GET_READER_CAPABILITIES_RESPONSE:
2702
0
        case LLRP_TYPE_ADD_ROSPEC:
2703
0
        case LLRP_TYPE_ADD_ROSPEC_RESPONSE:
2704
0
        case LLRP_TYPE_DELETE_ROSPEC_RESPONSE:
2705
0
        case LLRP_TYPE_START_ROSPEC_RESPONSE:
2706
0
        case LLRP_TYPE_STOP_ROSPEC_RESPONSE:
2707
0
        case LLRP_TYPE_ENABLE_ROSPEC_RESPONSE:
2708
0
        case LLRP_TYPE_DISABLE_ROSPEC_RESPONSE:
2709
0
        case LLRP_TYPE_GET_ROSPECS_RESPONSE:
2710
0
        case LLRP_TYPE_ADD_ACCESSSPEC:
2711
0
        case LLRP_TYPE_ADD_ACCESSSPEC_RESPONSE:
2712
0
        case LLRP_TYPE_DELETE_ACCESSSPEC_RESPONSE:
2713
0
        case LLRP_TYPE_ENABLE_ACCESSSPEC_RESPONSE:
2714
0
        case LLRP_TYPE_DISABLE_ACCESSSPEC_RESPONSE:
2715
0
        case LLRP_TYPE_GET_ACCESSSPECS:
2716
0
        case LLRP_TYPE_CLIENT_REQUEST_OP:
2717
0
        case LLRP_TYPE_CLIENT_RESQUEST_OP_RESPONSE:
2718
0
        case LLRP_TYPE_RO_ACCESS_REPORT:
2719
0
        case LLRP_TYPE_READER_EVENT_NOTIFICATION:
2720
0
        case LLRP_TYPE_ERROR_MESSAGE:
2721
0
        case LLRP_TYPE_GET_READER_CONFIG_RESPONSE:
2722
0
        case LLRP_TYPE_SET_READER_CONFIG_RESPONSE:
2723
0
        case LLRP_TYPE_SET_PROTOCOL_VERSION_RESPONSE:
2724
0
        case LLRP_TYPE_GET_ACCESSSPECS_RESPONSE:
2725
0
        case LLRP_TYPE_GET_REPORT:
2726
0
        case LLRP_TYPE_ENABLE_EVENTS_AND_REPORTS:
2727
0
            ends_with_parameters = true;
2728
0
            break;
2729
        /* Some just have an ROSpec ID */
2730
0
        case LLRP_TYPE_START_ROSPEC:
2731
0
        case LLRP_TYPE_STOP_ROSPEC:
2732
0
        case LLRP_TYPE_ENABLE_ROSPEC:
2733
0
        case LLRP_TYPE_DISABLE_ROSPEC:
2734
0
        case LLRP_TYPE_DELETE_ROSPEC:
2735
0
            proto_tree_add_item(tree, hf_llrp_rospec, tvb, offset, 4, ENC_BIG_ENDIAN);
2736
0
            offset += 4;
2737
0
            break;
2738
        /* Some just have an AccessSpec ID */
2739
0
        case LLRP_TYPE_ENABLE_ACCESSSPEC:
2740
0
        case LLRP_TYPE_DELETE_ACCESSSPEC:
2741
0
        case LLRP_TYPE_DISABLE_ACCESSSPEC:
2742
0
            proto_tree_add_item(tree, hf_llrp_accessspec, tvb, offset, 4, ENC_BIG_ENDIAN);
2743
0
            offset += 4;
2744
0
            break;
2745
0
        case LLRP_TYPE_GET_READER_CAPABILITIES:
2746
0
            proto_tree_add_item(tree, hf_llrp_req_cap, tvb, offset, 1, ENC_BIG_ENDIAN);
2747
0
            offset++;
2748
0
            ends_with_parameters = true;
2749
0
            break;
2750
        /* GET_READER_CONFIG is more complicated */
2751
0
        case LLRP_TYPE_GET_READER_CONFIG:
2752
0
            antenna_item = proto_tree_add_item(tree, hf_llrp_antenna_id, tvb, offset, 2, ENC_BIG_ENDIAN);
2753
0
            offset += 2;
2754
2755
0
            requested_data = tvb_get_uint8(tvb, offset);
2756
0
            request_item = proto_tree_add_item(tree, hf_llrp_req_conf, tvb,
2757
0
                    offset, 1, ENC_BIG_ENDIAN);
2758
0
            offset++;
2759
2760
0
            gpi_item = proto_tree_add_item(tree, hf_llrp_gpi_port, tvb, offset, 2, ENC_BIG_ENDIAN);
2761
0
            offset += 2;
2762
2763
0
            gpo_item = proto_tree_add_item(tree, hf_llrp_gpo_port, tvb, offset, 2, ENC_BIG_ENDIAN);
2764
0
            offset += 2;
2765
2766
0
            switch (requested_data)
2767
0
            {
2768
0
                case LLRP_CONF_ALL:
2769
0
                    break;
2770
0
                case LLRP_CONF_ANTENNA_PROPERTIES:
2771
0
                case LLRP_CONF_ANTENNA_CONFIGURATION:
2772
                    /* Ignore both GPI and GPO ports */
2773
0
                    proto_item_append_text(gpi_item, " (Ignored)");
2774
0
                    proto_item_append_text(gpo_item, " (Ignored)");
2775
0
                    break;
2776
0
                case LLRP_CONF_IDENTIFICATION:
2777
0
                case LLRP_CONF_RO_REPORT_SPEC:
2778
0
                case LLRP_CONF_READER_EVENT_NOTIFICATION_SPEC:
2779
0
                case LLRP_CONF_ACCESS_REPORT_SPEC:
2780
0
                case LLRP_CONF_LLRP_CONFIGURATION_STATE:
2781
0
                case LLRP_CONF_KEEPALIVE_SPEC:
2782
0
                case LLRP_CONF_EVENTS_AND_REPORTS:
2783
                    /* Ignore antenna ID */
2784
0
                    proto_item_append_text(antenna_item, " (Ignored)");
2785
                    /* Ignore both GPI and GPO ports */
2786
0
                    proto_item_append_text(gpi_item, " (Ignored)");
2787
0
                    proto_item_append_text(gpo_item, " (Ignored)");
2788
0
                    break;
2789
0
                case LLRP_CONF_GPI_PORT_CURRENT_STATE:
2790
                    /* Ignore antenna ID */
2791
0
                    proto_item_append_text(antenna_item, " (Ignored)");
2792
                    /* Ignore GPO port */
2793
0
                    proto_item_append_text(gpo_item, " (Ignored)");
2794
0
                    break;
2795
0
                case LLRP_CONF_GPO_WRITE_DATA:
2796
                    /* Ignore antenna ID */
2797
0
                    proto_item_append_text(antenna_item, " (Ignored)");
2798
                    /* Ignore GPI port */
2799
0
                    proto_item_append_text(gpi_item, " (Ignored)");
2800
0
                    break;
2801
0
                default:
2802
                    /* Ignore antenna ID */
2803
0
                    proto_item_append_text(antenna_item, " (Ignored)");
2804
                    /* Tell the user that we are confused */
2805
0
                    expert_add_info_format(pinfo, request_item, &ei_llrp_req_conf,
2806
0
                            "Unrecognized configuration request: %u",
2807
0
                            requested_data);
2808
                    /* Ignore both GPI and GPO ports */
2809
0
                    proto_item_append_text(gpi_item, " (Ignored)");
2810
0
                    proto_item_append_text(gpo_item, " (Ignored)");
2811
0
                    break;
2812
0
            };
2813
0
            ends_with_parameters = true;
2814
0
            break;
2815
        /* END GET_READER_CONFIG */
2816
        /* Misc */
2817
0
        case LLRP_TYPE_SET_READER_CONFIG:
2818
0
            proto_tree_add_item(tree, hf_llrp_rest_fact, tvb, offset, 1, ENC_NA);
2819
0
            offset++;
2820
0
            ends_with_parameters = true;
2821
0
            break;
2822
0
        case LLRP_TYPE_SET_PROTOCOL_VERSION:
2823
0
            proto_tree_add_item(tree, hf_llrp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
2824
0
            break;
2825
0
        case LLRP_TYPE_GET_SUPPORTED_VERSION_RESPONSE:
2826
0
            proto_tree_add_item(tree, hf_llrp_cur_ver, tvb, offset, 1, ENC_BIG_ENDIAN);
2827
0
            offset++;
2828
0
            proto_tree_add_item(tree, hf_llrp_sup_ver, tvb, offset, 1, ENC_BIG_ENDIAN);
2829
0
            offset++;
2830
0
            ends_with_parameters = true;
2831
0
            break;
2832
0
        case LLRP_TYPE_CUSTOM_MESSAGE:
2833
0
            vendor = tvb_get_ntohl(tvb, offset);
2834
0
            proto_tree_add_item(tree, hf_llrp_vendor, tvb, offset, 4, ENC_BIG_ENDIAN);
2835
0
            offset += 4;
2836
            /* Do vendor specific dissection */
2837
0
            switch(vendor) {
2838
0
            case LLRP_VENDOR_IMPINJ:
2839
0
                dissect_custom_message = dissect_llrp_impinj_message;
2840
0
                ends_with_parameters = true;
2841
0
                break;
2842
0
            }
2843
0
            if (dissect_custom_message)
2844
0
                offset = dissect_custom_message(tvb, pinfo, tree, offset);
2845
0
            break;
2846
        /* Some have no extra data expected */
2847
0
        case LLRP_TYPE_KEEPALIVE:
2848
0
        case LLRP_TYPE_KEEPALIVE_ACK:
2849
0
        case LLRP_TYPE_CLOSE_CONNECTION:
2850
0
        case LLRP_TYPE_GET_ROSPECS:
2851
0
        case LLRP_TYPE_GET_SUPPORTED_VERSION:
2852
0
            break;
2853
0
        default:
2854
            /* We shouldn't be called if we don't already recognize the value */
2855
0
            DISSECTOR_ASSERT_NOT_REACHED();
2856
0
    };
2857
0
    if(ends_with_parameters) {
2858
0
        offset = dissect_llrp_parameters(tvb, pinfo, tree, offset, tvb_reported_length(tvb), 0);
2859
0
    }
2860
0
    if(tvb_reported_length_remaining(tvb, offset) != 0) {
2861
        /* Report problem */
2862
0
        expert_add_info_format(pinfo, tree, &ei_llrp_invalid_length,
2863
0
                "Incorrect length of message: %u bytes decoded, but %u bytes available.",
2864
0
                offset, tvb_reported_length(tvb));
2865
0
    }
2866
0
}
2867
2868
/* Code to actually dissect the packets */
2869
static int
2870
dissect_llrp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
2871
0
{
2872
0
    proto_item *ti;
2873
0
    proto_tree *llrp_tree;
2874
0
    uint16_t    type;
2875
0
    uint32_t    len;
2876
0
    unsigned    offset = 0;
2877
2878
    /* Check that there's enough data */
2879
0
    if (tvb_reported_length(tvb) < LLRP_HEADER_LENGTH) {
2880
0
        return 0;
2881
0
    }
2882
2883
    /* Make entries in Protocol column and Info column on summary display */
2884
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "LLRP");
2885
2886
0
    col_set_str(pinfo->cinfo, COL_INFO, "LLRP Message");
2887
2888
0
    type = tvb_get_ntohs(tvb, offset) & 0x03FF;
2889
2890
0
    col_append_fstr(pinfo->cinfo, COL_INFO, " (%s)",
2891
0
                    val_to_str_ext(type, &message_types_ext, "Unknown Type: %d"));
2892
2893
0
    ti = proto_tree_add_item(tree, proto_llrp, tvb, offset, -1, ENC_NA);
2894
0
    llrp_tree = proto_item_add_subtree(ti, ett_llrp);
2895
2896
0
    proto_tree_add_item(llrp_tree, hf_llrp_version, tvb, offset, 1, ENC_BIG_ENDIAN);
2897
0
    proto_tree_add_item(llrp_tree, hf_llrp_type, tvb, offset, 2, ENC_BIG_ENDIAN);
2898
0
    offset += 2;
2899
2900
0
    ti = proto_tree_add_item(llrp_tree, hf_llrp_length, tvb, offset, 4, ENC_BIG_ENDIAN);
2901
0
    len = tvb_get_ntohl(tvb, offset);
2902
0
    if (len != tvb_reported_length(tvb))
2903
0
    {
2904
0
        expert_add_info_format(pinfo, ti, &ei_llrp_invalid_length,
2905
0
                               "Incorrect length field: claimed %u, but have %u.",
2906
0
                               len, tvb_reported_length(tvb));
2907
0
    }
2908
0
    offset += 4;
2909
2910
0
    proto_tree_add_item(llrp_tree, hf_llrp_id, tvb, offset, 4, ENC_BIG_ENDIAN);
2911
0
    offset += 4;
2912
2913
0
    if (try_val_to_str_ext(type, &message_types_ext))
2914
0
        dissect_llrp_message(tvb, pinfo, llrp_tree, type, offset);
2915
2916
0
    return tvb_captured_length(tvb);
2917
0
}
2918
2919
/* Determine length of LLRP message */
2920
static unsigned
2921
get_llrp_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
2922
0
{
2923
    /* Peek into the header to determine the total message length */
2924
0
    return (unsigned)tvb_get_ntohl(tvb, offset+2);
2925
0
}
2926
2927
/* The main dissecting routine */
2928
static int
2929
dissect_llrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
2930
0
{
2931
0
    tcp_dissect_pdus(tvb, pinfo, tree, true, LLRP_HEADER_LENGTH,
2932
0
        get_llrp_message_len, dissect_llrp_packet, data);
2933
0
    return tvb_captured_length(tvb);
2934
0
}
2935
2936
void
2937
proto_register_llrp(void)
2938
14
{
2939
    /* Setup list of header fields  See Section 1.6.1 for details */
2940
14
    static hf_register_info hf[] = {
2941
14
        { &hf_llrp_version,
2942
14
        { "Version", "llrp.version", FT_UINT8, BASE_DEC, VALS(llrp_versions), 0x1C,
2943
14
          NULL, HFILL }},
2944
2945
14
        { &hf_llrp_type,
2946
14
        { "Type", "llrp.type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &message_types_ext, 0x03FF,
2947
14
          NULL, HFILL }},
2948
2949
14
        { &hf_llrp_length,
2950
14
        { "Length", "llrp.length", FT_UINT32, BASE_DEC, NULL, 0,
2951
14
          NULL, HFILL }},
2952
2953
14
        { &hf_llrp_id,
2954
14
        { "ID", "llrp.id", FT_UINT32, BASE_DEC, NULL, 0,
2955
14
          NULL, HFILL }},
2956
2957
14
        { &hf_llrp_cur_ver,
2958
14
        { "Current Version", "llrp.cur_ver", FT_UINT8, BASE_DEC, VALS(llrp_versions), 0,
2959
14
          NULL, HFILL }},
2960
2961
14
        { &hf_llrp_sup_ver,
2962
14
        { "Supported Version", "llrp.sup_ver", FT_UINT8, BASE_DEC, VALS(llrp_versions), 0,
2963
14
          "The max supported protocol version.", HFILL }},
2964
2965
14
        { &hf_llrp_req_cap,
2966
14
        { "Requested Capabilities", "llrp.req_cap", FT_UINT8, BASE_DEC, VALS(capabilities_request), 0,
2967
14
          NULL, HFILL }},
2968
2969
14
        { &hf_llrp_req_conf,
2970
14
        { "Requested Configuration", "llrp.req_conf", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &config_request_ext, 0,
2971
14
          NULL, HFILL }},
2972
2973
14
        { &hf_llrp_rospec,
2974
14
        { "ROSpec ID", "llrp.rospec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_all_rospecs), 0,
2975
14
          NULL, HFILL }},
2976
2977
14
        { &hf_llrp_antenna_id,
2978
14
        { "Antenna ID", "llrp.antenna_id", FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_all_antenna), 0,
2979
14
          NULL, HFILL }},
2980
2981
14
        { &hf_llrp_gpi_port,
2982
14
        { "GPI Port Number", "llrp.gpi_port", FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_all_gpi_ports), 0,
2983
14
          NULL, HFILL }},
2984
2985
14
        { &hf_llrp_gpo_port,
2986
14
        { "GPO Port Number", "llrp.gpo_port", FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_all_gpo_ports), 0,
2987
14
          NULL, HFILL }},
2988
2989
14
        { &hf_llrp_rest_fact,
2990
14
        { "Restore Factory Settings", "llrp.rest_fact", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
2991
14
          NULL, HFILL }},
2992
2993
14
        { &hf_llrp_accessspec,
2994
14
        { "Access Spec ID", "llrp.accessspec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_all_access_specs), 0,
2995
14
          NULL, HFILL }},
2996
2997
14
        { &hf_llrp_vendor,
2998
14
        { "Vendor ID", "llrp.vendor", FT_UINT32, BASE_DEC, VALS(llrp_vendors), 0,
2999
14
          NULL, HFILL }},
3000
3001
14
        { &hf_llrp_impinj_msg_type,
3002
14
        { "Subtype", "llrp.impinj.type", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &impinj_msg_subtype_ext, 0,
3003
14
          "Subtype specified by vendor", HFILL }},
3004
3005
14
        { &hf_llrp_tlv_type,
3006
14
        { "Type", "llrp.tlv_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &tlv_type_ext, 0x03FF,
3007
14
          "The type of TLV.", HFILL }},
3008
3009
14
        { &hf_llrp_tv_type,
3010
14
        { "Type", "llrp.tv_type", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &tv_type_ext, 0x7F,
3011
14
          "The type of TV.", HFILL }},
3012
3013
14
        { &hf_llrp_tlv_len,
3014
14
        { "Length", "llrp.tlv_len", FT_UINT16, BASE_DEC, NULL, 0,
3015
14
          "The length of this TLV.", HFILL }},
3016
3017
14
        { &hf_llrp_param,
3018
14
        { "Parameter", "llrp.param", FT_NONE, BASE_NONE, NULL, 0,
3019
14
          NULL, HFILL }},
3020
3021
14
        { &hf_llrp_num_gpi,
3022
14
        { "Number of GPI ports", "llrp.param.num_gpi", FT_UINT16, BASE_DEC, NULL, 0,
3023
14
          NULL, HFILL }},
3024
3025
14
        { &hf_llrp_num_gpo,
3026
14
        { "Number of GPO ports", "llrp.param.num_gpo", FT_UINT16, BASE_DEC, NULL, 0,
3027
14
          NULL, HFILL }},
3028
3029
14
        { &hf_llrp_microseconds,
3030
14
        { "Microseconds", "llrp.param.microseconds", FT_UINT64, BASE_DEC, NULL, 0,
3031
14
          NULL, HFILL }},
3032
3033
14
        { &hf_llrp_max_supported_antenna,
3034
14
        { "Max number of antenna supported", "llrp.param.max_supported_antenna", FT_UINT16, BASE_DEC, NULL, 0,
3035
14
          NULL, HFILL }},
3036
3037
14
        { &hf_llrp_can_set_antenna_prop,
3038
14
        { "Can set antenna properties", "llrp.param.can_set_antenna_prop", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x8000,
3039
14
          NULL, HFILL }},
3040
3041
14
        { &hf_llrp_has_utc_clock,
3042
14
        { "Has UTC clock capabilities", "llrp.param.has_utc_clock", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x4000,
3043
14
          NULL, HFILL }},
3044
3045
14
        { &hf_llrp_device_manufacturer,
3046
14
        { "Device manufacturer name", "llrp.param.device_manufacturer", FT_UINT32, BASE_DEC, NULL, 0,
3047
14
          NULL, HFILL }},
3048
3049
14
        { &hf_llrp_model,
3050
14
        { "Model name", "llrp.param.model", FT_UINT32, BASE_DEC, NULL, 0,
3051
14
          NULL, HFILL }},
3052
3053
14
        { &hf_llrp_firmware_version,
3054
14
        { "Reader firmware version", "llrp.param.firmware_version", FT_UINT_STRING, BASE_NONE, NULL, 0,
3055
14
          NULL, HFILL }},
3056
3057
14
        { &hf_llrp_max_receive_sense,
3058
14
        { "Maximum sensitivity value", "llrp.param.max_receive_sense", FT_UINT16, BASE_DEC, NULL, 0,
3059
14
          NULL, HFILL }},
3060
3061
14
        { &hf_llrp_index,
3062
14
        { "Index", "llrp.param.index", FT_UINT16, BASE_DEC, NULL, 0,
3063
14
          NULL, HFILL }},
3064
3065
14
        { &hf_llrp_receive_sense,
3066
14
        { "Receive sensitivity value", "llrp.param.receive_sense", FT_UINT16, BASE_DEC, NULL, 0,
3067
14
          NULL, HFILL }},
3068
3069
14
        { &hf_llrp_receive_sense_index_min,
3070
14
        { "Receive sensitivity index min", "llrp.param.receive_sense_index_min", FT_UINT16, BASE_DEC, NULL, 0,
3071
14
          NULL, HFILL }},
3072
3073
14
        { &hf_llrp_receive_sense_index_max,
3074
14
        { "Receive sensitivity index max", "llrp.param.receive_sense_index_max", FT_UINT16, BASE_DEC, NULL, 0,
3075
14
          NULL, HFILL }},
3076
3077
14
        { &hf_llrp_num_protocols,
3078
14
        { "Number of protocols", "llrp.param.num_protocols", FT_UINT16, BASE_DEC, NULL, 0,
3079
14
          NULL, HFILL }},
3080
3081
14
        { &hf_llrp_protocol_id,
3082
14
        { "Protocol ID", "llrp.param.protocol_id", FT_UINT8, BASE_DEC | BASE_RANGE_STRING, RVALS(protocol_id), 0,
3083
14
          NULL, HFILL }},
3084
3085
14
        { &hf_llrp_can_do_survey,
3086
14
        { "Can do RF survey", "llrp.param.can_do_survey", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3087
14
          NULL, HFILL }},
3088
3089
14
        { &hf_llrp_can_report_buffer_warning,
3090
14
        { "Can report buffer fill warning", "llrp.param.can_report_buffer_warning", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
3091
14
          NULL, HFILL }},
3092
3093
14
        { &hf_llrp_support_client_opspec,
3094
14
        { "Support client request OpSpec", "llrp.param.support_client_opspec", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
3095
14
          NULL, HFILL }},
3096
3097
14
        { &hf_llrp_can_stateaware,
3098
14
        { "Can do tag inventory state aware singulation", "llrp.param.can_stateaware", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
3099
14
          NULL, HFILL }},
3100
3101
14
        { &hf_llrp_support_holding,
3102
14
        { "Support event and report holding", "llrp.param.support_holding", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
3103
14
          NULL, HFILL }},
3104
3105
14
        { &hf_llrp_max_priority_supported,
3106
14
        { "Max priority level supported", "llrp.param.max_priority_supported", FT_UINT8, BASE_DEC, NULL, 0,
3107
14
          NULL, HFILL }},
3108
3109
14
        { &hf_llrp_client_opspec_timeout,
3110
14
        { "Client request OpSpec timeout", "llrp.param.client_opspec_timeout", FT_UINT16, BASE_DEC, NULL, 0,
3111
14
          NULL, HFILL }},
3112
3113
14
        { &hf_llrp_max_num_rospec,
3114
14
        { "Maximum number of ROSpecs", "llrp.param.max_num_rospec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3115
14
          NULL, HFILL }},
3116
3117
14
        { &hf_llrp_max_num_spec_per_rospec,
3118
14
        { "Maximum number of spec per ROSpec", "llrp.param.max_num_spec_per_rospec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3119
14
          NULL, HFILL }},
3120
3121
14
        { &hf_llrp_max_num_inventory_per_aispec,
3122
14
        { "Maximum number of Inventory Spec per AISpec", "llrp.param.max_num_inventory_per_aispec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3123
14
          NULL, HFILL }},
3124
3125
14
        { &hf_llrp_max_num_accessspec,
3126
14
        { "Maximum number of AccessSpec", "llrp.param.max_num_accessspec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3127
14
          NULL, HFILL }},
3128
3129
14
        { &hf_llrp_max_num_opspec_per_accressspec,
3130
14
        { "Maximum number of OpSpec per AccessSpec", "llrp.param.max_num_opspec_per_accressspec", FT_UINT32, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3131
14
          NULL, HFILL }},
3132
3133
        /* TODO add translation */
3134
14
        { &hf_llrp_country_code,
3135
14
        { "Country code", "llrp.param.country_code", FT_UINT16, BASE_DEC, NULL, 0,
3136
14
          NULL, HFILL }},
3137
3138
14
        { &hf_llrp_comm_standard,
3139
14
        { "Communication standard", "llrp.param.comm_standard", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &comm_standard_ext, 0,
3140
14
          NULL, HFILL }},
3141
3142
14
        { &hf_llrp_transmit_power,
3143
14
        { "Transmit power value", "llrp.param.transmit_power", FT_UINT16, BASE_DEC, NULL, 0,
3144
14
          NULL, HFILL }},
3145
3146
14
        { &hf_llrp_hopping,
3147
14
        { "Hopping", "llrp.param.hopping", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3148
14
          NULL, HFILL }},
3149
3150
14
        { &hf_llrp_hop_table_id,
3151
14
        { "Hop table ID", "llrp.param.hop_table_id", FT_UINT16, BASE_DEC, NULL, 0,
3152
14
          NULL, HFILL }},
3153
3154
14
        { &hf_llrp_rfu,
3155
14
        { "Reserved for future use", "llrp.param.rfu", FT_BYTES, BASE_NONE, NULL, 0,
3156
14
          NULL, HFILL }},
3157
3158
14
        { &hf_llrp_num_hops,
3159
14
        { "Number of hops", "llrp.param.num_hops", FT_UINT16, BASE_DEC, NULL, 0,
3160
14
          NULL, HFILL }},
3161
3162
14
        { &hf_llrp_frequency,
3163
14
        { "Frequency", "llrp.param.frequency", FT_UINT32, BASE_DEC, NULL, 0,
3164
14
          NULL, HFILL }},
3165
3166
14
        { &hf_llrp_num_freqs,
3167
14
        { "Number of frequencies", "llrp.param.num_freqs", FT_UINT16, BASE_DEC, NULL, 0,
3168
14
          NULL, HFILL }},
3169
3170
14
        { &hf_llrp_min_freq,
3171
14
        { "Minimum frequency", "llrp.param.min_freq", FT_UINT32, BASE_DEC, NULL, 0,
3172
14
          NULL, HFILL }},
3173
3174
14
        { &hf_llrp_max_freq,
3175
14
        { "Maximum frequency", "llrp.param.max_freq", FT_UINT32, BASE_DEC, NULL, 0,
3176
14
          NULL, HFILL }},
3177
3178
14
        { &hf_llrp_rospec_id,
3179
14
        { "ROSpec ID", "llrp.param.rospec_id", FT_UINT32, BASE_DEC, NULL, 0,
3180
14
          NULL, HFILL }},
3181
3182
14
        { &hf_llrp_priority,
3183
14
        { "Priority", "llrp.param.priority", FT_UINT8, BASE_DEC, NULL, 0,
3184
14
          NULL, HFILL }},
3185
3186
14
        { &hf_llrp_cur_state,
3187
14
        { "Current state", "llrp.param.cur_state", FT_UINT8, BASE_DEC, NULL, 0,
3188
14
          NULL, HFILL }},
3189
3190
14
        { &hf_llrp_rospec_start_trig_type,
3191
14
        { "ROSpec start trigger type", "llrp.param.rospec_start_trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3192
14
          NULL, HFILL }},
3193
3194
14
        { &hf_llrp_offset,
3195
14
        { "Offset", "llrp.param.offset", FT_UINT32, BASE_DEC, NULL, 0,
3196
14
          NULL, HFILL }},
3197
3198
14
        { &hf_llrp_period,
3199
14
        { "Period", "llrp.param.period", FT_UINT32, BASE_DEC, NULL, 0,
3200
14
          NULL, HFILL }},
3201
3202
14
        { &hf_llrp_gpi_event,
3203
14
        { "GPI event", "llrp.param.gpi_event", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3204
14
          NULL, HFILL }},
3205
3206
14
        { &hf_llrp_timeout,
3207
14
        { "Timeout", "llrp.param.timeout", FT_UINT32, BASE_DEC, NULL, 0,
3208
14
          NULL, HFILL }},
3209
3210
14
        { &hf_llrp_rospec_stop_trig_type,
3211
14
        { "ROSpec stop trigger type", "llrp.param.rospec_stop_trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3212
14
          NULL, HFILL }},
3213
3214
14
        { &hf_llrp_duration_trig,
3215
14
        { "Duration trigger value", "llrp.param.duration_trig", FT_UINT32, BASE_DEC, NULL, 0,
3216
14
          NULL, HFILL }},
3217
3218
14
        { &hf_llrp_antenna_count,
3219
14
        { "Antenna count", "llrp.param.antenna_count", FT_UINT16, BASE_DEC, NULL, 0,
3220
14
          NULL, HFILL }},
3221
3222
14
        { &hf_llrp_antenna,
3223
14
        { "Antenna ID", "llrp.param.antenna", FT_UINT16, BASE_DEC, NULL, 0,
3224
14
          NULL, HFILL }},
3225
3226
14
        { &hf_llrp_aispec_stop_trig_type,
3227
14
        { "AISpec stop trigger type", "llrp.param.aispec_stop_trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3228
14
          NULL, HFILL }},
3229
3230
14
        { &hf_llrp_trig_type,
3231
14
        { "Trigger type", "llrp.param.trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3232
14
          NULL, HFILL }},
3233
3234
14
        { &hf_llrp_number_of_tags,
3235
14
        { "Number of tags", "llrp.param.number_of_tags", FT_UINT16, BASE_DEC, NULL, 0,
3236
14
          NULL, HFILL }},
3237
3238
14
        { &hf_llrp_number_of_attempts,
3239
14
        { "Number of attempts", "llrp.param.number_of_attempts", FT_UINT16, BASE_DEC, NULL, 0,
3240
14
          NULL, HFILL }},
3241
3242
14
        { &hf_llrp_t,
3243
14
        { "T", "llrp.param.t", FT_UINT16, BASE_DEC, NULL, 0,
3244
14
          NULL, HFILL }},
3245
3246
14
        { &hf_llrp_inventory_spec_id,
3247
14
        { "Inventory parameter spec id", "llrp.param.inventory_spec_id", FT_UINT16, BASE_DEC, NULL, 0,
3248
14
          NULL, HFILL }},
3249
3250
14
        { &hf_llrp_start_freq,
3251
14
        { "Start frequency", "llrp.param.start_freq", FT_UINT32, BASE_DEC, NULL, 0,
3252
14
          NULL, HFILL }},
3253
3254
14
        { &hf_llrp_stop_freq,
3255
14
        { "Stop frequency", "llrp.param.stop_freq", FT_UINT32, BASE_DEC, NULL, 0,
3256
14
          NULL, HFILL }},
3257
3258
14
        { &hf_llrp_stop_trig_type,
3259
14
        { "Stop trigger type", "llrp.param.stop_trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3260
14
          NULL, HFILL }},
3261
3262
14
        { &hf_llrp_n_4,
3263
14
        { "N", "llrp.param.n_4", FT_UINT32, BASE_DEC, NULL, 0,
3264
14
          NULL, HFILL }},
3265
3266
14
        { &hf_llrp_duration,
3267
14
        { "Duration", "llrp.param.duration", FT_UINT32, BASE_DEC, NULL, 0,
3268
14
          NULL, HFILL }},
3269
3270
14
        { &hf_llrp_accessspec_id,
3271
14
        { "AccessSpec ID", "llrp.param.accessspec_id", FT_UINT32, BASE_DEC, NULL, 0,
3272
14
          NULL, HFILL }},
3273
3274
14
        { &hf_llrp_access_cur_state,
3275
14
        { "Current state", "llrp.param.access_cur_state", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3276
14
          NULL, HFILL }},
3277
3278
14
        { &hf_llrp_access_stop_trig_type,
3279
14
        { "AccessSpec Stop trigger", "llrp.param.access_stop_trig_type", FT_UINT8, BASE_DEC, NULL, 0,
3280
14
          NULL, HFILL }},
3281
3282
14
        { &hf_llrp_operation_count,
3283
14
        { "Operation count value", "llrp.param.operation_count", FT_UINT16, BASE_DEC, NULL, 0,
3284
14
          NULL, HFILL }},
3285
3286
14
        { &hf_llrp_opspec_id,
3287
14
        { "OpSpec ID", "llrp.param.opspec_id", FT_UINT16, BASE_DEC, NULL, 0,
3288
14
          NULL, HFILL }},
3289
3290
14
        { &hf_llrp_conf_value,
3291
14
        { "Configuration value", "llrp.param.conf_value", FT_UINT32, BASE_DEC, NULL, 0,
3292
14
          NULL, HFILL }},
3293
3294
14
        { &hf_llrp_id_type,
3295
14
        { "ID type", "llrp.param.id_type", FT_UINT8, BASE_DEC, VALS(id_type), 0,
3296
14
          NULL, HFILL }},
3297
3298
14
        { &hf_llrp_reader_id,
3299
14
        { "Reader ID", "llrp.param.reader_id", FT_UINT_BYTES, BASE_NONE, NULL, 0,
3300
14
          NULL, HFILL }},
3301
3302
14
        { &hf_llrp_gpo_data,
3303
14
        { "GPO data", "llrp.param.gpo_data", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3304
14
          NULL, HFILL }},
3305
3306
14
        { &hf_llrp_keepalive_trig_type,
3307
14
        { "KeepAlive trigger type", "llrp.param.keepalive_trig_type", FT_UINT8, BASE_DEC, VALS(keepalive_type), 0,
3308
14
          NULL, HFILL }},
3309
3310
14
        { &hf_llrp_time_iterval,
3311
14
        { "Time interval", "llrp.param.time_iterval", FT_UINT32, BASE_DEC, NULL, 0,
3312
14
          NULL, HFILL }},
3313
3314
14
        { &hf_llrp_antenna_connected,
3315
14
        { "Antenna connected", "llrp.param.antenna_connected", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3316
14
          NULL, HFILL }},
3317
3318
14
        { &hf_llrp_antenna_gain,
3319
14
        { "Antenna gain", "llrp.param.antenna_gain", FT_UINT16, BASE_DEC, NULL, 0,
3320
14
          NULL, HFILL }},
3321
3322
14
        { &hf_llrp_receiver_sense,
3323
14
        { "Receiver sensitivity", "llrp.param.receiver_sense", FT_UINT16, BASE_DEC, NULL, 0,
3324
14
          NULL, HFILL }},
3325
3326
14
        { &hf_llrp_channel_idx,
3327
14
        { "Channel index", "llrp.param.channel_idx", FT_UINT16, BASE_DEC, NULL, 0,
3328
14
          NULL, HFILL }},
3329
3330
14
        { &hf_llrp_gpi_config,
3331
14
        { "GPI config", "llrp.param.gpi_config", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3332
14
          NULL, HFILL }},
3333
3334
14
        { &hf_llrp_gpi_state,
3335
14
        { "GPI state", "llrp.param.gpi_state", FT_UINT16, BASE_DEC, NULL, 0,
3336
14
          NULL, HFILL }},
3337
3338
14
        { &hf_llrp_hold_events_and_reports,
3339
14
        { "Hold events and reports upon reconnect", "llrp.param.hold_events_and_reports", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3340
14
          NULL, HFILL }},
3341
3342
14
        { &hf_llrp_ro_report_trig,
3343
14
        { "RO report trigger", "llrp.param.ro_report_trig", FT_UINT8, BASE_DEC, NULL, 0,
3344
14
          NULL, HFILL }},
3345
3346
14
        { &hf_llrp_n_2,
3347
14
        { "N", "llrp.param.n_2", FT_UINT16, BASE_DEC, NULL, 0,
3348
14
          NULL, HFILL }},
3349
3350
14
        { &hf_llrp_enable_rospec_id,
3351
14
        { "Enable ROSpec ID", "llrp.param.enable_rospec_id", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x8000,
3352
14
          NULL, HFILL }},
3353
3354
14
        { &hf_llrp_enable_spec_idx,
3355
14
        { "Enable spec index", "llrp.param.enable_spec_idx", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x4000,
3356
14
          NULL, HFILL }},
3357
3358
14
        { &hf_llrp_enable_inv_spec_id,
3359
14
        { "Enable inventory spec ID", "llrp.param.enable_inv_spec_id", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x2000,
3360
14
          NULL, HFILL }},
3361
3362
14
        { &hf_llrp_enable_antenna_id,
3363
14
        { "Enable antenna ID", "llrp.param.enable_antenna_id", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x1000,
3364
14
          NULL, HFILL }},
3365
3366
14
        { &hf_llrp_enable_channel_idx,
3367
14
        { "Enable channel index", "llrp.param.enable_channel_idx", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0800,
3368
14
          NULL, HFILL }},
3369
3370
14
        { &hf_llrp_enable_peak_rssi,
3371
14
        { "Enable peak RSSI", "llrp.param.enable_peak_rssi", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0400,
3372
14
          NULL, HFILL }},
3373
3374
14
        { &hf_llrp_enable_first_seen,
3375
14
        { "Enable first seen timestamp", "llrp.param.enable_first_seen", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0200,
3376
14
          NULL, HFILL }},
3377
3378
14
        { &hf_llrp_enable_last_seen,
3379
14
        { "Enable last seen timestamp", "llrp.param.enable_last_seen", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0100,
3380
14
          NULL, HFILL }},
3381
3382
14
        { &hf_llrp_enable_seen_count,
3383
14
        { "Enable tag seen count", "llrp.param.enable_seen_count", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0080,
3384
14
          NULL, HFILL }},
3385
3386
14
        { &hf_llrp_enable_accessspec_id,
3387
14
        { "Enable AccessSpec ID", "llrp.param.enable_accessspec_id", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0040,
3388
14
          NULL, HFILL }},
3389
3390
14
        { &hf_llrp_access_report_trig,
3391
14
        { "Access report trigger", "llrp.param.access_report_trig", FT_UINT8, BASE_DEC, NULL, 0,
3392
14
          NULL, HFILL }},
3393
3394
14
        { &hf_llrp_length_bits,
3395
14
        { "Bit field length (bits)", "llrp.param.length_bits", FT_UINT16, BASE_DEC, NULL, 0,
3396
14
          NULL, HFILL }},
3397
3398
14
        { &hf_llrp_epc,
3399
14
        { "EPC", "llrp.param.epc", FT_BYTES, BASE_NONE, NULL, 0,
3400
14
          NULL, HFILL }},
3401
3402
14
        { &hf_llrp_spec_idx,
3403
14
        { "Spec index", "llrp.param.spec_idx", FT_UINT16, BASE_DEC, NULL, 0,
3404
14
          NULL, HFILL }},
3405
3406
14
        { &hf_llrp_peak_rssi,
3407
14
        { "Peak RSSI", "llrp.param.peak_rssi", FT_UINT8, BASE_DEC, NULL, 0,
3408
14
          NULL, HFILL }},
3409
3410
14
        { &hf_llrp_tag_count,
3411
14
        { "Tag count", "llrp.param.tag_count", FT_UINT16, BASE_DEC, NULL, 0,
3412
14
          NULL, HFILL }},
3413
3414
14
        { &hf_llrp_bandwidth,
3415
14
        { "Bandwidth", "llrp.param.bandwidth", FT_UINT32, BASE_DEC, NULL, 0,
3416
14
          NULL, HFILL }},
3417
3418
14
        { &hf_llrp_average_rssi,
3419
14
        { "Average RSSI", "llrp.param.average_rssi", FT_UINT8, BASE_DEC, NULL, 0,
3420
14
          NULL, HFILL }},
3421
3422
14
        { &hf_llrp_notif_state,
3423
14
        { "Notification state", "llrp.param.notif_state", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3424
14
          NULL, HFILL }},
3425
3426
14
        { &hf_llrp_event_type,
3427
14
        { "Event type", "llrp.param.event_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &event_type_ext, 0,
3428
14
          NULL, HFILL }},
3429
3430
14
        { &hf_llrp_next_chan_idx,
3431
14
        { "Next channel index", "llrp.param.next_chan_idx", FT_UINT16, BASE_DEC, NULL, 0,
3432
14
          NULL, HFILL }},
3433
3434
14
        { &hf_llrp_roevent_type,
3435
14
        { "Event type", "llrp.param.roevent_type", FT_UINT8, BASE_DEC, VALS(roevent_type), 0,
3436
14
          NULL, HFILL }},
3437
3438
14
        { &hf_llrp_prem_rospec_id,
3439
14
        { "Preempting ROSpec ID", "llrp.param.prem_rospec_id", FT_UINT32, BASE_DEC, NULL, 0,
3440
14
          NULL, HFILL }},
3441
3442
14
        { &hf_llrp_buffer_full_percentage,
3443
14
        { "Report Buffer percentage full", "llrp.param.buffer_full_percentage", FT_UINT8, BASE_DEC, NULL, 0,
3444
14
          NULL, HFILL }},
3445
3446
14
        { &hf_llrp_message,
3447
14
        { "Message", "llrp.param.message", FT_UINT_STRING, BASE_NONE, NULL, 0,
3448
14
          NULL, HFILL }},
3449
3450
14
        { &hf_llrp_rfevent_type,
3451
14
        { "Event type", "llrp.param.rfevent_type", FT_UINT8, BASE_DEC, VALS(rfevent_type), 0,
3452
14
          NULL, HFILL }},
3453
3454
14
        { &hf_llrp_aievent_type,
3455
14
        { "Event type", "llrp.param.aievent_type", FT_UINT8, BASE_DEC, VALS(aievent_type), 0,
3456
14
          NULL, HFILL }},
3457
3458
14
        { &hf_llrp_antenna_event_type,
3459
14
        { "Event type", "llrp.param.antenna_event_type", FT_UINT8, BASE_DEC, VALS(antenna_event_type), 0,
3460
14
          NULL, HFILL }},
3461
3462
14
        { &hf_llrp_conn_status,
3463
14
        { "Status", "llrp.param.conn_status", FT_UINT16, BASE_DEC, VALS(connection_status), 0,
3464
14
          NULL, HFILL }},
3465
3466
14
        { &hf_llrp_loop_count,
3467
14
        { "Loop count", "llrp.param.loop_count", FT_UINT32, BASE_DEC, NULL, 0,
3468
14
          NULL, HFILL }},
3469
3470
14
        { &hf_llrp_status_code,
3471
14
        { "Status code", "llrp.param.status_code", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &status_code_ext, 0,
3472
14
          NULL, HFILL }},
3473
3474
14
        { &hf_llrp_error_desc,
3475
14
        { "Error Description", "llrp.param.error_desc", FT_UINT_STRING, BASE_NONE, NULL, 0,
3476
14
          NULL, HFILL }},
3477
3478
14
        { &hf_llrp_field_num,
3479
14
        { "Field number", "llrp.param.field_num", FT_UINT16, BASE_DEC, NULL, 0,
3480
14
          NULL, HFILL }},
3481
3482
14
        { &hf_llrp_error_code,
3483
14
        { "Error code", "llrp.param.error_code", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &status_code_ext, 0,
3484
14
          NULL, HFILL }},
3485
3486
14
        { &hf_llrp_parameter_type,
3487
14
        { "Parameter type", "llrp.param.parameter_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &tlv_type_ext, 0,
3488
14
          NULL, HFILL }},
3489
3490
14
        { &hf_llrp_can_support_block_erase,
3491
14
        { "Can support block erase", "llrp.param.can_support_block_erase", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3492
14
          NULL, HFILL }},
3493
3494
14
        { &hf_llrp_can_support_block_write,
3495
14
        { "Can support block write", "llrp.param.can_support_block_write", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
3496
14
          NULL, HFILL }},
3497
3498
14
        { &hf_llrp_can_support_block_permalock,
3499
14
        { "Can support block permalock", "llrp.param.can_support_block_permalock", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
3500
14
          NULL, HFILL }},
3501
3502
14
        { &hf_llrp_can_support_tag_recomm,
3503
14
        { "Can support tag recommisioning", "llrp.param.can_support_tag_recomm", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
3504
14
          NULL, HFILL }},
3505
3506
14
        { &hf_llrp_can_support_UMI_method2,
3507
14
        { "Can support UMI method 2", "llrp.param.can_support_UMI_method2", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
3508
14
          NULL, HFILL }},
3509
3510
14
        { &hf_llrp_can_support_XPC,
3511
14
        { "Can support XPC", "llrp.param.can_support_XPC", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
3512
14
          NULL, HFILL }},
3513
3514
14
        { &hf_llrp_max_num_filter_per_query,
3515
14
        { "Maximum number of select filters per query", "llrp.param.max_num_filter_per_query", FT_UINT16, BASE_DEC|BASE_SPECIAL_VALS, VALS(unique_no_limit), 0,
3516
14
          NULL, HFILL }},
3517
3518
14
        { &hf_llrp_mode_ident,
3519
14
        { "Mode identifier", "llrp.param.mode_ident", FT_UINT32, BASE_DEC, NULL, 0,
3520
14
          NULL, HFILL }},
3521
3522
14
        { &hf_llrp_DR,
3523
14
        { "DR", "llrp.param.DR", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3524
14
          NULL, HFILL }},
3525
3526
14
        { &hf_llrp_hag_conformance,
3527
14
        { "EPC HAG T&C Conformance", "llrp.param.hag_conformance", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
3528
14
          NULL, HFILL }},
3529
3530
14
        { &hf_llrp_mod,
3531
14
        { "M", "llrp.param.mod", FT_UINT8, BASE_DEC, NULL, 0,
3532
14
          NULL, HFILL }},
3533
3534
14
        { &hf_llrp_flm,
3535
14
        { "Forward link modulation", "llrp.param.flm", FT_UINT8, BASE_DEC, NULL, 0,
3536
14
          NULL, HFILL }},
3537
3538
14
        { &hf_llrp_m,
3539
14
        { "Spectral mask indicator", "llrp.param.m", FT_UINT8, BASE_DEC, NULL, 0,
3540
14
          NULL, HFILL }},
3541
3542
14
        { &hf_llrp_bdr,
3543
14
        { "BDR", "llrp.param.bdr", FT_UINT32, BASE_DEC, NULL, 0,
3544
14
          NULL, HFILL }},
3545
3546
14
        { &hf_llrp_pie,
3547
14
        { "PIE", "llrp.param.pie", FT_UINT32, BASE_DEC, NULL, 0,
3548
14
          NULL, HFILL }},
3549
3550
14
        { &hf_llrp_min_tari,
3551
14
        { "Minimum tari", "llrp.param.min_tari", FT_UINT32, BASE_DEC, NULL, 0,
3552
14
          NULL, HFILL }},
3553
3554
14
        { &hf_llrp_max_tari,
3555
14
        { "Maximum tari", "llrp.param.max_tari", FT_UINT32, BASE_DEC, NULL, 0,
3556
14
          NULL, HFILL }},
3557
3558
14
        { &hf_llrp_step_tari,
3559
14
        { "Tari step", "llrp.param.step_tari", FT_UINT32, BASE_DEC, NULL, 0,
3560
14
          NULL, HFILL }},
3561
3562
14
        { &hf_llrp_inventory_state_aware,
3563
14
        { "Tag inventory state aware", "llrp.param.inventory_state_aware", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3564
14
          NULL, HFILL }},
3565
3566
14
        { &hf_llrp_trunc,
3567
14
        { "T", "llrp.param.trunc", FT_UINT8, BASE_DEC, NULL, 0xC0,
3568
14
          NULL, HFILL }},
3569
3570
14
        { &hf_llrp_mb,
3571
14
        { "MB", "llrp.param.mb", FT_UINT8, BASE_DEC, NULL, 0xC0,
3572
14
          NULL, HFILL }},
3573
3574
14
        { &hf_llrp_pointer,
3575
14
        { "Pointer", "llrp.param.pointer", FT_UINT16, BASE_DEC_HEX, NULL, 0,
3576
14
          NULL, HFILL }},
3577
3578
14
        { &hf_llrp_tag_mask,
3579
14
        { "Tag mask", "llrp.param.tag_mask", FT_BYTES, BASE_NONE, NULL, 0,
3580
14
          NULL, HFILL }},
3581
3582
14
        { &hf_llrp_aware_filter_target,
3583
14
        { "Target", "llrp.param.aware_filter_target", FT_UINT8, BASE_DEC, NULL, 0,
3584
14
          NULL, HFILL }},
3585
3586
14
        { &hf_llrp_aware_filter_action,
3587
14
        { "Action", "llrp.param.aware_filter_action", FT_UINT8, BASE_DEC, NULL, 0,
3588
14
          NULL, HFILL }},
3589
3590
14
        { &hf_llrp_unaware_filter_action,
3591
14
        { "Action", "llrp.param.unaware_filter_action", FT_UINT8, BASE_DEC, NULL, 0,
3592
14
          NULL, HFILL }},
3593
3594
14
        { &hf_llrp_mode_idx,
3595
14
        { "Mode index", "llrp.param.mode_idx", FT_UINT16, BASE_DEC, NULL, 0,
3596
14
          NULL, HFILL }},
3597
3598
14
        { &hf_llrp_tari,
3599
14
        { "Tari", "llrp.param.tari", FT_UINT16, BASE_DEC, NULL, 0,
3600
14
          NULL, HFILL }},
3601
3602
14
        { &hf_llrp_session,
3603
14
        { "Session", "llrp.param.session", FT_UINT8, BASE_DEC, NULL, 0xC0,
3604
14
          NULL, HFILL }},
3605
3606
14
        { &hf_llrp_tag_population,
3607
14
        { "Tag population", "llrp.param.tag_population", FT_UINT16, BASE_DEC, NULL, 0,
3608
14
          NULL, HFILL }},
3609
3610
14
        { &hf_llrp_tag_transit_time,
3611
14
        { "Tag tranzit time", "llrp.param.tag_transit_time", FT_UINT32, BASE_DEC, NULL, 0,
3612
14
          NULL, HFILL }},
3613
3614
14
        { &hf_llrp_sing_i,
3615
14
        { "I", "llrp.param.sing_i", FT_BOOLEAN, 8, TFS(&tfs_state_a_b), 0x80,
3616
14
          NULL, HFILL }},
3617
3618
14
        { &hf_llrp_sing_s,
3619
14
        { "S", "llrp.param.sing_s", FT_BOOLEAN, 8, TFS(&tfs_sl), 0x40,
3620
14
          NULL, HFILL }},
3621
3622
14
        { &hf_llrp_sing_a,
3623
14
        { "S_All", "llrp.param.sing_a", FT_BOOLEAN, 8, TFS(&tfs_all_no), 0x20,
3624
14
          NULL, HFILL }},
3625
3626
14
        { &hf_llrp_match,
3627
14
        { "Match", "llrp.param.match", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
3628
14
          NULL, HFILL }},
3629
3630
14
        { &hf_llrp_tag_data,
3631
14
        { "Tag data", "llrp.param.tag_data", FT_BYTES, BASE_NONE, NULL, 0,
3632
14
          NULL, HFILL }},
3633
3634
14
        { &hf_llrp_access_pass,
3635
14
        { "Access password", "llrp.param.access_pass", FT_UINT32, BASE_DEC_HEX, NULL, 0,
3636
14
          NULL, HFILL }},
3637
3638
14
        { &hf_llrp_word_pointer,
3639
14
        { "Word pointer", "llrp.param.word_pointer", FT_UINT16, BASE_DEC_HEX, NULL, 0,
3640
14
          NULL, HFILL }},
3641
3642
14
        { &hf_llrp_word_count,
3643
14
        { "Word count", "llrp.param.word_count", FT_UINT16, BASE_DEC, NULL, 0,
3644
14
          NULL, HFILL }},
3645
3646
14
        { &hf_llrp_write_data,
3647
14
        { "Write data", "llrp.param.write_data", FT_BYTES, BASE_NONE, NULL, 0,
3648
14
          NULL, HFILL }},
3649
3650
14
        { &hf_llrp_kill_pass,
3651
14
        { "Killpassword", "llrp.param.kill_pass", FT_UINT32, BASE_DEC_HEX, NULL, 0,
3652
14
          NULL, HFILL }},
3653
3654
14
        { &hf_llrp_kill_3,
3655
14
        { "3", "llrp.param.kill_3", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
3656
14
          NULL, HFILL }},
3657
3658
14
        { &hf_llrp_kill_2,
3659
14
        { "2", "llrp.param.kill_2", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
3660
14
          NULL, HFILL }},
3661
3662
14
        { &hf_llrp_kill_l,
3663
14
        { "L", "llrp.param.kill_l", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
3664
14
          NULL, HFILL }},
3665
3666
14
        { &hf_llrp_privilege,
3667
14
        { "Privilege", "llrp.param.privilege", FT_UINT8, BASE_DEC, NULL, 0,
3668
14
          NULL, HFILL }},
3669
3670
14
        { &hf_llrp_data_field,
3671
14
        { "Data field", "llrp.param.data_field", FT_UINT8, BASE_DEC, NULL, 0,
3672
14
          NULL, HFILL }},
3673
3674
14
        { &hf_llrp_block_pointer,
3675
14
        { "Block pointer", "llrp.param.block_pointer", FT_UINT16, BASE_DEC_HEX, NULL, 0,
3676
14
          NULL, HFILL }},
3677
3678
14
        { &hf_llrp_block_mask,
3679
14
        { "Block mask", "llrp.param.block_mask", FT_BYTES, BASE_NONE, NULL, 0,
3680
14
          NULL, HFILL }},
3681
3682
14
        { &hf_llrp_length_words,
3683
14
        { "Field Length (words)", "llrp.param.length_words", FT_UINT16, BASE_DEC, NULL, 0,
3684
14
          NULL, HFILL }},
3685
3686
14
        { &hf_llrp_block_range,
3687
14
        { "Block range", "llrp.param.block_range", FT_UINT16, BASE_DEC, NULL, 0,
3688
14
          NULL, HFILL }},
3689
3690
14
        { &hf_llrp_enable_crc,
3691
14
        { "Enable CRC", "llrp.param.enable_crc", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3692
14
          NULL, HFILL }},
3693
3694
14
        { &hf_llrp_enable_pc,
3695
14
        { "Enable PC bits", "llrp.param.enable_pc", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40,
3696
14
          NULL, HFILL }},
3697
3698
14
        { &hf_llrp_enable_xpc,
3699
14
        { "Enable XPC bits", "llrp.param.enable_xpc", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
3700
14
          NULL, HFILL }},
3701
3702
14
        { &hf_llrp_pc_bits,
3703
14
        { "PC bits", "llrp.param.pc_bits", FT_UINT16, BASE_HEX, NULL, 0,
3704
14
          NULL, HFILL }},
3705
3706
14
        { &hf_llrp_xpc_w1,
3707
14
        { "XPC-W1", "llrp.param.xpc_w1", FT_UINT16, BASE_HEX, NULL, 0,
3708
14
          NULL, HFILL }},
3709
3710
14
        { &hf_llrp_xpc_w2,
3711
14
        { "XPC-W2", "llrp.param.xpc_w2", FT_UINT16, BASE_HEX, NULL, 0,
3712
14
          NULL, HFILL }},
3713
3714
14
        { &hf_llrp_crc,
3715
14
        { "CRC", "llrp.param.crc", FT_UINT16, BASE_HEX, NULL, 0,
3716
14
          NULL, HFILL }},
3717
3718
14
        { &hf_llrp_num_coll,
3719
14
        { "Number of collisions", "llrp.param.num_coll", FT_UINT16, BASE_DEC, NULL, 0,
3720
14
          NULL, HFILL }},
3721
3722
14
        { &hf_llrp_num_empty,
3723
14
        { "Number of empty slots", "llrp.param.num_empty", FT_UINT16, BASE_DEC, NULL, 0,
3724
14
          NULL, HFILL }},
3725
3726
14
        { &hf_llrp_access_result,
3727
14
        { "Result", "llrp.param.access_result", FT_UINT8, BASE_DEC, NULL, 0,
3728
14
          NULL, HFILL }},
3729
3730
14
        { &hf_llrp_read_data,
3731
14
        { "Read data", "llrp.param.read_data", FT_BYTES, BASE_NONE, NULL, 0,
3732
14
          NULL, HFILL }},
3733
3734
14
        { &hf_llrp_num_words_written,
3735
14
        { "Number of words written", "llrp.param.num_words_written", FT_UINT16, BASE_DEC, NULL, 0,
3736
14
          NULL, HFILL }},
3737
3738
14
        { &hf_llrp_permlock_status,
3739
14
        { "Read data", "llrp.param.permlock_status", FT_BYTES, BASE_NONE, NULL, 0,
3740
14
          NULL, HFILL }},
3741
3742
14
        { &hf_llrp_vendor_id,
3743
14
        { "Vendor ID", "llrp.param.vendor_id", FT_UINT32, BASE_DEC, VALS(llrp_vendors), 0,
3744
14
          NULL, HFILL }},
3745
3746
14
        { &hf_llrp_vendor_unknown,
3747
14
        { "Vendor Unknown", "llrp.param.vendor_unknown", FT_BYTES, BASE_NONE, NULL, 0,
3748
14
          NULL, HFILL }},
3749
3750
14
        { &hf_llrp_impinj_param_type,
3751
14
        { "Impinj parameter subtype", "llrp.param.impinj_param_type", FT_UINT32, BASE_DEC | BASE_EXT_STRING, &impinj_param_type_ext, 0,
3752
14
          NULL, HFILL }},
3753
3754
14
        { &hf_llrp_save_config,
3755
14
        { "Save configuration", "llrp.param.save_config", FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80,
3756
14
          NULL, HFILL }},
3757
3758
14
        { &hf_llrp_impinj_req_data,
3759
14
        { "Requested data", "llrp.param.impinj_req_data", FT_UINT32, BASE_DEC | BASE_EXT_STRING, &impinj_req_data_ext, 0,
3760
14
          NULL, HFILL }},
3761
3762
14
        { &hf_llrp_impinj_reg_region,
3763
14
        { "Regulatory region", "llrp.param.impinj_reg_region", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &impinj_reg_region_ext, 0,
3764
14
          NULL, HFILL }},
3765
3766
14
        { &hf_llrp_impinj_search_mode,
3767
14
        { "Inventory search mode", "llrp.param.impinj_search_mode", FT_UINT16, BASE_DEC, VALS(impinj_search_mode), 0,
3768
14
          NULL, HFILL }},
3769
3770
14
        { &hf_llrp_impinj_en_tag_dir,
3771
14
        { "Enable tag direction", "llrp.param.impinj_en_tag_dir", FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x8000,
3772
14
          NULL, HFILL }},
3773
3774
14
        { &hf_llrp_impinj_antenna_conf,
3775
14
        { "Antenna configuration", "llrp.param.impinj_antenna_conf", FT_UINT16, BASE_DEC, VALS(impinj_ant_conf), 0,
3776
14
          NULL, HFILL }},
3777
3778
14
        { &hf_llrp_decision_time,
3779
14
        { "Decision timestamp", "llrp.param.decision_time", FT_UINT64, BASE_DEC, NULL, 0,
3780
14
          NULL, HFILL }},
3781
3782
14
        { &hf_llrp_impinj_tag_dir,
3783
14
        { "Tag direction", "llrp.param.impinj_tag_dir", FT_UINT16, BASE_DEC, VALS(impinj_tag_dir), 0,
3784
14
          NULL, HFILL }},
3785
3786
14
        { &hf_llrp_confidence,
3787
14
        { "Confidence", "llrp.param.confidence", FT_UINT16, BASE_DEC, NULL, 0,
3788
14
          NULL, HFILL }},
3789
3790
14
        { &hf_llrp_impinj_fix_freq_mode,
3791
14
        { "Fixed frequency mode", "llrp.param.impinj_fix_freq_mode", FT_UINT16, BASE_DEC, VALS(impinj_fix_freq_mode), 0,
3792
14
          NULL, HFILL }},
3793
3794
14
        { &hf_llrp_num_channels,
3795
14
        { "Number of channels", "llrp.param.num_channels", FT_UINT16, BASE_DEC, NULL, 0,
3796
14
          NULL, HFILL }},
3797
3798
14
        { &hf_llrp_channel,
3799
14
        { "Channel", "llrp.param.channel", FT_UINT16, BASE_DEC, NULL, 0,
3800
14
          NULL, HFILL }},
3801
3802
14
        { &hf_llrp_impinj_reduce_power_mode,
3803
14
        { "Reduced power mode", "llrp.param.impinj_reduce_power_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3804
14
          NULL, HFILL }},
3805
3806
14
        { &hf_llrp_impinj_low_duty_mode,
3807
14
        { "Low duty cycle mode", "llrp.param.impinj_low_duty_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3808
14
          NULL, HFILL }},
3809
3810
14
        { &hf_llrp_empty_field_timeout,
3811
14
        { "Empty field timeout", "llrp.param.empty_field_timeout", FT_UINT16, BASE_DEC, NULL, 0,
3812
14
          NULL, HFILL }},
3813
3814
14
        { &hf_llrp_field_ping_interval,
3815
14
        { "Field ping interval", "llrp.param.field_ping_interval", FT_UINT16, BASE_DEC, NULL, 0,
3816
14
          NULL, HFILL }},
3817
3818
14
        { &hf_llrp_model_name,
3819
14
        { "Model name", "llrp.param.model_name", FT_UINT_STRING, BASE_NONE, NULL, 0,
3820
14
          NULL, HFILL }},
3821
3822
14
        { &hf_llrp_serial_number,
3823
14
        { "Serial number", "llrp.param.serial_number", FT_UINT_STRING, BASE_NONE, NULL, 0,
3824
14
          NULL, HFILL }},
3825
3826
14
        { &hf_llrp_soft_ver,
3827
14
        { "Software version", "llrp.param.soft_ver", FT_UINT_STRING, BASE_NONE, NULL, 0,
3828
14
          NULL, HFILL }},
3829
3830
14
        { &hf_llrp_firm_ver,
3831
14
        { "Firmware version", "llrp.param.firm_ver", FT_UINT_STRING, BASE_NONE, NULL, 0,
3832
14
          NULL, HFILL }},
3833
3834
14
        { &hf_llrp_fpga_ver,
3835
14
        { "FPGA version", "llrp.param.fpga_ver", FT_UINT_STRING, BASE_NONE, NULL, 0,
3836
14
          NULL, HFILL }},
3837
3838
14
        { &hf_llrp_pcba_ver,
3839
14
        { "PCBA version", "llrp.param.pcba_ver", FT_UINT_STRING, BASE_NONE, NULL, 0,
3840
14
          NULL, HFILL }},
3841
3842
14
        { &hf_llrp_height_thresh,
3843
14
        { "Height threshold", "llrp.param.height_thresh", FT_UINT16, BASE_DEC, NULL, 0,
3844
14
          NULL, HFILL }},
3845
3846
14
        { &hf_llrp_zero_motion_thresh,
3847
14
        { "Zero motion threshold", "llrp.param.zero_motion_thresh", FT_UINT16, BASE_DEC, NULL, 0,
3848
14
          NULL, HFILL }},
3849
3850
14
        { &hf_llrp_board_manufacturer,
3851
14
        { "Board manufacturer", "llrp.param.board_manufacturer", FT_UINT_STRING, BASE_NONE, NULL, 0,
3852
14
          NULL, HFILL }},
3853
3854
14
        { &hf_llrp_fw_ver_hex,
3855
14
        { "Firmware version", "llrp.param.fw_ver_hex", FT_UINT_BYTES, BASE_NONE, NULL, 0,
3856
14
          NULL, HFILL }},
3857
3858
14
        { &hf_llrp_hw_ver_hex,
3859
14
        { "Hardware version", "llrp.param.hw_ver_hex", FT_UINT_BYTES, BASE_NONE, NULL, 0,
3860
14
          NULL, HFILL }},
3861
3862
14
        { &hf_llrp_gpi_debounce,
3863
14
        { "GPI debounce timer Msec", "llrp.param.gpi_debounce", FT_UINT32, BASE_DEC, NULL, 0,
3864
14
          NULL, HFILL }},
3865
3866
14
        { &hf_llrp_temperature,
3867
14
        { "Temperature", "llrp.param.temperature", FT_INT16, BASE_DEC, NULL, 0,
3868
14
          NULL, HFILL }},
3869
3870
14
        { &hf_llrp_impinj_link_monitor_mode,
3871
14
        { "Link monitor mode", "llrp.param.impinj_link_monitor_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3872
14
          NULL, HFILL }},
3873
3874
14
        { &hf_llrp_link_down_thresh,
3875
14
        { "Link down threshold", "llrp.param.link_down_thresh", FT_UINT16, BASE_DEC, NULL, 0,
3876
14
          NULL, HFILL }},
3877
3878
14
        { &hf_llrp_impinj_report_buff_mode,
3879
14
        { "Report buffer mode", "llrp.param.impinj_report_buff_mode", FT_UINT16, BASE_DEC, VALS(impinj_report_buff_mode), 0,
3880
14
          NULL, HFILL }},
3881
3882
14
        { &hf_llrp_permalock_result,
3883
14
        { "Result", "llrp.param.permalock_result", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &impinj_permalock_result_ext, 0,
3884
14
          NULL, HFILL }},
3885
3886
14
        { &hf_llrp_block_permalock_result,
3887
14
        { "Result", "llrp.param.block_permalock_result", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &impinj_block_permalock_result_ext, 0,
3888
14
          NULL, HFILL }},
3889
3890
14
        { &hf_llrp_impinj_data_profile,
3891
14
        { "Data profile", "llrp.param.impinj_data_profile", FT_UINT8, BASE_DEC, VALS(impinj_data_profile), 0,
3892
14
          NULL, HFILL }},
3893
3894
14
        { &hf_llrp_impinj_access_range,
3895
14
        { "Access range", "llrp.param.impinj_access_range", FT_UINT8, BASE_DEC, VALS(impinj_access_range), 0,
3896
14
          NULL, HFILL }},
3897
3898
14
        { &hf_llrp_impinj_persistence,
3899
14
        { "Persistence", "llrp.param.impinj_persistence", FT_UINT8, BASE_DEC, VALS(impinj_persistence), 0,
3900
14
          NULL, HFILL }},
3901
3902
14
        { &hf_llrp_set_qt_config_result,
3903
14
        { "Result", "llrp.param.set_qt_config_result", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &impinj_set_qt_config_result_ext, 0,
3904
14
          NULL, HFILL }},
3905
3906
14
        { &hf_llrp_get_qt_config_result,
3907
14
        { "Result", "llrp.param.get_qt_config_result", FT_UINT8, BASE_DEC | BASE_EXT_STRING, &impinj_get_qt_config_result_ext, 0,
3908
14
          NULL, HFILL }},
3909
3910
14
        { &hf_llrp_impinj_serialized_tid_mode,
3911
14
        { "Serialized TID Mode", "llrp.param.impinj_serialized_tid_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3912
14
          NULL, HFILL }},
3913
3914
14
        { &hf_llrp_impinj_rf_phase_mode,
3915
14
        { "RF phase angle mode", "llrp.param.impinj_rf_phase_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3916
14
          NULL, HFILL }},
3917
3918
14
        { &hf_llrp_impinj_peak_rssi_mode,
3919
14
        { "Peak RSSI mode", "llrp.param.impinj_peak_rssi_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3920
14
          NULL, HFILL }},
3921
3922
14
        { &hf_llrp_impinj_gps_coordinates_mode,
3923
14
        { "GPS coordinates mode", "llrp.param.impinj_gps_coordinates_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3924
14
          NULL, HFILL }},
3925
3926
14
        { &hf_llrp_impinj_tid,
3927
14
        { "TID", "llrp.param.impinj_tid", FT_UINT_BYTES, BASE_NONE, NULL, 0,
3928
14
          NULL, HFILL }},
3929
3930
14
        { &hf_llrp_phase_angle,
3931
14
        { "Phase angle", "llrp.param.phase_angle", FT_UINT16, BASE_DEC, NULL, 0,
3932
14
          NULL, HFILL }},
3933
3934
14
        { &hf_llrp_rssi,
3935
14
        { "RSSI", "llrp.param.rssi", FT_INT16, BASE_DEC, NULL, 0,
3936
14
          NULL, HFILL }},
3937
3938
14
        { &hf_llrp_latitude,
3939
14
        { "Latitude", "llrp.param.latitude", FT_INT32, BASE_DEC, NULL, 0,
3940
14
          NULL, HFILL }},
3941
3942
14
        { &hf_llrp_longitude,
3943
14
        { "Longitude", "llrp.param.longitude", FT_INT32, BASE_DEC, NULL, 0,
3944
14
          NULL, HFILL }},
3945
3946
14
        { &hf_llrp_gga_sentence,
3947
14
        { "GGA sentence", "llrp.param.gga_sentence", FT_UINT_STRING, BASE_NONE, NULL, 0,
3948
14
          NULL, HFILL }},
3949
3950
14
        { &hf_llrp_rmc_sentence,
3951
14
        { "RMC sentence", "llrp.param.rmc_sentence", FT_UINT_STRING, BASE_NONE, NULL, 0,
3952
14
          NULL, HFILL }},
3953
3954
14
        { &hf_llrp_impinj_optim_read_mode,
3955
14
        { "Optimized read mode", "llrp.param.impinj_optim_read_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3956
14
          NULL, HFILL }},
3957
3958
14
        { &hf_llrp_impinj_rf_doppler_mode,
3959
14
        { "RF doppler frequency mode", "llrp.param.impinj_rf_doppler_mode", FT_UINT16, BASE_DEC, VALS(impinj_boolean), 0,
3960
14
          NULL, HFILL }},
3961
3962
14
        { &hf_llrp_retry_count,
3963
14
        { "Retry count", "llrp.param.retry_count", FT_UINT16, BASE_DEC, NULL, 0,
3964
14
          NULL, HFILL }},
3965
3966
14
        { &hf_llrp_impinj_access_spec_ordering,
3967
14
        { "AccessSpec ordering", "llrp.param.impinj_access_spec_ordering", FT_UINT16, BASE_DEC, VALS(impinj_access_spec_ordering), 0,
3968
14
          NULL, HFILL }},
3969
3970
14
        { &hf_llrp_impinj_gpo_mode,
3971
14
        { "GPO mode", "llrp.param.impinj_gpo_mode", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &impinj_gpo_mode_ext, 0,
3972
14
          NULL, HFILL }},
3973
3974
14
        { &hf_llrp_gpo_pulse_dur,
3975
14
        { "GPO pulse duration", "llrp.param.gpo_pulse_dur", FT_UINT32, BASE_DEC, NULL, 0,
3976
14
          NULL, HFILL }},
3977
3978
14
        { &hf_llrp_impinj_hub_id,
3979
14
        { "Hub ID", "llrp.impinj_hub_id", FT_UINT16, BASE_DEC, NULL, 0,
3980
14
          NULL, HFILL }},
3981
3982
14
        { &hf_llrp_impinj_hub_fault_type,
3983
14
        { "Hub fault type", "llrp.param.impinj_hub_fault_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &impinj_hub_fault_type_ext, 0,
3984
14
          NULL, HFILL }},
3985
3986
14
        { &hf_llrp_impinj_hub_connected_type,
3987
14
        { "Hub connected type", "llrp.param.impinj_hub_connected_type", FT_UINT16, BASE_DEC | BASE_EXT_STRING, &impinj_hub_connected_type_ext, 0,
3988
14
          NULL, HFILL }},
3989
14
    };
3990
3991
    /* Setup protocol subtree array */
3992
14
    static int *ett[] = {
3993
14
        &ett_llrp,
3994
14
        &ett_llrp_param
3995
14
    };
3996
3997
14
    static ei_register_info ei[] = {
3998
14
        { &ei_llrp_invalid_length, { "llrp.invalid_length_of_string_claimed", PI_MALFORMED, PI_ERROR, "Invalid Length", EXPFILL }},
3999
14
        { &ei_llrp_req_conf, { "llrp.req_conf.invalid", PI_PROTOCOL, PI_ERROR, "Unrecognized configuration request", EXPFILL }},
4000
14
    };
4001
4002
14
    expert_module_t* expert_llrp;
4003
4004
    /* Register the protocol name and description */
4005
14
    proto_llrp = proto_register_protocol("Low Level Reader Protocol", "LLRP", "llrp");
4006
4007
    /* Required function calls to register the header fields and subtrees used */
4008
14
    proto_register_field_array(proto_llrp, hf, array_length(hf));
4009
14
    proto_register_subtree_array(ett, array_length(ett));
4010
14
    expert_llrp = expert_register_protocol(proto_llrp);
4011
14
    expert_register_field_array(expert_llrp, ei, array_length(ei));
4012
4013
14
    llrp_handle = register_dissector("llrp", dissect_llrp, proto_llrp);
4014
14
}
4015
4016
void
4017
proto_reg_handoff_llrp(void)
4018
14
{
4019
14
    dissector_add_uint_with_preference("tcp.port", LLRP_PORT, llrp_handle);
4020
14
}
4021
4022
4023
/*
4024
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
4025
 *
4026
 * Local variables:
4027
 * c-basic-offset: 4
4028
 * tab-width: 8
4029
 * indent-tabs-mode: nil
4030
 * End:
4031
 *
4032
 * vi: set shiftwidth=4 tabstop=8 expandtab:
4033
 * :indentSize=4:tabSize=8:noTabs=true:
4034
 */