Coverage Report

Created: 2025-12-27 06:52

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