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
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.
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
;
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" },
404 static value_string_ext message_types_ext
= VALUE_STRING_EXT_INIT(message_types
);
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" },
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" },
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" },
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" },
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" },
744 static value_string_ext tv_type_ext
= VALUE_STRING_EXT_INIT(tv_type
);
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" },
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" },
782 static value_string_ext comm_standard_ext
= VALUE_STRING_EXT_INIT(comm_standard
);
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" };
952 #define LLRP_VENDOR_IMPINJ 25882
954 static const value_string llrp_vendors
[] = {
955 { LLRP_VENDOR_IMPINJ
, "Impinj" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
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" },
1367 static value_string_ext impinj_gpo_mode_ext
= VALUE_STRING_EXT_INIT(impinj_gpo_mode
);
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
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
)
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
));
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
)
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
)
1420 len
= tvb_get_ntohs(tvb
, offset
);
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
)
1435 num
= tvb_get_ntohs(tvb
, offset
);
1436 proto_tree_add_item(tree
, hfindex_number
, tvb
,
1437 offset
, 2, ENC_BIG_ENDIAN
);
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
);
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
;
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); \
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); \
1469 dissect_llrp_impinj_parameter(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*param_tree
,
1470 guint suboffset
, const guint param_end
)
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
);
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 */
1488 case LLRP_IMPINJ_PARAM_REQUESTED_DATA
:
1489 PARAM_TREE_ADD(impinj_req_data
, 4, ENC_BIG_ENDIAN
);
1491 case LLRP_IMPINJ_PARAM_SUBREGULATORY_REGION
:
1492 PARAM_TREE_ADD(impinj_reg_region
, 2, ENC_BIG_ENDIAN
);
1494 case LLRP_IMPINJ_PARAM_INVENTORY_SEARCH_MODE
:
1495 PARAM_TREE_ADD(impinj_search_mode
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1536 case LLRP_IMPINJ_PARAM_FORKLIFT_HEIGHT_THRESHOLD
:
1537 PARAM_TREE_ADD(height_thresh
, 2, ENC_BIG_ENDIAN
);
1539 case LLRP_IMPINJ_PARAM_FORKLIFT_ZEROMOTION_TIME_THRESHOLD
:
1540 PARAM_TREE_ADD(zero_motion_thresh
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
1551 case LLRP_IMPINJ_PARAM_READER_TEMPERATURE
:
1552 PARAM_TREE_ADD(temperature
, 2, ENC_BIG_ENDIAN
);
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
);
1558 case LLRP_IMPINJ_PARAM_REPORT_BUFFER_CONFIGURATION
:
1559 PARAM_TREE_ADD(impinj_report_buff_mode
, 2, ENC_BIG_ENDIAN
);
1561 case LLRP_IMPINJ_PARAM_BLOCK_WRITE_WORD_COUNT
:
1562 PARAM_TREE_ADD(word_count
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1609 case LLRP_IMPINJ_PARAM_ENABLE_SERIALIZED_TID
:
1610 PARAM_TREE_ADD(impinj_serialized_tid_mode
, 2, ENC_BIG_ENDIAN
);
1612 case LLRP_IMPINJ_PARAM_ENABLE_RF_PHASE_ANGLE
:
1613 PARAM_TREE_ADD(impinj_rf_phase_mode
, 2, ENC_BIG_ENDIAN
);
1615 case LLRP_IMPINJ_PARAM_ENABLE_PEAK_RSSI
:
1616 PARAM_TREE_ADD(impinj_peak_rssi_mode
, 2, ENC_BIG_ENDIAN
);
1618 case LLRP_IMPINJ_PARAM_ENABLE_GPS_COORDINATES
:
1619 PARAM_TREE_ADD(impinj_gps_coordinates_mode
, 2, ENC_BIG_ENDIAN
);
1621 case LLRP_IMPINJ_PARAM_SERIALIZED_TID
:
1622 PARAM_TREE_ADD(impinj_tid
, 2, ENC_BIG_ENDIAN
);
1624 case LLRP_IMPINJ_PARAM_RF_PHASE_ANGLE
:
1625 PARAM_TREE_ADD(phase_angle
, 2, ENC_BIG_ENDIAN
);
1627 case LLRP_IMPINJ_PARAM_PEAK_RSSI
:
1628 PARAM_TREE_ADD(rssi
, 2, ENC_BIG_ENDIAN
);
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
);
1634 case LLRP_IMPINJ_PARAM_LOOP_SPEC
:
1635 PARAM_TREE_ADD(loop_count
, 4, ENC_BIG_ENDIAN
);
1637 case LLRP_IMPINJ_PARAM_GGA_SENTENCE
:
1638 suboffset
= dissect_llrp_utf8_parameter(tvb
, pinfo
, param_tree
, hf_llrp_gga_sentence
, suboffset
);
1640 case LLRP_IMPINJ_PARAM_RMC_SENTENCE
:
1641 suboffset
= dissect_llrp_utf8_parameter(tvb
, pinfo
, param_tree
, hf_llrp_rmc_sentence
, suboffset
);
1643 case LLRP_IMPINJ_PARAM_OPSPEC_RETRY_COUNT
:
1644 PARAM_TREE_ADD(retry_count
, 2, ENC_BIG_ENDIAN
);
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
);
1651 case LLRP_IMPINJ_PARAM_ENABLE_OPTIM_READ
:
1652 PARAM_TREE_ADD(impinj_optim_read_mode
, 2, ENC_BIG_ENDIAN
);
1654 case LLRP_IMPINJ_PARAM_ACCESS_SPEC_ORDERING
:
1655 PARAM_TREE_ADD(impinj_access_spec_ordering
, 2, ENC_BIG_ENDIAN
);
1657 case LLRP_IMPINJ_PARAM_ENABLE_RF_DOPPLER_FREQ
:
1658 PARAM_TREE_ADD(impinj_rf_doppler_mode
, 2, ENC_BIG_ENDIAN
);
1664 /* Each custom parameters ends with optional custom parameter, disscect it */
1665 return dissect_llrp_parameters(tvb
, pinfo
, param_tree
, suboffset
, param_end
);
1669 dissect_llrp_parameters(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
,
1670 guint offset
, const guint end
)
1674 guint real_len
, param_end
;
1678 proto_tree
*param_tree
;
1680 while (((gint
)(end
- offset
)) > 0)
1682 has_length
= !(tvb_get_guint8(tvb
, offset
) & 0x80);
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
);
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
);
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.",
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
);
1728 case LLRP_TLV_UTC_TIMESTAMP
:
1729 case LLRP_TLV_UPTIME
:
1730 PARAM_TREE_ADD(microseconds
, 8, ENC_BIG_ENDIAN
);
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
);
1741 case LLRP_TLV_MAX_RECEIVE_SENSE
:
1742 PARAM_TREE_ADD(max_receive_sense
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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)");
1774 PARAM_TREE_ADD_STAY(max_num_rospec
, 4, ENC_BIG_ENDIAN
);
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)");
1780 PARAM_TREE_ADD_STAY(max_num_spec_per_rospec
, 4, ENC_BIG_ENDIAN
);
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)");
1786 PARAM_TREE_ADD_STAY(max_num_inventory_per_aispec
, 4, ENC_BIG_ENDIAN
);
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)");
1792 PARAM_TREE_ADD_STAY(max_num_accessspec
, 4, ENC_BIG_ENDIAN
);
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)");
1798 PARAM_TREE_ADD_STAY(max_num_opspec_per_accressspec
, 4, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1887 case LLRP_TLV_LOOP_SPEC
:
1888 PARAM_TREE_ADD(loop_count
, 4, ENC_BIG_ENDIAN
);
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
);
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
);
1902 case LLRP_TLV_CLIENT_REQ_OP_SPEC
:
1903 PARAM_TREE_ADD(opspec_id
, 2, ENC_BIG_ENDIAN
);
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
);
1909 case LLRP_TLV_LLRP_CONF_STATE_VAL
:
1910 PARAM_TREE_ADD(conf_value
, 4, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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
);
1935 case LLRP_TLV_RF_RECEIVER
:
1936 PARAM_TREE_ADD(receiver_sense
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
1948 case LLRP_TLV_EVENTS_AND_REPORTS
:
1949 PARAM_TREE_ADD(hold_events_and_reports
, 1, ENC_NA
);
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
);
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
);
1969 case LLRP_TLV_ACCESS_REPORT_SPEC
:
1970 PARAM_TREE_ADD(access_report_trig
, 1, ENC_NA
);
1972 case LLRP_TLV_EPC_DATA
:
1973 suboffset
= dissect_llrp_bit_field(tvb
, param_tree
, hf_llrp_epc
, suboffset
);
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
);
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
);
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
);
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
);
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
);
1999 case LLRP_TLV_REPORT_BUF_LEVEL_WARN
:
2000 PARAM_TREE_ADD(buffer_full_percentage
, 1, ENC_NA
);
2002 case LLRP_TLV_REPORT_BUF_OVERFLOW_ERR
:
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
);
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
);
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
);
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
);
2023 case LLRP_TLV_CONN_ATTEMPT_EVENT
:
2024 PARAM_TREE_ADD(conn_status
, 2, ENC_BIG_ENDIAN
);
2026 case LLRP_TLV_CONN_CLOSE_EVENT
:
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
);
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
);
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
);
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
);
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)");
2057 PARAM_TREE_ADD_STAY(max_num_filter_per_query
, 2, ENC_BIG_ENDIAN
);
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
);
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
);
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
);
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
);
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
);
2090 case LLRP_TLV_C1G2_TAG_INV_UNAWR_FLTR
:
2091 PARAM_TREE_ADD(unaware_filter_action
, 1, ENC_NA
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
2147 case LLRP_TLV_C1G2_LOCK_PAYLOAD
:
2148 PARAM_TREE_ADD(privilege
, 1, ENC_NA
);
2149 PARAM_TREE_ADD(data_field
, 1, ENC_NA
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
2194 case LLRP_TLV_CUSTOM_PARAMETER
:
2195 num
= tvb_get_ntohl(tvb
, suboffset
);
2196 PARAM_TREE_ADD(vendor_id
, 4, ENC_BIG_ENDIAN
);
2198 case LLRP_VENDOR_IMPINJ
:
2199 suboffset
= dissect_llrp_impinj_parameter(tvb
, pinfo
, param_tree
, suboffset
, param_end
);
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;
2217 type
= tvb_get_guint8(tvb
, offset
) & 0x7F;
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;
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;
2263 * No need to mark it, since the hf_llrp_tv_type field
2264 * will already show up as 'unknown'. */
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
,
2281 case LLRP_TV_ANTENNA_ID
:
2282 PARAM_TREE_ADD_STAY(antenna_id
, 2, ENC_BIG_ENDIAN
);
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
);
2290 case LLRP_TV_PEAK_RSSI
:
2291 PARAM_TREE_ADD_STAY(peak_rssi
, 1, ENC_NA
);
2293 case LLRP_TV_CHANNEL_INDEX
:
2294 PARAM_TREE_ADD_STAY(channel_idx
, 2, ENC_BIG_ENDIAN
);
2296 case LLRP_TV_TAG_SEEN_COUNT
:
2297 PARAM_TREE_ADD_STAY(tag_count
, 2, ENC_BIG_ENDIAN
);
2299 case LLRP_TV_RO_SPEC_ID
:
2300 PARAM_TREE_ADD_STAY(rospec_id
, 4, ENC_BIG_ENDIAN
);
2302 case LLRP_TV_INVENTORY_PARAM_SPEC_ID
:
2303 PARAM_TREE_ADD_STAY(inventory_spec_id
, 2, ENC_BIG_ENDIAN
);
2305 case LLRP_TV_C1G2_CRC
:
2306 PARAM_TREE_ADD_STAY(crc
, 2, ENC_BIG_ENDIAN
);
2308 case LLRP_TV_C1G2_PC
:
2309 PARAM_TREE_ADD_STAY(pc_bits
, 2, ENC_BIG_ENDIAN
);
2312 PARAM_TREE_ADD_STAY(epc
, 96/8, ENC_NA
);
2314 case LLRP_TV_SPEC_INDEX
:
2315 PARAM_TREE_ADD_STAY(spec_idx
, 2, ENC_BIG_ENDIAN
);
2317 case LLRP_TV_CLIENT_REQ_OP_SPEC_RES
:
2318 PARAM_TREE_ADD_STAY(opspec_id
, 2, ENC_BIG_ENDIAN
);
2320 case LLRP_TV_ACCESS_SPEC_ID
:
2321 PARAM_TREE_ADD_STAY(accessspec_id
, 4, ENC_BIG_ENDIAN
);
2323 case LLRP_TV_OP_SPEC_ID
:
2324 PARAM_TREE_ADD_STAY(opspec_id
, 2, ENC_BIG_ENDIAN
);
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
);
2330 case LLRP_TV_C1G2_XPC_W1
:
2331 PARAM_TREE_ADD_STAY(xpc_w1
, 2, ENC_BIG_ENDIAN
);
2333 case LLRP_TV_C1G2_XPC_W2
:
2334 PARAM_TREE_ADD_STAY(xpc_w2
, 2, ENC_BIG_ENDIAN
);
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. */
2345 #undef PARAM_TREE_ADD_STAY
2346 #undef PARAM_TREE_ADD
2347 #undef PARAM_TREE_ADD_SPEC_STAY
2348 #undef PARAM_TREE_ADD_SPEC
2351 dissect_llrp_impinj_message(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, guint offset
)
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
);
2363 case LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS
:
2364 proto_tree_add_item(tree
, hf_llrp_rfu
, tvb
, offset
, 4, ENC_NA
);
2367 case LLRP_IMPINJ_TYPE_ENABLE_EXTENSIONS_RESPONSE
:
2368 /* Just parameters */
2370 case LLRP_IMPINJ_TYPE_SAVE_SETTINGS
:
2371 proto_tree_add_item(tree
, hf_llrp_save_config
, tvb
, offset
, 1, ENC_NA
);
2374 case LLRP_IMPINJ_TYPE_SAVE_SETTINGS_RESPONSE
:
2375 /* Just parameters */
2378 /* Just return offset, parameters will be dissected by our callee */
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
;
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
;
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
);
2438 proto_tree_add_item(tree
, hf_llrp_rospec
, tvb
,
2439 offset
, 4, ENC_BIG_ENDIAN
);
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
);
2451 proto_tree_add_item(tree
, hf_llrp_accessspec
, tvb
,
2452 offset
, 4, ENC_BIG_ENDIAN
);
2455 case LLRP_TYPE_GET_READER_CAPABILITIES
:
2456 proto_tree_add_item(tree
, hf_llrp_req_cap
, tvb
, offset
, 1, ENC_NA
);
2458 ends_with_parameters
= TRUE
;
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
);
2467 antenna_item
= proto_tree_add_item(tree
, hf_llrp_antenna_id
, tvb
,
2468 offset
, 2, ENC_BIG_ENDIAN
);
2471 requested_data
= tvb_get_guint8(tvb
, offset
);
2472 request_item
= proto_tree_add_item(tree
, hf_llrp_req_conf
, tvb
,
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
);
2481 gpi_item
= proto_tree_add_item(tree
, hf_llrp_gpi_port
, tvb
,
2482 offset
, 2, ENC_BIG_ENDIAN
);
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
);
2490 gpo_item
= proto_tree_add_item(tree
, hf_llrp_gpo_port
, tvb
,
2491 offset
, 2, ENC_BIG_ENDIAN
);
2494 switch (requested_data
)
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)");
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)");
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)");
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)");
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",
2536 /* Ignore both GPI and GPO ports */
2537 proto_item_append_text(gpi_item
, " (Ignored)");
2538 proto_item_append_text(gpo_item
, " (Ignored)");
2541 ends_with_parameters
= TRUE
;
2543 /* END GET_READER_CONFIG */
2545 case LLRP_TYPE_SET_READER_CONFIG
:
2546 proto_tree_add_item(tree
, hf_llrp_rest_fact
, tvb
, offset
, 1, ENC_NA
);
2548 ends_with_parameters
= TRUE
;
2550 case LLRP_TYPE_SET_PROTOCOL_VERSION
:
2551 proto_tree_add_item(tree
, hf_llrp_version
, tvb
, offset
, 1, ENC_NA
);
2553 case LLRP_TYPE_GET_SUPPORTED_VERSION_RESPONSE
:
2554 proto_tree_add_item(tree
, hf_llrp_cur_ver
, tvb
, offset
, 1, ENC_NA
);
2556 proto_tree_add_item(tree
, hf_llrp_sup_ver
, tvb
, offset
, 1, ENC_NA
);
2558 ends_with_parameters
= TRUE
;
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
);
2564 /* Do vendor specific dissection */
2566 case LLRP_VENDOR_IMPINJ
:
2567 dissect_custom_message
= dissect_llrp_impinj_message
;
2568 ends_with_parameters
= TRUE
;
2571 if (dissect_custom_message
)
2572 offset
= dissect_custom_message(tvb
, pinfo
, tree
, offset
);
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
:
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 */
2598 dissect_llrp_packet(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void* data _U_
)
2601 proto_tree
*llrp_tree
;
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
);
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
));
2636 proto_tree_add_item(llrp_tree
, hf_llrp_id
, tvb
, offset
, 4, ENC_BIG_ENDIAN
);
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 */
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 */
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
);
2663 proto_register_llrp(void)
2665 /* Setup list of header fields See Section 1.6.1 for details */
2666 static hf_register_info hf
[] = {
2668 { "Version", "llrp.version", FT_UINT8
, BASE_DEC
, VALS(llrp_versions
), 0x1C,
2672 { "Type", "llrp.type", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &message_types_ext
, 0x03FF,
2676 { "Length", "llrp.length", FT_UINT32
, BASE_DEC
, NULL
, 0,
2680 { "ID", "llrp.id", FT_UINT32
, BASE_DEC
, NULL
, 0,
2684 { "Current Version", "llrp.cur_ver", FT_UINT8
, BASE_DEC
, VALS(llrp_versions
), 0,
2688 { "Supported Version", "llrp.sup_ver", FT_UINT8
, BASE_DEC
, VALS(llrp_versions
), 0,
2689 "The max supported protocol version.", HFILL
}},
2692 { "Requested Capabilities", "llrp.req_cap", FT_UINT8
, BASE_DEC
, VALS(capabilities_request
), 0,
2695 { &hf_llrp_req_conf
,
2696 { "Requested Configuration", "llrp.req_conf", FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &config_request_ext
, 0,
2700 { "ROSpec ID", "llrp.rospec", FT_UINT32
, BASE_DEC
, NULL
, 0,
2703 { &hf_llrp_antenna_id
,
2704 { "Antenna ID", "llrp.antenna_id", FT_UINT16
, BASE_DEC
, NULL
, 0,
2707 { &hf_llrp_gpi_port
,
2708 { "GPI Port Number", "llrp.gpi_port", FT_UINT16
, BASE_DEC
, NULL
, 0,
2711 { &hf_llrp_gpo_port
,
2712 { "GPO Port Number", "llrp.gpo_port", FT_UINT16
, BASE_DEC
, NULL
, 0,
2715 { &hf_llrp_rest_fact
,
2716 { "Restore Factory Settings", "llrp.rest_fact", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
2719 { &hf_llrp_accessspec
,
2720 { "Access Spec ID", "llrp.accessspec", FT_UINT32
, BASE_DEC
, NULL
, 0,
2724 { "Vendor ID", "llrp.vendor", FT_UINT32
, BASE_DEC
, VALS(llrp_vendors
), 0,
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
}},
2736 { "Type", "llrp.tv_type", FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &tv_type_ext
, 0x7F,
2737 "The type of TV.", HFILL
}},
2740 { "Length", "llrp.tlv_len", FT_UINT16
, BASE_DEC
, NULL
, 0,
2741 "The length of this TLV.", HFILL
}},
2744 { "Parameter", "llrp.param", FT_NONE
, BASE_NONE
, NULL
, 0,
2748 { "Number of GPI ports", "llrp.param.num_gpi", FT_UINT16
, BASE_DEC
, NULL
, 0,
2752 { "Number of GPO ports", "llrp.param.num_gpo", FT_UINT16
, BASE_DEC
, NULL
, 0,
2755 { &hf_llrp_microseconds
,
2756 { "Microseconds", "llrp.param.microseconds", FT_UINT64
, BASE_DEC
, NULL
, 0,
2759 { &hf_llrp_max_supported_antenna
,
2760 { "Max number of antenna supported", "llrp.param.max_supported_antenna", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
2767 { &hf_llrp_has_utc_clock
,
2768 { "Has UTC clock capabilities", "llrp.param.has_utc_clock", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x4000,
2771 { &hf_llrp_device_manufacturer
,
2772 { "Device manufacturer name", "llrp.param.device_manufacturer", FT_UINT32
, BASE_DEC
, NULL
, 0,
2776 { "Model name", "llrp.param.model", FT_UINT32
, BASE_DEC
, NULL
, 0,
2779 { &hf_llrp_firmware_version
,
2780 { "Reader firmware version", "llrp.param.firmware_version", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
2783 { &hf_llrp_max_receive_sense
,
2784 { "Maximum sensitivity value", "llrp.param.max_receive_sense", FT_UINT16
, BASE_DEC
, NULL
, 0,
2788 { "Index", "llrp.param.index", FT_UINT16
, BASE_DEC
, NULL
, 0,
2791 { &hf_llrp_receive_sense
,
2792 { "Receive sensitivity value", "llrp.param.receive_sense", FT_UINT16
, BASE_DEC
, NULL
, 0,
2795 { &hf_llrp_receive_sense_index_min
,
2796 { "Receive sensitivity index min", "llrp.param.receive_sense_index_min", FT_UINT16
, BASE_DEC
, NULL
, 0,
2799 { &hf_llrp_receive_sense_index_max
,
2800 { "Receive sensitivity index max", "llrp.param.receive_sense_index_max", FT_UINT16
, BASE_DEC
, NULL
, 0,
2803 { &hf_llrp_num_protocols
,
2804 { "Number of protocols", "llrp.param.num_protocols", FT_UINT16
, BASE_DEC
, NULL
, 0,
2807 { &hf_llrp_protocol_id
,
2808 { "Protocol ID", "llrp.param.protocol_id", FT_UINT8
, BASE_DEC
| BASE_RANGE_STRING
, RVALS(protocol_id
), 0,
2811 { &hf_llrp_can_do_survey
,
2812 { "Can do RF survey", "llrp.param.can_do_survey", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
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,
2819 { &hf_llrp_support_client_opspec
,
2820 { "Support client request OpSpec", "llrp.param.support_client_opspec", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x20,
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,
2827 { &hf_llrp_support_holding
,
2828 { "Support event and report holding", "llrp.param.support_holding", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x08,
2831 { &hf_llrp_max_priority_supported
,
2832 { "Max priority level supported", "llrp.param.max_priority_supported", FT_UINT8
, BASE_DEC
, NULL
, 0,
2835 { &hf_llrp_client_opspec_timeout
,
2836 { "Client request OpSpec timeout", "llrp.param.client_opspec_timeout", FT_UINT16
, BASE_DEC
, NULL
, 0,
2839 { &hf_llrp_max_num_rospec
,
2840 { "Maximum number of ROSpecs", "llrp.param.max_num_rospec", FT_UINT32
, BASE_DEC
, NULL
, 0,
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,
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,
2851 { &hf_llrp_max_num_accessspec
,
2852 { "Maximum number of AccessSpec", "llrp.param.max_num_accessspec", FT_UINT32
, BASE_DEC
, NULL
, 0,
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,
2859 /* TODO add translation */
2860 { &hf_llrp_country_code
,
2861 { "Contry code", "llrp.param.country_code", FT_UINT16
, BASE_DEC
, NULL
, 0,
2864 { &hf_llrp_comm_standard
,
2865 { "Communication standard", "llrp.param.comm_standard", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &comm_standard_ext
, 0,
2868 { &hf_llrp_transmit_power
,
2869 { "Transmit power value", "llrp.param.transmit_power", FT_UINT16
, BASE_DEC
, NULL
, 0,
2873 { "Hopping", "llrp.param.hopping", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
2876 { &hf_llrp_hop_table_id
,
2877 { "Hop table ID", "llrp.param.hop_table_id", FT_UINT8
, BASE_DEC
, NULL
, 0,
2881 { "Reserved for future use", "llrp.param.rfu", FT_BYTES
, BASE_NONE
, NULL
, 0,
2884 { &hf_llrp_num_hops
,
2885 { "Number of hops", "llrp.param.num_hops", FT_UINT16
, BASE_DEC
, NULL
, 0,
2888 { &hf_llrp_frequency
,
2889 { "Frequency", "llrp.param.frequency", FT_UINT32
, BASE_DEC
, NULL
, 0,
2892 { &hf_llrp_num_freqs
,
2893 { "Number of frequencies", "llrp.param.num_freqs", FT_UINT16
, BASE_DEC
, NULL
, 0,
2896 { &hf_llrp_min_freq
,
2897 { "Minimum frequency", "llrp.param.min_freq", FT_UINT32
, BASE_DEC
, NULL
, 0,
2900 { &hf_llrp_max_freq
,
2901 { "Maximum frequency", "llrp.param.max_freq", FT_UINT32
, BASE_DEC
, NULL
, 0,
2904 { &hf_llrp_rospec_id
,
2905 { "ROSpec ID", "llrp.param.rospec_id", FT_UINT32
, BASE_DEC
, NULL
, 0,
2908 { &hf_llrp_priority
,
2909 { "Priority", "llrp.param.priority", FT_UINT8
, BASE_DEC
, NULL
, 0,
2912 { &hf_llrp_cur_state
,
2913 { "Current state", "llrp.param.cur_state", FT_UINT8
, BASE_DEC
, NULL
, 0,
2916 { &hf_llrp_rospec_start_trig_type
,
2917 { "ROSpec start trigger type", "llrp.param.rospec_start_trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
2921 { "Offset", "llrp.param.offset", FT_UINT32
, BASE_DEC
, NULL
, 0,
2925 { "Period", "llrp.param.period", FT_UINT32
, BASE_DEC
, NULL
, 0,
2928 { &hf_llrp_gpi_event
,
2929 { "GPI event", "llrp.param.gpi_event", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
2933 { "Timeout", "llrp.param.timeout", FT_UINT32
, BASE_DEC
, NULL
, 0,
2936 { &hf_llrp_rospec_stop_trig_type
,
2937 { "ROSpec stop trigger type", "llrp.param.rospec_stop_trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
2940 { &hf_llrp_duration_trig
,
2941 { "Duration trigger value", "llrp.param.duration_trig", FT_UINT32
, BASE_DEC
, NULL
, 0,
2944 { &hf_llrp_antenna_count
,
2945 { "Antenna count", "llrp.param.antenna_count", FT_UINT16
, BASE_DEC
, NULL
, 0,
2949 { "Antenna ID", "llrp.param.antenna", FT_UINT16
, BASE_DEC
, NULL
, 0,
2952 { &hf_llrp_aispec_stop_trig_type
,
2953 { "AISpec stop trigger type", "llrp.param.aispec_stop_trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
2956 { &hf_llrp_trig_type
,
2957 { "Trigger type", "llrp.param.trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
2960 { &hf_llrp_number_of_tags
,
2961 { "Number of tags", "llrp.param.number_of_tags", FT_UINT16
, BASE_DEC
, NULL
, 0,
2964 { &hf_llrp_number_of_attempts
,
2965 { "Number of attempts", "llrp.param.number_of_attempts", FT_UINT16
, BASE_DEC
, NULL
, 0,
2969 { "T", "llrp.param.t", FT_UINT16
, BASE_DEC
, NULL
, 0,
2972 { &hf_llrp_inventory_spec_id
,
2973 { "Inventory parameter spec id", "llrp.param.inventory_spec_id", FT_UINT16
, BASE_DEC
, NULL
, 0,
2976 { &hf_llrp_start_freq
,
2977 { "Start frequency", "llrp.param.start_freq", FT_UINT32
, BASE_DEC
, NULL
, 0,
2980 { &hf_llrp_stop_freq
,
2981 { "Stop frequency", "llrp.param.stop_freq", FT_UINT32
, BASE_DEC
, NULL
, 0,
2984 { &hf_llrp_stop_trig_type
,
2985 { "Stop trigger type", "llrp.param.stop_trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
2989 { "N", "llrp.param.n_4", FT_UINT32
, BASE_DEC
, NULL
, 0,
2992 { &hf_llrp_duration
,
2993 { "Duration", "llrp.param.duration", FT_UINT32
, BASE_DEC
, NULL
, 0,
2996 { &hf_llrp_accessspec_id
,
2997 { "AccessSpec ID", "llrp.param.accessspec_id", FT_UINT32
, BASE_DEC
, NULL
, 0,
3000 { &hf_llrp_access_cur_state
,
3001 { "Current state", "llrp.param.access_cur_state", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3004 { &hf_llrp_access_stop_trig_type
,
3005 { "AccessSpec Stop trigger", "llrp.param.access_stop_trig_type", FT_UINT8
, BASE_DEC
, NULL
, 0,
3008 { &hf_llrp_operation_count
,
3009 { "Operation count value", "llrp.param.operation_count", FT_UINT16
, BASE_DEC
, NULL
, 0,
3012 { &hf_llrp_opspec_id
,
3013 { "OpSpec ID", "llrp.param.opspec_id", FT_UINT16
, BASE_DEC
, NULL
, 0,
3016 { &hf_llrp_conf_value
,
3017 { "Configuration value", "llrp.param.conf_value", FT_UINT32
, BASE_DEC
, NULL
, 0,
3021 { "ID type", "llrp.param.id_type", FT_UINT8
, BASE_DEC
, VALS(id_type
), 0,
3024 { &hf_llrp_reader_id
,
3025 { "Reader ID", "llrp.param.reader_id", FT_UINT_BYTES
, BASE_NONE
, NULL
, 0,
3028 { &hf_llrp_gpo_data
,
3029 { "GPO data", "llrp.param.gpo_data", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3032 { &hf_llrp_keepalive_trig_type
,
3033 { "KeepAlive trigger type", "llrp.param.keepalive_trig_type", FT_UINT8
, BASE_DEC
, VALS(keepalive_type
), 0,
3036 { &hf_llrp_time_iterval
,
3037 { "Time interval", "llrp.param.time_iterval", FT_UINT32
, BASE_DEC
, NULL
, 0,
3040 { &hf_llrp_antenna_connected
,
3041 { "Antenna connected", "llrp.param.antenna_connected", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3044 { &hf_llrp_antenna_gain
,
3045 { "Antenna gain", "llrp.param.antenna_gain", FT_UINT16
, BASE_DEC
, NULL
, 0,
3048 { &hf_llrp_receiver_sense
,
3049 { "Receiver sensitivity", "llrp.param.receiver_sense", FT_UINT16
, BASE_DEC
, NULL
, 0,
3052 { &hf_llrp_channel_idx
,
3053 { "Channel index", "llrp.param.channel_idx", FT_UINT16
, BASE_DEC
, NULL
, 0,
3056 { &hf_llrp_gpi_config
,
3057 { "GPI config", "llrp.param.gpi_config", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3060 { &hf_llrp_gpi_state
,
3061 { "GPI state", "llrp.param.gpi_state", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
3068 { &hf_llrp_ro_report_trig
,
3069 { "RO report trigger", "llrp.param.ro_report_trig", FT_UINT8
, BASE_DEC
, NULL
, 0,
3073 { "N", "llrp.param.n_2", FT_UINT16
, BASE_DEC
, NULL
, 0,
3076 { &hf_llrp_enable_rospec_id
,
3077 { "Enable ROSpec ID", "llrp.param.enable_rospec_id", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x8000,
3080 { &hf_llrp_enable_spec_idx
,
3081 { "Enable spec index", "llrp.param.enable_spec_idx", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x4000,
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,
3088 { &hf_llrp_enable_antenna_id
,
3089 { "Enable antenna ID", "llrp.param.enable_antenna_id", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x1000,
3092 { &hf_llrp_enable_channel_idx
,
3093 { "Enable channel index", "llrp.param.enable_channel_idx", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0800,
3096 { &hf_llrp_enable_peak_rssi
,
3097 { "Enable peak RSSI", "llrp.param.enable_peak_rssi", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0400,
3100 { &hf_llrp_enable_first_seen
,
3101 { "Enable first seen timestamp", "llrp.param.enable_first_seen", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0200,
3104 { &hf_llrp_enable_last_seen
,
3105 { "Enable last seen timestamp", "llrp.param.enable_last_seen", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0100,
3108 { &hf_llrp_enable_seen_count
,
3109 { "Enable tag seen count", "llrp.param.enable_seen_count", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0080,
3112 { &hf_llrp_enable_accessspec_id
,
3113 { "Enable AccessSpec ID", "llrp.param.enable_accessspec_id", FT_BOOLEAN
, 16, TFS(&tfs_yes_no
), 0x0040,
3116 { &hf_llrp_access_report_trig
,
3117 { "Access report trigger", "llrp.param.access_report_trig", FT_UINT8
, BASE_DEC
, NULL
, 0,
3120 { &hf_llrp_length_bits
,
3121 { "Bit field length (bits)", "llrp.param.length_bits", FT_UINT16
, BASE_DEC
, NULL
, 0,
3125 { "EPC", "llrp.param.epc", FT_BYTES
, BASE_NONE
, NULL
, 0,
3128 { &hf_llrp_spec_idx
,
3129 { "Spec index", "llrp.param.spec_idx", FT_UINT16
, BASE_DEC
, NULL
, 0,
3132 { &hf_llrp_peak_rssi
,
3133 { "Peak RSSI", "llrp.param.peak_rssi", FT_UINT8
, BASE_DEC
, NULL
, 0,
3136 { &hf_llrp_tag_count
,
3137 { "Tag count", "llrp.param.tag_count", FT_UINT16
, BASE_DEC
, NULL
, 0,
3140 { &hf_llrp_bandwidth
,
3141 { "Bandwidth", "llrp.param.bandwidth", FT_UINT32
, BASE_DEC
, NULL
, 0,
3144 { &hf_llrp_average_rssi
,
3145 { "Average RSSI", "llrp.param.average_rssi", FT_UINT8
, BASE_DEC
, NULL
, 0,
3148 { &hf_llrp_notif_state
,
3149 { "Notification state", "llrp.param.notif_state", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3152 { &hf_llrp_event_type
,
3153 { "Event type", "llrp.param.event_type", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &event_type_ext
, 0,
3156 { &hf_llrp_next_chan_idx
,
3157 { "Next channel index", "llrp.param.next_chan_idx", FT_UINT16
, BASE_DEC
, NULL
, 0,
3160 { &hf_llrp_roevent_type
,
3161 { "Event type", "llrp.param.roevent_type", FT_UINT8
, BASE_DEC
, VALS(roevent_type
), 0,
3164 { &hf_llrp_prem_rospec_id
,
3165 { "Preempting ROSpec ID", "llrp.param.prem_rospec_id", FT_UINT32
, BASE_DEC
, NULL
, 0,
3168 { &hf_llrp_buffer_full_percentage
,
3169 { "Report Buffer percentage full", "llrp.param.buffer_full_percentage", FT_UINT8
, BASE_DEC
, NULL
, 0,
3173 { "Message", "llrp.param.message", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3176 { &hf_llrp_rfevent_type
,
3177 { "Event type", "llrp.param.rfevent_type", FT_UINT8
, BASE_DEC
, VALS(rfevent_type
), 0,
3180 { &hf_llrp_aievent_type
,
3181 { "Event type", "llrp.param.aievent_type", FT_UINT8
, BASE_DEC
, VALS(aievent_type
), 0,
3184 { &hf_llrp_antenna_event_type
,
3185 { "Event type", "llrp.param.antenna_event_type", FT_UINT8
, BASE_DEC
, VALS(antenna_event_type
), 0,
3188 { &hf_llrp_conn_status
,
3189 { "Status", "llrp.param.conn_status", FT_UINT16
, BASE_DEC
, VALS(connection_status
), 0,
3192 { &hf_llrp_loop_count
,
3193 { "Loop count", "llrp.param.loop_count", FT_UINT32
, BASE_DEC
, NULL
, 0,
3196 { &hf_llrp_status_code
,
3197 { "Status code", "llrp.param.status_code", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &status_code_ext
, 0,
3200 { &hf_llrp_error_desc
,
3201 { "Error Description", "llrp.param.error_desc", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3204 { &hf_llrp_field_num
,
3205 { "Field number", "llrp.param.field_num", FT_UINT16
, BASE_DEC
, NULL
, 0,
3208 { &hf_llrp_error_code
,
3209 { "Error code", "llrp.param.error_code", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &status_code_ext
, 0,
3212 { &hf_llrp_parameter_type
,
3213 { "Parameter type", "llrp.param.parameter_type", FT_UINT16
, BASE_DEC
| BASE_EXT_STRING
, &tlv_type_ext
, 0,
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,
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,
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,
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,
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,
3236 { &hf_llrp_can_support_XPC
,
3237 { "Can support XPC", "llrp.param.can_support_XPC", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x04,
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,
3244 { &hf_llrp_mode_ident
,
3245 { "Mode identifier", "llrp.param.mode_ident", FT_UINT32
, BASE_DEC
, NULL
, 0,
3249 { "DR", "llrp.param.DR", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3252 { &hf_llrp_hag_conformance
,
3253 { "EPC HAG T&C Conformance", "llrp.param.hag_conformance", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x40,
3257 { "M", "llrp.param.mod", FT_UINT8
, BASE_DEC
, NULL
, 0,
3261 { "Forward link modulation", "llrp.param.flm", FT_UINT8
, BASE_DEC
, NULL
, 0,
3265 { "Spectral mask indicator", "llrp.param.m", FT_UINT8
, BASE_DEC
, NULL
, 0,
3269 { "BDR", "llrp.param.bdr", FT_UINT32
, BASE_DEC
, NULL
, 0,
3273 { "PIE", "llrp.param.pie", FT_UINT32
, BASE_DEC
, NULL
, 0,
3276 { &hf_llrp_min_tari
,
3277 { "Minimum tari", "llrp.param.min_tari", FT_UINT32
, BASE_DEC
, NULL
, 0,
3280 { &hf_llrp_max_tari
,
3281 { "Maximum tari", "llrp.param.max_tari", FT_UINT32
, BASE_DEC
, NULL
, 0,
3284 { &hf_llrp_step_tari
,
3285 { "Tari step", "llrp.param.step_tari", FT_UINT32
, BASE_DEC
, NULL
, 0,
3288 { &hf_llrp_inventory_state_aware
,
3289 { "Tag inventory state aware", "llrp.param.inventory_state_aware", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3293 { "T", "llrp.param.trunc", FT_UINT8
, BASE_DEC
, NULL
, 0xC0,
3297 { "MB", "llrp.param.mb", FT_UINT8
, BASE_DEC
, NULL
, 0xC0,
3301 { "Pointer", "llrp.param.pointer", FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3304 { &hf_llrp_tag_mask
,
3305 { "Tag mask", "llrp.param.tag_mask", FT_BYTES
, BASE_NONE
, NULL
, 0,
3308 { &hf_llrp_aware_filter_target
,
3309 { "Target", "llrp.param.aware_filter_target", FT_UINT8
, BASE_DEC
, NULL
, 0,
3312 { &hf_llrp_aware_filter_action
,
3313 { "Action", "llrp.param.aware_filter_action", FT_UINT8
, BASE_DEC
, NULL
, 0,
3316 { &hf_llrp_unaware_filter_action
,
3317 { "Action", "llrp.param.unaware_filter_action", FT_UINT8
, BASE_DEC
, NULL
, 0,
3320 { &hf_llrp_mode_idx
,
3321 { "Mode index", "llrp.param.mode_idx", FT_UINT16
, BASE_DEC
, NULL
, 0,
3325 { "Tari", "llrp.param.tari", FT_UINT16
, BASE_DEC
, NULL
, 0,
3329 { "Session", "llrp.param.session", FT_UINT8
, BASE_DEC
, NULL
, 0xC0,
3332 { &hf_llrp_tag_population
,
3333 { "Tag population", "llrp.param.tag_population", FT_UINT16
, BASE_DEC
, NULL
, 0,
3336 { &hf_llrp_tag_transit_time
,
3337 { "Tag tranzit time", "llrp.param.tag_transit_time", FT_UINT32
, BASE_DEC
, NULL
, 0,
3341 { "I", "llrp.param.sing_i", FT_BOOLEAN
, 8, TFS(&tfs_state_a_b
), 0x80,
3345 { "S", "llrp.param.sing_s", FT_BOOLEAN
, 8, TFS(&tfs_sl
), 0x40,
3349 { "S_All", "llrp.param.sing_a", FT_BOOLEAN
, 8, TFS(&tfs_all_no
), 0x20,
3353 { "Match", "llrp.param.match", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x20,
3356 { &hf_llrp_tag_data
,
3357 { "Tag data", "llrp.param.tag_data", FT_BYTES
, BASE_NONE
, NULL
, 0,
3360 { &hf_llrp_access_pass
,
3361 { "Access password", "llrp.param.access_pass", FT_UINT32
, BASE_DEC_HEX
, NULL
, 0,
3364 { &hf_llrp_word_pointer
,
3365 { "Word pointer", "llrp.param.word_pointer", FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3368 { &hf_llrp_word_count
,
3369 { "Word count", "llrp.param.word_count", FT_UINT16
, BASE_DEC
, NULL
, 0,
3372 { &hf_llrp_write_data
,
3373 { "Write data", "llrp.param.write_data", FT_BYTES
, BASE_NONE
, NULL
, 0,
3376 { &hf_llrp_kill_pass
,
3377 { "Killpassword", "llrp.param.kill_pass", FT_UINT32
, BASE_DEC_HEX
, NULL
, 0,
3381 { "3", "llrp.param.kill_3", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x04,
3385 { "2", "llrp.param.kill_2", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x02,
3389 { "L", "llrp.param.kill_l", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x01,
3392 { &hf_llrp_privilege
,
3393 { "Privilege", "llrp.param.privilege", FT_UINT8
, BASE_DEC
, NULL
, 0,
3396 { &hf_llrp_data_field
,
3397 { "Data field", "llrp.param.data_field", FT_UINT8
, BASE_DEC
, NULL
, 0,
3400 { &hf_llrp_block_pointer
,
3401 { "Block pointer", "llrp.param.block_pointer", FT_UINT16
, BASE_DEC_HEX
, NULL
, 0,
3404 { &hf_llrp_block_mask
,
3405 { "Block mask", "llrp.param.block_mask", FT_BYTES
, BASE_NONE
, NULL
, 0,
3408 { &hf_llrp_length_words
,
3409 { "Field Length (words)", "llrp.param.length_words", FT_UINT16
, BASE_DEC
, NULL
, 0,
3412 { &hf_llrp_block_range
,
3413 { "Block range", "llrp.param.block_range", FT_UINT16
, BASE_DEC
, NULL
, 0,
3416 { &hf_llrp_enable_crc
,
3417 { "Enable CRC", "llrp.param.enable_crc", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
3420 { &hf_llrp_enable_pc
,
3421 { "Enable PC bits", "llrp.param.enable_pc", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x40,
3424 { &hf_llrp_enable_xpc
,
3425 { "Enable XPC bits", "llrp.param.enable_xpc", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x20,
3429 { "PC bits", "llrp.param.pc_bits", FT_UINT16
, BASE_HEX
, NULL
, 0,
3433 { "XPC-W1", "llrp.param.xpc_w1", FT_UINT16
, BASE_HEX
, NULL
, 0,
3437 { "XPC-W2", "llrp.param.xpc_w2", FT_UINT16
, BASE_HEX
, NULL
, 0,
3441 { "CRC", "llrp.param.crc", FT_UINT16
, BASE_HEX
, NULL
, 0,
3444 { &hf_llrp_num_coll
,
3445 { "Number of collisions", "llrp.param.num_coll", FT_UINT16
, BASE_DEC
, NULL
, 0,
3448 { &hf_llrp_num_empty
,
3449 { "Number of empty slots", "llrp.param.num_empty", FT_UINT16
, BASE_DEC
, NULL
, 0,
3452 { &hf_llrp_access_result
,
3453 { "Result", "llrp.param.access_result", FT_UINT8
, BASE_DEC
, NULL
, 0,
3456 { &hf_llrp_read_data
,
3457 { "Read data", "llrp.param.read_data", FT_BYTES
, BASE_NONE
, NULL
, 0,
3460 { &hf_llrp_num_words_written
,
3461 { "Number of words written", "llrp.param.num_words_written", FT_UINT16
, BASE_DEC
, NULL
, 0,
3464 { &hf_llrp_permlock_status
,
3465 { "Read data", "llrp.param.permlock_status", FT_BYTES
, BASE_NONE
, NULL
, 0,
3468 { &hf_llrp_vendor_id
,
3469 { "Vendor ID", "llrp.param.vendor_id", FT_UINT32
, BASE_DEC
, VALS(llrp_vendors
), 0,
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,
3476 { &hf_llrp_save_config
,
3477 { "Save configuration", "llrp.param.save_config", FT_BOOLEAN
, 8, TFS(&tfs_yes_no
), 0x80,
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,
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,
3488 { &hf_llrp_impinj_search_mode
,
3489 { "Inventory search mode", "llrp.param.impinj_search_mode", FT_UINT16
, BASE_DEC
, VALS(impinj_search_mode
), 0,
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,
3496 { &hf_llrp_impinj_antenna_conf
,
3497 { "Antenna configuration", "llrp.param.impinj_antenna_conf", FT_UINT16
, BASE_DEC
, VALS(impinj_ant_conf
), 0,
3500 { &hf_llrp_decision_time
,
3501 { "Decision timestamp", "llrp.param.decision_time", FT_UINT64
, BASE_DEC
, NULL
, 0,
3504 { &hf_llrp_impinj_tag_dir
,
3505 { "Tag direction", "llrp.param.impinj_tag_dir", FT_UINT16
, BASE_DEC
, VALS(impinj_tag_dir
), 0,
3508 { &hf_llrp_confidence
,
3509 { "Confidence", "llrp.param.confidence", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
3516 { &hf_llrp_num_channels
,
3517 { "Number of channels", "llrp.param.num_channels", FT_UINT16
, BASE_DEC
, NULL
, 0,
3521 { "Channel", "llrp.param.channel", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
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,
3532 { &hf_llrp_empty_field_timeout
,
3533 { "Empty field timeout", "llrp.param.empty_field_timeout", FT_UINT16
, BASE_DEC
, NULL
, 0,
3536 { &hf_llrp_field_ping_interval
,
3537 { "Field ping interval", "llrp.param.field_ping_interval", FT_UINT16
, BASE_DEC
, NULL
, 0,
3540 { &hf_llrp_model_name
,
3541 { "Model name", "llrp.param.model_name", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3544 { &hf_llrp_serial_number
,
3545 { "Serial number", "llrp.param.serial_number", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3548 { &hf_llrp_soft_ver
,
3549 { "Softwave version", "llrp.param.soft_ver", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3552 { &hf_llrp_firm_ver
,
3553 { "Firmware version", "llrp.param.firm_ver", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3556 { &hf_llrp_fpga_ver
,
3557 { "FPGA version", "llrp.param.fpga_ver", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3560 { &hf_llrp_pcba_ver
,
3561 { "PCBA version", "llrp.param.pcba_ver", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3564 { &hf_llrp_height_thresh
,
3565 { "Height threshold", "llrp.param.height_thresh", FT_UINT16
, BASE_DEC
, NULL
, 0,
3568 { &hf_llrp_zero_motion_thresh
,
3569 { "Zero motion threshold", "llrp.param.zero_motion_thresh", FT_UINT16
, BASE_DEC
, NULL
, 0,
3572 { &hf_llrp_board_manufacturer
,
3573 { "Board manufacturer", "llrp.param.board_manufacturer", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3576 { &hf_llrp_fw_ver_hex
,
3577 { "Firmware version", "llrp.param.fw_ver_hex", FT_UINT_BYTES
, BASE_NONE
, NULL
, 0,
3580 { &hf_llrp_hw_ver_hex
,
3581 { "Hardware version", "llrp.param.hw_ver_hex", FT_UINT_BYTES
, BASE_NONE
, NULL
, 0,
3584 { &hf_llrp_gpi_debounce
,
3585 { "GPI debounce timer Msec", "llrp.param.gpi_debounce", FT_UINT16
, BASE_DEC
, NULL
, 0,
3588 { &hf_llrp_temperature
,
3589 { "Temperature", "llrp.param.temperature", FT_INT16
, BASE_DEC
, NULL
, 0,
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,
3596 { &hf_llrp_link_down_thresh
,
3597 { "Link down threshold", "llrp.param.link_down_thresh", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
3604 { &hf_llrp_permalock_result
,
3605 { "Result", "llrp.param.permalock_result", FT_UINT8
, BASE_DEC
| BASE_EXT_STRING
, &impinj_permalock_result_ext
, 0,
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,
3612 { &hf_llrp_impinj_data_profile
,
3613 { "Data profile", "llrp.param.impinj_data_profile", FT_UINT8
, BASE_DEC
, VALS(impinj_data_profile
), 0,
3616 { &hf_llrp_impinj_access_range
,
3617 { "Access range", "llrp.param.impinj_access_range", FT_UINT8
, BASE_DEC
, VALS(impinj_access_range
), 0,
3620 { &hf_llrp_impinj_persistence
,
3621 { "Persistence", "llrp.param.impinj_persistence", FT_UINT8
, BASE_DEC
, VALS(impinj_persistence
), 0,
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,
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,
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,
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,
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,
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,
3648 { &hf_llrp_impinj_tid
,
3649 { "TID", "llrp.param.impinj_tid", FT_UINT_BYTES
, BASE_NONE
, NULL
, 0,
3652 { &hf_llrp_phase_angle
,
3653 { "Phase angle", "llrp.param.phase_angle", FT_UINT16
, BASE_DEC
, NULL
, 0,
3657 { "RSSI", "llrp.param.rssi", FT_INT16
, BASE_DEC
, NULL
, 0,
3660 { &hf_llrp_latitude
,
3661 { "Latitude", "llrp.param.latitude", FT_INT32
, BASE_DEC
, NULL
, 0,
3664 { &hf_llrp_longitude
,
3665 { "Longitude", "llrp.param.longitude", FT_INT32
, BASE_DEC
, NULL
, 0,
3668 { &hf_llrp_gga_sentence
,
3669 { "GGA sentence", "llrp.param.gga_sentence", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
3672 { &hf_llrp_rmc_sentence
,
3673 { "RMC sentence", "llrp.param.rmc_sentence", FT_UINT_STRING
, BASE_NONE
, NULL
, 0,
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,
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,
3684 { &hf_llrp_retry_count
,
3685 { "Retry count", "llrp.param.retry_count", FT_UINT16
, BASE_DEC
, NULL
, 0,
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,
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,
3696 { &hf_llrp_gpo_pulse_dur
,
3697 { "GPO pulse duration", "llrp.param.gpo_pulse_dur", FT_UINT32
, BASE_DEC
, NULL
, 0,
3702 /* Setup protocol subtree array */
3703 static gint
*ett
[] = {
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",
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
));
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
3742 * indent-tabs-mode: nil
3745 * vi: set shiftwidth=4 tabstop=8 expandtab:
3746 * :indentSize=4:tabSize=8:noTabs=true: