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