From Matt Poduska via bug 1957 (with minor changes):
authorgerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 4 Jun 2010 18:45:02 +0000 (18:45 +0000)
committergerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 4 Jun 2010 18:45:02 +0000 (18:45 +0000)
New dissector (plugin) to support decode of the EPCglobal Low-Level Reader
protocol (see llrp.org for more information). This dissector has passed fuzz
testing.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@33088 f5534014-38df-0310-8fa8-9805f1628bb7

26 files changed:
Makefile.am
configure.in
packaging/nsis/Makefile.nmake
packaging/nsis/wireshark.nsi
plugins/Makefile.am
plugins/Makefile.nmake
plugins/llrp/AUTHORS [new file with mode: 0644]
plugins/llrp/ChangeLog [new file with mode: 0644]
plugins/llrp/Makefile.am [new file with mode: 0644]
plugins/llrp/Makefile.common [new file with mode: 0644]
plugins/llrp/Makefile.nmake [new file with mode: 0644]
plugins/llrp/llrp-1x0-def.c [new file with mode: 0644]
plugins/llrp/llrp-1x0-def.h [new file with mode: 0644]
plugins/llrp/llrp-Intermec.c [new file with mode: 0644]
plugins/llrp/llrp-Intermec.h [new file with mode: 0644]
plugins/llrp/llrpparse.c [new file with mode: 0644]
plugins/llrp/llrpparse.h [new file with mode: 0644]
plugins/llrp/llrpparsehelp.c [new file with mode: 0644]
plugins/llrp/llrpparsehelp.h [new file with mode: 0644]
plugins/llrp/llrpparseinc.h [new file with mode: 0644]
plugins/llrp/llrpparsetypes.c [new file with mode: 0644]
plugins/llrp/llrpparsetypes.h [new file with mode: 0644]
plugins/llrp/moduleinfo.h [new file with mode: 0644]
plugins/llrp/moduleinfo.nmake [new file with mode: 0644]
plugins/llrp/packet-llrp.c [new file with mode: 0644]
plugins/llrp/plugin.rc.in [new file with mode: 0644]

index 3526d5d949de5db3cc6337c2ea8c4a75793ffeef..94b4c774eb1a56d1dd01f1760abb3de03581b306 100644 (file)
@@ -272,6 +272,7 @@ plugin_ldadd = $(_CUSTOM_plugin_ldadd_) \
        -dlopen plugins/gryphon/gryphon.la \
        -dlopen plugins/interlink/interlink.la \
        -dlopen plugins/irda/irda.la \
+       -dlopen plugins/llrp/llrp.la \
        -dlopen plugins/m2m/m2m.la \
        -dlopen plugins/mate/mate.la \
        -dlopen plugins/opcua/opcua.la \
index 73267b3582c318de70f8e5025fb6d0fdfb41407f..1ea386cd471d79a3a5c6a0bf310215a16a66b0a2 100644 (file)
@@ -1860,6 +1860,7 @@ AC_OUTPUT(
   plugins/gryphon/Makefile
   plugins/interlink/Makefile
   plugins/irda/Makefile
+  plugins/llrp/Makefile
   plugins/m2m/Makefile
   plugins/mate/Makefile
   plugins/opcua/Makefile
index cb643d5049746d6587ed2caa86c36b998ba2f847..95b522a2313f7c919ce857bf0520fc6132fbf228 100644 (file)
@@ -55,6 +55,7 @@ PLUGINS= \
        ../../plugins/gryphon/gryphon.dll \
        ../../plugins/interlink/interlink.dll \
        ../../plugins/irda/irda.dll \
+       ../../plugins/llrp/llrp.dll \
        ../../plugins/m2m/m2m.dll \
        ../../plugins/mate/mate.dll \
        ../../plugins/opcua/opcua.dll \
index 95e1b767ebb989a2a6a1e00f957117ce4de065f2..c3bb7714a7c5750ccba118acb7dcd09104ecca3a 100644 (file)
@@ -885,6 +885,7 @@ File "..\..\plugins\giop\tango.dll"
 File "..\..\plugins\gryphon\gryphon.dll"
 File "..\..\plugins\interlink\interlink.dll"
 File "..\..\plugins\irda\irda.dll"
+File "..\..\plugins\llrp\llrp.dll"
 File "..\..\plugins\m2m\m2m.dll"
 File "..\..\plugins\opcua\opcua.dll"
 File "..\..\plugins\profinet\profinet.dll"
index f7f49cf3e3d74ee22cdef31250cc5b34fb5f8e3f..8e33478c7ef3f6cab94a4067d00a2f19000ad04c 100644 (file)
@@ -30,6 +30,7 @@ SUBDIRS = $(_CUSTOM_SUBDIRS_) \
        gryphon \
        interlink \
        irda \
+       llrp \
        m2m \
        mate \
        opcua \
index c11868b54203507ac5eb3ddd4a01289c84f7352f..66fee75b4a948645d4127a72226361f6c94b0c46 100644 (file)
@@ -14,6 +14,7 @@ PLUGIN_LIST = \
        gryphon     \
        interlink   \
        irda        \
+       llrp        \
        m2m         \
        mate        \
        opcua       \
@@ -45,8 +46,8 @@ distclean-local: clean-local
 
 maintainer-clean-local: distclean-local
 
-checkapi: 
-        $(MAKE) -f Makefile.nmake PLUGIN_TARGET=checkapi process-plugins 
+checkapi:
+       $(MAKE) -f Makefile.nmake PLUGIN_TARGET=checkapi process-plugins 
 
 
 
diff --git a/plugins/llrp/AUTHORS b/plugins/llrp/AUTHORS
new file mode 100644 (file)
index 0000000..5425595
--- /dev/null
@@ -0,0 +1,4 @@
+Author :
+Matt Poduska <matt.poduska@intermec.com>
+
+
diff --git a/plugins/llrp/ChangeLog b/plugins/llrp/ChangeLog
new file mode 100644 (file)
index 0000000..df86e5b
--- /dev/null
@@ -0,0 +1,5 @@
+2007-12-18  Matt Poduska  <matt.poduska@intermec.com>
+
+       * initial version
+       
+
diff --git a/plugins/llrp/Makefile.am b/plugins/llrp/Makefile.am
new file mode 100644 (file)
index 0000000..f5a7a57
--- /dev/null
@@ -0,0 +1,121 @@
+# Makefile.am
+# Automake file for EPCglobal Low-Level Reader Protocol plugin
+#
+# $Id$
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+
+INCLUDES = -I$(top_srcdir) -I$(includedir)
+
+include Makefile.common
+
+plugindir = @plugindir@
+
+plugin_LTLIBRARIES = llrp.la
+llrp_la_SOURCES = \
+       plugin.c \
+       moduleinfo.h \
+       $(DISSECTOR_SRC) \
+       $(DISSECTOR_SUPPORT_SRC) \
+       $(DISSECTOR_INCLUDES)
+llrp_la_LDFLAGS = -module -avoid-version
+llrp_la_LIBADD = @PLUGIN_LIBS@
+
+# Libs must be cleared, or else libtool won't create a shared module.
+# If your module needs to be linked against any particular libraries,
+# add them here.
+LIBS =
+
+#
+# Build plugin.c, which contains the plugin version[] string, a
+# function plugin_register() that calls the register routines for all
+# protocols, and a function plugin_reg_handoff() that calls the handoff
+# registration routines for all protocols.
+#
+# We do this by scanning sources.  If that turns out to be too slow,
+# maybe we could just require every .o file to have an register routine
+# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
+#
+# Formatting conventions:  The name of the proto_register_* routines an
+# proto_reg_handoff_* routines must start in column zero, or must be
+# preceded only by "void " starting in column zero, and must not be
+# inside #if.
+#
+# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
+#
+# For some unknown reason, having a big "for" loop in the Makefile
+# to scan all the files doesn't work with some "make"s; they seem to
+# pass only the first few names in the list to the shell, for some
+# reason.
+#
+# Therefore, we have a script to generate the plugin.c file.
+# The shell script runs slowly, as multiple greps and seds are run
+# for each input file; this is especially slow on Windows.  Therefore,
+# if Python is present (as indicated by PYTHON being defined), we run
+# a faster Python script to do that work instead.
+#
+# The first argument is the directory in which the source files live.
+# The second argument is "plugin", to indicate that we should build
+# a plugin.c file for a plugin.
+# All subsequent arguments are the files to scan.
+#
+plugin.c: $(DISSECTOR_SRC) $(top_srcdir)/tools/make-dissector-reg \
+    $(top_srcdir)/tools/make-dissector-reg.py
+       @if test -n $(PYTHON); then \
+               echo Making plugin.c with python ; \
+               $(PYTHON) $(top_srcdir)/tools/make-dissector-reg.py $(srcdir) \
+                   plugin $(DISSECTOR_SRC) ; \
+       else \
+               echo Making plugin.c with shell script ; \
+               $(top_srcdir)/tools/make-dissector-reg $(srcdir) \
+                   $(plugin_src) plugin $(DISSECTOR_SRC) ; \
+       fi
+
+#
+# Currently plugin.c can be included in the distribution because
+# we always build all protocol dissectors. We used to have to check
+# whether or not to build the snmp dissector. If we again need to
+# variably build something, making plugin.c non-portable, uncomment
+# the dist-hook line below.
+#
+# Oh, yuk.  We don't want to include "plugin.c" in the distribution, as
+# its contents depend on the configuration, and therefore we want it
+# to be built when the first "make" is done; however, Automake insists
+# on putting *all* source into the distribution.
+#
+# We work around this by having a "dist-hook" rule that deletes
+# "plugin.c", so that "dist" won't pick it up.
+#
+#dist-hook:
+#      @rm -f $(distdir)/plugin.c
+
+CLEANFILES = \
+       *~
+
+MAINTAINERCLEANFILES = \
+       Makefile.in     \
+       plugin.c
+
+EXTRA_DIST = \
+       Makefile.common         \
+       Makefile.nmake          \
+       moduleinfo.nmake        \
+       plugin.rc.in
+
diff --git a/plugins/llrp/Makefile.common b/plugins/llrp/Makefile.common
new file mode 100644 (file)
index 0000000..7e0a07a
--- /dev/null
@@ -0,0 +1,50 @@
+# Makefile.common for EPCglobal Low-Level Reader Protocol plugin
+#     Contains the stuff from Makefile.am and Makefile.nmake that is
+#     a) common to both files and
+#     b) portable between both files
+#
+# $Id$
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+# the name of the plugin
+PLUGIN_NAME = llrp
+
+# the dissector sources (without any helpers)
+DISSECTOR_SRC = \
+       packet-llrp.c
+
+# corresponding headers
+DISSECTOR_INCLUDES =    \
+        llrp-1x0-def.h   \
+        llrp-Intermec.h  \
+        llrpparse.h      \
+        llrpparsehelp.h  \
+        llrpparseinc.h   \
+        llrpparsetypes.h
+
+# Dissector helpers.  They're included in the source files in this
+# directory, but they're not dissectors themselves, i.e. they're not
+# used to generate "register.c").
+DISSECTOR_SUPPORT_SRC =  \
+        llrp-1x0-def.c   \
+        llrp-Intermec.c  \
+        llrpparsehelp.c  \
+        llrpparsetypes.c \
+        llrpparse.c
diff --git a/plugins/llrp/Makefile.nmake b/plugins/llrp/Makefile.nmake
new file mode 100644 (file)
index 0000000..c280a82
--- /dev/null
@@ -0,0 +1,95 @@
+# Makefile.nmake
+# nmake file for Wireshark plugin
+#
+# $Id$
+#
+
+include ..\..\config.nmake
+include moduleinfo.nmake
+
+include Makefile.common
+
+CFLAGS=/DHAVE_CONFIG_H /I../.. /I../../wiretap $(GLIB_CFLAGS) \
+       /I$(PCAP_DIR)\include -D_U_="" $(LOCAL_CFLAGS)
+
+LDFLAGS = /NOLOGO /INCREMENTAL:no /MACHINE:I386 $(LOCAL_LDFLAGS)
+
+!IFDEF ENABLE_LIBWIRESHARK
+LINK_PLUGIN_WITH=..\..\epan\libwireshark.lib
+CFLAGS=/DHAVE_WIN32_LIBWIRESHARK_LIB /D_NEED_VAR_IMPORT_ $(CFLAGS)
+
+DISSECTOR_OBJECTS = $(DISSECTOR_SRC:.c=.obj)
+
+DISSECTOR_SUPPORT_OBJECTS = $(DISSECTOR_SUPPORT_SRC:.c=.obj)
+
+OBJECTS = $(DISSECTOR_OBJECTS) $(DISSECTOR_SUPPORT_OBJECTS) plugin.obj
+
+RESOURCE=$(PLUGIN_NAME).res
+
+all: $(PLUGIN_NAME).dll
+
+$(PLUGIN_NAME).rc : moduleinfo.nmake
+       sed -e s/@PLUGIN_NAME@/$(PLUGIN_NAME)/ \
+       -e s/@RC_MODULE_VERSION@/$(RC_MODULE_VERSION)/ \
+       -e s/@RC_VERSION@/$(RC_VERSION)/ \
+       -e s/@MODULE_VERSION@/$(MODULE_VERSION)/ \
+       -e s/@PACKAGE@/$(PACKAGE)/ \
+       -e s/@VERSION@/$(VERSION)/ \
+       -e s/@MSVC_VARIANT@/$(MSVC_VARIANT)/ \
+       < plugin.rc.in > $@
+
+$(PLUGIN_NAME).dll $(PLUGIN_NAME).exp $(PLUGIN_NAME).lib : $(OBJECTS) $(LINK_PLUGIN_WITH) $(RESOURCE)
+       link -dll /out:$(PLUGIN_NAME).dll $(LDFLAGS) $(OBJECTS) $(LINK_PLUGIN_WITH) \
+       $(GLIB_LIBS) $(RESOURCE)
+#
+# Build plugin.c, which contains the plugin version[] string, a
+# function plugin_register() that calls the register routines for all
+# protocols, and a function plugin_reg_handoff() that calls the handoff
+# registration routines for all protocols.
+#
+# We do this by scanning sources.  If that turns out to be too slow,
+# maybe we could just require every .o file to have an register routine
+# of a given name (packet-aarp.o -> proto_register_aarp, etc.).
+#
+# Formatting conventions:  The name of the proto_register_* routines an
+# proto_reg_handoff_* routines must start in column zero, or must be
+# preceded only by "void " starting in column zero, and must not be
+# inside #if.
+#
+# DISSECTOR_SRC is assumed to have all the files that need to be scanned.
+#
+# For some unknown reason, having a big "for" loop in the Makefile
+# to scan all the files doesn't work with some "make"s; they seem to
+# pass only the first few names in the list to the shell, for some
+# reason.
+#
+# Therefore, we have a script to generate the plugin.c file.
+# The shell script runs slowly, as multiple greps and seds are run
+# for each input file; this is especially slow on Windows.  Therefore,
+# if Python is present (as indicated by PYTHON being defined), we run
+# a faster Python script to do that work instead.
+#
+# The first argument is the directory in which the source files live.
+# The second argument is "plugin", to indicate that we should build
+# a plugin.c file for a plugin.
+# All subsequent arguments are the files to scan.
+#
+plugin.c: $(DISSECTOR_SRC)
+!IFDEF PYTHON
+       @echo Making plugin.c (using python)
+       @$(PYTHON) "../../tools/make-dissector-reg.py" . plugin $(DISSECTOR_SRC)
+!ELSE
+       @echo Making plugin.c (using sh)
+       @$(SH) ../../tools/make-dissector-reg . plugin $(DISSECTOR_SRC)
+!ENDIF
+
+!ENDIF
+
+clean:
+       rm -f $(OBJECTS) $(RESOURCE) plugin.c *.pdb \
+               $(PLUGIN_NAME).dll $(PLUGIN_NAME).dll.manifest $(PLUGIN_NAME).lib \
+        $(PLUGIN_NAME).exp $(PLUGIN_NAME).rc 
+
+distclean: clean
+
+maintainer-clean: distclean
diff --git a/plugins/llrp/llrp-1x0-def.c b/plugins/llrp/llrp-1x0-def.c
new file mode 100644 (file)
index 0000000..2900e74
--- /dev/null
@@ -0,0 +1,3953 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */ 
+
+#include <stdio.h> /* for NULL */
+#include "llrpparsetypes.h" 
+#include "llrpparseinc.h" 
+/*lint -e786 -e766*/
+
+
+/* ----------------------------------------------------------------------------- */
+/* Enumerations (42 total) */
+    
+t_llrp_enumeration_item llrp_enum_list_AirProtocols[] = {
+        
+    { "Unspecified", 0 },
+    { "EPCGlobalClass1Gen2", 1 },
+};
+t_llrp_enumeration llrp_enum_AirProtocols = {
+    llrp_enum_list_AirProtocols, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_GetReaderCapabilitiesRequestedData[] = {
+        
+    { "All", 0 },
+    { "General_Device_Capabilities", 1 },
+    { "LLRP_Capabilities", 2 },
+    { "Regulatory_Capabilities", 3 },
+    { "LLRP_Air_Protocol_Capabilities", 4 },
+};
+t_llrp_enumeration llrp_enum_GetReaderCapabilitiesRequestedData = {
+    llrp_enum_list_GetReaderCapabilitiesRequestedData, 5
+};
+    
+t_llrp_enumeration_item llrp_enum_list_CommunicationsStandard[] = {
+        
+    { "Unspecified", 0 },
+    { "US_FCC_Part_15", 1 },
+    { "ETSI_302_208", 2 },
+    { "ETSI_300_220", 3 },
+    { "Australia_LIPD_1W", 4 },
+    { "Australia_LIPD_4W", 5 },
+    { "Japan_ARIB_STD_T89", 6 },
+    { "Hong_Kong_OFTA_1049", 7 },
+    { "Taiwan_DGT_LP0002", 8 },
+    { "Korea_MIC_Article_5_2", 9 },
+};
+t_llrp_enumeration llrp_enum_CommunicationsStandard = {
+    llrp_enum_list_CommunicationsStandard, 10
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ROSpecState[] = {
+        
+    { "Disabled", 0 },
+    { "Inactive", 1 },
+    { "Active", 2 },
+};
+t_llrp_enumeration llrp_enum_ROSpecState = {
+    llrp_enum_list_ROSpecState, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ROSpecStartTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Immediate", 1 },
+    { "Periodic", 2 },
+    { "GPI", 3 },
+};
+t_llrp_enumeration llrp_enum_ROSpecStartTriggerType = {
+    llrp_enum_list_ROSpecStartTriggerType, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ROSpecStopTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Duration", 1 },
+    { "GPI_With_Timeout", 2 },
+};
+t_llrp_enumeration llrp_enum_ROSpecStopTriggerType = {
+    llrp_enum_list_ROSpecStopTriggerType, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AISpecStopTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Duration", 1 },
+    { "GPI_With_Timeout", 2 },
+    { "Tag_Observation", 3 },
+};
+t_llrp_enumeration llrp_enum_AISpecStopTriggerType = {
+    llrp_enum_list_AISpecStopTriggerType, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_TagObservationTriggerType[] = {
+        
+    { "Upon_Seeing_N_Tags_Or_Timeout", 0 },
+    { "Upon_Seeing_No_More_New_Tags_For_Tms_Or_Timeout", 1 },
+    { "N_Attempts_To_See_All_Tags_In_FOV_Or_Timeout", 2 },
+};
+t_llrp_enumeration llrp_enum_TagObservationTriggerType = {
+    llrp_enum_list_TagObservationTriggerType, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_RFSurveySpecStopTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Duration", 1 },
+    { "N_Iterations_Through_Frequency_Range", 2 },
+};
+t_llrp_enumeration llrp_enum_RFSurveySpecStopTriggerType = {
+    llrp_enum_list_RFSurveySpecStopTriggerType, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AccessSpecState[] = {
+        
+    { "Disabled", 0 },
+    { "Active", 1 },
+};
+t_llrp_enumeration llrp_enum_AccessSpecState = {
+    llrp_enum_list_AccessSpecState, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AccessSpecStopTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Operation_Count", 1 },
+};
+t_llrp_enumeration llrp_enum_AccessSpecStopTriggerType = {
+    llrp_enum_list_AccessSpecStopTriggerType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_GetReaderConfigRequestedData[] = {
+        
+    { "All", 0 },
+    { "Identification", 1 },
+    { "AntennaProperties", 2 },
+    { "AntennaConfiguration", 3 },
+    { "ROReportSpec", 4 },
+    { "ReaderEventNotificationSpec", 5 },
+    { "AccessReportSpec", 6 },
+    { "LLRPConfigurationStateValue", 7 },
+    { "KeepaliveSpec", 8 },
+    { "GPIPortCurrentState", 9 },
+    { "GPOWriteData", 10 },
+    { "EventsAndReports", 11 },
+};
+t_llrp_enumeration llrp_enum_GetReaderConfigRequestedData = {
+    llrp_enum_list_GetReaderConfigRequestedData, 12
+};
+    
+t_llrp_enumeration_item llrp_enum_list_IdentificationType[] = {
+        
+    { "MAC_Address", 0 },
+    { "EPC", 1 },
+};
+t_llrp_enumeration llrp_enum_IdentificationType = {
+    llrp_enum_list_IdentificationType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_KeepaliveTriggerType[] = {
+        
+    { "Null", 0 },
+    { "Periodic", 1 },
+};
+t_llrp_enumeration llrp_enum_KeepaliveTriggerType = {
+    llrp_enum_list_KeepaliveTriggerType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_GPIPortState[] = {
+        
+    { "Low", 0 },
+    { "High", 1 },
+    { "Unknown", 2 },
+};
+t_llrp_enumeration llrp_enum_GPIPortState = {
+    llrp_enum_list_GPIPortState, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ROReportTriggerType[] = {
+        
+    { "None", 0 },
+    { "Upon_N_Tags_Or_End_Of_AISpec", 1 },
+    { "Upon_N_Tags_Or_End_Of_ROSpec", 2 },
+};
+t_llrp_enumeration llrp_enum_ROReportTriggerType = {
+    llrp_enum_list_ROReportTriggerType, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AccessReportTriggerType[] = {
+        
+    { "Whenever_ROReport_Is_Generated", 0 },
+    { "End_Of_AccessSpec", 1 },
+};
+t_llrp_enumeration llrp_enum_AccessReportTriggerType = {
+    llrp_enum_list_AccessReportTriggerType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_NotificationEventType[] = {
+        
+    { "Upon_Hopping_To_Next_Channel", 0 },
+    { "GPI_Event", 1 },
+    { "ROSpec_Event", 2 },
+    { "Report_Buffer_Fill_Warning", 3 },
+    { "Reader_Exception_Event", 4 },
+    { "RFSurvey_Event", 5 },
+    { "AISpec_Event", 6 },
+    { "AISpec_Event_With_Details", 7 },
+    { "Antenna_Event", 8 },
+};
+t_llrp_enumeration llrp_enum_NotificationEventType = {
+    llrp_enum_list_NotificationEventType, 9
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ROSpecEventType[] = {
+        
+    { "Start_Of_ROSpec", 0 },
+    { "End_Of_ROSpec", 1 },
+    { "Preemption_Of_ROSpec", 2 },
+};
+t_llrp_enumeration llrp_enum_ROSpecEventType = {
+    llrp_enum_list_ROSpecEventType, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_RFSurveyEventType[] = {
+        
+    { "Start_Of_RFSurvey", 0 },
+    { "End_Of_RFSurvey", 1 },
+};
+t_llrp_enumeration llrp_enum_RFSurveyEventType = {
+    llrp_enum_list_RFSurveyEventType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AISpecEventType[] = {
+        
+    { "End_Of_AISpec", 0 },
+};
+t_llrp_enumeration llrp_enum_AISpecEventType = {
+    llrp_enum_list_AISpecEventType, 1
+};
+    
+t_llrp_enumeration_item llrp_enum_list_AntennaEventType[] = {
+        
+    { "Antenna_Disconnected", 0 },
+    { "Antenna_Connected", 1 },
+};
+t_llrp_enumeration llrp_enum_AntennaEventType = {
+    llrp_enum_list_AntennaEventType, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_ConnectionAttemptStatusType[] = {
+        
+    { "Success", 0 },
+    { "Failed_A_Reader_Initiated_Connection_Already_Exists", 1 },
+    { "Failed_A_Client_Initiated_Connection_Already_Exists", 2 },
+    { "Failed_Reason_Other_Than_A_Connection_Already_Exists", 3 },
+    { "Another_Connection_Attempted", 4 },
+};
+t_llrp_enumeration llrp_enum_ConnectionAttemptStatusType = {
+    llrp_enum_list_ConnectionAttemptStatusType, 5
+};
+    
+t_llrp_enumeration_item llrp_enum_list_StatusCode[] = {
+        
+    { "M_Success", 0 },
+    { "M_ParameterError", 1 },
+    { "M_FieldError", 2 },
+    { "M_UnexpectedParameter", 3 },
+    { "M_MissingParameter", 4 },
+    { "M_DuplicateParameter", 5 },
+    { "M_OverflowParameter", 6 },
+    { "M_OverflowField", 7 },
+    { "M_UnknownParameter", 8 },
+    { "M_UnknownField", 9 },
+    { "M_UnsupportedMessage", 10 },
+    { "M_UnsupportedVersion", 11 },
+    { "M_UnsupportedParameter", 12 },
+    { "P_ParameterError", 13 },
+    { "P_FieldError", 14 },
+    { "P_UnexpectedParameter", 15 },
+    { "P_MissingParameter", 16 },
+    { "P_DuplicateParameter", 17 },
+    { "P_OverflowParameter", 18 },
+    { "P_OverflowField", 19 },
+    { "P_UnknownParameter", 20 },
+    { "P_UnknownField", 21 },
+    { "P_UnsupportedParameter", 22 },
+    { "A_Invalid", 23 },
+    { "A_OutOfRange", 24 },
+    { "R_DeviceError", 25 },
+};
+t_llrp_enumeration llrp_enum_StatusCode = {
+    llrp_enum_list_StatusCode, 26
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2DRValue[] = {
+        
+    { "DRV_8", 0 },
+    { "DRV_64_3", 1 },
+};
+t_llrp_enumeration llrp_enum_C1G2DRValue = {
+    llrp_enum_list_C1G2DRValue, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2MValue[] = {
+        
+    { "MV_FM0", 0 },
+    { "MV_2", 1 },
+    { "MV_4", 2 },
+    { "MV_8", 3 },
+};
+t_llrp_enumeration llrp_enum_C1G2MValue = {
+    llrp_enum_list_C1G2MValue, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2ForwardLinkModulation[] = {
+        
+    { "PR_ASK", 0 },
+    { "SSB_ASK", 1 },
+    { "DSB_ASK", 2 },
+};
+t_llrp_enumeration llrp_enum_C1G2ForwardLinkModulation = {
+    llrp_enum_list_C1G2ForwardLinkModulation, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2SpectralMaskIndicator[] = {
+        
+    { "Unknown", 0 },
+    { "SI", 1 },
+    { "MI", 2 },
+    { "DI", 3 },
+};
+t_llrp_enumeration llrp_enum_C1G2SpectralMaskIndicator = {
+    llrp_enum_list_C1G2SpectralMaskIndicator, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2TruncateAction[] = {
+        
+    { "Unspecified", 0 },
+    { "Do_Not_Truncate", 1 },
+    { "Truncate", 2 },
+};
+t_llrp_enumeration llrp_enum_C1G2TruncateAction = {
+    llrp_enum_list_C1G2TruncateAction, 3
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2StateAwareTarget[] = {
+        
+    { "SL", 0 },
+    { "Inventoried_State_For_Session_S0", 1 },
+    { "Inventoried_State_For_Session_S1", 2 },
+    { "Inventoried_State_For_Session_S2", 3 },
+    { "Inventoried_State_For_Session_S3", 4 },
+};
+t_llrp_enumeration llrp_enum_C1G2StateAwareTarget = {
+    llrp_enum_list_C1G2StateAwareTarget, 5
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2StateAwareAction[] = {
+        
+    { "AssertSLOrA_DeassertSLOrB", 0 },
+    { "AssertSLOrA_Noop", 1 },
+    { "Noop_DeassertSLOrB", 2 },
+    { "NegateSLOrABBA_Noop", 3 },
+    { "DeassertSLOrB_AssertSLOrA", 4 },
+    { "DeassertSLOrB_Noop", 5 },
+    { "Noop_AssertSLOrA", 6 },
+    { "Noop_NegateSLOrABBA", 7 },
+};
+t_llrp_enumeration llrp_enum_C1G2StateAwareAction = {
+    llrp_enum_list_C1G2StateAwareAction, 8
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2StateUnawareAction[] = {
+        
+    { "Select_Unselect", 0 },
+    { "Select_DoNothing", 1 },
+    { "DoNothing_Unselect", 2 },
+    { "Unselect_DoNothing", 3 },
+    { "Unselect_Select", 4 },
+    { "DoNothing_Select", 5 },
+};
+t_llrp_enumeration llrp_enum_C1G2StateUnawareAction = {
+    llrp_enum_list_C1G2StateUnawareAction, 6
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2TagInventoryStateAwareI[] = {
+        
+    { "State_A", 0 },
+    { "State_B", 1 },
+};
+t_llrp_enumeration llrp_enum_C1G2TagInventoryStateAwareI = {
+    llrp_enum_list_C1G2TagInventoryStateAwareI, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2TagInventoryStateAwareS[] = {
+        
+    { "SL", 0 },
+    { "Not_SL", 1 },
+};
+t_llrp_enumeration llrp_enum_C1G2TagInventoryStateAwareS = {
+    llrp_enum_list_C1G2TagInventoryStateAwareS, 2
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2LockPrivilege[] = {
+        
+    { "Read_Write", 0 },
+    { "Perma_Lock", 1 },
+    { "Perma_Unlock", 2 },
+    { "Unlock", 3 },
+};
+t_llrp_enumeration llrp_enum_C1G2LockPrivilege = {
+    llrp_enum_list_C1G2LockPrivilege, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2LockDataField[] = {
+        
+    { "Kill_Password", 0 },
+    { "Access_Password", 1 },
+    { "EPC_Memory", 2 },
+    { "TID_Memory", 3 },
+    { "User_Memory", 4 },
+};
+t_llrp_enumeration llrp_enum_C1G2LockDataField = {
+    llrp_enum_list_C1G2LockDataField, 5
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2ReadResultType[] = {
+        
+    { "Success", 0 },
+    { "Nonspecific_Tag_Error", 1 },
+    { "No_Response_From_Tag", 2 },
+    { "Nonspecific_Reader_Error", 3 },
+};
+t_llrp_enumeration llrp_enum_C1G2ReadResultType = {
+    llrp_enum_list_C1G2ReadResultType, 4
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2WriteResultType[] = {
+        
+    { "Success", 0 },
+    { "Tag_Memory_Overrun_Error", 1 },
+    { "Tag_Memory_Locked_Error", 2 },
+    { "Insufficient_Power", 3 },
+    { "Nonspecific_Tag_Error", 4 },
+    { "No_Response_From_Tag", 5 },
+    { "Nonspecific_Reader_Error", 6 },
+};
+t_llrp_enumeration llrp_enum_C1G2WriteResultType = {
+    llrp_enum_list_C1G2WriteResultType, 7
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2KillResultType[] = {
+        
+    { "Success", 0 },
+    { "Zero_Kill_Password_Error", 1 },
+    { "Insufficient_Power", 2 },
+    { "Nonspecific_Tag_Error", 3 },
+    { "No_Response_From_Tag", 4 },
+    { "Nonspecific_Reader_Error", 5 },
+};
+t_llrp_enumeration llrp_enum_C1G2KillResultType = {
+    llrp_enum_list_C1G2KillResultType, 6
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2LockResultType[] = {
+        
+    { "Success", 0 },
+    { "Insufficient_Power", 1 },
+    { "Nonspecific_Tag_Error", 2 },
+    { "No_Response_From_Tag", 3 },
+    { "Nonspecific_Reader_Error", 4 },
+};
+t_llrp_enumeration llrp_enum_C1G2LockResultType = {
+    llrp_enum_list_C1G2LockResultType, 5
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2BlockEraseResultType[] = {
+        
+    { "Success", 0 },
+    { "Tag_Memory_Overrun_Error", 1 },
+    { "Tag_Memory_Locked_Error", 2 },
+    { "Insufficient_Power", 3 },
+    { "Nonspecific_Tag_Error", 4 },
+    { "No_Response_From_Tag", 5 },
+    { "Nonspecific_Reader_Error", 6 },
+};
+t_llrp_enumeration llrp_enum_C1G2BlockEraseResultType = {
+    llrp_enum_list_C1G2BlockEraseResultType, 7
+};
+    
+t_llrp_enumeration_item llrp_enum_list_C1G2BlockWriteResultType[] = {
+        
+    { "Success", 0 },
+    { "Tag_Memory_Overrun_Error", 1 },
+    { "Tag_Memory_Locked_Error", 2 },
+    { "Insufficient_Power", 3 },
+    { "Nonspecific_Tag_Error", 4 },
+    { "No_Response_From_Tag", 5 },
+    { "Nonspecific_Reader_Error", 6 },
+};
+t_llrp_enumeration llrp_enum_C1G2BlockWriteResultType = {
+    llrp_enum_list_C1G2BlockWriteResultType, 7
+};
+    
+
+/* ----------------------------------------------------------------------------- */
+/* Choice Definitions (unordered lists of parameters)                            */
+
+    
+/* Choice: SpecParameter */
+t_llrp_compound_item *llrp_choice_items_SpecParameter[] = {
+        
+    &llrp_param_AISpec,
+    &llrp_param_RFSurveySpec,
+    &llrp_param_Custom,
+};
+t_llrp_compound_item llrp_choice_SpecParameter = { 
+    "SpecParameter", LLRP_ITEM_CHOICE, 0, 3, llrp_choice_items_SpecParameter
+};
+    
+/* Choice: AccessCommandOpSpec */
+t_llrp_compound_item *llrp_choice_items_AccessCommandOpSpec[] = {
+        
+    &llrp_param_C1G2Read,
+    &llrp_param_C1G2Write,
+    &llrp_param_C1G2Kill,
+    &llrp_param_C1G2Lock,
+    &llrp_param_C1G2BlockErase,
+    &llrp_param_C1G2BlockWrite,
+};
+t_llrp_compound_item llrp_choice_AccessCommandOpSpec = { 
+    "AccessCommandOpSpec", LLRP_ITEM_CHOICE, 0, 6, llrp_choice_items_AccessCommandOpSpec
+};
+    
+/* Choice: AccessCommandOpSpecResult */
+t_llrp_compound_item *llrp_choice_items_AccessCommandOpSpecResult[] = {
+        
+    &llrp_param_C1G2ReadOpSpecResult,
+    &llrp_param_C1G2WriteOpSpecResult,
+    &llrp_param_C1G2KillOpSpecResult,
+    &llrp_param_C1G2LockOpSpecResult,
+    &llrp_param_C1G2BlockEraseOpSpecResult,
+    &llrp_param_C1G2BlockWriteOpSpecResult,
+};
+t_llrp_compound_item llrp_choice_AccessCommandOpSpecResult = { 
+    "AccessCommandOpSpecResult", LLRP_ITEM_CHOICE, 0, 6, llrp_choice_items_AccessCommandOpSpecResult
+};
+    
+/* Choice: EPCParameter */
+t_llrp_compound_item *llrp_choice_items_EPCParameter[] = {
+        
+    &llrp_param_EPCData,
+    &llrp_param_EPC_96,
+};
+t_llrp_compound_item llrp_choice_EPCParameter = { 
+    "EPCParameter", LLRP_ITEM_CHOICE, 0, 2, llrp_choice_items_EPCParameter
+};
+    
+/* Choice: Timestamp */
+t_llrp_compound_item *llrp_choice_items_Timestamp[] = {
+        
+    &llrp_param_UTCTimestamp,
+    &llrp_param_Uptime,
+};
+t_llrp_compound_item llrp_choice_Timestamp = { 
+    "Timestamp", LLRP_ITEM_CHOICE, 0, 2, llrp_choice_items_Timestamp
+};
+    
+/* Choice: AirProtocolLLRPCapabilities */
+t_llrp_compound_item *llrp_choice_items_AirProtocolLLRPCapabilities[] = {
+        
+    &llrp_param_C1G2LLRPCapabilities,
+};
+t_llrp_compound_item llrp_choice_AirProtocolLLRPCapabilities = { 
+    "AirProtocolLLRPCapabilities", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolLLRPCapabilities
+};
+    
+/* Choice: AirProtocolUHFRFModeTable */
+t_llrp_compound_item *llrp_choice_items_AirProtocolUHFRFModeTable[] = {
+        
+    &llrp_param_C1G2UHFRFModeTable,
+};
+t_llrp_compound_item llrp_choice_AirProtocolUHFRFModeTable = { 
+    "AirProtocolUHFRFModeTable", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolUHFRFModeTable
+};
+    
+/* Choice: AirProtocolInventoryCommandSettings */
+t_llrp_compound_item *llrp_choice_items_AirProtocolInventoryCommandSettings[] = {
+        
+    &llrp_param_C1G2InventoryCommand,
+};
+t_llrp_compound_item llrp_choice_AirProtocolInventoryCommandSettings = { 
+    "AirProtocolInventoryCommandSettings", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolInventoryCommandSettings
+};
+    
+/* Choice: AirProtocolTagSpec */
+t_llrp_compound_item *llrp_choice_items_AirProtocolTagSpec[] = {
+        
+    &llrp_param_C1G2TagSpec,
+};
+t_llrp_compound_item llrp_choice_AirProtocolTagSpec = { 
+    "AirProtocolTagSpec", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolTagSpec
+};
+    
+/* Choice: AirProtocolEPCMemorySelector */
+t_llrp_compound_item *llrp_choice_items_AirProtocolEPCMemorySelector[] = {
+        
+    &llrp_param_C1G2EPCMemorySelector,
+};
+t_llrp_compound_item llrp_choice_AirProtocolEPCMemorySelector = { 
+    "AirProtocolEPCMemorySelector", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolEPCMemorySelector
+};
+    
+/* Choice: AirProtocolTagData */
+t_llrp_compound_item *llrp_choice_items_AirProtocolTagData[] = {
+        
+    &llrp_param_C1G2_PC,
+    &llrp_param_C1G2_CRC,
+};
+t_llrp_compound_item llrp_choice_AirProtocolTagData = { 
+    "AirProtocolTagData", LLRP_ITEM_CHOICE, 0, 2, llrp_choice_items_AirProtocolTagData
+};
+    
+/* Choice: AirProtocolSingulationDetails */
+t_llrp_compound_item *llrp_choice_items_AirProtocolSingulationDetails[] = {
+        
+    &llrp_param_C1G2SingulationDetails,
+};
+t_llrp_compound_item llrp_choice_AirProtocolSingulationDetails = { 
+    "AirProtocolSingulationDetails", LLRP_ITEM_CHOICE, 0, 1, llrp_choice_items_AirProtocolSingulationDetails
+};
+    
+/* ----------------------------------------------------------------------------- */
+/* Choice List (12 total)                                  */
+
+t_llrp_compound_item *llrp_v1_0_choice_list[] = {
+  
+    &llrp_choice_SpecParameter,
+    &llrp_choice_AccessCommandOpSpec,
+    &llrp_choice_AccessCommandOpSpecResult,
+    &llrp_choice_EPCParameter,
+    &llrp_choice_Timestamp,
+    &llrp_choice_AirProtocolLLRPCapabilities,
+    &llrp_choice_AirProtocolUHFRFModeTable,
+    &llrp_choice_AirProtocolInventoryCommandSettings,
+    &llrp_choice_AirProtocolTagSpec,
+    &llrp_choice_AirProtocolEPCMemorySelector,
+    &llrp_choice_AirProtocolTagData,
+    &llrp_choice_AirProtocolSingulationDetails,
+};
+  
+/* ----------------------------------------------------------------------------- */
+/* Parameter Definitions (108 total) */
+    
+/* Parameter: UTCTimestamp */
+      
+t_llrp_item llrp_param_items_UTCTimestamp[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_UTCTimestamp = {
+    "UTCTimestamp", LLRP_ITEM_PARAMETER, 128, 1,
+      llrp_param_items_UTCTimestamp
+};
+    
+/* Parameter: Uptime */
+      
+t_llrp_item llrp_param_items_Uptime[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_Uptime = {
+    "Uptime", LLRP_ITEM_PARAMETER, 129, 1,
+      llrp_param_items_Uptime
+};
+    
+/* Parameter: Custom */
+      
+t_llrp_item llrp_param_items_Custom[] = {
+      
+    { "VendorIdentifier", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "ParameterSubtype", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "Data", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_bytesToEnd, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_Custom = {
+    "Custom", LLRP_ITEM_PARAMETER, 1023, 3,
+      llrp_param_items_Custom
+};
+    
+/* Parameter: GeneralDeviceCapabilities */
+      
+t_llrp_item llrp_param_items_GeneralDeviceCapabilities[] = {
+      
+    { "MaxNumberOfAntennaSupported", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "CanSetAntennaProperties", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "HasUTCClockCapability", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 14, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "DeviceManufacturerName", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "ModelName", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "ReaderFirmwareVersion", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "ReceiveSensitivityTableEntry", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_ReceiveSensitivityTableEntry },
+
+    { "PerAntennaReceiveSensitivityRange", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_PerAntennaReceiveSensitivityRange },
+
+    { "GPIOCapabilities", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_GPIOCapabilities },
+
+    { "PerAntennaAirProtocol", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_PerAntennaAirProtocol },
+
+};
+      
+t_llrp_compound_item llrp_param_GeneralDeviceCapabilities = {
+    "GeneralDeviceCapabilities", LLRP_ITEM_PARAMETER, 137, 11,
+      llrp_param_items_GeneralDeviceCapabilities
+};
+    
+/* Parameter: ReceiveSensitivityTableEntry */
+      
+t_llrp_item llrp_param_items_ReceiveSensitivityTableEntry[] = {
+      
+    { "Index", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ReceiveSensitivityValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_ReceiveSensitivityTableEntry = {
+    "ReceiveSensitivityTableEntry", LLRP_ITEM_PARAMETER, 139, 2,
+      llrp_param_items_ReceiveSensitivityTableEntry
+};
+    
+/* Parameter: PerAntennaReceiveSensitivityRange */
+      
+t_llrp_item llrp_param_items_PerAntennaReceiveSensitivityRange[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ReceiveSensitivityIndexMin", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ReceiveSensitivityIndexMax", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_PerAntennaReceiveSensitivityRange = {
+    "PerAntennaReceiveSensitivityRange", LLRP_ITEM_PARAMETER, 149, 3,
+      llrp_param_items_PerAntennaReceiveSensitivityRange
+};
+    
+/* Parameter: PerAntennaAirProtocol */
+      
+t_llrp_item llrp_param_items_PerAntennaAirProtocol[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ProtocolID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8v, 
+      &llrp_enum_AirProtocols },
+
+};
+      
+t_llrp_compound_item llrp_param_PerAntennaAirProtocol = {
+    "PerAntennaAirProtocol", LLRP_ITEM_PARAMETER, 140, 2,
+      llrp_param_items_PerAntennaAirProtocol
+};
+    
+/* Parameter: GPIOCapabilities */
+      
+t_llrp_item llrp_param_items_GPIOCapabilities[] = {
+      
+    { "NumGPIs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NumGPOs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_GPIOCapabilities = {
+    "GPIOCapabilities", LLRP_ITEM_PARAMETER, 141, 2,
+      llrp_param_items_GPIOCapabilities
+};
+    
+/* Parameter: LLRPCapabilities */
+      
+t_llrp_item llrp_param_items_LLRPCapabilities[] = {
+      
+    { "CanDoRFSurvey", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "CanReportBufferFillWarning", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "SupportsClientRequestOpSpec", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "CanDoTagInventoryStateAwareSingulation", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "SupportsEventAndReportHolding", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 3, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "MaxNumPriorityLevelsSupported", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+    { "ClientRequestOpSpecTimeout", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "MaxNumROSpecs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MaxNumSpecsPerROSpec", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MaxNumInventoryParameterSpecsPerAISpec", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MaxNumAccessSpecs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MaxNumOpSpecsPerAccessSpec", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_LLRPCapabilities = {
+    "LLRPCapabilities", LLRP_ITEM_PARAMETER, 142, 13,
+      llrp_param_items_LLRPCapabilities
+};
+    
+/* Parameter: RegulatoryCapabilities */
+      
+t_llrp_item llrp_param_items_RegulatoryCapabilities[] = {
+      
+    { "CountryCode", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "CommunicationsStandard", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_CommunicationsStandard },
+
+    { "UHFBandCapabilities", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_UHFBandCapabilities },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_RegulatoryCapabilities = {
+    "RegulatoryCapabilities", LLRP_ITEM_PARAMETER, 143, 4,
+      llrp_param_items_RegulatoryCapabilities
+};
+    
+/* Parameter: UHFBandCapabilities */
+      
+t_llrp_item llrp_param_items_UHFBandCapabilities[] = {
+      
+    { "TransmitPowerLevelTableEntry", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_TransmitPowerLevelTableEntry },
+
+    { "FrequencyInformation", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_FrequencyInformation },
+
+    { "AirProtocolUHFRFModeTable", LLRP_ITEM_CHOICE, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolUHFRFModeTable },
+
+};
+      
+t_llrp_compound_item llrp_param_UHFBandCapabilities = {
+    "UHFBandCapabilities", LLRP_ITEM_PARAMETER, 144, 3,
+      llrp_param_items_UHFBandCapabilities
+};
+    
+/* Parameter: TransmitPowerLevelTableEntry */
+      
+t_llrp_item llrp_param_items_TransmitPowerLevelTableEntry[] = {
+      
+    { "Index", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TransmitPowerValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_TransmitPowerLevelTableEntry = {
+    "TransmitPowerLevelTableEntry", LLRP_ITEM_PARAMETER, 145, 2,
+      llrp_param_items_TransmitPowerLevelTableEntry
+};
+    
+/* Parameter: FrequencyInformation */
+      
+t_llrp_item llrp_param_items_FrequencyInformation[] = {
+      
+    { "Hopping", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "FrequencyHopTable", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_FrequencyHopTable },
+
+    { "FixedFrequencyTable", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_FixedFrequencyTable },
+
+};
+      
+t_llrp_compound_item llrp_param_FrequencyInformation = {
+    "FrequencyInformation", LLRP_ITEM_PARAMETER, 146, 4,
+      llrp_param_items_FrequencyInformation
+};
+    
+/* Parameter: FrequencyHopTable */
+      
+t_llrp_item llrp_param_items_FrequencyHopTable[] = {
+      
+    { "HopTableID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 8, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "Frequency", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_FrequencyHopTable = {
+    "FrequencyHopTable", LLRP_ITEM_PARAMETER, 147, 3,
+      llrp_param_items_FrequencyHopTable
+};
+    
+/* Parameter: FixedFrequencyTable */
+      
+t_llrp_item llrp_param_items_FixedFrequencyTable[] = {
+      
+    { "Frequency", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_FixedFrequencyTable = {
+    "FixedFrequencyTable", LLRP_ITEM_PARAMETER, 148, 1,
+      llrp_param_items_FixedFrequencyTable
+};
+    
+/* Parameter: ROSpec */
+      
+t_llrp_item llrp_param_items_ROSpec[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "Priority", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+    { "CurrentState", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_ROSpecState },
+
+    { "ROBoundarySpec", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_ROBoundarySpec },
+
+    { "SpecParameter", LLRP_ITEM_CHOICE, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_SpecParameter },
+
+    { "ROReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROReportSpec },
+
+};
+      
+t_llrp_compound_item llrp_param_ROSpec = {
+    "ROSpec", LLRP_ITEM_PARAMETER, 177, 6,
+      llrp_param_items_ROSpec
+};
+    
+/* Parameter: ROBoundarySpec */
+      
+t_llrp_item llrp_param_items_ROBoundarySpec[] = {
+      
+    { "ROSpecStartTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecStartTrigger },
+
+    { "ROSpecStopTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecStopTrigger },
+
+};
+      
+t_llrp_compound_item llrp_param_ROBoundarySpec = {
+    "ROBoundarySpec", LLRP_ITEM_PARAMETER, 178, 2,
+      llrp_param_items_ROBoundarySpec
+};
+    
+/* Parameter: ROSpecStartTrigger */
+      
+t_llrp_item llrp_param_items_ROSpecStartTrigger[] = {
+      
+    { "ROSpecStartTriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_ROSpecStartTriggerType },
+
+    { "PeriodicTriggerValue", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_PeriodicTriggerValue },
+
+    { "GPITriggerValue", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_GPITriggerValue },
+
+};
+      
+t_llrp_compound_item llrp_param_ROSpecStartTrigger = {
+    "ROSpecStartTrigger", LLRP_ITEM_PARAMETER, 179, 3,
+      llrp_param_items_ROSpecStartTrigger
+};
+    
+/* Parameter: PeriodicTriggerValue */
+      
+t_llrp_item llrp_param_items_PeriodicTriggerValue[] = {
+      
+    { "Offset", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "Period", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "UTCTimestamp", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_UTCTimestamp },
+
+};
+      
+t_llrp_compound_item llrp_param_PeriodicTriggerValue = {
+    "PeriodicTriggerValue", LLRP_ITEM_PARAMETER, 180, 3,
+      llrp_param_items_PeriodicTriggerValue
+};
+    
+/* Parameter: GPITriggerValue */
+      
+t_llrp_item llrp_param_items_GPITriggerValue[] = {
+      
+    { "GPIPortNum", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "GPIEvent", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "Timeout", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_GPITriggerValue = {
+    "GPITriggerValue", LLRP_ITEM_PARAMETER, 181, 4,
+      llrp_param_items_GPITriggerValue
+};
+    
+/* Parameter: ROSpecStopTrigger */
+      
+t_llrp_item llrp_param_items_ROSpecStopTrigger[] = {
+      
+    { "ROSpecStopTriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_ROSpecStopTriggerType },
+
+    { "DurationTriggerValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "GPITriggerValue", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_GPITriggerValue },
+
+};
+      
+t_llrp_compound_item llrp_param_ROSpecStopTrigger = {
+    "ROSpecStopTrigger", LLRP_ITEM_PARAMETER, 182, 3,
+      llrp_param_items_ROSpecStopTrigger
+};
+    
+/* Parameter: AISpec */
+      
+t_llrp_item llrp_param_items_AISpec[] = {
+      
+    { "AntennaIDs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16v, 
+      NULL },
+
+    { "AISpecStopTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_AISpecStopTrigger },
+
+    { "InventoryParameterSpec", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_InventoryParameterSpec },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_AISpec = {
+    "AISpec", LLRP_ITEM_PARAMETER, 183, 4,
+      llrp_param_items_AISpec
+};
+    
+/* Parameter: AISpecStopTrigger */
+      
+t_llrp_item llrp_param_items_AISpecStopTrigger[] = {
+      
+    { "AISpecStopTriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AISpecStopTriggerType },
+
+    { "DurationTrigger", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "GPITriggerValue", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_GPITriggerValue },
+
+    { "TagObservationTrigger", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_TagObservationTrigger },
+
+};
+      
+t_llrp_compound_item llrp_param_AISpecStopTrigger = {
+    "AISpecStopTrigger", LLRP_ITEM_PARAMETER, 184, 4,
+      llrp_param_items_AISpecStopTrigger
+};
+    
+/* Parameter: TagObservationTrigger */
+      
+t_llrp_item llrp_param_items_TagObservationTrigger[] = {
+      
+    { "TriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_TagObservationTriggerType },
+
+    { "", LLRP_ITEM_RESERVED, 8, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "NumberOfTags", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NumberOfAttempts", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "T", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "Timeout", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_TagObservationTrigger = {
+    "TagObservationTrigger", LLRP_ITEM_PARAMETER, 185, 6,
+      llrp_param_items_TagObservationTrigger
+};
+    
+/* Parameter: InventoryParameterSpec */
+      
+t_llrp_item llrp_param_items_InventoryParameterSpec[] = {
+      
+    { "InventoryParameterSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ProtocolID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AirProtocols },
+
+    { "AntennaConfiguration", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaConfiguration },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_InventoryParameterSpec = {
+    "InventoryParameterSpec", LLRP_ITEM_PARAMETER, 186, 4,
+      llrp_param_items_InventoryParameterSpec
+};
+    
+/* Parameter: RFSurveySpec */
+      
+t_llrp_item llrp_param_items_RFSurveySpec[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "StartFrequency", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "EndFrequency", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "RFSurveySpecStopTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_RFSurveySpecStopTrigger },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_RFSurveySpec = {
+    "RFSurveySpec", LLRP_ITEM_PARAMETER, 187, 5,
+      llrp_param_items_RFSurveySpec
+};
+    
+/* Parameter: RFSurveySpecStopTrigger */
+      
+t_llrp_item llrp_param_items_RFSurveySpecStopTrigger[] = {
+      
+    { "StopTriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_RFSurveySpecStopTriggerType },
+
+    { "DurationPeriod", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "N", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_RFSurveySpecStopTrigger = {
+    "RFSurveySpecStopTrigger", LLRP_ITEM_PARAMETER, 188, 3,
+      llrp_param_items_RFSurveySpecStopTrigger
+};
+    
+/* Parameter: AccessSpec */
+      
+t_llrp_item llrp_param_items_AccessSpec[] = {
+      
+    { "AccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ProtocolID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AirProtocols },
+
+    { "CurrentState", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      &llrp_enum_AccessSpecState },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "AccessSpecStopTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_AccessSpecStopTrigger },
+
+    { "AccessCommand", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_AccessCommand },
+
+    { "AccessReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AccessReportSpec },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_AccessSpec = {
+    "AccessSpec", LLRP_ITEM_PARAMETER, 207, 10,
+      llrp_param_items_AccessSpec
+};
+    
+/* Parameter: AccessSpecStopTrigger */
+      
+t_llrp_item llrp_param_items_AccessSpecStopTrigger[] = {
+      
+    { "AccessSpecStopTrigger", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AccessSpecStopTriggerType },
+
+    { "OperationCountValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_AccessSpecStopTrigger = {
+    "AccessSpecStopTrigger", LLRP_ITEM_PARAMETER, 208, 2,
+      llrp_param_items_AccessSpecStopTrigger
+};
+    
+/* Parameter: AccessCommand */
+      
+t_llrp_item llrp_param_items_AccessCommand[] = {
+      
+    { "AirProtocolTagSpec", LLRP_ITEM_CHOICE, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolTagSpec },
+
+    { "AccessCommandOpSpec", LLRP_ITEM_CHOICE, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AccessCommandOpSpec },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_AccessCommand = {
+    "AccessCommand", LLRP_ITEM_PARAMETER, 209, 3,
+      llrp_param_items_AccessCommand
+};
+    
+/* Parameter: LLRPConfigurationStateValue */
+      
+t_llrp_item llrp_param_items_LLRPConfigurationStateValue[] = {
+      
+    { "LLRPConfigurationStateValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_LLRPConfigurationStateValue = {
+    "LLRPConfigurationStateValue", LLRP_ITEM_PARAMETER, 217, 1,
+      llrp_param_items_LLRPConfigurationStateValue
+};
+    
+/* Parameter: Identification */
+      
+t_llrp_item llrp_param_items_Identification[] = {
+      
+    { "IDType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_IdentificationType },
+
+    { "ReaderID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_Identification = {
+    "Identification", LLRP_ITEM_PARAMETER, 218, 2,
+      llrp_param_items_Identification
+};
+    
+/* Parameter: GPOWriteData */
+      
+t_llrp_item llrp_param_items_GPOWriteData[] = {
+      
+    { "GPOPortNumber", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "GPOData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_GPOWriteData = {
+    "GPOWriteData", LLRP_ITEM_PARAMETER, 219, 3,
+      llrp_param_items_GPOWriteData
+};
+    
+/* Parameter: KeepaliveSpec */
+      
+t_llrp_item llrp_param_items_KeepaliveSpec[] = {
+      
+    { "KeepaliveTriggerType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_KeepaliveTriggerType },
+
+    { "PeriodicTriggerValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_KeepaliveSpec = {
+    "KeepaliveSpec", LLRP_ITEM_PARAMETER, 220, 2,
+      llrp_param_items_KeepaliveSpec
+};
+    
+/* Parameter: AntennaProperties */
+      
+t_llrp_item llrp_param_items_AntennaProperties[] = {
+      
+    { "AntennaConnected", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AntennaGain", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_AntennaProperties = {
+    "AntennaProperties", LLRP_ITEM_PARAMETER, 221, 4,
+      llrp_param_items_AntennaProperties
+};
+    
+/* Parameter: AntennaConfiguration */
+      
+t_llrp_item llrp_param_items_AntennaConfiguration[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "RFReceiver", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_RFReceiver },
+
+    { "RFTransmitter", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_RFTransmitter },
+
+    { "AirProtocolInventoryCommandSettings", LLRP_ITEM_CHOICE, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolInventoryCommandSettings },
+
+};
+      
+t_llrp_compound_item llrp_param_AntennaConfiguration = {
+    "AntennaConfiguration", LLRP_ITEM_PARAMETER, 222, 4,
+      llrp_param_items_AntennaConfiguration
+};
+    
+/* Parameter: RFReceiver */
+      
+t_llrp_item llrp_param_items_RFReceiver[] = {
+      
+    { "ReceiverSensitivity", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_RFReceiver = {
+    "RFReceiver", LLRP_ITEM_PARAMETER, 223, 1,
+      llrp_param_items_RFReceiver
+};
+    
+/* Parameter: RFTransmitter */
+      
+t_llrp_item llrp_param_items_RFTransmitter[] = {
+      
+    { "HopTableID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ChannelIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TransmitPower", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_RFTransmitter = {
+    "RFTransmitter", LLRP_ITEM_PARAMETER, 224, 3,
+      llrp_param_items_RFTransmitter
+};
+    
+/* Parameter: GPIPortCurrentState */
+      
+t_llrp_item llrp_param_items_GPIPortCurrentState[] = {
+      
+    { "GPIPortNum", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "Config", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "State", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_GPIPortState },
+
+};
+      
+t_llrp_compound_item llrp_param_GPIPortCurrentState = {
+    "GPIPortCurrentState", LLRP_ITEM_PARAMETER, 225, 4,
+      llrp_param_items_GPIPortCurrentState
+};
+    
+/* Parameter: EventsAndReports */
+      
+t_llrp_item llrp_param_items_EventsAndReports[] = {
+      
+    { "HoldEventsAndReportsUponReconnect", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_EventsAndReports = {
+    "EventsAndReports", LLRP_ITEM_PARAMETER, 226, 2,
+      llrp_param_items_EventsAndReports
+};
+    
+/* Parameter: ROReportSpec */
+      
+t_llrp_item llrp_param_items_ROReportSpec[] = {
+      
+    { "ROReportTrigger", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_ROReportTriggerType },
+
+    { "N", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TagReportContentSelector", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_TagReportContentSelector },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_ROReportSpec = {
+    "ROReportSpec", LLRP_ITEM_PARAMETER, 237, 4,
+      llrp_param_items_ROReportSpec
+};
+    
+/* Parameter: TagReportContentSelector */
+      
+t_llrp_item llrp_param_items_TagReportContentSelector[] = {
+      
+    { "EnableROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableSpecIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableInventoryParameterSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableAntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableChannelIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnablePeakRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableFirstSeenTimestamp", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableLastSeenTimestamp", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableTagSeenCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableAccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "AirProtocolEPCMemorySelector", LLRP_ITEM_CHOICE, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolEPCMemorySelector },
+
+};
+      
+t_llrp_compound_item llrp_param_TagReportContentSelector = {
+    "TagReportContentSelector", LLRP_ITEM_PARAMETER, 238, 12,
+      llrp_param_items_TagReportContentSelector
+};
+    
+/* Parameter: AccessReportSpec */
+      
+t_llrp_item llrp_param_items_AccessReportSpec[] = {
+      
+    { "AccessReportTrigger", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AccessReportTriggerType },
+
+};
+      
+t_llrp_compound_item llrp_param_AccessReportSpec = {
+    "AccessReportSpec", LLRP_ITEM_PARAMETER, 239, 1,
+      llrp_param_items_AccessReportSpec
+};
+    
+/* Parameter: TagReportData */
+      
+t_llrp_item llrp_param_items_TagReportData[] = {
+      
+    { "EPCParameter", LLRP_ITEM_CHOICE, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_choice_EPCParameter },
+
+    { "ROSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecID },
+
+    { "SpecIndex", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_SpecIndex },
+
+    { "InventoryParameterSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_InventoryParameterSpecID },
+
+    { "AntennaID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaID },
+
+    { "PeakRSSI", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_PeakRSSI },
+
+    { "ChannelIndex", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ChannelIndex },
+
+    { "FirstSeenTimestampUTC", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_FirstSeenTimestampUTC },
+
+    { "FirstSeenTimestampUptime", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_FirstSeenTimestampUptime },
+
+    { "LastSeenTimestampUTC", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_LastSeenTimestampUTC },
+
+    { "LastSeenTimestampUptime", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_LastSeenTimestampUptime },
+
+    { "TagSeenCount", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_TagSeenCount },
+
+    { "AirProtocolTagData", LLRP_ITEM_CHOICE, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolTagData },
+
+    { "AccessSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AccessSpecID },
+
+    { "AccessCommandOpSpecResult", LLRP_ITEM_CHOICE, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_choice_AccessCommandOpSpecResult },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_TagReportData = {
+    "TagReportData", LLRP_ITEM_PARAMETER, 240, 16,
+      llrp_param_items_TagReportData
+};
+    
+/* Parameter: EPCData */
+      
+t_llrp_item llrp_param_items_EPCData[] = {
+      
+    { "EPC", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_EPCData = {
+    "EPCData", LLRP_ITEM_PARAMETER, 241, 1,
+      llrp_param_items_EPCData
+};
+    
+/* Parameter: EPC_96 */
+      
+t_llrp_item llrp_param_items_EPC_96[] = {
+      
+    { "EPC", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u96, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_EPC_96 = {
+    "EPC_96", LLRP_ITEM_PARAMETER, 13, 1,
+      llrp_param_items_EPC_96
+};
+    
+/* Parameter: ROSpecID */
+      
+t_llrp_item llrp_param_items_ROSpecID[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_ROSpecID = {
+    "ROSpecID", LLRP_ITEM_PARAMETER, 9, 1,
+      llrp_param_items_ROSpecID
+};
+    
+/* Parameter: SpecIndex */
+      
+t_llrp_item llrp_param_items_SpecIndex[] = {
+      
+    { "SpecIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_SpecIndex = {
+    "SpecIndex", LLRP_ITEM_PARAMETER, 14, 1,
+      llrp_param_items_SpecIndex
+};
+    
+/* Parameter: InventoryParameterSpecID */
+      
+t_llrp_item llrp_param_items_InventoryParameterSpecID[] = {
+      
+    { "InventoryParameterSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_InventoryParameterSpecID = {
+    "InventoryParameterSpecID", LLRP_ITEM_PARAMETER, 10, 1,
+      llrp_param_items_InventoryParameterSpecID
+};
+    
+/* Parameter: AntennaID */
+      
+t_llrp_item llrp_param_items_AntennaID[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_AntennaID = {
+    "AntennaID", LLRP_ITEM_PARAMETER, 1, 1,
+      llrp_param_items_AntennaID
+};
+    
+/* Parameter: PeakRSSI */
+      
+t_llrp_item llrp_param_items_PeakRSSI[] = {
+      
+    { "PeakRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_PeakRSSI = {
+    "PeakRSSI", LLRP_ITEM_PARAMETER, 6, 1,
+      llrp_param_items_PeakRSSI
+};
+    
+/* Parameter: ChannelIndex */
+      
+t_llrp_item llrp_param_items_ChannelIndex[] = {
+      
+    { "ChannelIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_ChannelIndex = {
+    "ChannelIndex", LLRP_ITEM_PARAMETER, 7, 1,
+      llrp_param_items_ChannelIndex
+};
+    
+/* Parameter: FirstSeenTimestampUTC */
+      
+t_llrp_item llrp_param_items_FirstSeenTimestampUTC[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_FirstSeenTimestampUTC = {
+    "FirstSeenTimestampUTC", LLRP_ITEM_PARAMETER, 2, 1,
+      llrp_param_items_FirstSeenTimestampUTC
+};
+    
+/* Parameter: FirstSeenTimestampUptime */
+      
+t_llrp_item llrp_param_items_FirstSeenTimestampUptime[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_FirstSeenTimestampUptime = {
+    "FirstSeenTimestampUptime", LLRP_ITEM_PARAMETER, 3, 1,
+      llrp_param_items_FirstSeenTimestampUptime
+};
+    
+/* Parameter: LastSeenTimestampUTC */
+      
+t_llrp_item llrp_param_items_LastSeenTimestampUTC[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_LastSeenTimestampUTC = {
+    "LastSeenTimestampUTC", LLRP_ITEM_PARAMETER, 4, 1,
+      llrp_param_items_LastSeenTimestampUTC
+};
+    
+/* Parameter: LastSeenTimestampUptime */
+      
+t_llrp_item llrp_param_items_LastSeenTimestampUptime[] = {
+      
+    { "Microseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_LastSeenTimestampUptime = {
+    "LastSeenTimestampUptime", LLRP_ITEM_PARAMETER, 5, 1,
+      llrp_param_items_LastSeenTimestampUptime
+};
+    
+/* Parameter: TagSeenCount */
+      
+t_llrp_item llrp_param_items_TagSeenCount[] = {
+      
+    { "TagCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_TagSeenCount = {
+    "TagSeenCount", LLRP_ITEM_PARAMETER, 8, 1,
+      llrp_param_items_TagSeenCount
+};
+    
+/* Parameter: AccessSpecID */
+      
+t_llrp_item llrp_param_items_AccessSpecID[] = {
+      
+    { "AccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_AccessSpecID = {
+    "AccessSpecID", LLRP_ITEM_PARAMETER, 16, 1,
+      llrp_param_items_AccessSpecID
+};
+    
+/* Parameter: RFSurveyReportData */
+      
+t_llrp_item llrp_param_items_RFSurveyReportData[] = {
+      
+    { "ROSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecID },
+
+    { "SpecIndex", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_SpecIndex },
+
+    { "FrequencyRSSILevelEntry", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_FrequencyRSSILevelEntry },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_RFSurveyReportData = {
+    "RFSurveyReportData", LLRP_ITEM_PARAMETER, 242, 4,
+      llrp_param_items_RFSurveyReportData
+};
+    
+/* Parameter: FrequencyRSSILevelEntry */
+      
+t_llrp_item llrp_param_items_FrequencyRSSILevelEntry[] = {
+      
+    { "Frequency", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "Bandwidth", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "AverageRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s8, 
+      NULL },
+
+    { "PeakRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s8, 
+      NULL },
+
+    { "Timestamp", LLRP_ITEM_CHOICE, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_choice_Timestamp },
+
+};
+      
+t_llrp_compound_item llrp_param_FrequencyRSSILevelEntry = {
+    "FrequencyRSSILevelEntry", LLRP_ITEM_PARAMETER, 243, 5,
+      llrp_param_items_FrequencyRSSILevelEntry
+};
+    
+/* Parameter: ReaderEventNotificationSpec */
+      
+t_llrp_item llrp_param_items_ReaderEventNotificationSpec[] = {
+      
+    { "EventNotificationState", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_EventNotificationState },
+
+};
+      
+t_llrp_compound_item llrp_param_ReaderEventNotificationSpec = {
+    "ReaderEventNotificationSpec", LLRP_ITEM_PARAMETER, 244, 1,
+      llrp_param_items_ReaderEventNotificationSpec
+};
+    
+/* Parameter: EventNotificationState */
+      
+t_llrp_item llrp_param_items_EventNotificationState[] = {
+      
+    { "EventType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_NotificationEventType },
+
+    { "NotificationState", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_EventNotificationState = {
+    "EventNotificationState", LLRP_ITEM_PARAMETER, 245, 3,
+      llrp_param_items_EventNotificationState
+};
+    
+/* Parameter: ReaderEventNotificationData */
+      
+t_llrp_item llrp_param_items_ReaderEventNotificationData[] = {
+      
+    { "Timestamp", LLRP_ITEM_CHOICE, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_choice_Timestamp },
+
+    { "HoppingEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_HoppingEvent },
+
+    { "GPIEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_GPIEvent },
+
+    { "ROSpecEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecEvent },
+
+    { "ReportBufferLevelWarningEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ReportBufferLevelWarningEvent },
+
+    { "ReportBufferOverflowErrorEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ReportBufferOverflowErrorEvent },
+
+    { "ReaderExceptionEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ReaderExceptionEvent },
+
+    { "RFSurveyEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_RFSurveyEvent },
+
+    { "AISpecEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AISpecEvent },
+
+    { "AntennaEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaEvent },
+
+    { "ConnectionAttemptEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ConnectionAttemptEvent },
+
+    { "ConnectionCloseEvent", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ConnectionCloseEvent },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_ReaderEventNotificationData = {
+    "ReaderEventNotificationData", LLRP_ITEM_PARAMETER, 246, 13,
+      llrp_param_items_ReaderEventNotificationData
+};
+    
+/* Parameter: HoppingEvent */
+      
+t_llrp_item llrp_param_items_HoppingEvent[] = {
+      
+    { "HopTableID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NextChannelIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_HoppingEvent = {
+    "HoppingEvent", LLRP_ITEM_PARAMETER, 247, 2,
+      llrp_param_items_HoppingEvent
+};
+    
+/* Parameter: GPIEvent */
+      
+t_llrp_item llrp_param_items_GPIEvent[] = {
+      
+    { "GPIPortNumber", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "GPIEvent", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_GPIEvent = {
+    "GPIEvent", LLRP_ITEM_PARAMETER, 248, 3,
+      llrp_param_items_GPIEvent
+};
+    
+/* Parameter: ROSpecEvent */
+      
+t_llrp_item llrp_param_items_ROSpecEvent[] = {
+      
+    { "EventType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_ROSpecEventType },
+
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "PreemptingROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_ROSpecEvent = {
+    "ROSpecEvent", LLRP_ITEM_PARAMETER, 249, 3,
+      llrp_param_items_ROSpecEvent
+};
+    
+/* Parameter: ReportBufferLevelWarningEvent */
+      
+t_llrp_item llrp_param_items_ReportBufferLevelWarningEvent[] = {
+      
+    { "ReportBufferPercentageFull", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_ReportBufferLevelWarningEvent = {
+    "ReportBufferLevelWarningEvent", LLRP_ITEM_PARAMETER, 250, 1,
+      llrp_param_items_ReportBufferLevelWarningEvent
+};
+    
+/* Parameter: ReportBufferOverflowErrorEvent */
+      
+t_llrp_compound_item llrp_param_ReportBufferOverflowErrorEvent = {
+    "ReportBufferOverflowErrorEvent", LLRP_ITEM_PARAMETER, 251, 0,
+      NULL
+};
+    
+/* Parameter: ReaderExceptionEvent */
+      
+t_llrp_item llrp_param_items_ReaderExceptionEvent[] = {
+      
+    { "Message", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "ROSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpecID },
+
+    { "SpecIndex", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_SpecIndex },
+
+    { "InventoryParameterSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_InventoryParameterSpecID },
+
+    { "AntennaID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaID },
+
+    { "AccessSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AccessSpecID },
+
+    { "OpSpecID", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_OpSpecID },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_ReaderExceptionEvent = {
+    "ReaderExceptionEvent", LLRP_ITEM_PARAMETER, 252, 8,
+      llrp_param_items_ReaderExceptionEvent
+};
+    
+/* Parameter: OpSpecID */
+      
+t_llrp_item llrp_param_items_OpSpecID[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_OpSpecID = {
+    "OpSpecID", LLRP_ITEM_PARAMETER, 17, 1,
+      llrp_param_items_OpSpecID
+};
+    
+/* Parameter: RFSurveyEvent */
+      
+t_llrp_item llrp_param_items_RFSurveyEvent[] = {
+      
+    { "EventType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_RFSurveyEventType },
+
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "SpecIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_RFSurveyEvent = {
+    "RFSurveyEvent", LLRP_ITEM_PARAMETER, 253, 3,
+      llrp_param_items_RFSurveyEvent
+};
+    
+/* Parameter: AISpecEvent */
+      
+t_llrp_item llrp_param_items_AISpecEvent[] = {
+      
+    { "EventType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AISpecEventType },
+
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "SpecIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AirProtocolSingulationDetails", LLRP_ITEM_CHOICE, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolSingulationDetails },
+
+};
+      
+t_llrp_compound_item llrp_param_AISpecEvent = {
+    "AISpecEvent", LLRP_ITEM_PARAMETER, 254, 4,
+      llrp_param_items_AISpecEvent
+};
+    
+/* Parameter: AntennaEvent */
+      
+t_llrp_item llrp_param_items_AntennaEvent[] = {
+      
+    { "EventType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_AntennaEventType },
+
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_AntennaEvent = {
+    "AntennaEvent", LLRP_ITEM_PARAMETER, 255, 2,
+      llrp_param_items_AntennaEvent
+};
+    
+/* Parameter: ConnectionAttemptEvent */
+      
+t_llrp_item llrp_param_items_ConnectionAttemptEvent[] = {
+      
+    { "Status", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_ConnectionAttemptStatusType },
+
+};
+      
+t_llrp_compound_item llrp_param_ConnectionAttemptEvent = {
+    "ConnectionAttemptEvent", LLRP_ITEM_PARAMETER, 256, 1,
+      llrp_param_items_ConnectionAttemptEvent
+};
+    
+/* Parameter: ConnectionCloseEvent */
+      
+t_llrp_compound_item llrp_param_ConnectionCloseEvent = {
+    "ConnectionCloseEvent", LLRP_ITEM_PARAMETER, 257, 0,
+      NULL
+};
+    
+/* Parameter: LLRPStatus */
+      
+t_llrp_item llrp_param_items_LLRPStatus[] = {
+      
+    { "StatusCode", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_StatusCode },
+
+    { "ErrorDescription", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "FieldError", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_FieldError },
+
+    { "ParameterError", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ParameterError },
+
+};
+      
+t_llrp_compound_item llrp_param_LLRPStatus = {
+    "LLRPStatus", LLRP_ITEM_PARAMETER, 287, 4,
+      llrp_param_items_LLRPStatus
+};
+    
+/* Parameter: FieldError */
+      
+t_llrp_item llrp_param_items_FieldError[] = {
+      
+    { "FieldNum", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ErrorCode", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_StatusCode },
+
+};
+      
+t_llrp_compound_item llrp_param_FieldError = {
+    "FieldError", LLRP_ITEM_PARAMETER, 288, 2,
+      llrp_param_items_FieldError
+};
+    
+/* Parameter: ParameterError */
+      
+t_llrp_item llrp_param_items_ParameterError[] = {
+      
+    { "ParameterType", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ErrorCode", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_StatusCode },
+
+    { "FieldError", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_FieldError },
+
+    { "ParameterError", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ParameterError },
+
+};
+      
+t_llrp_compound_item llrp_param_ParameterError = {
+    "ParameterError", LLRP_ITEM_PARAMETER, 289, 4,
+      llrp_param_items_ParameterError
+};
+    
+/* Parameter: C1G2LLRPCapabilities */
+      
+t_llrp_item llrp_param_items_C1G2LLRPCapabilities[] = {
+      
+    { "CanSupportBlockErase", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "CanSupportBlockWrite", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "MaxNumSelectFiltersPerQuery", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2LLRPCapabilities = {
+    "C1G2LLRPCapabilities", LLRP_ITEM_PARAMETER, 327, 4,
+      llrp_param_items_C1G2LLRPCapabilities
+};
+    
+/* Parameter: C1G2UHFRFModeTable */
+      
+t_llrp_item llrp_param_items_C1G2UHFRFModeTable[] = {
+      
+    { "C1G2UHFRFModeTableEntry", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2UHFRFModeTableEntry },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2UHFRFModeTable = {
+    "C1G2UHFRFModeTable", LLRP_ITEM_PARAMETER, 328, 1,
+      llrp_param_items_C1G2UHFRFModeTable
+};
+    
+/* Parameter: C1G2UHFRFModeTableEntry */
+      
+t_llrp_item llrp_param_items_C1G2UHFRFModeTableEntry[] = {
+      
+    { "ModeIdentifier", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "DRValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      &llrp_enum_C1G2DRValue },
+
+    { "EPCHAGTCConformance", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "MValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2MValue },
+
+    { "ForwardLinkModulation", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2ForwardLinkModulation },
+
+    { "SpectralMaskIndicator", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2SpectralMaskIndicator },
+
+    { "BDRValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "PIEValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MinTariValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MaxTariValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "StepTariValue", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2UHFRFModeTableEntry = {
+    "C1G2UHFRFModeTableEntry", LLRP_ITEM_PARAMETER, 329, 12,
+      llrp_param_items_C1G2UHFRFModeTableEntry
+};
+    
+/* Parameter: C1G2InventoryCommand */
+      
+t_llrp_item llrp_param_items_C1G2InventoryCommand[] = {
+      
+    { "TagInventoryStateAware", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "C1G2Filter", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2Filter },
+
+    { "C1G2RFControl", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2RFControl },
+
+    { "C1G2SingulationControl", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2SingulationControl },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2InventoryCommand = {
+    "C1G2InventoryCommand", LLRP_ITEM_PARAMETER, 330, 6,
+      llrp_param_items_C1G2InventoryCommand
+};
+    
+/* Parameter: C1G2Filter */
+      
+t_llrp_item llrp_param_items_C1G2Filter[] = {
+      
+    { "T", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      &llrp_enum_C1G2TruncateAction },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "C1G2TagInventoryMask", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2TagInventoryMask },
+
+    { "C1G2TagInventoryStateAwareFilterAction", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2TagInventoryStateAwareFilterAction },
+
+    { "C1G2TagInventoryStateUnawareFilterAction", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2TagInventoryStateUnawareFilterAction },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2Filter = {
+    "C1G2Filter", LLRP_ITEM_PARAMETER, 331, 5,
+      llrp_param_items_C1G2Filter
+};
+    
+/* Parameter: C1G2TagInventoryMask */
+      
+t_llrp_item llrp_param_items_C1G2TagInventoryMask[] = {
+      
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "Pointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TagMask", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TagInventoryMask = {
+    "C1G2TagInventoryMask", LLRP_ITEM_PARAMETER, 332, 4,
+      llrp_param_items_C1G2TagInventoryMask
+};
+    
+/* Parameter: C1G2TagInventoryStateAwareFilterAction */
+      
+t_llrp_item llrp_param_items_C1G2TagInventoryStateAwareFilterAction[] = {
+      
+    { "Target", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2StateAwareTarget },
+
+    { "Action", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2StateAwareAction },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TagInventoryStateAwareFilterAction = {
+    "C1G2TagInventoryStateAwareFilterAction", LLRP_ITEM_PARAMETER, 333, 2,
+      llrp_param_items_C1G2TagInventoryStateAwareFilterAction
+};
+    
+/* Parameter: C1G2TagInventoryStateUnawareFilterAction */
+      
+t_llrp_item llrp_param_items_C1G2TagInventoryStateUnawareFilterAction[] = {
+      
+    { "Action", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2StateUnawareAction },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TagInventoryStateUnawareFilterAction = {
+    "C1G2TagInventoryStateUnawareFilterAction", LLRP_ITEM_PARAMETER, 334, 1,
+      llrp_param_items_C1G2TagInventoryStateUnawareFilterAction
+};
+    
+/* Parameter: C1G2RFControl */
+      
+t_llrp_item llrp_param_items_C1G2RFControl[] = {
+      
+    { "ModeIndex", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "Tari", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2RFControl = {
+    "C1G2RFControl", LLRP_ITEM_PARAMETER, 335, 2,
+      llrp_param_items_C1G2RFControl
+};
+    
+/* Parameter: C1G2SingulationControl */
+      
+t_llrp_item llrp_param_items_C1G2SingulationControl[] = {
+      
+    { "Session", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "TagPopulation", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TagTransitTime", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "C1G2TagInventoryStateAwareSingulationAction", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2TagInventoryStateAwareSingulationAction },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2SingulationControl = {
+    "C1G2SingulationControl", LLRP_ITEM_PARAMETER, 336, 5,
+      llrp_param_items_C1G2SingulationControl
+};
+    
+/* Parameter: C1G2TagInventoryStateAwareSingulationAction */
+      
+t_llrp_item llrp_param_items_C1G2TagInventoryStateAwareSingulationAction[] = {
+      
+    { "I", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      &llrp_enum_C1G2TagInventoryStateAwareI },
+
+    { "S", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      &llrp_enum_C1G2TagInventoryStateAwareS },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TagInventoryStateAwareSingulationAction = {
+    "C1G2TagInventoryStateAwareSingulationAction", LLRP_ITEM_PARAMETER, 337, 3,
+      llrp_param_items_C1G2TagInventoryStateAwareSingulationAction
+};
+    
+/* Parameter: C1G2TagSpec */
+      
+t_llrp_item llrp_param_items_C1G2TagSpec[] = {
+      
+    { "C1G2TargetTag", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2TargetTag },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TagSpec = {
+    "C1G2TagSpec", LLRP_ITEM_PARAMETER, 338, 1,
+      llrp_param_items_C1G2TagSpec
+};
+    
+/* Parameter: C1G2TargetTag */
+      
+t_llrp_item llrp_param_items_C1G2TargetTag[] = {
+      
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "Match", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 5, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "Pointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "TagMask", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1v, 
+      NULL },
+
+    { "TagData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2TargetTag = {
+    "C1G2TargetTag", LLRP_ITEM_PARAMETER, 339, 6,
+      llrp_param_items_C1G2TargetTag
+};
+    
+/* Parameter: C1G2Read */
+      
+t_llrp_item llrp_param_items_C1G2Read[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "WordPointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "WordCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2Read = {
+    "C1G2Read", LLRP_ITEM_PARAMETER, 341, 6,
+      llrp_param_items_C1G2Read
+};
+    
+/* Parameter: C1G2Write */
+      
+t_llrp_item llrp_param_items_C1G2Write[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "WordPointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "WriteData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2Write = {
+    "C1G2Write", LLRP_ITEM_PARAMETER, 342, 6,
+      llrp_param_items_C1G2Write
+};
+    
+/* Parameter: C1G2Kill */
+      
+t_llrp_item llrp_param_items_C1G2Kill[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "KillPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2Kill = {
+    "C1G2Kill", LLRP_ITEM_PARAMETER, 343, 2,
+      llrp_param_items_C1G2Kill
+};
+    
+/* Parameter: C1G2Lock */
+      
+t_llrp_item llrp_param_items_C1G2Lock[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "C1G2LockPayload", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_C1G2LockPayload },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2Lock = {
+    "C1G2Lock", LLRP_ITEM_PARAMETER, 344, 3,
+      llrp_param_items_C1G2Lock
+};
+    
+/* Parameter: C1G2LockPayload */
+      
+t_llrp_item llrp_param_items_C1G2LockPayload[] = {
+      
+    { "Privilege", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2LockPrivilege },
+
+    { "DataField", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2LockDataField },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2LockPayload = {
+    "C1G2LockPayload", LLRP_ITEM_PARAMETER, 345, 2,
+      llrp_param_items_C1G2LockPayload
+};
+    
+/* Parameter: C1G2BlockErase */
+      
+t_llrp_item llrp_param_items_C1G2BlockErase[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "WordPointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "WordCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2BlockErase = {
+    "C1G2BlockErase", LLRP_ITEM_PARAMETER, 346, 6,
+      llrp_param_items_C1G2BlockErase
+};
+    
+/* Parameter: C1G2BlockWrite */
+      
+t_llrp_item llrp_param_items_C1G2BlockWrite[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MB", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u2, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "WordPointer", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "WriteData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2BlockWrite = {
+    "C1G2BlockWrite", LLRP_ITEM_PARAMETER, 347, 6,
+      llrp_param_items_C1G2BlockWrite
+};
+    
+/* Parameter: C1G2EPCMemorySelector */
+      
+t_llrp_item llrp_param_items_C1G2EPCMemorySelector[] = {
+      
+    { "EnableCRC", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnablePCBits", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 6, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2EPCMemorySelector = {
+    "C1G2EPCMemorySelector", LLRP_ITEM_PARAMETER, 348, 3,
+      llrp_param_items_C1G2EPCMemorySelector
+};
+    
+/* Parameter: C1G2_PC */
+      
+t_llrp_item llrp_param_items_C1G2_PC[] = {
+      
+    { "PC_Bits", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2_PC = {
+    "C1G2_PC", LLRP_ITEM_PARAMETER, 12, 1,
+      llrp_param_items_C1G2_PC
+};
+    
+/* Parameter: C1G2_CRC */
+      
+t_llrp_item llrp_param_items_C1G2_CRC[] = {
+      
+    { "CRC", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2_CRC = {
+    "C1G2_CRC", LLRP_ITEM_PARAMETER, 11, 1,
+      llrp_param_items_C1G2_CRC
+};
+    
+/* Parameter: C1G2SingulationDetails */
+      
+t_llrp_item llrp_param_items_C1G2SingulationDetails[] = {
+      
+    { "NumCollisionSlots", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NumEmptySlots", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2SingulationDetails = {
+    "C1G2SingulationDetails", LLRP_ITEM_PARAMETER, 18, 2,
+      llrp_param_items_C1G2SingulationDetails
+};
+    
+/* Parameter: C1G2ReadOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2ReadOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2ReadResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "ReadData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16v, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2ReadOpSpecResult = {
+    "C1G2ReadOpSpecResult", LLRP_ITEM_PARAMETER, 349, 3,
+      llrp_param_items_C1G2ReadOpSpecResult
+};
+    
+/* Parameter: C1G2WriteOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2WriteOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2WriteResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NumWordsWritten", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2WriteOpSpecResult = {
+    "C1G2WriteOpSpecResult", LLRP_ITEM_PARAMETER, 350, 3,
+      llrp_param_items_C1G2WriteOpSpecResult
+};
+    
+/* Parameter: C1G2KillOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2KillOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2KillResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2KillOpSpecResult = {
+    "C1G2KillOpSpecResult", LLRP_ITEM_PARAMETER, 351, 2,
+      llrp_param_items_C1G2KillOpSpecResult
+};
+    
+/* Parameter: C1G2LockOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2LockOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2LockResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2LockOpSpecResult = {
+    "C1G2LockOpSpecResult", LLRP_ITEM_PARAMETER, 352, 2,
+      llrp_param_items_C1G2LockOpSpecResult
+};
+    
+/* Parameter: C1G2BlockEraseOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2BlockEraseOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2BlockEraseResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2BlockEraseOpSpecResult = {
+    "C1G2BlockEraseOpSpecResult", LLRP_ITEM_PARAMETER, 353, 2,
+      llrp_param_items_C1G2BlockEraseOpSpecResult
+};
+    
+/* Parameter: C1G2BlockWriteOpSpecResult */
+      
+t_llrp_item llrp_param_items_C1G2BlockWriteOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_C1G2BlockWriteResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "NumWordsWritten", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_param_C1G2BlockWriteOpSpecResult = {
+    "C1G2BlockWriteOpSpecResult", LLRP_ITEM_PARAMETER, 354, 3,
+      llrp_param_items_C1G2BlockWriteOpSpecResult
+};
+    
+/* ----------------------------------------------------------------------------- */
+/* Parameter List (108 total) */
+
+t_llrp_standard_map_item llrp_v1_0_parameter_list[] = {
+  
+    { 1, &llrp_param_AntennaID,
+        
+    },
+  
+    { 2, &llrp_param_FirstSeenTimestampUTC,
+        
+    },
+  
+    { 3, &llrp_param_FirstSeenTimestampUptime,
+        
+    },
+  
+    { 4, &llrp_param_LastSeenTimestampUTC,
+        
+    },
+  
+    { 5, &llrp_param_LastSeenTimestampUptime,
+        
+    },
+  
+    { 6, &llrp_param_PeakRSSI,
+        
+    },
+  
+    { 7, &llrp_param_ChannelIndex,
+        
+    },
+  
+    { 8, &llrp_param_TagSeenCount,
+        
+    },
+  
+    { 9, &llrp_param_ROSpecID,
+        
+    },
+  
+    { 10, &llrp_param_InventoryParameterSpecID,
+        
+    },
+  
+    { 11, &llrp_param_C1G2_CRC,
+        
+    },
+  
+    { 12, &llrp_param_C1G2_PC,
+        
+    },
+  
+    { 13, &llrp_param_EPC_96,
+        
+    },
+  
+    { 14, &llrp_param_SpecIndex,
+        
+    },
+  
+    { 16, &llrp_param_AccessSpecID,
+        
+    },
+  
+    { 17, &llrp_param_OpSpecID,
+        
+    },
+  
+    { 18, &llrp_param_C1G2SingulationDetails,
+        
+    },
+  
+    { 128, &llrp_param_UTCTimestamp,
+        
+    },
+  
+    { 129, &llrp_param_Uptime,
+        
+    },
+  
+    { 137, &llrp_param_GeneralDeviceCapabilities,
+        
+    },
+  
+    { 139, &llrp_param_ReceiveSensitivityTableEntry,
+        
+    },
+  
+    { 140, &llrp_param_PerAntennaAirProtocol,
+        
+    },
+  
+    { 141, &llrp_param_GPIOCapabilities,
+        
+    },
+  
+    { 142, &llrp_param_LLRPCapabilities,
+        
+    },
+  
+    { 143, &llrp_param_RegulatoryCapabilities,
+        
+    },
+  
+    { 144, &llrp_param_UHFBandCapabilities,
+        
+    },
+  
+    { 145, &llrp_param_TransmitPowerLevelTableEntry,
+        
+    },
+  
+    { 146, &llrp_param_FrequencyInformation,
+        
+    },
+  
+    { 147, &llrp_param_FrequencyHopTable,
+        
+    },
+  
+    { 148, &llrp_param_FixedFrequencyTable,
+        
+    },
+  
+    { 149, &llrp_param_PerAntennaReceiveSensitivityRange,
+        
+    },
+  
+    { 177, &llrp_param_ROSpec,
+        
+    },
+  
+    { 178, &llrp_param_ROBoundarySpec,
+        
+    },
+  
+    { 179, &llrp_param_ROSpecStartTrigger,
+        
+    },
+  
+    { 180, &llrp_param_PeriodicTriggerValue,
+        
+    },
+  
+    { 181, &llrp_param_GPITriggerValue,
+        
+    },
+  
+    { 182, &llrp_param_ROSpecStopTrigger,
+        
+    },
+  
+    { 183, &llrp_param_AISpec,
+        
+    },
+  
+    { 184, &llrp_param_AISpecStopTrigger,
+        
+    },
+  
+    { 185, &llrp_param_TagObservationTrigger,
+        
+    },
+  
+    { 186, &llrp_param_InventoryParameterSpec,
+        
+    },
+  
+    { 187, &llrp_param_RFSurveySpec,
+        
+    },
+  
+    { 188, &llrp_param_RFSurveySpecStopTrigger,
+        
+    },
+  
+    { 207, &llrp_param_AccessSpec,
+        
+    },
+  
+    { 208, &llrp_param_AccessSpecStopTrigger,
+        
+    },
+  
+    { 209, &llrp_param_AccessCommand,
+        
+    },
+  
+    { 217, &llrp_param_LLRPConfigurationStateValue,
+        
+    },
+  
+    { 218, &llrp_param_Identification,
+        
+    },
+  
+    { 219, &llrp_param_GPOWriteData,
+        
+    },
+  
+    { 220, &llrp_param_KeepaliveSpec,
+        
+    },
+  
+    { 221, &llrp_param_AntennaProperties,
+        
+    },
+  
+    { 222, &llrp_param_AntennaConfiguration,
+        
+    },
+  
+    { 223, &llrp_param_RFReceiver,
+        
+    },
+  
+    { 224, &llrp_param_RFTransmitter,
+        
+    },
+  
+    { 225, &llrp_param_GPIPortCurrentState,
+        
+    },
+  
+    { 226, &llrp_param_EventsAndReports,
+        
+    },
+  
+    { 237, &llrp_param_ROReportSpec,
+        
+    },
+  
+    { 238, &llrp_param_TagReportContentSelector,
+        
+    },
+  
+    { 239, &llrp_param_AccessReportSpec,
+        
+    },
+  
+    { 240, &llrp_param_TagReportData,
+        
+    },
+  
+    { 241, &llrp_param_EPCData,
+        
+    },
+  
+    { 242, &llrp_param_RFSurveyReportData,
+        
+    },
+  
+    { 243, &llrp_param_FrequencyRSSILevelEntry,
+        
+    },
+  
+    { 244, &llrp_param_ReaderEventNotificationSpec,
+        
+    },
+  
+    { 245, &llrp_param_EventNotificationState,
+        
+    },
+  
+    { 246, &llrp_param_ReaderEventNotificationData,
+        
+    },
+  
+    { 247, &llrp_param_HoppingEvent,
+        
+    },
+  
+    { 248, &llrp_param_GPIEvent,
+        
+    },
+  
+    { 249, &llrp_param_ROSpecEvent,
+        
+    },
+  
+    { 250, &llrp_param_ReportBufferLevelWarningEvent,
+        
+    },
+  
+    { 251, &llrp_param_ReportBufferOverflowErrorEvent,
+        
+    },
+  
+    { 252, &llrp_param_ReaderExceptionEvent,
+        
+    },
+  
+    { 253, &llrp_param_RFSurveyEvent,
+        
+    },
+  
+    { 254, &llrp_param_AISpecEvent,
+        
+    },
+  
+    { 255, &llrp_param_AntennaEvent,
+        
+    },
+  
+    { 256, &llrp_param_ConnectionAttemptEvent,
+        
+    },
+  
+    { 257, &llrp_param_ConnectionCloseEvent,
+        
+    },
+  
+    { 287, &llrp_param_LLRPStatus,
+        
+    },
+  
+    { 288, &llrp_param_FieldError,
+        
+    },
+  
+    { 289, &llrp_param_ParameterError,
+        
+    },
+  
+    { 327, &llrp_param_C1G2LLRPCapabilities,
+        
+    },
+  
+    { 328, &llrp_param_C1G2UHFRFModeTable,
+        
+    },
+  
+    { 329, &llrp_param_C1G2UHFRFModeTableEntry,
+        
+    },
+  
+    { 330, &llrp_param_C1G2InventoryCommand,
+        
+    },
+  
+    { 331, &llrp_param_C1G2Filter,
+        
+    },
+  
+    { 332, &llrp_param_C1G2TagInventoryMask,
+        
+    },
+  
+    { 333, &llrp_param_C1G2TagInventoryStateAwareFilterAction,
+        
+    },
+  
+    { 334, &llrp_param_C1G2TagInventoryStateUnawareFilterAction,
+        
+    },
+  
+    { 335, &llrp_param_C1G2RFControl,
+        
+    },
+  
+    { 336, &llrp_param_C1G2SingulationControl,
+        
+    },
+  
+    { 337, &llrp_param_C1G2TagInventoryStateAwareSingulationAction,
+        
+    },
+  
+    { 338, &llrp_param_C1G2TagSpec,
+        
+    },
+  
+    { 339, &llrp_param_C1G2TargetTag,
+        
+    },
+  
+    { 341, &llrp_param_C1G2Read,
+        
+    },
+  
+    { 342, &llrp_param_C1G2Write,
+        
+    },
+  
+    { 343, &llrp_param_C1G2Kill,
+        
+    },
+  
+    { 344, &llrp_param_C1G2Lock,
+        
+    },
+  
+    { 345, &llrp_param_C1G2LockPayload,
+        
+    },
+  
+    { 346, &llrp_param_C1G2BlockErase,
+        
+    },
+  
+    { 347, &llrp_param_C1G2BlockWrite,
+        
+    },
+  
+    { 348, &llrp_param_C1G2EPCMemorySelector,
+        
+    },
+  
+    { 349, &llrp_param_C1G2ReadOpSpecResult,
+        
+    },
+  
+    { 350, &llrp_param_C1G2WriteOpSpecResult,
+        
+    },
+  
+    { 351, &llrp_param_C1G2KillOpSpecResult,
+        
+    },
+  
+    { 352, &llrp_param_C1G2LockOpSpecResult,
+        
+    },
+  
+    { 353, &llrp_param_C1G2BlockEraseOpSpecResult,
+        
+    },
+  
+    { 354, &llrp_param_C1G2BlockWriteOpSpecResult,
+        
+    },
+  
+    { 1023, &llrp_param_Custom,
+        
+    },
+  
+};
+  
+
+/* ----------------------------------------------------------------------------- */
+/* Message Definitions (40 total) */
+    
+/* Message: CUSTOM_MESSAGE */
+t_llrp_item llrp_message_items_CUSTOM_MESSAGE[] = {
+      
+    { "VendorIdentifier", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "MessageSubtype", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+    { "Data", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_bytesToEnd, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_CUSTOM_MESSAGE = {
+    "CUSTOM_MESSAGE", LLRP_ITEM_MESSAGE, 1023, 3,
+      llrp_message_items_CUSTOM_MESSAGE
+};
+    
+/* Message: GET_READER_CAPABILITIES */
+t_llrp_item llrp_message_items_GET_READER_CAPABILITIES[] = {
+      
+    { "RequestedData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_GetReaderCapabilitiesRequestedData },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_READER_CAPABILITIES = {
+    "GET_READER_CAPABILITIES", LLRP_ITEM_MESSAGE, 1, 2,
+      llrp_message_items_GET_READER_CAPABILITIES
+};
+    
+/* Message: GET_READER_CAPABILITIES_RESPONSE */
+t_llrp_item llrp_message_items_GET_READER_CAPABILITIES_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+    { "GeneralDeviceCapabilities", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_GeneralDeviceCapabilities },
+
+    { "LLRPCapabilities", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPCapabilities },
+
+    { "RegulatoryCapabilities", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_RegulatoryCapabilities },
+
+    { "AirProtocolLLRPCapabilities", LLRP_ITEM_CHOICE, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_choice_AirProtocolLLRPCapabilities },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_READER_CAPABILITIES_RESPONSE = {
+    "GET_READER_CAPABILITIES_RESPONSE", LLRP_ITEM_MESSAGE, 11, 6,
+      llrp_message_items_GET_READER_CAPABILITIES_RESPONSE
+};
+    
+/* Message: ADD_ROSPEC */
+t_llrp_item llrp_message_items_ADD_ROSPEC[] = {
+      
+    { "ROSpec", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpec },
+
+};
+      
+t_llrp_compound_item llrp_message_ADD_ROSPEC = {
+    "ADD_ROSPEC", LLRP_ITEM_MESSAGE, 20, 1,
+      llrp_message_items_ADD_ROSPEC
+};
+    
+/* Message: ADD_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_ADD_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_ADD_ROSPEC_RESPONSE = {
+    "ADD_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 30, 1,
+      llrp_message_items_ADD_ROSPEC_RESPONSE
+};
+    
+/* Message: DELETE_ROSPEC */
+t_llrp_item llrp_message_items_DELETE_ROSPEC[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_DELETE_ROSPEC = {
+    "DELETE_ROSPEC", LLRP_ITEM_MESSAGE, 21, 1,
+      llrp_message_items_DELETE_ROSPEC
+};
+    
+/* Message: DELETE_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_DELETE_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_DELETE_ROSPEC_RESPONSE = {
+    "DELETE_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 31, 1,
+      llrp_message_items_DELETE_ROSPEC_RESPONSE
+};
+    
+/* Message: START_ROSPEC */
+t_llrp_item llrp_message_items_START_ROSPEC[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_START_ROSPEC = {
+    "START_ROSPEC", LLRP_ITEM_MESSAGE, 22, 1,
+      llrp_message_items_START_ROSPEC
+};
+    
+/* Message: START_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_START_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_START_ROSPEC_RESPONSE = {
+    "START_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 32, 1,
+      llrp_message_items_START_ROSPEC_RESPONSE
+};
+    
+/* Message: STOP_ROSPEC */
+t_llrp_item llrp_message_items_STOP_ROSPEC[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_STOP_ROSPEC = {
+    "STOP_ROSPEC", LLRP_ITEM_MESSAGE, 23, 1,
+      llrp_message_items_STOP_ROSPEC
+};
+    
+/* Message: STOP_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_STOP_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_STOP_ROSPEC_RESPONSE = {
+    "STOP_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 33, 1,
+      llrp_message_items_STOP_ROSPEC_RESPONSE
+};
+    
+/* Message: ENABLE_ROSPEC */
+t_llrp_item llrp_message_items_ENABLE_ROSPEC[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_ENABLE_ROSPEC = {
+    "ENABLE_ROSPEC", LLRP_ITEM_MESSAGE, 24, 1,
+      llrp_message_items_ENABLE_ROSPEC
+};
+    
+/* Message: ENABLE_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_ENABLE_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_ENABLE_ROSPEC_RESPONSE = {
+    "ENABLE_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 34, 1,
+      llrp_message_items_ENABLE_ROSPEC_RESPONSE
+};
+    
+/* Message: DISABLE_ROSPEC */
+t_llrp_item llrp_message_items_DISABLE_ROSPEC[] = {
+      
+    { "ROSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_DISABLE_ROSPEC = {
+    "DISABLE_ROSPEC", LLRP_ITEM_MESSAGE, 25, 1,
+      llrp_message_items_DISABLE_ROSPEC
+};
+    
+/* Message: DISABLE_ROSPEC_RESPONSE */
+t_llrp_item llrp_message_items_DISABLE_ROSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_DISABLE_ROSPEC_RESPONSE = {
+    "DISABLE_ROSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 35, 1,
+      llrp_message_items_DISABLE_ROSPEC_RESPONSE
+};
+    
+t_llrp_compound_item llrp_message_GET_ROSPECS = {
+    "GET_ROSPECS", LLRP_ITEM_MESSAGE, 26, 0,
+      NULL
+};
+    
+/* Message: GET_ROSPECS_RESPONSE */
+t_llrp_item llrp_message_items_GET_ROSPECS_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+    { "ROSpec", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_ROSpec },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_ROSPECS_RESPONSE = {
+    "GET_ROSPECS_RESPONSE", LLRP_ITEM_MESSAGE, 36, 2,
+      llrp_message_items_GET_ROSPECS_RESPONSE
+};
+    
+/* Message: ADD_ACCESSSPEC */
+t_llrp_item llrp_message_items_ADD_ACCESSSPEC[] = {
+      
+    { "AccessSpec", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_AccessSpec },
+
+};
+      
+t_llrp_compound_item llrp_message_ADD_ACCESSSPEC = {
+    "ADD_ACCESSSPEC", LLRP_ITEM_MESSAGE, 40, 1,
+      llrp_message_items_ADD_ACCESSSPEC
+};
+    
+/* Message: ADD_ACCESSSPEC_RESPONSE */
+t_llrp_item llrp_message_items_ADD_ACCESSSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_ADD_ACCESSSPEC_RESPONSE = {
+    "ADD_ACCESSSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 50, 1,
+      llrp_message_items_ADD_ACCESSSPEC_RESPONSE
+};
+    
+/* Message: DELETE_ACCESSSPEC */
+t_llrp_item llrp_message_items_DELETE_ACCESSSPEC[] = {
+      
+    { "AccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_DELETE_ACCESSSPEC = {
+    "DELETE_ACCESSSPEC", LLRP_ITEM_MESSAGE, 41, 1,
+      llrp_message_items_DELETE_ACCESSSPEC
+};
+    
+/* Message: DELETE_ACCESSSPEC_RESPONSE */
+t_llrp_item llrp_message_items_DELETE_ACCESSSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_DELETE_ACCESSSPEC_RESPONSE = {
+    "DELETE_ACCESSSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 51, 1,
+      llrp_message_items_DELETE_ACCESSSPEC_RESPONSE
+};
+    
+/* Message: ENABLE_ACCESSSPEC */
+t_llrp_item llrp_message_items_ENABLE_ACCESSSPEC[] = {
+      
+    { "AccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_ENABLE_ACCESSSPEC = {
+    "ENABLE_ACCESSSPEC", LLRP_ITEM_MESSAGE, 42, 1,
+      llrp_message_items_ENABLE_ACCESSSPEC
+};
+    
+/* Message: ENABLE_ACCESSSPEC_RESPONSE */
+t_llrp_item llrp_message_items_ENABLE_ACCESSSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_ENABLE_ACCESSSPEC_RESPONSE = {
+    "ENABLE_ACCESSSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 52, 1,
+      llrp_message_items_ENABLE_ACCESSSPEC_RESPONSE
+};
+    
+/* Message: DISABLE_ACCESSSPEC */
+t_llrp_item llrp_message_items_DISABLE_ACCESSSPEC[] = {
+      
+    { "AccessSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_message_DISABLE_ACCESSSPEC = {
+    "DISABLE_ACCESSSPEC", LLRP_ITEM_MESSAGE, 43, 1,
+      llrp_message_items_DISABLE_ACCESSSPEC
+};
+    
+/* Message: DISABLE_ACCESSSPEC_RESPONSE */
+t_llrp_item llrp_message_items_DISABLE_ACCESSSPEC_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_DISABLE_ACCESSSPEC_RESPONSE = {
+    "DISABLE_ACCESSSPEC_RESPONSE", LLRP_ITEM_MESSAGE, 53, 1,
+      llrp_message_items_DISABLE_ACCESSSPEC_RESPONSE
+};
+    
+t_llrp_compound_item llrp_message_GET_ACCESSSPECS = {
+    "GET_ACCESSSPECS", LLRP_ITEM_MESSAGE, 44, 0,
+      NULL
+};
+    
+/* Message: GET_ACCESSSPECS_RESPONSE */
+t_llrp_item llrp_message_items_GET_ACCESSSPECS_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+    { "AccessSpec", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AccessSpec },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_ACCESSSPECS_RESPONSE = {
+    "GET_ACCESSSPECS_RESPONSE", LLRP_ITEM_MESSAGE, 54, 2,
+      llrp_message_items_GET_ACCESSSPECS_RESPONSE
+};
+    
+/* Message: GET_READER_CONFIG */
+t_llrp_item llrp_message_items_GET_READER_CONFIG[] = {
+      
+    { "AntennaID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "RequestedData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_GetReaderConfigRequestedData },
+
+    { "GPIPortNum", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "GPOPortNum", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_READER_CONFIG = {
+    "GET_READER_CONFIG", LLRP_ITEM_MESSAGE, 2, 5,
+      llrp_message_items_GET_READER_CONFIG
+};
+    
+/* Message: GET_READER_CONFIG_RESPONSE */
+t_llrp_item llrp_message_items_GET_READER_CONFIG_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+    { "Identification", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_Identification },
+
+    { "AntennaProperties", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaProperties },
+
+    { "AntennaConfiguration", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaConfiguration },
+
+    { "ReaderEventNotificationSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ReaderEventNotificationSpec },
+
+    { "ROReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROReportSpec },
+
+    { "AccessReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AccessReportSpec },
+
+    { "LLRPConfigurationStateValue", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPConfigurationStateValue },
+
+    { "KeepaliveSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_KeepaliveSpec },
+
+    { "GPIPortCurrentState", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_GPIPortCurrentState },
+
+    { "GPOWriteData", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_GPOWriteData },
+
+    { "EventsAndReports", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_EventsAndReports },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_GET_READER_CONFIG_RESPONSE = {
+    "GET_READER_CONFIG_RESPONSE", LLRP_ITEM_MESSAGE, 12, 13,
+      llrp_message_items_GET_READER_CONFIG_RESPONSE
+};
+    
+/* Message: SET_READER_CONFIG */
+t_llrp_item llrp_message_items_SET_READER_CONFIG[] = {
+      
+    { "ResetToFactoryDefault", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+    { "ReaderEventNotificationSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ReaderEventNotificationSpec },
+
+    { "AntennaProperties", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaProperties },
+
+    { "AntennaConfiguration", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaConfiguration },
+
+    { "ROReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_ROReportSpec },
+
+    { "AccessReportSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_AccessReportSpec },
+
+    { "KeepaliveSpec", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_KeepaliveSpec },
+
+    { "GPOWriteData", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_GPOWriteData },
+
+    { "GPIPortCurrentState", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_GPIPortCurrentState },
+
+    { "EventsAndReports", LLRP_ITEM_PARAMETER, 0, 1, LLRP_FIELDTYPE_NONE, &llrp_param_EventsAndReports },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_SET_READER_CONFIG = {
+    "SET_READER_CONFIG", LLRP_ITEM_MESSAGE, 3, 12,
+      llrp_message_items_SET_READER_CONFIG
+};
+    
+/* Message: SET_READER_CONFIG_RESPONSE */
+t_llrp_item llrp_message_items_SET_READER_CONFIG_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_SET_READER_CONFIG_RESPONSE = {
+    "SET_READER_CONFIG_RESPONSE", LLRP_ITEM_MESSAGE, 13, 1,
+      llrp_message_items_SET_READER_CONFIG_RESPONSE
+};
+    
+t_llrp_compound_item llrp_message_CLOSE_CONNECTION = {
+    "CLOSE_CONNECTION", LLRP_ITEM_MESSAGE, 14, 0,
+      NULL
+};
+    
+/* Message: CLOSE_CONNECTION_RESPONSE */
+t_llrp_item llrp_message_items_CLOSE_CONNECTION_RESPONSE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_CLOSE_CONNECTION_RESPONSE = {
+    "CLOSE_CONNECTION_RESPONSE", LLRP_ITEM_MESSAGE, 4, 1,
+      llrp_message_items_CLOSE_CONNECTION_RESPONSE
+};
+    
+t_llrp_compound_item llrp_message_GET_REPORT = {
+    "GET_REPORT", LLRP_ITEM_MESSAGE, 60, 0,
+      NULL
+};
+    
+/* Message: RO_ACCESS_REPORT */
+t_llrp_item llrp_message_items_RO_ACCESS_REPORT[] = {
+      
+    { "TagReportData", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_TagReportData },
+
+    { "RFSurveyReportData", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_RFSurveyReportData },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_message_RO_ACCESS_REPORT = {
+    "RO_ACCESS_REPORT", LLRP_ITEM_MESSAGE, 61, 3,
+      llrp_message_items_RO_ACCESS_REPORT
+};
+    
+t_llrp_compound_item llrp_message_KEEPALIVE = {
+    "KEEPALIVE", LLRP_ITEM_MESSAGE, 62, 0,
+      NULL
+};
+    
+t_llrp_compound_item llrp_message_KEEPALIVE_ACK = {
+    "KEEPALIVE_ACK", LLRP_ITEM_MESSAGE, 72, 0,
+      NULL
+};
+    
+/* Message: READER_EVENT_NOTIFICATION */
+t_llrp_item llrp_message_items_READER_EVENT_NOTIFICATION[] = {
+      
+    { "ReaderEventNotificationData", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_ReaderEventNotificationData },
+
+};
+      
+t_llrp_compound_item llrp_message_READER_EVENT_NOTIFICATION = {
+    "READER_EVENT_NOTIFICATION", LLRP_ITEM_MESSAGE, 63, 1,
+      llrp_message_items_READER_EVENT_NOTIFICATION
+};
+    
+t_llrp_compound_item llrp_message_ENABLE_EVENTS_AND_REPORTS = {
+    "ENABLE_EVENTS_AND_REPORTS", LLRP_ITEM_MESSAGE, 64, 0,
+      NULL
+};
+    
+/* Message: ERROR_MESSAGE */
+t_llrp_item llrp_message_items_ERROR_MESSAGE[] = {
+      
+    { "LLRPStatus", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LLRPStatus },
+
+};
+      
+t_llrp_compound_item llrp_message_ERROR_MESSAGE = {
+    "ERROR_MESSAGE", LLRP_ITEM_MESSAGE, 100, 1,
+      llrp_message_items_ERROR_MESSAGE
+};
+    
+/* ----------------------------------------------------------------------------- */
+/* Message List (40 total) */
+
+t_llrp_standard_map_item llrp_v1_0_message_list[] = {
+  
+    { 1, &llrp_message_GET_READER_CAPABILITIES,
+        
+    },
+  
+    { 2, &llrp_message_GET_READER_CONFIG,
+        
+    },
+  
+    { 3, &llrp_message_SET_READER_CONFIG,
+        
+    },
+  
+    { 4, &llrp_message_CLOSE_CONNECTION_RESPONSE,
+        
+    },
+  
+    { 11, &llrp_message_GET_READER_CAPABILITIES_RESPONSE,
+        
+    },
+  
+    { 12, &llrp_message_GET_READER_CONFIG_RESPONSE,
+        
+    },
+  
+    { 13, &llrp_message_SET_READER_CONFIG_RESPONSE,
+        
+    },
+  
+    { 14, &llrp_message_CLOSE_CONNECTION,
+        
+    },
+  
+    { 20, &llrp_message_ADD_ROSPEC,
+        
+    },
+  
+    { 21, &llrp_message_DELETE_ROSPEC,
+        
+    },
+  
+    { 22, &llrp_message_START_ROSPEC,
+        
+    },
+  
+    { 23, &llrp_message_STOP_ROSPEC,
+        
+    },
+  
+    { 24, &llrp_message_ENABLE_ROSPEC,
+        
+    },
+  
+    { 25, &llrp_message_DISABLE_ROSPEC,
+        
+    },
+  
+    { 26, &llrp_message_GET_ROSPECS,
+        
+    },
+  
+    { 30, &llrp_message_ADD_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 31, &llrp_message_DELETE_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 32, &llrp_message_START_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 33, &llrp_message_STOP_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 34, &llrp_message_ENABLE_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 35, &llrp_message_DISABLE_ROSPEC_RESPONSE,
+        
+    },
+  
+    { 36, &llrp_message_GET_ROSPECS_RESPONSE,
+        
+    },
+  
+    { 40, &llrp_message_ADD_ACCESSSPEC,
+        
+    },
+  
+    { 41, &llrp_message_DELETE_ACCESSSPEC,
+        
+    },
+  
+    { 42, &llrp_message_ENABLE_ACCESSSPEC,
+        
+    },
+  
+    { 43, &llrp_message_DISABLE_ACCESSSPEC,
+        
+    },
+  
+    { 44, &llrp_message_GET_ACCESSSPECS,
+        
+    },
+  
+    { 50, &llrp_message_ADD_ACCESSSPEC_RESPONSE,
+        
+    },
+  
+    { 51, &llrp_message_DELETE_ACCESSSPEC_RESPONSE,
+        
+    },
+  
+    { 52, &llrp_message_ENABLE_ACCESSSPEC_RESPONSE,
+        
+    },
+  
+    { 53, &llrp_message_DISABLE_ACCESSSPEC_RESPONSE,
+        
+    },
+  
+    { 54, &llrp_message_GET_ACCESSSPECS_RESPONSE,
+        
+    },
+  
+    { 60, &llrp_message_GET_REPORT,
+        
+    },
+  
+    { 61, &llrp_message_RO_ACCESS_REPORT,
+        
+    },
+  
+    { 62, &llrp_message_KEEPALIVE,
+        
+    },
+  
+    { 63, &llrp_message_READER_EVENT_NOTIFICATION,
+        
+    },
+  
+    { 64, &llrp_message_ENABLE_EVENTS_AND_REPORTS,
+        
+    },
+  
+    { 72, &llrp_message_KEEPALIVE_ACK,
+        
+    },
+  
+    { 100, &llrp_message_ERROR_MESSAGE,
+        
+    },
+  
+    { 1023, &llrp_message_CUSTOM_MESSAGE,
+        
+    },
+  
+};
+  
+/* ----------------------------------------------------------------------------- */
+/* Validator: v1_0 */
+t_llrp_parse_validator llrp_v1_0_parse_validator = {
+    "v1_0",
+    llrp_v1_0_parameter_list, 108,
+    NULL, 0,
+    llrp_v1_0_message_list, 40,
+    NULL, 0,
+};
+
+
+/*end*/
diff --git a/plugins/llrp/llrp-1x0-def.h b/plugins/llrp/llrp-1x0-def.h
new file mode 100644 (file)
index 0000000..9526318
--- /dev/null
@@ -0,0 +1,532 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _LLRP_GENERATED_v1_0_H
+#define _LLRP_GENERATED_v1_0_H
+
+#include "llrpparsetypes.h" 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern t_llrp_parse_validator llrp_v1_0_parse_validator;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/* ----------------------------------------------------------------------------- */
+/* Choice Forward Declarations (12 total) */
+    
+extern t_llrp_compound_item llrp_choice_SpecParameter;
+extern t_llrp_compound_item llrp_choice_AccessCommandOpSpec;
+extern t_llrp_compound_item llrp_choice_AccessCommandOpSpecResult;
+extern t_llrp_compound_item llrp_choice_EPCParameter;
+extern t_llrp_compound_item llrp_choice_Timestamp;
+extern t_llrp_compound_item llrp_choice_AirProtocolLLRPCapabilities;
+extern t_llrp_compound_item llrp_choice_AirProtocolUHFRFModeTable;
+extern t_llrp_compound_item llrp_choice_AirProtocolInventoryCommandSettings;
+extern t_llrp_compound_item llrp_choice_AirProtocolTagSpec;
+extern t_llrp_compound_item llrp_choice_AirProtocolEPCMemorySelector;
+extern t_llrp_compound_item llrp_choice_AirProtocolTagData;
+extern t_llrp_compound_item llrp_choice_AirProtocolSingulationDetails;
+
+/* ----------------------------------------------------------------------------- */
+/* Parameter Forward Declarations (108 total) */
+    
+extern t_llrp_compound_item llrp_param_UTCTimestamp;
+extern t_llrp_compound_item llrp_param_Uptime;
+extern t_llrp_compound_item llrp_param_Custom;
+extern t_llrp_compound_item llrp_param_GeneralDeviceCapabilities;
+extern t_llrp_compound_item llrp_param_ReceiveSensitivityTableEntry;
+extern t_llrp_compound_item llrp_param_PerAntennaReceiveSensitivityRange;
+extern t_llrp_compound_item llrp_param_PerAntennaAirProtocol;
+extern t_llrp_compound_item llrp_param_GPIOCapabilities;
+extern t_llrp_compound_item llrp_param_LLRPCapabilities;
+extern t_llrp_compound_item llrp_param_RegulatoryCapabilities;
+extern t_llrp_compound_item llrp_param_UHFBandCapabilities;
+extern t_llrp_compound_item llrp_param_TransmitPowerLevelTableEntry;
+extern t_llrp_compound_item llrp_param_FrequencyInformation;
+extern t_llrp_compound_item llrp_param_FrequencyHopTable;
+extern t_llrp_compound_item llrp_param_FixedFrequencyTable;
+extern t_llrp_compound_item llrp_param_ROSpec;
+extern t_llrp_compound_item llrp_param_ROBoundarySpec;
+extern t_llrp_compound_item llrp_param_ROSpecStartTrigger;
+extern t_llrp_compound_item llrp_param_PeriodicTriggerValue;
+extern t_llrp_compound_item llrp_param_GPITriggerValue;
+extern t_llrp_compound_item llrp_param_ROSpecStopTrigger;
+extern t_llrp_compound_item llrp_param_AISpec;
+extern t_llrp_compound_item llrp_param_AISpecStopTrigger;
+extern t_llrp_compound_item llrp_param_TagObservationTrigger;
+extern t_llrp_compound_item llrp_param_InventoryParameterSpec;
+extern t_llrp_compound_item llrp_param_RFSurveySpec;
+extern t_llrp_compound_item llrp_param_RFSurveySpecStopTrigger;
+extern t_llrp_compound_item llrp_param_AccessSpec;
+extern t_llrp_compound_item llrp_param_AccessSpecStopTrigger;
+extern t_llrp_compound_item llrp_param_AccessCommand;
+extern t_llrp_compound_item llrp_param_LLRPConfigurationStateValue;
+extern t_llrp_compound_item llrp_param_Identification;
+extern t_llrp_compound_item llrp_param_GPOWriteData;
+extern t_llrp_compound_item llrp_param_KeepaliveSpec;
+extern t_llrp_compound_item llrp_param_AntennaProperties;
+extern t_llrp_compound_item llrp_param_AntennaConfiguration;
+extern t_llrp_compound_item llrp_param_RFReceiver;
+extern t_llrp_compound_item llrp_param_RFTransmitter;
+extern t_llrp_compound_item llrp_param_GPIPortCurrentState;
+extern t_llrp_compound_item llrp_param_EventsAndReports;
+extern t_llrp_compound_item llrp_param_ROReportSpec;
+extern t_llrp_compound_item llrp_param_TagReportContentSelector;
+extern t_llrp_compound_item llrp_param_AccessReportSpec;
+extern t_llrp_compound_item llrp_param_TagReportData;
+extern t_llrp_compound_item llrp_param_EPCData;
+extern t_llrp_compound_item llrp_param_EPC_96;
+extern t_llrp_compound_item llrp_param_ROSpecID;
+extern t_llrp_compound_item llrp_param_SpecIndex;
+extern t_llrp_compound_item llrp_param_InventoryParameterSpecID;
+extern t_llrp_compound_item llrp_param_AntennaID;
+extern t_llrp_compound_item llrp_param_PeakRSSI;
+extern t_llrp_compound_item llrp_param_ChannelIndex;
+extern t_llrp_compound_item llrp_param_FirstSeenTimestampUTC;
+extern t_llrp_compound_item llrp_param_FirstSeenTimestampUptime;
+extern t_llrp_compound_item llrp_param_LastSeenTimestampUTC;
+extern t_llrp_compound_item llrp_param_LastSeenTimestampUptime;
+extern t_llrp_compound_item llrp_param_TagSeenCount;
+extern t_llrp_compound_item llrp_param_AccessSpecID;
+extern t_llrp_compound_item llrp_param_RFSurveyReportData;
+extern t_llrp_compound_item llrp_param_FrequencyRSSILevelEntry;
+extern t_llrp_compound_item llrp_param_ReaderEventNotificationSpec;
+extern t_llrp_compound_item llrp_param_EventNotificationState;
+extern t_llrp_compound_item llrp_param_ReaderEventNotificationData;
+extern t_llrp_compound_item llrp_param_HoppingEvent;
+extern t_llrp_compound_item llrp_param_GPIEvent;
+extern t_llrp_compound_item llrp_param_ROSpecEvent;
+extern t_llrp_compound_item llrp_param_ReportBufferLevelWarningEvent;
+extern t_llrp_compound_item llrp_param_ReportBufferOverflowErrorEvent;
+extern t_llrp_compound_item llrp_param_ReaderExceptionEvent;
+extern t_llrp_compound_item llrp_param_OpSpecID;
+extern t_llrp_compound_item llrp_param_RFSurveyEvent;
+extern t_llrp_compound_item llrp_param_AISpecEvent;
+extern t_llrp_compound_item llrp_param_AntennaEvent;
+extern t_llrp_compound_item llrp_param_ConnectionAttemptEvent;
+extern t_llrp_compound_item llrp_param_ConnectionCloseEvent;
+extern t_llrp_compound_item llrp_param_LLRPStatus;
+extern t_llrp_compound_item llrp_param_FieldError;
+extern t_llrp_compound_item llrp_param_ParameterError;
+extern t_llrp_compound_item llrp_param_C1G2LLRPCapabilities;
+extern t_llrp_compound_item llrp_param_C1G2UHFRFModeTable;
+extern t_llrp_compound_item llrp_param_C1G2UHFRFModeTableEntry;
+extern t_llrp_compound_item llrp_param_C1G2InventoryCommand;
+extern t_llrp_compound_item llrp_param_C1G2Filter;
+extern t_llrp_compound_item llrp_param_C1G2TagInventoryMask;
+extern t_llrp_compound_item llrp_param_C1G2TagInventoryStateAwareFilterAction;
+extern t_llrp_compound_item llrp_param_C1G2TagInventoryStateUnawareFilterAction;
+extern t_llrp_compound_item llrp_param_C1G2RFControl;
+extern t_llrp_compound_item llrp_param_C1G2SingulationControl;
+extern t_llrp_compound_item llrp_param_C1G2TagInventoryStateAwareSingulationAction;
+extern t_llrp_compound_item llrp_param_C1G2TagSpec;
+extern t_llrp_compound_item llrp_param_C1G2TargetTag;
+extern t_llrp_compound_item llrp_param_C1G2Read;
+extern t_llrp_compound_item llrp_param_C1G2Write;
+extern t_llrp_compound_item llrp_param_C1G2Kill;
+extern t_llrp_compound_item llrp_param_C1G2Lock;
+extern t_llrp_compound_item llrp_param_C1G2LockPayload;
+extern t_llrp_compound_item llrp_param_C1G2BlockErase;
+extern t_llrp_compound_item llrp_param_C1G2BlockWrite;
+extern t_llrp_compound_item llrp_param_C1G2EPCMemorySelector;
+extern t_llrp_compound_item llrp_param_C1G2_PC;
+extern t_llrp_compound_item llrp_param_C1G2_CRC;
+extern t_llrp_compound_item llrp_param_C1G2SingulationDetails;
+extern t_llrp_compound_item llrp_param_C1G2ReadOpSpecResult;
+extern t_llrp_compound_item llrp_param_C1G2WriteOpSpecResult;
+extern t_llrp_compound_item llrp_param_C1G2KillOpSpecResult;
+extern t_llrp_compound_item llrp_param_C1G2LockOpSpecResult;
+extern t_llrp_compound_item llrp_param_C1G2BlockEraseOpSpecResult;
+extern t_llrp_compound_item llrp_param_C1G2BlockWriteOpSpecResult;
+
+/* Enumerations */
+  
+#define LLRP_ENUM_v1_0_AirProtocols_Unspecified  0
+#define LLRP_ENUM_v1_0_AirProtocols_EPCGlobalClass1Gen2  1
+#define LLRP_ENUM_v1_0_GetReaderCapabilitiesRequestedData_All  0
+#define LLRP_ENUM_v1_0_GetReaderCapabilitiesRequestedData_General_Device_Capabilities  1
+#define LLRP_ENUM_v1_0_GetReaderCapabilitiesRequestedData_LLRP_Capabilities  2
+#define LLRP_ENUM_v1_0_GetReaderCapabilitiesRequestedData_Regulatory_Capabilities  3
+#define LLRP_ENUM_v1_0_GetReaderCapabilitiesRequestedData_LLRP_Air_Protocol_Capabilities  4
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Unspecified  0
+#define LLRP_ENUM_v1_0_CommunicationsStandard_US_FCC_Part_15  1
+#define LLRP_ENUM_v1_0_CommunicationsStandard_ETSI_302_208  2
+#define LLRP_ENUM_v1_0_CommunicationsStandard_ETSI_300_220  3
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Australia_LIPD_1W  4
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Australia_LIPD_4W  5
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Japan_ARIB_STD_T89  6
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Hong_Kong_OFTA_1049  7
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Taiwan_DGT_LP0002  8
+#define LLRP_ENUM_v1_0_CommunicationsStandard_Korea_MIC_Article_5_2  9
+#define LLRP_ENUM_v1_0_ROSpecState_Disabled  0
+#define LLRP_ENUM_v1_0_ROSpecState_Inactive  1
+#define LLRP_ENUM_v1_0_ROSpecState_Active  2
+#define LLRP_ENUM_v1_0_ROSpecStartTriggerType_Null  0
+#define LLRP_ENUM_v1_0_ROSpecStartTriggerType_Immediate  1
+#define LLRP_ENUM_v1_0_ROSpecStartTriggerType_Periodic  2
+#define LLRP_ENUM_v1_0_ROSpecStartTriggerType_GPI  3
+#define LLRP_ENUM_v1_0_ROSpecStopTriggerType_Null  0
+#define LLRP_ENUM_v1_0_ROSpecStopTriggerType_Duration  1
+#define LLRP_ENUM_v1_0_ROSpecStopTriggerType_GPI_With_Timeout  2
+#define LLRP_ENUM_v1_0_AISpecStopTriggerType_Null  0
+#define LLRP_ENUM_v1_0_AISpecStopTriggerType_Duration  1
+#define LLRP_ENUM_v1_0_AISpecStopTriggerType_GPI_With_Timeout  2
+#define LLRP_ENUM_v1_0_AISpecStopTriggerType_Tag_Observation  3
+#define LLRP_ENUM_v1_0_TagObservationTriggerType_Upon_Seeing_N_Tags_Or_Timeout  0
+#define LLRP_ENUM_v1_0_TagObservationTriggerType_Upon_Seeing_No_More_New_Tags_For_Tms_Or_Timeout  1
+#define LLRP_ENUM_v1_0_TagObservationTriggerType_N_Attempts_To_See_All_Tags_In_FOV_Or_Timeout  2
+#define LLRP_ENUM_v1_0_RFSurveySpecStopTriggerType_Null  0
+#define LLRP_ENUM_v1_0_RFSurveySpecStopTriggerType_Duration  1
+#define LLRP_ENUM_v1_0_RFSurveySpecStopTriggerType_N_Iterations_Through_Frequency_Range  2
+#define LLRP_ENUM_v1_0_AccessSpecState_Disabled  0
+#define LLRP_ENUM_v1_0_AccessSpecState_Active  1
+#define LLRP_ENUM_v1_0_AccessSpecStopTriggerType_Null  0
+#define LLRP_ENUM_v1_0_AccessSpecStopTriggerType_Operation_Count  1
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_All  0
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_Identification  1
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_AntennaProperties  2
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_AntennaConfiguration  3
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_ROReportSpec  4
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_ReaderEventNotificationSpec  5
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_AccessReportSpec  6
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_LLRPConfigurationStateValue  7
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_KeepaliveSpec  8
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_GPIPortCurrentState  9
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_GPOWriteData  10
+#define LLRP_ENUM_v1_0_GetReaderConfigRequestedData_EventsAndReports  11
+#define LLRP_ENUM_v1_0_IdentificationType_MAC_Address  0
+#define LLRP_ENUM_v1_0_IdentificationType_EPC  1
+#define LLRP_ENUM_v1_0_KeepaliveTriggerType_Null  0
+#define LLRP_ENUM_v1_0_KeepaliveTriggerType_Periodic  1
+#define LLRP_ENUM_v1_0_GPIPortState_Low  0
+#define LLRP_ENUM_v1_0_GPIPortState_High  1
+#define LLRP_ENUM_v1_0_GPIPortState_Unknown  2
+#define LLRP_ENUM_v1_0_ROReportTriggerType_None  0
+#define LLRP_ENUM_v1_0_ROReportTriggerType_Upon_N_Tags_Or_End_Of_AISpec  1
+#define LLRP_ENUM_v1_0_ROReportTriggerType_Upon_N_Tags_Or_End_Of_ROSpec  2
+#define LLRP_ENUM_v1_0_AccessReportTriggerType_Whenever_ROReport_Is_Generated  0
+#define LLRP_ENUM_v1_0_AccessReportTriggerType_End_Of_AccessSpec  1
+#define LLRP_ENUM_v1_0_NotificationEventType_Upon_Hopping_To_Next_Channel  0
+#define LLRP_ENUM_v1_0_NotificationEventType_GPI_Event  1
+#define LLRP_ENUM_v1_0_NotificationEventType_ROSpec_Event  2
+#define LLRP_ENUM_v1_0_NotificationEventType_Report_Buffer_Fill_Warning  3
+#define LLRP_ENUM_v1_0_NotificationEventType_Reader_Exception_Event  4
+#define LLRP_ENUM_v1_0_NotificationEventType_RFSurvey_Event  5
+#define LLRP_ENUM_v1_0_NotificationEventType_AISpec_Event  6
+#define LLRP_ENUM_v1_0_NotificationEventType_AISpec_Event_With_Details  7
+#define LLRP_ENUM_v1_0_NotificationEventType_Antenna_Event  8
+#define LLRP_ENUM_v1_0_ROSpecEventType_Start_Of_ROSpec  0
+#define LLRP_ENUM_v1_0_ROSpecEventType_End_Of_ROSpec  1
+#define LLRP_ENUM_v1_0_ROSpecEventType_Preemption_Of_ROSpec  2
+#define LLRP_ENUM_v1_0_RFSurveyEventType_Start_Of_RFSurvey  0
+#define LLRP_ENUM_v1_0_RFSurveyEventType_End_Of_RFSurvey  1
+#define LLRP_ENUM_v1_0_AISpecEventType_End_Of_AISpec  0
+#define LLRP_ENUM_v1_0_AntennaEventType_Antenna_Disconnected  0
+#define LLRP_ENUM_v1_0_AntennaEventType_Antenna_Connected  1
+#define LLRP_ENUM_v1_0_ConnectionAttemptStatusType_Success  0
+#define LLRP_ENUM_v1_0_ConnectionAttemptStatusType_Failed_A_Reader_Initiated_Connection_Already_Exists  1
+#define LLRP_ENUM_v1_0_ConnectionAttemptStatusType_Failed_A_Client_Initiated_Connection_Already_Exists  2
+#define LLRP_ENUM_v1_0_ConnectionAttemptStatusType_Failed_Reason_Other_Than_A_Connection_Already_Exists  3
+#define LLRP_ENUM_v1_0_ConnectionAttemptStatusType_Another_Connection_Attempted  4
+#define LLRP_ENUM_v1_0_StatusCode_M_Success  0
+#define LLRP_ENUM_v1_0_StatusCode_M_ParameterError  100
+#define LLRP_ENUM_v1_0_StatusCode_M_FieldError  101
+#define LLRP_ENUM_v1_0_StatusCode_M_UnexpectedParameter  102
+#define LLRP_ENUM_v1_0_StatusCode_M_MissingParameter  103
+#define LLRP_ENUM_v1_0_StatusCode_M_DuplicateParameter  104
+#define LLRP_ENUM_v1_0_StatusCode_M_OverflowParameter  105
+#define LLRP_ENUM_v1_0_StatusCode_M_OverflowField  106
+#define LLRP_ENUM_v1_0_StatusCode_M_UnknownParameter  107
+#define LLRP_ENUM_v1_0_StatusCode_M_UnknownField  108
+#define LLRP_ENUM_v1_0_StatusCode_M_UnsupportedMessage  109
+#define LLRP_ENUM_v1_0_StatusCode_M_UnsupportedVersion  110
+#define LLRP_ENUM_v1_0_StatusCode_M_UnsupportedParameter  111
+#define LLRP_ENUM_v1_0_StatusCode_P_ParameterError  200
+#define LLRP_ENUM_v1_0_StatusCode_P_FieldError  201
+#define LLRP_ENUM_v1_0_StatusCode_P_UnexpectedParameter  202
+#define LLRP_ENUM_v1_0_StatusCode_P_MissingParameter  203
+#define LLRP_ENUM_v1_0_StatusCode_P_DuplicateParameter  204
+#define LLRP_ENUM_v1_0_StatusCode_P_OverflowParameter  205
+#define LLRP_ENUM_v1_0_StatusCode_P_OverflowField  206
+#define LLRP_ENUM_v1_0_StatusCode_P_UnknownParameter  207
+#define LLRP_ENUM_v1_0_StatusCode_P_UnknownField  208
+#define LLRP_ENUM_v1_0_StatusCode_P_UnsupportedParameter  209
+#define LLRP_ENUM_v1_0_StatusCode_A_Invalid  300
+#define LLRP_ENUM_v1_0_StatusCode_A_OutOfRange  301
+#define LLRP_ENUM_v1_0_StatusCode_R_DeviceError  401
+#define LLRP_ENUM_v1_0_C1G2DRValue_DRV_8  0
+#define LLRP_ENUM_v1_0_C1G2DRValue_DRV_64_3  1
+#define LLRP_ENUM_v1_0_C1G2MValue_MV_FM0  0
+#define LLRP_ENUM_v1_0_C1G2MValue_MV_2  1
+#define LLRP_ENUM_v1_0_C1G2MValue_MV_4  2
+#define LLRP_ENUM_v1_0_C1G2MValue_MV_8  3
+#define LLRP_ENUM_v1_0_C1G2ForwardLinkModulation_PR_ASK  0
+#define LLRP_ENUM_v1_0_C1G2ForwardLinkModulation_SSB_ASK  1
+#define LLRP_ENUM_v1_0_C1G2ForwardLinkModulation_DSB_ASK  2
+#define LLRP_ENUM_v1_0_C1G2SpectralMaskIndicator_Unknown  0
+#define LLRP_ENUM_v1_0_C1G2SpectralMaskIndicator_SI  1
+#define LLRP_ENUM_v1_0_C1G2SpectralMaskIndicator_MI  2
+#define LLRP_ENUM_v1_0_C1G2SpectralMaskIndicator_DI  3
+#define LLRP_ENUM_v1_0_C1G2TruncateAction_Unspecified  0
+#define LLRP_ENUM_v1_0_C1G2TruncateAction_Do_Not_Truncate  1
+#define LLRP_ENUM_v1_0_C1G2TruncateAction_Truncate  2
+#define LLRP_ENUM_v1_0_C1G2StateAwareTarget_SL  0
+#define LLRP_ENUM_v1_0_C1G2StateAwareTarget_Inventoried_State_For_Session_S0  1
+#define LLRP_ENUM_v1_0_C1G2StateAwareTarget_Inventoried_State_For_Session_S1  2
+#define LLRP_ENUM_v1_0_C1G2StateAwareTarget_Inventoried_State_For_Session_S2  3
+#define LLRP_ENUM_v1_0_C1G2StateAwareTarget_Inventoried_State_For_Session_S3  4
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_AssertSLOrA_DeassertSLOrB  0
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_AssertSLOrA_Noop  1
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_Noop_DeassertSLOrB  2
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_NegateSLOrABBA_Noop  3
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_DeassertSLOrB_AssertSLOrA  4
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_DeassertSLOrB_Noop  5
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_Noop_AssertSLOrA  6
+#define LLRP_ENUM_v1_0_C1G2StateAwareAction_Noop_NegateSLOrABBA  7
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_Select_Unselect  0
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_Select_DoNothing  1
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_DoNothing_Unselect  2
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_Unselect_DoNothing  3
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_Unselect_Select  4
+#define LLRP_ENUM_v1_0_C1G2StateUnawareAction_DoNothing_Select  5
+#define LLRP_ENUM_v1_0_C1G2TagInventoryStateAwareI_State_A  0
+#define LLRP_ENUM_v1_0_C1G2TagInventoryStateAwareI_State_B  1
+#define LLRP_ENUM_v1_0_C1G2TagInventoryStateAwareS_SL  0
+#define LLRP_ENUM_v1_0_C1G2TagInventoryStateAwareS_Not_SL  1
+#define LLRP_ENUM_v1_0_C1G2LockPrivilege_Read_Write  0
+#define LLRP_ENUM_v1_0_C1G2LockPrivilege_Perma_Lock  1
+#define LLRP_ENUM_v1_0_C1G2LockPrivilege_Perma_Unlock  2
+#define LLRP_ENUM_v1_0_C1G2LockPrivilege_Unlock  3
+#define LLRP_ENUM_v1_0_C1G2LockDataField_Kill_Password  0
+#define LLRP_ENUM_v1_0_C1G2LockDataField_Access_Password  1
+#define LLRP_ENUM_v1_0_C1G2LockDataField_EPC_Memory  2
+#define LLRP_ENUM_v1_0_C1G2LockDataField_TID_Memory  3
+#define LLRP_ENUM_v1_0_C1G2LockDataField_User_Memory  4
+#define LLRP_ENUM_v1_0_C1G2ReadResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2ReadResultType_Nonspecific_Tag_Error  1
+#define LLRP_ENUM_v1_0_C1G2ReadResultType_No_Response_From_Tag  2
+#define LLRP_ENUM_v1_0_C1G2ReadResultType_Nonspecific_Reader_Error  3
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Tag_Memory_Overrun_Error  1
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Tag_Memory_Locked_Error  2
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Insufficient_Power  3
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Nonspecific_Tag_Error  4
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_No_Response_From_Tag  5
+#define LLRP_ENUM_v1_0_C1G2WriteResultType_Nonspecific_Reader_Error  6
+#define LLRP_ENUM_v1_0_C1G2KillResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2KillResultType_Zero_Kill_Password_Error  1
+#define LLRP_ENUM_v1_0_C1G2KillResultType_Insufficient_Power  2
+#define LLRP_ENUM_v1_0_C1G2KillResultType_Nonspecific_Tag_Error  3
+#define LLRP_ENUM_v1_0_C1G2KillResultType_No_Response_From_Tag  4
+#define LLRP_ENUM_v1_0_C1G2KillResultType_Nonspecific_Reader_Error  5
+#define LLRP_ENUM_v1_0_C1G2LockResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2LockResultType_Insufficient_Power  1
+#define LLRP_ENUM_v1_0_C1G2LockResultType_Nonspecific_Tag_Error  2
+#define LLRP_ENUM_v1_0_C1G2LockResultType_No_Response_From_Tag  3
+#define LLRP_ENUM_v1_0_C1G2LockResultType_Nonspecific_Reader_Error  4
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Tag_Memory_Overrun_Error  1
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Tag_Memory_Locked_Error  2
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Insufficient_Power  3
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Nonspecific_Tag_Error  4
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_No_Response_From_Tag  5
+#define LLRP_ENUM_v1_0_C1G2BlockEraseResultType_Nonspecific_Reader_Error  6
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Success  0
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Tag_Memory_Overrun_Error  1
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Tag_Memory_Locked_Error  2
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Insufficient_Power  3
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Nonspecific_Tag_Error  4
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_No_Response_From_Tag  5
+#define LLRP_ENUM_v1_0_C1G2BlockWriteResultType_Nonspecific_Reader_Error  6
+
+/* Parameters */
+  
+#define LLRP_PARM_v1_0_AntennaID  1
+#define LLRP_PARM_v1_0_FirstSeenTimestampUTC  2
+#define LLRP_PARM_v1_0_FirstSeenTimestampUptime  3
+#define LLRP_PARM_v1_0_LastSeenTimestampUTC  4
+#define LLRP_PARM_v1_0_LastSeenTimestampUptime  5
+#define LLRP_PARM_v1_0_PeakRSSI  6
+#define LLRP_PARM_v1_0_ChannelIndex  7
+#define LLRP_PARM_v1_0_TagSeenCount  8
+#define LLRP_PARM_v1_0_ROSpecID  9
+#define LLRP_PARM_v1_0_InventoryParameterSpecID  10
+#define LLRP_PARM_v1_0_C1G2_CRC  11
+#define LLRP_PARM_v1_0_C1G2_PC  12
+#define LLRP_PARM_v1_0_EPC_96  13
+#define LLRP_PARM_v1_0_SpecIndex  14
+#define LLRP_PARM_v1_0_AccessSpecID  16
+#define LLRP_PARM_v1_0_OpSpecID  17
+#define LLRP_PARM_v1_0_C1G2SingulationDetails  18
+#define LLRP_PARM_v1_0_UTCTimestamp  128
+#define LLRP_PARM_v1_0_Uptime  129
+#define LLRP_PARM_v1_0_GeneralDeviceCapabilities  137
+#define LLRP_PARM_v1_0_ReceiveSensitivityTableEntry  139
+#define LLRP_PARM_v1_0_PerAntennaAirProtocol  140
+#define LLRP_PARM_v1_0_GPIOCapabilities  141
+#define LLRP_PARM_v1_0_LLRPCapabilities  142
+#define LLRP_PARM_v1_0_RegulatoryCapabilities  143
+#define LLRP_PARM_v1_0_UHFBandCapabilities  144
+#define LLRP_PARM_v1_0_TransmitPowerLevelTableEntry  145
+#define LLRP_PARM_v1_0_FrequencyInformation  146
+#define LLRP_PARM_v1_0_FrequencyHopTable  147
+#define LLRP_PARM_v1_0_FixedFrequencyTable  148
+#define LLRP_PARM_v1_0_PerAntennaReceiveSensitivityRange  149
+#define LLRP_PARM_v1_0_ROSpec  177
+#define LLRP_PARM_v1_0_ROBoundarySpec  178
+#define LLRP_PARM_v1_0_ROSpecStartTrigger  179
+#define LLRP_PARM_v1_0_PeriodicTriggerValue  180
+#define LLRP_PARM_v1_0_GPITriggerValue  181
+#define LLRP_PARM_v1_0_ROSpecStopTrigger  182
+#define LLRP_PARM_v1_0_AISpec  183
+#define LLRP_PARM_v1_0_AISpecStopTrigger  184
+#define LLRP_PARM_v1_0_TagObservationTrigger  185
+#define LLRP_PARM_v1_0_InventoryParameterSpec  186
+#define LLRP_PARM_v1_0_RFSurveySpec  187
+#define LLRP_PARM_v1_0_RFSurveySpecStopTrigger  188
+#define LLRP_PARM_v1_0_AccessSpec  207
+#define LLRP_PARM_v1_0_AccessSpecStopTrigger  208
+#define LLRP_PARM_v1_0_AccessCommand  209
+#define LLRP_PARM_v1_0_LLRPConfigurationStateValue  217
+#define LLRP_PARM_v1_0_Identification  218
+#define LLRP_PARM_v1_0_GPOWriteData  219
+#define LLRP_PARM_v1_0_KeepaliveSpec  220
+#define LLRP_PARM_v1_0_AntennaProperties  221
+#define LLRP_PARM_v1_0_AntennaConfiguration  222
+#define LLRP_PARM_v1_0_RFReceiver  223
+#define LLRP_PARM_v1_0_RFTransmitter  224
+#define LLRP_PARM_v1_0_GPIPortCurrentState  225
+#define LLRP_PARM_v1_0_EventsAndReports  226
+#define LLRP_PARM_v1_0_ROReportSpec  237
+#define LLRP_PARM_v1_0_TagReportContentSelector  238
+#define LLRP_PARM_v1_0_AccessReportSpec  239
+#define LLRP_PARM_v1_0_TagReportData  240
+#define LLRP_PARM_v1_0_EPCData  241
+#define LLRP_PARM_v1_0_RFSurveyReportData  242
+#define LLRP_PARM_v1_0_FrequencyRSSILevelEntry  243
+#define LLRP_PARM_v1_0_ReaderEventNotificationSpec  244
+#define LLRP_PARM_v1_0_EventNotificationState  245
+#define LLRP_PARM_v1_0_ReaderEventNotificationData  246
+#define LLRP_PARM_v1_0_HoppingEvent  247
+#define LLRP_PARM_v1_0_GPIEvent  248
+#define LLRP_PARM_v1_0_ROSpecEvent  249
+#define LLRP_PARM_v1_0_ReportBufferLevelWarningEvent  250
+#define LLRP_PARM_v1_0_ReportBufferOverflowErrorEvent  251
+#define LLRP_PARM_v1_0_ReaderExceptionEvent  252
+#define LLRP_PARM_v1_0_RFSurveyEvent  253
+#define LLRP_PARM_v1_0_AISpecEvent  254
+#define LLRP_PARM_v1_0_AntennaEvent  255
+#define LLRP_PARM_v1_0_ConnectionAttemptEvent  256
+#define LLRP_PARM_v1_0_ConnectionCloseEvent  257
+#define LLRP_PARM_v1_0_LLRPStatus  287
+#define LLRP_PARM_v1_0_FieldError  288
+#define LLRP_PARM_v1_0_ParameterError  289
+#define LLRP_PARM_v1_0_C1G2LLRPCapabilities  327
+#define LLRP_PARM_v1_0_C1G2UHFRFModeTable  328
+#define LLRP_PARM_v1_0_C1G2UHFRFModeTableEntry  329
+#define LLRP_PARM_v1_0_C1G2InventoryCommand  330
+#define LLRP_PARM_v1_0_C1G2Filter  331
+#define LLRP_PARM_v1_0_C1G2TagInventoryMask  332
+#define LLRP_PARM_v1_0_C1G2TagInventoryStateAwareFilterAction  333
+#define LLRP_PARM_v1_0_C1G2TagInventoryStateUnawareFilterAction  334
+#define LLRP_PARM_v1_0_C1G2RFControl  335
+#define LLRP_PARM_v1_0_C1G2SingulationControl  336
+#define LLRP_PARM_v1_0_C1G2TagInventoryStateAwareSingulationAction  337
+#define LLRP_PARM_v1_0_C1G2TagSpec  338
+#define LLRP_PARM_v1_0_C1G2TargetTag  339
+#define LLRP_PARM_v1_0_C1G2Read  341
+#define LLRP_PARM_v1_0_C1G2Write  342
+#define LLRP_PARM_v1_0_C1G2Kill  343
+#define LLRP_PARM_v1_0_C1G2Lock  344
+#define LLRP_PARM_v1_0_C1G2LockPayload  345
+#define LLRP_PARM_v1_0_C1G2BlockErase  346
+#define LLRP_PARM_v1_0_C1G2BlockWrite  347
+#define LLRP_PARM_v1_0_C1G2EPCMemorySelector  348
+#define LLRP_PARM_v1_0_C1G2ReadOpSpecResult  349
+#define LLRP_PARM_v1_0_C1G2WriteOpSpecResult  350
+#define LLRP_PARM_v1_0_C1G2KillOpSpecResult  351
+#define LLRP_PARM_v1_0_C1G2LockOpSpecResult  352
+#define LLRP_PARM_v1_0_C1G2BlockEraseOpSpecResult  353
+#define LLRP_PARM_v1_0_C1G2BlockWriteOpSpecResult  354
+#define LLRP_PARM_v1_0_Custom  1023
+
+/* Custom Parameters */
+  
+
+/* Messages */
+  
+#define LLRP_MSG_v1_0_GET_READER_CAPABILITIES  1
+#define LLRP_MSG_v1_0_GET_READER_CONFIG  2
+#define LLRP_MSG_v1_0_SET_READER_CONFIG  3
+#define LLRP_MSG_v1_0_CLOSE_CONNECTION_RESPONSE  4
+#define LLRP_MSG_v1_0_GET_READER_CAPABILITIES_RESPONSE  11
+#define LLRP_MSG_v1_0_GET_READER_CONFIG_RESPONSE  12
+#define LLRP_MSG_v1_0_SET_READER_CONFIG_RESPONSE  13
+#define LLRP_MSG_v1_0_CLOSE_CONNECTION  14
+#define LLRP_MSG_v1_0_ADD_ROSPEC  20
+#define LLRP_MSG_v1_0_DELETE_ROSPEC  21
+#define LLRP_MSG_v1_0_START_ROSPEC  22
+#define LLRP_MSG_v1_0_STOP_ROSPEC  23
+#define LLRP_MSG_v1_0_ENABLE_ROSPEC  24
+#define LLRP_MSG_v1_0_DISABLE_ROSPEC  25
+#define LLRP_MSG_v1_0_GET_ROSPECS  26
+#define LLRP_MSG_v1_0_ADD_ROSPEC_RESPONSE  30
+#define LLRP_MSG_v1_0_DELETE_ROSPEC_RESPONSE  31
+#define LLRP_MSG_v1_0_START_ROSPEC_RESPONSE  32
+#define LLRP_MSG_v1_0_STOP_ROSPEC_RESPONSE  33
+#define LLRP_MSG_v1_0_ENABLE_ROSPEC_RESPONSE  34
+#define LLRP_MSG_v1_0_DISABLE_ROSPEC_RESPONSE  35
+#define LLRP_MSG_v1_0_GET_ROSPECS_RESPONSE  36
+#define LLRP_MSG_v1_0_ADD_ACCESSSPEC  40
+#define LLRP_MSG_v1_0_DELETE_ACCESSSPEC  41
+#define LLRP_MSG_v1_0_ENABLE_ACCESSSPEC  42
+#define LLRP_MSG_v1_0_DISABLE_ACCESSSPEC  43
+#define LLRP_MSG_v1_0_GET_ACCESSSPECS  44
+#define LLRP_MSG_v1_0_ADD_ACCESSSPEC_RESPONSE  50
+#define LLRP_MSG_v1_0_DELETE_ACCESSSPEC_RESPONSE  51
+#define LLRP_MSG_v1_0_ENABLE_ACCESSSPEC_RESPONSE  52
+#define LLRP_MSG_v1_0_DISABLE_ACCESSSPEC_RESPONSE  53
+#define LLRP_MSG_v1_0_GET_ACCESSSPECS_RESPONSE  54
+#define LLRP_MSG_v1_0_GET_REPORT  60
+#define LLRP_MSG_v1_0_RO_ACCESS_REPORT  61
+#define LLRP_MSG_v1_0_KEEPALIVE  62
+#define LLRP_MSG_v1_0_READER_EVENT_NOTIFICATION  63
+#define LLRP_MSG_v1_0_ENABLE_EVENTS_AND_REPORTS  64
+#define LLRP_MSG_v1_0_KEEPALIVE_ACK  72
+#define LLRP_MSG_v1_0_ERROR_MESSAGE  100
+#define LLRP_MSG_v1_0_CUSTOM_MESSAGE  1023
+
+/* Custom Messages */
+  
+
+#endif /* _LLRP_GENERATED_v1_0_H */
+
diff --git a/plugins/llrp/llrp-Intermec.c b/plugins/llrp/llrp-Intermec.c
new file mode 100644 (file)
index 0000000..3ea99a5
--- /dev/null
@@ -0,0 +1,866 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */ 
+
+#include <stdio.h> /* for NULL */
+#include "llrpparsetypes.h" 
+#include "llrpparseinc.h" 
+/*lint -e786 -e766*/
+
+
+/* ----------------------------------------------------------------------------- */
+/* Enumerations (3 total) */
+    
+t_llrp_enumeration_item llrp_enum_list_IntermecEngineCodeEnumeration[] = {
+        
+    { "Success", 0 },
+    { "Insufficient_Tag_Power", 1 },
+    { "NAK", 2 },
+    { "Read_Error", 3 },
+    { "Write_Error", 4 },
+    { "Lock_Error", 5 },
+    { "Unlock_Error", 6 },
+    { "Query_Lock_Error", 7 },
+    { "Kill_Error", 8 },
+    { "Illegal_Command", 9 },
+    { "Address_Range_Check_Error", 10 },
+    { "Nonspecific_Error", 11 },
+    { "Privilege_Error", 12 },
+    { "Memory_Lock_Error", 13 },
+    { "Blocked", 14 },
+    { "Duty_Cycle", 15 },
+    { "No_Response", 16 },
+    { "CRC_Error", 17 },
+    { "Collision", 18 },
+    { "Memory_Overrun_Error", 19 },
+    { "Erase_Error", 20 },
+    { "NXP_Alarm_Error", 21 },
+};
+t_llrp_enumeration llrp_enum_IntermecEngineCodeEnumeration = {
+    llrp_enum_list_IntermecEngineCodeEnumeration, 22
+};
+    
+t_llrp_enumeration_item llrp_enum_list_IntermecNXPReadProtectResultType[] = {
+        
+    { "Success", 0 },
+    { "Tag_Memory_Locked_Error", 1 },
+    { "Insufficient_Power", 2 },
+    { "Nonspecific_Tag_Error", 3 },
+    { "No_Response_From_Tag", 4 },
+    { "Nonspecific_Reader_Error", 5 },
+};
+t_llrp_enumeration llrp_enum_IntermecNXPReadProtectResultType = {
+    llrp_enum_list_IntermecNXPReadProtectResultType, 6
+};
+    
+t_llrp_enumeration_item llrp_enum_list_IntermecNXPEASResultType[] = {
+        
+    { "Success", 0 },
+    { "Tag_Memory_Locked_Error", 1 },
+    { "Insufficient_Power", 2 },
+    { "Nonspecific_Tag_Error", 3 },
+    { "No_Response_From_Tag", 4 },
+    { "Nonspecific_Reader_Error", 5 },
+};
+t_llrp_enumeration llrp_enum_IntermecNXPEASResultType = {
+    llrp_enum_list_IntermecNXPEASResultType, 6
+};
+    
+/* ----------------------------------------------------------------------------- */
+/* Parameter Definitions (36 total) */
+    
+/* Parameter: IntermecResetStartEvent */
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecResetStartEvent = {
+    "IntermecResetStartEvent", LLRP_ITEM_PARAMETER, 16, 0,
+      NULL
+};
+    
+/* Parameter: IntermecResetCompleteEvent */
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecResetCompleteEvent = {
+    "IntermecResetCompleteEvent", LLRP_ITEM_PARAMETER, 19, 0,
+      NULL
+};
+    
+/* Parameter: IntermecLowLevelLogEvent */
+      
+t_llrp_item llrp_custparam_items_IntermecLowLevelLogEvent[] = {
+      
+    { "PlatformVersion", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "SoftwareVersion", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "Region", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "BuildDate", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "BuildTime", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "BuildOwner", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "BuildBaseline", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_utf8v, 
+      NULL },
+
+    { "LogData", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_bytesToEnd, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecLowLevelLogEvent = {
+    "IntermecLowLevelLogEvent", LLRP_ITEM_PARAMETER, 18, 8,
+      llrp_custparam_items_IntermecLowLevelLogEvent
+};
+    
+/* Parameter: IntermecROSpecLoopEvent */
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecROSpecLoopEvent = {
+    "IntermecROSpecLoopEvent", LLRP_ITEM_PARAMETER, 21, 0,
+      NULL
+};
+    
+/* Parameter: IntermecNXPEASAlarmEndEvent */
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarmEndEvent = {
+    "IntermecNXPEASAlarmEndEvent", LLRP_ITEM_PARAMETER, 29, 0,
+      NULL
+};
+    
+/* Parameter: IntermecNXPEASAlarmResult */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPEASAlarmResult[] = {
+      
+    { "AlarmSeenCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "FirstSeenTimestampUTC", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_FirstSeenTimestampUTC },
+
+    { "LastSeenTimestampUTC", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_LastSeenTimestampUTC },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarmResult = {
+    "IntermecNXPEASAlarmResult", LLRP_ITEM_PARAMETER, 30, 3,
+      llrp_custparam_items_IntermecNXPEASAlarmResult
+};
+    
+/* Parameter: IntermecEnableROSpecLoop */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableROSpecLoop[] = {
+      
+    { "EnableSpecLooping", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableROSpecLoop = {
+    "IntermecEnableROSpecLoop", LLRP_ITEM_PARAMETER, 5, 2,
+      llrp_custparam_items_IntermecEnableROSpecLoop
+};
+    
+/* Parameter: IntermecEnableLowLevelLogging */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableLowLevelLogging[] = {
+      
+    { "EnableLowLevelLogging", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableLowLevelLogging = {
+    "IntermecEnableLowLevelLogging", LLRP_ITEM_PARAMETER, 17, 2,
+      llrp_custparam_items_IntermecEnableLowLevelLogging
+};
+    
+/* Parameter: IntermecNXPEASAlarm */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPEASAlarm[] = {
+      
+    { "AntennaIDs", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16v, 
+      NULL },
+
+    { "AntennaConfiguration", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_AntennaConfiguration },
+
+    { "AISpecStopTrigger", LLRP_ITEM_PARAMETER, 1, 0, LLRP_FIELDTYPE_NONE, &llrp_param_AISpecStopTrigger },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarm = {
+    "IntermecNXPEASAlarm", LLRP_ITEM_PARAMETER, 27, 3,
+      llrp_custparam_items_IntermecNXPEASAlarm
+};
+    
+/* Parameter: IntermecAISpecStopTrigger */
+      
+t_llrp_item llrp_custparam_items_IntermecAISpecStopTrigger[] = {
+      
+    { "Custom", LLRP_ITEM_PARAMETER, 1, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTrigger = {
+    "IntermecAISpecStopTrigger", LLRP_ITEM_PARAMETER, 28, 1,
+      llrp_custparam_items_IntermecAISpecStopTrigger
+};
+    
+/* Parameter: IntermecAISpecStopTriggerMinimumTries */
+      
+t_llrp_item llrp_custparam_items_IntermecAISpecStopTriggerMinimumTries[] = {
+      
+    { "MinimumTries", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTries = {
+    "IntermecAISpecStopTriggerMinimumTries", LLRP_ITEM_PARAMETER, 31, 2,
+      llrp_custparam_items_IntermecAISpecStopTriggerMinimumTries
+};
+    
+/* Parameter: IntermecAISpecStopTriggerMinimumTimeout */
+      
+t_llrp_item llrp_custparam_items_IntermecAISpecStopTriggerMinimumTimeout[] = {
+      
+    { "MinimumTimeout", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTimeout = {
+    "IntermecAISpecStopTriggerMinimumTimeout", LLRP_ITEM_PARAMETER, 32, 2,
+      llrp_custparam_items_IntermecAISpecStopTriggerMinimumTimeout
+};
+    
+/* Parameter: IntermecCollectExtraTagSingulationDetails */
+      
+t_llrp_item llrp_custparam_items_IntermecCollectExtraTagSingulationDetails[] = {
+      
+    { "EnableRNSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnableHighResolutionRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "EnablePhaseAngle", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 5, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecCollectExtraTagSingulationDetails = {
+    "IntermecCollectExtraTagSingulationDetails", LLRP_ITEM_PARAMETER, 1, 4,
+      llrp_custparam_items_IntermecCollectExtraTagSingulationDetails
+};
+    
+/* Parameter: IntermecEnableABToggle */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableABToggle[] = {
+      
+    { "EnableABToggle", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableABToggle = {
+    "IntermecEnableABToggle", LLRP_ITEM_PARAMETER, 7, 2,
+      llrp_custparam_items_IntermecEnableABToggle
+};
+    
+/* Parameter: IntermecNXPReadProtect */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPReadProtect[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "EnableReadProtect", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPReadProtect = {
+    "IntermecNXPReadProtect", LLRP_ITEM_PARAMETER, 23, 4,
+      llrp_custparam_items_IntermecNXPReadProtect
+};
+    
+/* Parameter: IntermecNXPEAS */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPEAS[] = {
+      
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "AccessPassword", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "EnableEAS", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEAS = {
+    "IntermecNXPEAS", LLRP_ITEM_PARAMETER, 24, 4,
+      llrp_custparam_items_IntermecNXPEAS
+};
+    
+/* Parameter: IntermecEnableReportCoalescence */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableReportCoalescence[] = {
+      
+    { "EnableCoalescence", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableReportCoalescence = {
+    "IntermecEnableReportCoalescence", LLRP_ITEM_PARAMETER, 33, 2,
+      llrp_custparam_items_IntermecEnableReportCoalescence
+};
+    
+/* Parameter: IntermecNXPReadProtectOpSpecResult */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPReadProtectOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_IntermecNXPReadProtectResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPReadProtectOpSpecResult = {
+    "IntermecNXPReadProtectOpSpecResult", LLRP_ITEM_PARAMETER, 25, 2,
+      llrp_custparam_items_IntermecNXPReadProtectOpSpecResult
+};
+    
+/* Parameter: IntermecNXPEASOpSpecResult */
+      
+t_llrp_item llrp_custparam_items_IntermecNXPEASOpSpecResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      &llrp_enum_IntermecNXPEASResultType },
+
+    { "OpSpecID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASOpSpecResult = {
+    "IntermecNXPEASOpSpecResult", LLRP_ITEM_PARAMETER, 26, 2,
+      llrp_custparam_items_IntermecNXPEASOpSpecResult
+};
+    
+/* Parameter: IntermecEnableTagInZone */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagInZone[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagInZone = {
+    "IntermecEnableTagInZone", LLRP_ITEM_PARAMETER, 3, 2,
+      llrp_custparam_items_IntermecEnableTagInZone
+};
+    
+/* Parameter: IntermecEnableTagInPortal */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagInPortal[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagInPortal = {
+    "IntermecEnableTagInPortal", LLRP_ITEM_PARAMETER, 35, 2,
+      llrp_custparam_items_IntermecEnableTagInPortal
+};
+    
+/* Parameter: IntermecEnableTagMoving */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagMoving[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagMoving = {
+    "IntermecEnableTagMoving", LLRP_ITEM_PARAMETER, 10, 2,
+      llrp_custparam_items_IntermecEnableTagMoving
+};
+    
+/* Parameter: IntermecEnableTagNear */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagNear[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagNear = {
+    "IntermecEnableTagNear", LLRP_ITEM_PARAMETER, 11, 2,
+      llrp_custparam_items_IntermecEnableTagNear
+};
+    
+/* Parameter: IntermecEnableTagSpeed */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagSpeed[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagSpeed = {
+    "IntermecEnableTagSpeed", LLRP_ITEM_PARAMETER, 14, 2,
+      llrp_custparam_items_IntermecEnableTagSpeed
+};
+    
+/* Parameter: IntermecEnableTagDistance */
+      
+t_llrp_item llrp_custparam_items_IntermecEnableTagDistance[] = {
+      
+    { "Enable", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1, 
+      NULL },
+
+    { "", LLRP_ITEM_RESERVED, 7, 0, LLRP_FIELDTYPE_NONE, NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagDistance = {
+    "IntermecEnableTagDistance", LLRP_ITEM_PARAMETER, 20, 2,
+      llrp_custparam_items_IntermecEnableTagDistance
+};
+    
+/* Parameter: IntermecTagReportData */
+      
+t_llrp_item llrp_custparam_items_IntermecTagReportData[] = {
+      
+    { "ID", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u1v, 
+      NULL },
+
+    { "TagSeenCount", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+    { "UTCTimestampMicroseconds", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u64, 
+      NULL },
+
+    { "Custom", LLRP_ITEM_PARAMETER, 0, LLRP_REPEAT_INDEFINITELY, LLRP_FIELDTYPE_NONE, &llrp_param_Custom },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagReportData = {
+    "IntermecTagReportData", LLRP_ITEM_PARAMETER, 2, 4,
+      llrp_custparam_items_IntermecTagReportData
+};
+    
+/* Parameter: IntermecAccessResult */
+      
+t_llrp_item llrp_custparam_items_IntermecAccessResult[] = {
+      
+    { "Result", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      &llrp_enum_IntermecEngineCodeEnumeration },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecAccessResult = {
+    "IntermecAccessResult", LLRP_ITEM_PARAMETER, 0, 1,
+      llrp_custparam_items_IntermecAccessResult
+};
+    
+/* Parameter: IntermecRNSI */
+      
+t_llrp_item llrp_custparam_items_IntermecRNSI[] = {
+      
+    { "RNSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "LowLevelTimestamp", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecRNSI = {
+    "IntermecRNSI", LLRP_ITEM_PARAMETER, 4, 2,
+      llrp_custparam_items_IntermecRNSI
+};
+    
+/* Parameter: IntermecPhaseAngle */
+      
+t_llrp_item llrp_custparam_items_IntermecPhaseAngle[] = {
+      
+    { "PhaseAngle", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_s16, 
+      NULL },
+
+    { "LowLevelTimestamp", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecPhaseAngle = {
+    "IntermecPhaseAngle", LLRP_ITEM_PARAMETER, 6, 2,
+      llrp_custparam_items_IntermecPhaseAngle
+};
+    
+/* Parameter: IntermecHighResolutionRSSI */
+      
+t_llrp_item llrp_custparam_items_IntermecHighResolutionRSSI[] = {
+      
+    { "HighResolutionRSSI", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+    { "LowLevelTimestamp", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u32, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecHighResolutionRSSI = {
+    "IntermecHighResolutionRSSI", LLRP_ITEM_PARAMETER, 8, 2,
+      llrp_custparam_items_IntermecHighResolutionRSSI
+};
+    
+/* Parameter: IntermecTagInZone */
+      
+t_llrp_item llrp_custparam_items_IntermecTagInZone[] = {
+      
+    { "InZoneConfidence", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagInZone = {
+    "IntermecTagInZone", LLRP_ITEM_PARAMETER, 9, 1,
+      llrp_custparam_items_IntermecTagInZone
+};
+    
+/* Parameter: IntermecTagInPortal */
+      
+t_llrp_item llrp_custparam_items_IntermecTagInPortal[] = {
+      
+    { "InPortalConfidence", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagInPortal = {
+    "IntermecTagInPortal", LLRP_ITEM_PARAMETER, 34, 1,
+      llrp_custparam_items_IntermecTagInPortal
+};
+    
+/* Parameter: IntermecTagMoving */
+      
+t_llrp_item llrp_custparam_items_IntermecTagMoving[] = {
+      
+    { "MovingConfidence", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagMoving = {
+    "IntermecTagMoving", LLRP_ITEM_PARAMETER, 12, 1,
+      llrp_custparam_items_IntermecTagMoving
+};
+    
+/* Parameter: IntermecTagNear */
+      
+t_llrp_item llrp_custparam_items_IntermecTagNear[] = {
+      
+    { "NearnessFactor", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u8, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagNear = {
+    "IntermecTagNear", LLRP_ITEM_PARAMETER, 13, 1,
+      llrp_custparam_items_IntermecTagNear
+};
+    
+/* Parameter: IntermecTagSpeed */
+      
+t_llrp_item llrp_custparam_items_IntermecTagSpeed[] = {
+      
+    { "Speed", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagSpeed = {
+    "IntermecTagSpeed", LLRP_ITEM_PARAMETER, 15, 1,
+      llrp_custparam_items_IntermecTagSpeed
+};
+    
+/* Parameter: IntermecTagDistance */
+      
+t_llrp_item llrp_custparam_items_IntermecTagDistance[] = {
+      
+    { "Distance", LLRP_ITEM_FIELD, 0, 0, LLRP_FIELDTYPE_u16, 
+      NULL },
+
+};
+      
+t_llrp_compound_item llrp_custparam_Intermec_IntermecTagDistance = {
+    "IntermecTagDistance", LLRP_ITEM_PARAMETER, 22, 1,
+      llrp_custparam_items_IntermecTagDistance
+};
+    
+/* ----------------------------------------------------------------------------- */
+/* Custom Parameter List (36 total) */
+
+t_llrp_custom_map_item llrp_llrp_Intermec_custom_parameter_list[] = {
+    
+    { 1963,
+      0, &llrp_custparam_Intermec_IntermecAccessResult,
+        
+    },
+    
+    { 1963,
+      1, &llrp_custparam_Intermec_IntermecCollectExtraTagSingulationDetails,
+        
+    },
+    
+    { 1963,
+      2, &llrp_custparam_Intermec_IntermecTagReportData,
+        
+    },
+    
+    { 1963,
+      3, &llrp_custparam_Intermec_IntermecEnableTagInZone,
+        
+    },
+    
+    { 1963,
+      4, &llrp_custparam_Intermec_IntermecRNSI,
+        
+    },
+    
+    { 1963,
+      5, &llrp_custparam_Intermec_IntermecEnableROSpecLoop,
+        
+    },
+    
+    { 1963,
+      6, &llrp_custparam_Intermec_IntermecPhaseAngle,
+        
+    },
+    
+    { 1963,
+      7, &llrp_custparam_Intermec_IntermecEnableABToggle,
+        
+    },
+    
+    { 1963,
+      8, &llrp_custparam_Intermec_IntermecHighResolutionRSSI,
+        
+    },
+    
+    { 1963,
+      9, &llrp_custparam_Intermec_IntermecTagInZone,
+        
+    },
+    
+    { 1963,
+      10, &llrp_custparam_Intermec_IntermecEnableTagMoving,
+        
+    },
+    
+    { 1963,
+      11, &llrp_custparam_Intermec_IntermecEnableTagNear,
+        
+    },
+    
+    { 1963,
+      12, &llrp_custparam_Intermec_IntermecTagMoving,
+        
+    },
+    
+    { 1963,
+      13, &llrp_custparam_Intermec_IntermecTagNear,
+        
+    },
+    
+    { 1963,
+      14, &llrp_custparam_Intermec_IntermecEnableTagSpeed,
+        
+    },
+    
+    { 1963,
+      15, &llrp_custparam_Intermec_IntermecTagSpeed,
+        
+    },
+    
+    { 1963,
+      16, &llrp_custparam_Intermec_IntermecResetStartEvent,
+        
+    },
+    
+    { 1963,
+      17, &llrp_custparam_Intermec_IntermecEnableLowLevelLogging,
+        
+    },
+    
+    { 1963,
+      18, &llrp_custparam_Intermec_IntermecLowLevelLogEvent,
+        
+    },
+    
+    { 1963,
+      19, &llrp_custparam_Intermec_IntermecResetCompleteEvent,
+        
+    },
+    
+    { 1963,
+      20, &llrp_custparam_Intermec_IntermecEnableTagDistance,
+        
+    },
+    
+    { 1963,
+      21, &llrp_custparam_Intermec_IntermecROSpecLoopEvent,
+        
+    },
+    
+    { 1963,
+      22, &llrp_custparam_Intermec_IntermecTagDistance,
+        
+    },
+    
+    { 1963,
+      23, &llrp_custparam_Intermec_IntermecNXPReadProtect,
+        
+    },
+    
+    { 1963,
+      24, &llrp_custparam_Intermec_IntermecNXPEAS,
+        
+    },
+    
+    { 1963,
+      25, &llrp_custparam_Intermec_IntermecNXPReadProtectOpSpecResult,
+        
+    },
+    
+    { 1963,
+      26, &llrp_custparam_Intermec_IntermecNXPEASOpSpecResult,
+        
+    },
+    
+    { 1963,
+      27, &llrp_custparam_Intermec_IntermecNXPEASAlarm,
+        
+    },
+    
+    { 1963,
+      28, &llrp_custparam_Intermec_IntermecAISpecStopTrigger,
+        
+    },
+    
+    { 1963,
+      29, &llrp_custparam_Intermec_IntermecNXPEASAlarmEndEvent,
+        
+    },
+    
+    { 1963,
+      30, &llrp_custparam_Intermec_IntermecNXPEASAlarmResult,
+        
+    },
+    
+    { 1963,
+      31, &llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTries,
+        
+    },
+    
+    { 1963,
+      32, &llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTimeout,
+        
+    },
+    
+    { 1963,
+      33, &llrp_custparam_Intermec_IntermecEnableReportCoalescence,
+        
+    },
+    
+    { 1963,
+      34, &llrp_custparam_Intermec_IntermecTagInPortal,
+        
+    },
+    
+    { 1963,
+      35, &llrp_custparam_Intermec_IntermecEnableTagInPortal,
+        
+    },
+    
+};
+  
+/* ----------------------------------------------------------------------------- */
+/* Validator: llrp_Intermec */
+t_llrp_parse_validator llrp_llrp_Intermec_parse_validator = {
+    "llrp_Intermec",
+    NULL, 0,
+    llrp_llrp_Intermec_custom_parameter_list, 36,
+    NULL, 0,
+    NULL, 0,
+};
+
+
+/*end*/
diff --git a/plugins/llrp/llrp-Intermec.h b/plugins/llrp/llrp-Intermec.h
new file mode 100644 (file)
index 0000000..ba1466b
--- /dev/null
@@ -0,0 +1,169 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _LLRP_GENERATED_llrp_Intermec_H
+#define _LLRP_GENERATED_llrp_Intermec_H
+
+#include "llrpparsetypes.h" 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern t_llrp_parse_validator llrp_llrp_Intermec_parse_validator;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/* ----------------------------------------------------------------------------- */
+/* Custom Parameter Forward Declarations (36 total) */
+    
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecResetStartEvent;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecResetCompleteEvent;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecLowLevelLogEvent;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecROSpecLoopEvent;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarmEndEvent;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarmResult;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableROSpecLoop;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableLowLevelLogging;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASAlarm;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTrigger;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTries;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecAISpecStopTriggerMinimumTimeout;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecCollectExtraTagSingulationDetails;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableABToggle;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPReadProtect;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEAS;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableReportCoalescence;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPReadProtectOpSpecResult;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecNXPEASOpSpecResult;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagInZone;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagInPortal;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagMoving;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagNear;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagSpeed;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecEnableTagDistance;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagReportData;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecAccessResult;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecRNSI;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecPhaseAngle;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecHighResolutionRSSI;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagInZone;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagInPortal;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagMoving;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagNear;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagSpeed;
+extern t_llrp_compound_item llrp_custparam_Intermec_IntermecTagDistance;
+
+/* Enumerations */
+  
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Success  0
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Insufficient_Tag_Power  1
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_NAK  3
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Read_Error  4
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Write_Error  5
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Lock_Error  7
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Unlock_Error  9
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Query_Lock_Error  10
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Kill_Error  12
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Illegal_Command  14
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Address_Range_Check_Error  15
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Nonspecific_Error  16
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Privilege_Error  17
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Memory_Lock_Error  18
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Blocked  19
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Duty_Cycle  20
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_No_Response  22
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_CRC_Error  23
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Collision  24
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Memory_Overrun_Error  25
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_Erase_Error  26
+#define LLRP_ENUM_llrp_Intermec_IntermecEngineCodeEnumeration_NXP_Alarm_Error  27
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_Success  0
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_Tag_Memory_Locked_Error  1
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_Insufficient_Power  2
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_Nonspecific_Tag_Error  3
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_No_Response_From_Tag  4
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPReadProtectResultType_Nonspecific_Reader_Error  5
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_Success  0
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_Tag_Memory_Locked_Error  1
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_Insufficient_Power  2
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_Nonspecific_Tag_Error  3
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_No_Response_From_Tag  4
+#define LLRP_ENUM_llrp_Intermec_IntermecNXPEASResultType_Nonspecific_Reader_Error  5
+
+/* Parameters */
+  
+
+/* Custom Parameters */
+  
+#define LLRP_PARM_llrp_Intermec_IntermecAccessResult  0
+#define LLRP_PARM_llrp_Intermec_IntermecCollectExtraTagSingulationDetails  1
+#define LLRP_PARM_llrp_Intermec_IntermecTagReportData  2
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagInZone  3
+#define LLRP_PARM_llrp_Intermec_IntermecRNSI  4
+#define LLRP_PARM_llrp_Intermec_IntermecEnableROSpecLoop  5
+#define LLRP_PARM_llrp_Intermec_IntermecPhaseAngle  6
+#define LLRP_PARM_llrp_Intermec_IntermecEnableABToggle  7
+#define LLRP_PARM_llrp_Intermec_IntermecHighResolutionRSSI  8
+#define LLRP_PARM_llrp_Intermec_IntermecTagInZone  9
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagMoving  10
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagNear  11
+#define LLRP_PARM_llrp_Intermec_IntermecTagMoving  12
+#define LLRP_PARM_llrp_Intermec_IntermecTagNear  13
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagSpeed  14
+#define LLRP_PARM_llrp_Intermec_IntermecTagSpeed  15
+#define LLRP_PARM_llrp_Intermec_IntermecResetStartEvent  16
+#define LLRP_PARM_llrp_Intermec_IntermecEnableLowLevelLogging  17
+#define LLRP_PARM_llrp_Intermec_IntermecLowLevelLogEvent  18
+#define LLRP_PARM_llrp_Intermec_IntermecResetCompleteEvent  19
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagDistance  20
+#define LLRP_PARM_llrp_Intermec_IntermecROSpecLoopEvent  21
+#define LLRP_PARM_llrp_Intermec_IntermecTagDistance  22
+#define LLRP_PARM_llrp_Intermec_IntermecNXPReadProtect  23
+#define LLRP_PARM_llrp_Intermec_IntermecNXPEAS  24
+#define LLRP_PARM_llrp_Intermec_IntermecNXPReadProtectOpSpecResult  25
+#define LLRP_PARM_llrp_Intermec_IntermecNXPEASOpSpecResult  26
+#define LLRP_PARM_llrp_Intermec_IntermecNXPEASAlarm  27
+#define LLRP_PARM_llrp_Intermec_IntermecAISpecStopTrigger  28
+#define LLRP_PARM_llrp_Intermec_IntermecNXPEASAlarmEndEvent  29
+#define LLRP_PARM_llrp_Intermec_IntermecNXPEASAlarmResult  30
+#define LLRP_PARM_llrp_Intermec_IntermecAISpecStopTriggerMinimumTries  31
+#define LLRP_PARM_llrp_Intermec_IntermecAISpecStopTriggerMinimumTimeout  32
+#define LLRP_PARM_llrp_Intermec_IntermecEnableReportCoalescence  33
+#define LLRP_PARM_llrp_Intermec_IntermecTagInPortal  34
+#define LLRP_PARM_llrp_Intermec_IntermecEnableTagInPortal  35
+
+/* Messages */
+  
+
+/* Custom Messages */
+  
+
+#endif /* _LLRP_GENERATED_llrp_Intermec_H */
+
diff --git a/plugins/llrp/llrpparse.c b/plugins/llrp/llrpparse.c
new file mode 100644 (file)
index 0000000..df9a2c7
--- /dev/null
@@ -0,0 +1,751 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h> /* For NULL */
+#include "llrpparsetypes.h"
+#include "llrpparse.h"
+
+/* ------------------------------------------------------------------------------- */
+/* Local Function Declarations                                                     */
+
+static void llrp_ParseParameter(t_llrp_parse_context *context, unsigned short usType,
+ int bImpliedLength, unsigned short usLength);
+static void llrp_ParseCustomParameter(t_llrp_parse_context *context, unsigned short usType,
+ unsigned short usLength);
+
+static void llrp_ParseCompoundItem(t_llrp_parse_context *context,
+ t_llrp_compound_item *pCompoundItem, unsigned long ulTotalLength);
+
+static int llrp_ParseFixedItems(t_llrp_parse_context *context, t_llrp_item *pItemList,
+ unsigned short usTotalItems, unsigned short *pusParsedItems, unsigned long ulTotalLength,
+ unsigned long *pulConsumedBytes);
+static int llrp_ParseVariableItems(t_llrp_parse_context *context, t_llrp_item *pItemList,
+ unsigned short usTotalItems, unsigned long ulTotalLength);
+
+static int llrp_HandleField(t_llrp_parse_context *context, t_llrp_item *pItem,
+ unsigned short usFieldIndex, unsigned long ulTotalLength, unsigned char *pucBitAccumulator,
+ unsigned char *pucAccumulatedBits);
+
+static int llrp_ParseGetParameterContentLength(const t_llrp_compound_item *pItem,
+ unsigned short *pusLength);
+
+#define llrp_ReportError(pContext, parameterList) \
+{ if((pContext)->parse_error_handler != NULL) (pContext)->parse_error_handler parameterList; }
+
+#define llrp_ReportMessage(pContext, parameterList) \
+{ if((pContext)->debug_message_handler != NULL) (pContext)->debug_message_handler parameterList; }
+
+#define llrp_StreamRead(pContext, readLength, readWaitForever, pReadResult) \
+    (pContext)->stream_read_handler(pContext, readLength, readWaitForever, pReadResult)
+
+#define llrp_StreamGetOffset(pContext) \
+    (pContext)->stream_get_offset_handler(pContext)
+
+/* ------------------------------------------------------------------------------- */
+/* Parsing                                                                         */
+
+int llrp_ParseMessage(t_llrp_parse_context *context)
+{
+    unsigned char ucVersion;
+    unsigned short *pusData, usValidatorIndex, usMessageIndex, usType;
+    unsigned long *pulData, ulLength, ulID, ulReadBytes;
+    t_llrp_parse_validator *validator;
+    int bContinueParse;
+
+    /* Make sure the context is valid */
+    if(context->stream_read_handler == NULL || context->stream_get_offset_handler == NULL)
+    {
+        llrp_ReportError(context, (context, LLRP_CONTEXT_ERROR, 0, "llrp_ParseMessage",
+         "Invalid context"));
+        return LLRP_PARSE_RESULT_FAILURE;
+    }
+
+    /* Ensure the stream starts at offset 0 */
+    if(llrp_StreamGetOffset(context) != 0)
+    {
+        llrp_ReportError(context, (context, LLRP_CONTEXT_ERROR, 0, "llrp_ParseMessage",
+         "Stream not starting at offset zero (current offset %lu)", llrp_StreamGetOffset(context)));
+        return LLRP_PARSE_RESULT_FAILURE;
+    }
+
+    context->depth = 0; /* Messages always begin at parse depth 0 */
+
+    /* Bytes 0-1: Type and version */
+    pusData= (unsigned short *) llrp_StreamRead(context, 2, 1, &ulReadBytes);
+    if(ulReadBytes != 2)
+    {
+        /* No error here - this happens when the stream read timed out */
+        return LLRP_PARSE_RESULT_NO_PARSE;
+    }
+    ucVersion = (unsigned char) (((unsigned char)((llrp_ntohs(*pusData)) >> 10)) & 0x07);
+    usType = (unsigned short) (llrp_ntohs(*pusData) & 0x3FF);
+
+    /* Bytes 2-5: Message length */
+    pulData = (unsigned long *) llrp_StreamRead(context, 4, 0, &ulReadBytes);
+    if(ulReadBytes != 4)
+    {
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_MESSAGE_DATA_UNDERFLOW, 0,
+         "llrp_ParseMessage", "Failed to read message length bytes"));
+        return LLRP_PARSE_RESULT_PARSE_FAILED;
+    }
+    ulLength = llrp_ntohl(*pulData);
+
+    /* Bytes 6-9: Message ID */
+    pulData = (unsigned long *) llrp_StreamRead(context, 4, 0, &ulReadBytes);
+    if(ulReadBytes != 4)
+    {
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_MESSAGE_DATA_UNDERFLOW, 0, 
+         "llrp_ParseMessage", "Failed to read message ID bytes"));
+        return LLRP_PARSE_RESULT_PARSE_FAILED;
+    }
+    ulID = llrp_ntohl(*pulData);
+
+    /* TODO: Use the message version to select the proper validator */
+    for(usValidatorIndex = 0; usValidatorIndex < context->validator_count; usValidatorIndex++)
+    {
+        validator = context->validator_list[usValidatorIndex];
+        for(usMessageIndex = 0; usMessageIndex < validator->message_count; usMessageIndex++)
+        {
+            if(validator->message_list[usMessageIndex].number == usType)
+            {
+                llrp_ReportMessage(context, (context, "llrp_ParseMessage", 
+                 "Message header parsed: version %u, type %u, length %u, ID %u",
+                 ucVersion, usType, ulLength, ulID));
+                
+                if(context->message_start_handler != NULL)
+                {
+                    bContinueParse= context->message_start_handler(context, ucVersion, usType,
+                     ulLength, ulID, (validator->message_list[usMessageIndex].item)->name);
+                }
+                else
+                    bContinueParse = 1;
+
+                if(bContinueParse)
+                {
+                    llrp_ParseCompoundItem(context, validator->message_list[usMessageIndex].item,
+                     ulLength-LLRP_HEADER_LENGTH);
+                }
+                else
+                {
+                    llrp_ReportMessage(context, (context, "llrp_ParseMessage", "Skipping message parse"));
+
+                    /* Consume/discard all remaining message data */
+                    (void)llrp_StreamRead(context, ulLength-LLRP_HEADER_LENGTH, 0, &ulReadBytes);
+                }
+
+                if(context->message_finished_handler != NULL)
+                {
+                    (void)context->message_finished_handler(context, ucVersion, usType,
+                     ulLength, ulID, (validator->message_list[usMessageIndex].item)->name);
+                }
+
+                return LLRP_PARSE_RESULT_SUCCESS;
+            }
+            if(validator->message_list[usMessageIndex].number > usType)
+                break;
+        }
+    }
+    
+    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_MESSAGE_TYPE_UNKNOWN, usType,
+     "llrp_ParseMessage", "Unknown message type (%u)", usType));
+
+    /* Consume/discard all remaining message data */
+    (void)llrp_StreamRead(context, ulLength-LLRP_HEADER_LENGTH, 0, &ulReadBytes);
+
+    return LLRP_PARSE_RESULT_PARSE_FAILED;
+}
+
+static void llrp_ParseParameter(t_llrp_parse_context *context, unsigned short usType,
+ int bImpliedLength, unsigned short usLength)
+{
+    unsigned short usTypeIndex, usValidatorIndex;
+    unsigned long ulReadBytes;
+    t_llrp_parse_validator *validator;
+    t_llrp_standard_map_item *pMapItem;
+    t_llrp_compound_item *pItem;
+
+    for(usValidatorIndex = 0; usValidatorIndex < context->validator_count; usValidatorIndex++)
+    {
+        validator = context->validator_list[usValidatorIndex];
+        for(usTypeIndex = 0; usTypeIndex < validator->parameter_count; usTypeIndex++)
+        {
+            if(validator->parameter_list[usTypeIndex].number == usType)
+            {
+                pMapItem = &(validator->parameter_list[usTypeIndex]);
+                pItem = pMapItem->item;
+
+                if(bImpliedLength)
+                {
+                    /* Calculate the length of all parameter contents. Normally this means
+                     *  the parameter is TV encoded, containing only fixed-length fields
+                     *  and no sub-parameters. */
+                    if(!llrp_ParseGetParameterContentLength(pItem, &usLength))
+                    {
+                        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_TV_NOT_FOUND,
+                         usType, "llrp_ParseParameter", "Failed to determine content size of parameter '%s' (ID %u)",
+                         pItem->name, usType));
+                        break;
+                    }
+                }
+
+                if(context->parameter_start_handler!= NULL)
+                    context->parameter_start_handler(context, usType, pItem->name, usLength);
+
+                llrp_ParseCompoundItem(context, pItem, usLength);
+
+                if(context->parameter_finished_handler!= NULL)
+                    context->parameter_finished_handler(context, usType, pItem->name, usLength);
+                return;
+            }
+
+            /* Since the parameter list is ordered (ascending), break out of the loop
+               once we've passed the usType we're looking for. */
+            if(validator->parameter_list[usTypeIndex].number > usType)
+                break;
+        }
+    }
+
+    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_TYPE_UNKNOWN, usType,
+     "llrp_ParseParameter", "Unknown parameter type (%u)", usType));
+
+    /* Discard the bytes in this unknown parameter */
+    (void)llrp_StreamRead(context, usLength, 0, &ulReadBytes);
+    if(ulReadBytes != usLength)
+    {
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW, usType,
+         "llrp_ParseParameter", "Failed to read %u discarded bytes (%u read)",
+         usLength, ulReadBytes));
+    }
+}
+
+static void llrp_ParseCustomParameter(t_llrp_parse_context *context, unsigned short usType,
+ unsigned short usLength)
+{
+    unsigned short usTypeIndex, usValidatorIndex;
+    unsigned long *pulData, ulReadBytes, ulVendorID, ulSubtype;
+    t_llrp_parse_validator *validator;
+    t_llrp_custom_map_item *pMapItem;
+    t_llrp_compound_item *pItem;
+
+    if(usLength < 8)
+    {
+        llrp_ReportMessage(context, (context, "llrp_ParseCustomParameter", "Invalid content length for custom parameter"));
+    }
+    else
+    {
+        /* Actual parameter length doesn't include the vendor ID or subtype */
+        usLength = usLength - 8;
+
+        pulData = (unsigned long *)llrp_StreamRead(context, 4, 0, &ulReadBytes);
+        if(ulReadBytes == 4)
+            ulVendorID = llrp_ntohl(*pulData);
+        else
+        {
+                llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW, usType,
+                            "llrp_ParseCustomParameter", "Failed to read vendor ID"));
+                return;
+        }
+
+        pulData = (unsigned long *)llrp_StreamRead(context, 4, 0, &ulReadBytes);
+        if(ulReadBytes == 4)
+            ulSubtype = llrp_ntohl(*pulData);
+        else
+        {
+                llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW, usType,
+             "llrp_ParseCustomParameter", "Failed to read subtype"));
+                return;
+        }
+
+        for(usValidatorIndex = 0; usValidatorIndex < context->validator_count; usValidatorIndex++)
+        {
+            validator = context->validator_list[usValidatorIndex];
+            for(usTypeIndex = 0; usTypeIndex < validator->custom_parameter_count; usTypeIndex++)
+            {
+                pMapItem = &(validator->custom_parameter_list[usTypeIndex]);
+                if(pMapItem->vendor_id == ulVendorID && pMapItem->subtype == ulSubtype)
+                {
+                    pItem = pMapItem->item;
+
+                    if(context->custom_parameter_start_handler!= NULL)
+                    {
+                        context->custom_parameter_start_handler(context, usType, ulVendorID,
+                         ulSubtype, pItem->name, usLength);
+                    }
+
+                    llrp_ParseCompoundItem(context, pItem, usLength);
+
+                    if(context->custom_parameter_finished_handler!= NULL)
+                    {
+                        context->custom_parameter_finished_handler(context, usType, ulVendorID,
+                         ulSubtype, pItem->name, usLength);
+                    }
+                    return;  
+                }
+            }
+        }
+
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_TYPE_UNKNOWN, usType,
+         "llrp_ParseCustomParameter", "Unknown custom parameter (type %u, vendor %lu, subtype %lu)",
+         usType, ulVendorID, ulSubtype));
+    }
+
+    /* Discard the bytes in this unknown parameter */
+    (void)llrp_StreamRead(context, usLength, 0, &ulReadBytes);
+    if(ulReadBytes != usLength)
+    {
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW, usType,
+         "llrp_ParseCustomParameter", "Failed to read %u discarded bytes (%u read)",
+         usLength, ulReadBytes));
+    }
+}
+
+static void llrp_ParseCompoundItem(t_llrp_parse_context *context,
+ t_llrp_compound_item *pCompoundItem, unsigned long ulTotalLength)
+{
+    unsigned short usParsedItems, usItemsRemaining;
+    unsigned long ulStartOffset, ulConsumedBytes, ulLengthRemaining;
+
+    ulStartOffset = llrp_StreamGetOffset(context);
+
+    llrp_ReportMessage(context, (context, "llrp_ParseCompoundItem", 
+     "Beginning parse of compound item '%s', type '%s', containing %u item%s, length %u bytes, stream offset %u",
+     pCompoundItem->name, llrp_compound_item_name[pCompoundItem->type], pCompoundItem->item_count,
+     (pCompoundItem->item_count == 1) ? "" : "s", ulTotalLength, ulStartOffset));
+
+    /* Each time a compound item is parsed, increase the depth. */
+    (context->depth)++;
+
+    /* Parse all fixed-length items. These must occur first. */
+    if(!llrp_ParseFixedItems(context, (t_llrp_item *) pCompoundItem->item_list,
+     pCompoundItem->item_count, &usParsedItems, ulTotalLength, &ulConsumedBytes))
+    {
+        llrp_ReportMessage(context, (context, "llrp_ParseCompoundItem", 
+         "Error while parsing fixed items in '%s'", pCompoundItem->name));
+    }
+    else
+    {
+        ulLengthRemaining = (unsigned long) (ulTotalLength - ulConsumedBytes);
+        usItemsRemaining = (unsigned short) ((pCompoundItem->item_count) - usParsedItems);
+
+        llrp_ReportMessage(context, (context, "llrp_ParseCompoundItem",
+         "Finished parsing fixed items. Length remaining %lu, items remaining %u, stream offset %u",
+         ulLengthRemaining, usItemsRemaining, llrp_StreamGetOffset(context)));
+
+        /* Parse all remaining data in the message */
+        if(usItemsRemaining > 0)
+        {
+            (void)llrp_ParseVariableItems(context, &((t_llrp_item *) pCompoundItem->item_list)[usParsedItems],
+             usItemsRemaining, ulLengthRemaining);
+        }
+    }
+
+    ulConsumedBytes = (unsigned long) (llrp_StreamGetOffset(context) - ulStartOffset);
+
+    llrp_ReportMessage(context, (context, "llrp_ParseCompoundItems",
+     "Finished parsing compound item '%s'. Buffer offset %lu, consumed bytes %lu",
+     pCompoundItem->name, llrp_StreamGetOffset(context), ulConsumedBytes));
+       
+    /* Make sure we've consumed the exact number of expected bytes */
+    if(ulConsumedBytes < ulTotalLength)
+    {
+        unsigned long ulReadLength;
+
+        ulLengthRemaining = (unsigned long) (ulTotalLength - ulConsumedBytes);
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_OVERFLOW,
+         pCompoundItem->type, "llrp_ParseCompoundItem", "%u leftover bytes in parameter %s",
+         ulLengthRemaining, pCompoundItem->name));
+        (void)llrp_StreamRead(context, ulLengthRemaining, 0, &ulReadLength);
+        if(ulReadLength != ulLengthRemaining)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW,
+             pCompoundItem->type, "llrp_ParseCompoundItem",
+             "Failed to read %u leftover bytes (%u read)", ulLengthRemaining, ulReadLength));
+        }
+    }
+    else if(ulConsumedBytes > ulTotalLength)
+    {
+        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_OVERFLOW,
+         pCompoundItem->type, "llrp_ParseCompoundItem",
+         "Buffer read overflow while parsing parameter %s (total: %u, consumed %u)",
+         pCompoundItem->name, ulTotalLength, ulConsumedBytes));
+    }
+
+    (context->depth)--;
+
+    llrp_ReportMessage(context, (context, "llrp_ParseCompoundItem",
+     "Finished parsing compound item '%s'", pCompoundItem->name));
+}
+
+static int llrp_ParseFixedItems(t_llrp_parse_context *context, t_llrp_item *pItemList,
+ unsigned short usTotalItems, unsigned short *pusParsedItems, unsigned long ulTotalLength,
+ unsigned long *pulConsumedBytes)
+{
+    t_llrp_item *pItem = pItemList;
+    int bDone = 0, bSuccess = 1;
+    unsigned short usItemIndex, usFieldIndex;
+    unsigned char ucAccumulatedBits, ucBitAccumulator;
+    unsigned long ulStartOffset, ulConsumedBytes;
+
+    usFieldIndex = 0;
+    usItemIndex = 0;
+    ucAccumulatedBits = 0;
+    ulConsumedBytes = 0;
+    ulStartOffset = llrp_StreamGetOffset(context);
+    while(!bDone)
+    {
+        ulConsumedBytes = (unsigned long) (llrp_StreamGetOffset(context) - ulStartOffset);
+
+        if(usItemIndex >= usTotalItems)
+            bDone = 1;
+        else
+        {
+            llrp_ReportMessage(context, (context, "llrp_ParseFixedItems",
+             "Parsing fixed item index %u of %u, type %u, consumed bytes %lu, offset %lu",
+             usItemIndex, usTotalItems, pItem->item_type, ulConsumedBytes,
+             llrp_StreamGetOffset(context)));
+
+            switch(pItem->item_type)
+            {
+                case LLRP_ITEM_FIELD:
+                    if(!llrp_HandleField(context, pItem, usFieldIndex, 
+                     (unsigned long) (ulTotalLength-ulConsumedBytes), &ucBitAccumulator,
+                     &ucAccumulatedBits))
+                    {
+                        bSuccess = 0;
+                        bDone = 1;
+                    }
+                    usFieldIndex++;
+                    break;
+                case LLRP_ITEM_RESERVED:
+                    if((pItem->min_repeat_count)%8 > ucAccumulatedBits)
+                    {
+                        llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW,
+                         usFieldIndex, "llrp_ParseFixedItems",
+                         "Only %u accumulated bits remaining for %u bit reserved field",
+                         ucAccumulatedBits, pItem->min_repeat_count));
+                        ucAccumulatedBits = 0;  /* Try to zero the accumulator, problems will likely follow */
+                    }
+                    else
+                    {
+                        if(pItem->min_repeat_count >= 8)
+                        {
+                            unsigned long ulReadBytes;
+
+                            /* Discard whole bytes... */
+                            (void)llrp_StreamRead(context, (pItem->min_repeat_count)/8, 0, &ulReadBytes);
+                            if(ulReadBytes != (unsigned long)((pItem->min_repeat_count)/8))
+                            {
+                                llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW,
+                                 usFieldIndex, "llrp_ParseFixedItems",
+                                 "Failed to consume %u reserved bytes from message stream for reserved field of %u bits",
+                                 (pItem->min_repeat_count)/8, pItem->min_repeat_count));
+                            }
+                        }                                
+
+                        ucAccumulatedBits = (unsigned char) (ucAccumulatedBits-((pItem->min_repeat_count)%8));
+                        llrp_ReportMessage(context, (context, "llrp_ParseFixedItems", 
+                         "Consumed %u reserved bits (accumulator now %u)", pItem->min_repeat_count,
+                         ucAccumulatedBits));
+                    }                        
+                    break;
+                case LLRP_ITEM_PARAMETER:
+                case LLRP_ITEM_CHOICE:
+                    /* When we encounter the first variable-length item, we're done parsing
+                       the fixed-length items. */
+                    bDone = 1;
+                    break;
+                default:
+                    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_TYPE_UNKNOWN,
+                     usFieldIndex, "llrp_ParseFixedItems", "Unknown fixed item field type (%u)",
+                     pItem->item_type));
+                    break;
+            }
+
+            if(!bDone)
+            {
+                usItemIndex++;
+                pItem++;
+            }
+        }
+    }
+
+    if(context->field_complete_handler != NULL)
+        context->field_complete_handler(context, usFieldIndex);
+       
+    if(pusParsedItems != NULL)
+        *pusParsedItems = usItemIndex;
+    if(pulConsumedBytes != NULL)
+        *pulConsumedBytes = ulConsumedBytes;
+
+    return bSuccess;
+}
+
+static int llrp_HandleField(t_llrp_parse_context *context, t_llrp_item *pItem,
+ unsigned short usFieldIndex, unsigned long ulTotalLength,
+ unsigned char *pucBitAccumulator, unsigned char *pucAccumulatedBits)
+{
+    unsigned long ulItemBits, ulItemBytes, ulLeftoverBits, ulReadBytes, ulLengthRemaining;
+    unsigned char *pucData, ucUsedAccumulator;
+
+    if(LLRP_FIELDTYPE_IS_VARIABLE(pItem->field_type))
+    {
+        unsigned short *pusData;
+
+        if(ulTotalLength < 2)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW, usFieldIndex,
+             "llrp_HandleField", "Buffer underrun while reading length of variable field '%s', index %u",
+             pItem->name, usFieldIndex));
+            return 0; /* Failed to handle this field */
+        }
+
+        pusData = (unsigned short *) llrp_StreamRead(context, 2, 0, &ulReadBytes);
+        if(ulReadBytes != 2)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW,
+             usFieldIndex, "llrp_HandleField",
+             "Failed to read the length of variable field '%s', index %u", pItem->name, usFieldIndex));
+            return 0; /* Failed to handle this field */
+        }
+        ulItemBits = (unsigned long) (llrp_ntohs(*pusData)*
+         llrp_variable_field_bitlength[LLRP_FIELDTYPE_INDEX_VARIABLE(pItem->field_type)]);
+        ulLengthRemaining = (unsigned long) (ulTotalLength-2);
+    }
+    else if(pItem->field_type == LLRP_FIELDTYPE_bytesToEnd)
+    {
+        ulLengthRemaining = ulTotalLength;  /* Consume the entire remaining length */
+        ulItemBits = (unsigned long) (ulLengthRemaining*8);
+    }
+    else
+    {
+        ulItemBits = llrp_fixed_field_bitlength[pItem->field_type];
+        ulLengthRemaining = ulTotalLength;
+    }
+
+    ulItemBytes = (unsigned long) ((ulItemBits/8) + ((ulItemBits%8) ? 1 : 0));
+    ulLeftoverBits = (unsigned long) ((ulItemBytes*8) - ulItemBits);
+
+    /* Is there enough data stored in the accumulator? */
+    if(ulItemBits <= *pucAccumulatedBits)
+    {
+        /* LLRP is bitwise big-endian; extract the topmost ulItemBits bits from the accumulator */
+        ucUsedAccumulator = (unsigned char) ((*pucBitAccumulator) >> ((*pucAccumulatedBits)-ulItemBits));
+        ucUsedAccumulator &= ((1 << ulItemBits)-1); /* Mask off unwanted bits */
+        pucData = &ucUsedAccumulator;
+        /* No need to clear the used bits from the accumulator. They're invalidated by
+         *  an update to pucAccumulatedBits. */
+        *pucAccumulatedBits = (unsigned char) ((*pucAccumulatedBits)-ulItemBits);
+        ulLeftoverBits = 0;
+    }
+    else /* No, we must get the data from the message */
+    {
+        if(ulItemBytes > ulLengthRemaining)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW,
+             usFieldIndex, "llrp_HandleField",
+             "Data underrun for field '%s', index %u (expected %u bytes, %u remain)",
+             pItem->name, usFieldIndex, ulItemBytes, ulLengthRemaining));
+            return 0; /* Failed to handle this field */
+        }
+        pucData= llrp_StreamRead(context, ulItemBytes, 0, &ulReadBytes);
+        if(ulReadBytes!= ulItemBytes)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW,
+             usFieldIndex, "llrp_HandleField",
+             "Failed to read %u data bytes of field '%s', index %u (%u read)",
+             ulItemBytes, pItem->name, usFieldIndex, ulReadBytes));
+            return 0; /* Failed to handle this field */
+        }
+    }
+
+    if(ulLeftoverBits > 0)
+    {
+        /* If there is any data that has been read from the message, but doesn't belong to */
+        /*  this field, add it to the accumulator. */
+        if((ulLeftoverBits+*pucAccumulatedBits) >= 8)
+        {
+            llrp_ReportError(context, (context, LLRP_PARSE_ERROR_FIELD_DATA_OVERFLOW,
+             usFieldIndex, "llrp_HandleField",
+             "Leftover bit accumulator overflow (accumulator bits: %u, new leftover bits: %u)",
+             *pucAccumulatedBits, ulLeftoverBits));
+        }
+        else
+        {
+            /* Bits are always added to the accumulator from the right (least significant bit) side */
+            *pucBitAccumulator<<= ulLeftoverBits;
+            *pucBitAccumulator|= pucData[ulItemBytes-1] & ((1 << ulLeftoverBits)-1);
+            *pucAccumulatedBits= (unsigned char) ((*pucAccumulatedBits)+ulLeftoverBits);
+        }
+
+        /* Always mask-off the bits that don't belong to this field */
+        if(ulItemBits <= 8)
+        {
+            ucUsedAccumulator= (unsigned char) (((*pucData) >> (8-ulItemBits)) & ((1 << ulItemBits)-1));
+            pucData= &ucUsedAccumulator;
+        }
+    }
+
+    llrp_ReportMessage(context, (context, "llrp_HandleField",
+     "Field '%s' parsed: fieldtype %u, bitlength %u, accumulator %u",
+     pItem->name, pItem->field_type, ulItemBits, *pucAccumulatedBits));
+    if(context->field_handler!= NULL)
+    {
+        context->field_handler(context, usFieldIndex, pItem->field_type, pItem->name,
+         ulItemBits, pucData, pItem->data);
+    }
+
+    return 1; /* Successfully handled */
+}
+
+/* Function: llrp_ParseVariableItems */
+/* Description: Parse all remaining data in the current compound item (message or parameter).
+ *  Parsing is completed only when all data has been exhausted from the current compound item.
+ *  It is assumed that no fixed-length items remain in the current compound item, they have
+ *  already been parsed. */
+/* Returns: nonzero upon successful parsing of all variable items in the compound item,
+ *  zero upon failure. */
+#define LLRP_VARIABLE_ITEM_MIN_HEADER_LENGTH  1 /* TV parameters require only one byte */
+static int llrp_ParseVariableItems(t_llrp_parse_context *context, t_llrp_item *pItemList,
+ unsigned short usTotalItems, unsigned long ulTotalLength)
+{
+    t_llrp_item *pItem = pItemList;
+    int bDone = 0, bImpliedLength;
+    unsigned long ulReadBytes, ulConsumedLength, ulStartOffset;
+    unsigned char *pucReadByte, ucHeaderLength;
+    unsigned short *pusLength, usType, usLength;
+
+    pItem=pItem; usTotalItems=usTotalItems;
+
+    ulStartOffset = llrp_StreamGetOffset(context);
+    while(!bDone)
+    {
+        ulConsumedLength = (unsigned long) (llrp_StreamGetOffset(context) - ulStartOffset);
+
+        /* Make sure we can at least read the minimum header length */
+        if((ulConsumedLength+LLRP_VARIABLE_ITEM_MIN_HEADER_LENGTH) > ulTotalLength)
+            bDone = 1;
+        else
+        {
+            /* Determine the type and length */
+            ucHeaderLength = LLRP_VARIABLE_ITEM_MIN_HEADER_LENGTH;
+            pucReadByte = (unsigned char *) llrp_StreamRead(context, 1, 0, &ulReadBytes);
+            if(ulReadBytes != 1)
+            {
+                llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW,
+                 0, "llrp_ParseVariableItems", "Failed to read first type byte of parameter"));
+                return 0; /* Failed to parse */
+            }
+            usType = *pucReadByte;
+            if(usType & 0x80) /* Is this a TV encoded parameter? */
+            {
+                usType &= ~0x80;
+                usLength = 0;
+                bImpliedLength = 1; /* Length is implied - make llrp_ParseParameter() derive it */
+            }
+            else
+            {
+                ucHeaderLength = 4; /* TLV parameter headers have 2 type bytes, 2 length bytes */
+                bImpliedLength = 0;
+
+                /* Get the second byte of the TLV parameter's type */
+                pucReadByte = (unsigned char *) llrp_StreamRead(context, 1, 0, &ulReadBytes);
+                if(ulReadBytes != 1)
+                {
+                    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW,
+                     0, "llrp_ParseVariableItems", "Failed to read second type byte of TLV parameter"));
+                    return 0; /* Failed to parse the variable item */
+                }
+                usType <<= 8;
+                usType = (unsigned short) (usType+(*pucReadByte));
+
+                /* TLV parameters have 2 bytes for the length */
+                pusLength = (unsigned short *) llrp_StreamRead(context, 2, 0, &ulReadBytes);
+                if(ulReadBytes != 2)
+                {
+                    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW,
+                     usType, "llrp_ParseVariableItems", "Failed to read length bytes of TLV parameter"));
+                    return 0; /* Failed to parse the variable item */
+                }
+                usLength = llrp_ntohs(*pusLength);
+                       
+                /* A rather pedantic test... */
+                if(usLength < ucHeaderLength)
+                {
+                    llrp_ReportError(context, (context, LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW,
+                     usType, "llrp_ParseVariableItems",
+                     "Length underflow for variable item type %u (requires %u bytes, %u in header)",
+                     usType, usLength, ucHeaderLength));
+                    return 0; /* Failed to parse the variable item */
+                }
+                usLength = (unsigned short) (usLength-ucHeaderLength);
+            }
+
+            llrp_ReportMessage(context, (context, "llrp_ParseVariableItems",
+             "Parsing variable item: type %u, header length %u, data length %u",
+             usType, ucHeaderLength, usLength));
+
+            /* TODO: Validate the parameter found against pItem */
+
+            if(usType == 1023) /* v1.0 Custom parameter type */
+                llrp_ParseCustomParameter(context, usType, usLength);
+            else
+                llrp_ParseParameter(context, usType, bImpliedLength, usLength);
+        }
+    }
+
+    if(context->all_parameters_complete_handler!= NULL)
+        context->all_parameters_complete_handler(context);
+
+    return 1; /* Variable item parsed successfully */
+}
+
+/* Determine the length of the contents of the specified compound item. This will only succeed
+ *  when the compound item contains nothing more than fixed-length fields. */
+static int llrp_ParseGetParameterContentLength(const t_llrp_compound_item *pItem,
+ unsigned short *pusLength)
+{
+    unsigned short usIndex, usLength;
+    t_llrp_item *pField;
+
+    usLength= 0;
+    for(usIndex= 0; usIndex< pItem->item_count; usIndex++)
+    {
+        pField= &((t_llrp_item *) (pItem->item_list))[usIndex];
+        switch(pField->item_type)
+        {
+            case LLRP_ITEM_FIELD:
+                if(LLRP_FIELDTYPE_IS_VARIABLE(pField->field_type))
+                    return 0; /* Not a constant content length, can't calculate content length */
+                usLength= (unsigned short) (usLength+((llrp_fixed_field_bitlength[pField->field_type])/8));
+                break;
+            default:
+                return 0; /* Contains items that are not fields, can't calculate content length */
+        }
+    }
+
+    if(pusLength!= NULL)
+        *pusLength= usLength;
+    return 1; /* Length calculated successfully */
+}
diff --git a/plugins/llrp/llrpparse.h b/plugins/llrp/llrpparse.h
new file mode 100644 (file)
index 0000000..4ff9522
--- /dev/null
@@ -0,0 +1,151 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */   
+
+#ifndef _LLRP_PARSER_H
+#define _LLRP_PARSER_H
+
+#include "llrpparsetypes.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* --------------------------------------------------------------------------------------- */
+/* Parse error codes, passed as a parameter in t_llrp_HandleParseError                     */
+
+#define LLRP_CONTEXT_ERROR                             0x00    
+
+/* Message Errors */
+#define LLRP_PARSE_ERROR_MESSAGE_DATA_UNDERFLOW        0x10
+#define LLRP_PARSE_ERROR_MESSAGE_TYPE_UNKNOWN          0x11
+
+/* Parameter Errors */
+#define LLRP_PARSE_ERROR_PARAMETER_TYPE_UNKNOWN        0x50
+#define LLRP_PARSE_ERROR_PARAMETER_TV_NOT_FOUND        0x51
+#define LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW      0x52
+#define LLRP_PARSE_ERROR_PARAMETER_DATA_OVERFLOW       0x53
+
+/* Field Errors */
+#define LLRP_PARSE_ERROR_FIELD_TYPE_UNKNOWN            0x90
+#define LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW          0x91
+#define LLRP_PARSE_ERROR_FIELD_DATA_OVERFLOW           0x92
+
+/* --------------------------------------------------------------------------------------- */
+/* Endian swappers                                                                         */
+/*   For portability, these functions must be defined externally. Often, they will map     */
+/*   directly to ntohs().                                                                  */
+
+typedef unsigned short (*t_llrp_ntohs)(unsigned short value);
+typedef unsigned long (*t_llrp_ntohl)(unsigned long value);
+
+extern t_llrp_ntohs llrp_ntohs;
+extern t_llrp_ntohl llrp_ntohl;
+
+/* --------------------------------------------------------------------------------------- */
+/* LLRP message parsing context                                                            */
+
+/* Consume 'length' bytes from the stream, set 'consumed' to the number of bytes
+    successfully consumed, return a pointer to the first consumed byte. */
+typedef unsigned char *(*t_llrp_StreamRead)(void *context, const unsigned long length,
+ const int wait_forever, unsigned long *consumed);
+
+/* Return the number of bytes consumed from stream */
+typedef unsigned long (*t_llrp_StreamGetOffset)(void *context);
+
+/* Called upon successful parsing of an LLRP message header. If the parser should continue
+ *  parsing this message, nonzero should be returned. If the parser should abort parsing this
+ *  message, zero should be returned. */
+typedef int (*t_llrp_HandleMessage)(void *context, const unsigned char version,
+ const unsigned short type, const unsigned long length, const unsigned long id, const char *name);
+
+/* Called upon successful parsing of an LLRP field. Note that data is in network byte order. */
+typedef void (*t_llrp_HandleField)(void *context, const unsigned short field_index,
+ const unsigned char type, const char *name, const unsigned long bitlength,
+ const unsigned char *data, t_llrp_enumeration *enumeration);
+
+/* Called upon completion of parsing all fields in a parameter/message */
+typedef void (*t_llrp_HandleFieldComplete)(void *context, const unsigned short field_count);
+
+/* Called upon successful parsing of an LLRP parameter */
+typedef void (*t_llrp_HandleParameter)(void *context, const unsigned short type, const char *name,
+ const unsigned short length);
+
+/* Called upon successful parsing of an LLRP custom parameter */
+typedef void (*t_llrp_HandleCustomParameter)(void *context, const unsigned short type,
+ const unsigned long vendorID, const unsigned long subtype, const char *name,
+ const unsigned short length);
+
+/* Called upon completion of parsing all parameters */
+typedef void (*t_llrp_HandleAllParametersComplete)(void *context);
+
+/* Called upon detection of a parsing error */
+typedef void (*t_llrp_HandleParseError)(void *context, const unsigned char code,
+ const unsigned short item, const char *function_name, const char *format, ...);
+
+/* Called by the parser to report an informational/debug message */
+typedef void (*t_llrp_HandleDebugMessage)(void *context, const char *function_name,
+ const char *format, ...);
+
+typedef struct
+{
+    unsigned char depth; /* Parse tree depth (message header is always parsed at depth 0) */
+
+    t_llrp_parse_validator **validator_list;
+    unsigned char validator_count;
+
+    /* Callback functions for stream management */
+    t_llrp_StreamRead stream_read_handler;
+    t_llrp_StreamGetOffset stream_get_offset_handler;
+
+    /* Callback functions for handling parsing events */
+    t_llrp_HandleMessage message_start_handler;
+    t_llrp_HandleMessage message_finished_handler;
+    t_llrp_HandleField field_handler;
+    t_llrp_HandleFieldComplete field_complete_handler;
+    t_llrp_HandleParameter parameter_start_handler;
+    t_llrp_HandleParameter parameter_finished_handler;
+    t_llrp_HandleCustomParameter custom_parameter_start_handler;
+    t_llrp_HandleCustomParameter custom_parameter_finished_handler;
+    t_llrp_HandleAllParametersComplete all_parameters_complete_handler;
+    t_llrp_HandleParseError parse_error_handler;
+    t_llrp_HandleDebugMessage debug_message_handler;
+
+    void *data; /* user-defined data */
+} t_llrp_parse_context;
+
+/* --------------------------------------------------------------------------------------- */
+/* Exported Functions                                                                      */
+
+#define LLRP_PARSE_RESULT_SUCCESS      0  /* parse successful */
+#define LLRP_PARSE_RESULT_PARSE_FAILED 1  /* received message, parse failed */
+#define LLRP_PARSE_RESULT_NO_PARSE     2  /* no message received */
+#define LLRP_PARSE_RESULT_FAILURE      3  /* unspecified failure */
+int llrp_ParseMessage(t_llrp_parse_context *context);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _LLRP_PARSER_H */
diff --git a/plugins/llrp/llrpparsehelp.c b/plugins/llrp/llrpparsehelp.c
new file mode 100644 (file)
index 0000000..c4d213c
--- /dev/null
@@ -0,0 +1,58 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdio.h>
+#include "llrpparsetypes.h"
+#include "llrpparsehelp.h"
+
+char *llrp_field_type_to_name(unsigned char type)
+{
+    if(LLRP_FIELDTYPE_IS_VARIABLE(type))
+        return llrp_variable_field_name[type-LLRP_FIELDTYPE_u1v];
+    else if(type == LLRP_FIELDTYPE_bytesToEnd)
+        return "bytesToEnd";
+    else
+        return llrp_fixed_field_name[type];
+}
+
+char *llrp_enumeration_to_name(t_llrp_enumeration *enumeration, unsigned short value)
+{
+    unsigned short usIndex;
+    t_llrp_enumeration_item *item;
+
+    for(usIndex= 0; usIndex< enumeration->count; usIndex++)
+    {
+        item= &enumeration->list[usIndex];
+        if(item->value== value)
+            return item->name;
+
+        /* Since the enumeration list is ordered by value (ascending), short circuit is possible */
+        if(item->value> value)
+            return NULL;
+    }
+
+    return NULL;
+}
+
diff --git a/plugins/llrp/llrpparsehelp.h b/plugins/llrp/llrpparsehelp.h
new file mode 100644 (file)
index 0000000..9455e15
--- /dev/null
@@ -0,0 +1,41 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */ 
+
+#ifndef _LLRP_MISCELLANEOUS_H
+#define _LLRP_MISCELLANEOUS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+char *llrp_field_type_to_name(unsigned char type);
+char *llrp_enumeration_to_name(t_llrp_enumeration *enumeration, unsigned short value);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _LLRP_MISCELLANEOUS_H */
+
diff --git a/plugins/llrp/llrpparseinc.h b/plugins/llrp/llrpparseinc.h
new file mode 100644 (file)
index 0000000..f1b012d
--- /dev/null
@@ -0,0 +1,33 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */ 
+
+#ifndef _LLRP_PARSER_INCLUDES_H
+#define _LLRP_PARSER_INCLUDES_H
+
+#include "llrp-1x0-def.h"
+#include "llrp-Intermec.h"
+
+#endif /* _LLRP_PARSER_INCLUDES_H */
+
diff --git a/plugins/llrp/llrpparsetypes.c b/plugins/llrp/llrpparsetypes.c
new file mode 100644 (file)
index 0000000..77eed18
--- /dev/null
@@ -0,0 +1,46 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "llrpparsetypes.h"
+
+/* Length (in bits) of fixed-length field types */
+unsigned short llrp_fixed_field_bitlength[] =
+    { 0, 1, 2, 8, 8, 16, 16, 32, 32, 64, 64, 96 };
+
+/* Length (in bits) of each item in variable-length field types */
+unsigned short llrp_variable_field_bitlength[] =
+    { 1, 8, 8, 8, 16, 16, 32, 32, 64, 64 };
+
+/* Descriptions for each fixed-length field type */
+char *llrp_fixed_field_name[] =
+    { "none", "u1", "u2", "u8", "s8", "u16", "s16", "u32", "s32", "u64", "s64", "u96" };
+
+/* Descriptions for each variable-length field type */
+char *llrp_variable_field_name[] =
+    { "u1v", "u8v", "s8v", "utf8v", "u16v", "s16v", "u32v", "s32v", "u64v", "s64v" };
+
+/* Descriptions for each compound item type, indexed by LLRP_ITEM_* values */
+char *llrp_compound_item_name[] =
+    { "none", "field", "reserved", "parameter", "choice", "message" };
diff --git a/plugins/llrp/llrpparsetypes.h b/plugins/llrp/llrpparsetypes.h
new file mode 100644 (file)
index 0000000..105031e
--- /dev/null
@@ -0,0 +1,142 @@
+/* EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef _LLRP_PARSE_TYPES_H
+#define _LLRP_PARSE_TYPES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LLRP_ITEM_NONE        0x00
+#define LLRP_ITEM_FIELD       0x01
+#define LLRP_ITEM_RESERVED    0x02
+#define LLRP_ITEM_PARAMETER   0x03
+#define LLRP_ITEM_CHOICE      0x04
+#define LLRP_ITEM_MESSAGE     0x05
+
+typedef struct {
+    char *name;
+    unsigned char item_type; /* one of LLRP_ITEM_* */
+    unsigned short min_repeat_count;
+        #define LLRP_REPEAT_INDEFINITELY  0xFFFF
+    unsigned short max_repeat_count;
+    unsigned char field_type;
+        #define LLRP_FIELDTYPE_NONE       0x00
+        #define LLRP_FIELDTYPE_u1         0x01
+        #define LLRP_FIELDTYPE_u2         0x02
+        #define LLRP_FIELDTYPE_u8         0x03
+        #define LLRP_FIELDTYPE_s8         0x04
+        #define LLRP_FIELDTYPE_u16        0x05
+        #define LLRP_FIELDTYPE_s16        0x06
+        #define LLRP_FIELDTYPE_u32        0x07
+        #define LLRP_FIELDTYPE_s32        0x08
+        #define LLRP_FIELDTYPE_u64        0x09
+        #define LLRP_FIELDTYPE_s64        0x0a
+        #define LLRP_FIELDTYPE_u96        0x0b
+        #define LLRP_FIELDTYPE_u1v        0x40
+        #define LLRP_FIELDTYPE_u8v        0x41
+        #define LLRP_FIELDTYPE_s8v        0x42
+        #define LLRP_FIELDTYPE_utf8v      0x43
+        #define LLRP_FIELDTYPE_u16v       0x44
+        #define LLRP_FIELDTYPE_s16v       0x45
+        #define LLRP_FIELDTYPE_u32v       0x46
+        #define LLRP_FIELDTYPE_s32v       0x47
+        #define LLRP_FIELDTYPE_u64v       0x48
+        #define LLRP_FIELDTYPE_s64v       0x49
+        #define LLRP_FIELDTYPE_bytesToEnd 0x60
+    void *data;         /* pointer to field_type specific data */
+} t_llrp_item;
+#define LLRP_FIELDTYPE_IS_VARIABLE(ft) ((ft)>= 0x40 && (ft)< 0x60)
+#define LLRP_FIELDTYPE_INDEX_VARIABLE(ft) ((ft)-0x40)
+
+typedef struct {
+    char *name;
+    unsigned short value;
+} t_llrp_enumeration_item;
+
+typedef struct {
+    t_llrp_enumeration_item *list;
+    unsigned short count;
+} t_llrp_enumeration;
+
+typedef struct {
+    char *name;
+    unsigned char type; /* one of LLRP_ITEM* */
+    unsigned short number;
+    unsigned short item_count;
+    void *item_list;
+} t_llrp_compound_item;
+
+typedef struct {
+    unsigned short number;
+    t_llrp_compound_item *item;
+} t_llrp_standard_map_item;
+
+typedef struct {
+    unsigned long vendor_id;
+    unsigned short subtype;
+    t_llrp_compound_item *item;
+} t_llrp_custom_map_item;
+
+typedef struct {
+    char *validator_name;
+
+    t_llrp_standard_map_item *parameter_list;
+    unsigned short parameter_count;
+
+    t_llrp_custom_map_item *custom_parameter_list;
+    unsigned short custom_parameter_count;
+
+    t_llrp_standard_map_item *message_list;
+    unsigned short message_count;
+
+    t_llrp_custom_map_item *custom_message_list;
+    unsigned short custom_message_count;
+} t_llrp_parse_validator;
+
+/* ----------------------------------------------------------------------- */
+/* Common Constants/Declarations/Functions                                 */
+
+#define LLRP_HEADER_LENGTH 10
+#define LLRP_PARAMETER_IS_TLV(usType) ((usType) > 127)
+#define LLRP_PARAMETER_IS_TV(usType)  ((usType) < 128)
+
+extern unsigned short llrp_fixed_field_bitlength[];
+extern unsigned short llrp_variable_field_bitlength[];
+extern char *llrp_fixed_field_name[];
+extern char *llrp_variable_field_name[];
+extern char *llrp_compound_item_name[];
+
+/* ----------------------------------------------------------------------- */
+/* Message Versions                                                        */
+
+#define LLRP_v1_0_VERSION  1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LLRP_PARSE_TYPES_H */
diff --git a/plugins/llrp/moduleinfo.h b/plugins/llrp/moduleinfo.h
new file mode 100644 (file)
index 0000000..41d398b
--- /dev/null
@@ -0,0 +1,18 @@
+/* Included *after* config.h, in order to re-define these macros */
+
+#ifdef PACKAGE
+#undef PACKAGE
+#endif
+
+/* Name of package */
+#define PACKAGE "llrp"
+
+
+#ifdef VERSION
+#undef VERSION
+#endif
+
+/* Version number of package */
+#define VERSION "1.0.0"
+
+
diff --git a/plugins/llrp/moduleinfo.nmake b/plugins/llrp/moduleinfo.nmake
new file mode 100644 (file)
index 0000000..9397c54
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# $Id$
+#
+
+# The name
+PACKAGE=llrp
+
+# The version
+MODULE_VERSION_MAJOR=1
+MODULE_VERSION_MINOR=0
+MODULE_VERSION_MICRO=0
+MODULE_VERSION_EXTRA=0
+
+#
+# The RC_VERSION should be comma-separated, not dot-separated, 
+# as per Graham Bloice's message in
+#
+#      http://www.ethereal.com/lists/ethereal-dev/200303/msg00283.html
+#
+# "The RC_VERSION variable in config.nmake should be comma separated. 
+# This allows the resources to be built correctly and the version
+# number to be correctly displayed in the explorer properties dialog
+# for the executables, and XP's tooltip, rather than 0.0.0.0."
+#
+
+MODULE_VERSION=$(MODULE_VERSION_MAJOR).$(MODULE_VERSION_MINOR).$(MODULE_VERSION_MICRO).$(MODULE_VERSION_EXTRA)
+RC_MODULE_VERSION=$(MODULE_VERSION_MAJOR),$(MODULE_VERSION_MINOR),$(MODULE_VERSION_MICRO),$(MODULE_VERSION_EXTRA)
+
diff --git a/plugins/llrp/packet-llrp.c b/plugins/llrp/packet-llrp.c
new file mode 100644 (file)
index 0000000..d8a99fb
--- /dev/null
@@ -0,0 +1,829 @@
+/* packet-llrp.c
+ * EPCglobal Low-Level Reader Protocol Packet Dissector
+ *
+ * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
+ *
+ * $Id$
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1999 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */   
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* Configurable Options */
+#define LLRP_RESOLVE_VENDOR_ID
+#define LLRP_DISSECTOR_DEBUG
+#define LLRP_PARSER_DEBUG
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <time.h>
+#include <glib.h>
+#include <epan/pint.h> /* For pntohl */
+#include <epan/filesystem.h>
+#include <epan/packet.h>
+#include <epan/addr_resolv.h>
+#include <epan/report_err.h>
+#include <epan/prefs.h>
+#include <epan/sminmpec.h>
+#include <epan/emem.h>
+#include <epan/expert.h>
+
+#ifdef LLRP_RESOLVE_VENDOR_ID
+#include <epan/value_string.h>
+#include <epan/sminmpec.h>
+#endif /* LLRP_RESOLVE_VENDOR_ID */
+
+#include <epan/dissectors/packet-tcp.h>
+
+#include "llrpparsetypes.h"
+#include "llrpparseinc.h"
+#include "llrpparsehelp.h"
+#include "llrpparse.h"
+
+#define TCP_PORT_EPC_LLRP            5084    /* IANA assigned TCP port number */
+#define PROTO_NAME_LLRP              "llrp"  /* must be lowercase */
+#define PROTO_SHORT_DESCRIPTION_LLRP "LLRP"
+#define PROTO_DESCRIPTION_LLRP       "EPCglobal RFID Low-Level Reader Protocol"
+#define LLRP_MAX_PARAMETER_DEPTH     10
+
+#ifdef LLRP_RESOLVE_VENDOR_ID
+static const char *llrp_ws_find_vendor_id(const unsigned long vendor_id);
+#endif /* LLRP_RESOLVE_VENDOR_ID */
+
+static gint gbl_llrpTcpPort = TCP_PORT_EPC_LLRP;
+
+typedef struct
+{
+    proto_tree *tree[LLRP_MAX_PARAMETER_DEPTH];
+    tvbuff_t *tvb;
+    unsigned long tvb_offset;       
+    packet_info *pinfo;
+    int quiet_parse;  /* When nonzero, don't display any parse info */
+} t_llrp_parse_info;
+static t_llrp_parse_info llrp_parse_info;
+
+/* --------------------------------------------------------------------------------------- */
+/* Dissector Display Tree Information                                                      */
+
+static int proto_epc_llrp = -1;
+
+static gint hf_llrp_message_version = -1;
+static gint hf_llrp_message_type = -1;
+static gint hf_llrp_message_length = -1;
+static gint hf_llrp_message_id = -1;
+static gint hf_llrp_message_parm = -1;
+static gint hf_llrp_message_field = -1;
+static gint hf_llrp_field_type = -1;
+static gint hf_llrp_field_count = -1;
+static gint hf_llrp_field_bitlength = -1;
+static gint hf_llrp_field_value_u1 = -1;
+static gint hf_llrp_field_value_u2 = -1;
+static gint hf_llrp_field_value_u8 = -1;
+static gint hf_llrp_field_value_s8 = -1;
+static gint hf_llrp_field_value_u16 = -1;
+static gint hf_llrp_field_value_s16 = -1;
+static gint hf_llrp_field_value_u32 = -1;
+static gint hf_llrp_field_value_s32 = -1;
+static gint hf_llrp_field_value_u64 = -1;
+static gint hf_llrp_field_value_s64 = -1;
+static gint hf_llrp_field_value_variable = -1;
+static gint hf_llrp_field_enumeration = -1;
+static gint hf_llrp_parameter_type= -1;
+static gint hf_llrp_parameter_length= -1;
+static gint hf_llrp_custparm_vendorid= -1;
+static gint hf_llrp_custparm_subtype= -1;
+static hf_register_info hf_llrp[] =
+{
+    /* Message/header */
+    { &hf_llrp_message_version, { "Version", PROTO_NAME_LLRP ".version", FT_UINT8,
+                                  BASE_DEC, NULL, 0x00, "llrp message protocol version", HFILL }},
+    { &hf_llrp_message_type,    { "Message Type", PROTO_NAME_LLRP ".type", FT_UINT16,
+                                  BASE_DEC, NULL, 0x00, "llrp message type", HFILL }},
+    { &hf_llrp_message_length,  { "Message Length", PROTO_NAME_LLRP ".length", FT_UINT32,
+                                  BASE_DEC, NULL, 0x00, "llrp message total length", HFILL }},
+    { &hf_llrp_message_id,      { "Message ID", PROTO_NAME_LLRP ".id", FT_UINT32,
+                                  BASE_DEC, NULL, 0x00, "llrp message ID", HFILL }},
+    { &hf_llrp_message_parm,    { "Parameter", PROTO_NAME_LLRP ".parameter", FT_UINT16, BASE_DEC,
+                                  NULL, 0x00, "llrp message parameter", HFILL }},
+    { &hf_llrp_message_field,   { "Field", PROTO_NAME_LLRP ".field", FT_UINT16, BASE_DEC,
+                                 NULL, 0x00, "llrp message field", HFILL }},
+
+    /* Parameter */
+    { &hf_llrp_parameter_type,   { "Type", PROTO_NAME_LLRP ".parameter.type", FT_UINT16, BASE_DEC,
+                                   NULL, 0x00, "llrp parameter type", HFILL }},
+    { &hf_llrp_parameter_length, { "Length (bytes)", PROTO_NAME_LLRP ".parameter.length", FT_UINT16, BASE_DEC,
+                                   NULL, 0x00, "llrp parameter length", HFILL }},
+    { &hf_llrp_custparm_vendorid,{ "VendorID", PROTO_NAME_LLRP ".custparam.vendorid", FT_UINT32, BASE_HEX,
+                                   NULL, 0x00, "llrp custom parameter vendor ID", HFILL }},
+    { &hf_llrp_custparm_subtype, { "Subtype", PROTO_NAME_LLRP ".custparam.subtype", FT_UINT16, BASE_DEC,
+                                   NULL, 0x00, "llrp custom parameter subtype", HFILL }},
+
+    /* Field */
+    { &hf_llrp_field_type, { "Type", PROTO_NAME_LLRP ".field.type", FT_UINT16, BASE_DEC, NULL,
+                             0x00, "llrp field type", HFILL }},
+    { &hf_llrp_field_count, { "Count (items)", PROTO_NAME_LLRP ".field.count", FT_UINT16,
+                                  BASE_DEC, NULL, 0x00, "llrp field count", HFILL }},
+    { &hf_llrp_field_bitlength, { "Length (bits)", PROTO_NAME_LLRP ".field.length", FT_UINT16,
+                                  BASE_DEC, NULL, 0x00, "llrp field bitlength", HFILL }},
+    { &hf_llrp_field_value_u1, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT8,
+                                  BASE_DEC, NULL, 0x00, "llrp field u1 value", HFILL }},
+    { &hf_llrp_field_value_u2, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT8,
+                                  BASE_DEC, NULL, 0x00, "llrp field u2 value", HFILL }},
+    { &hf_llrp_field_value_u8, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT8,
+                                  BASE_DEC, NULL, 0x00, "llrp field u8 value", HFILL }},
+    { &hf_llrp_field_value_s8, { "Value", PROTO_NAME_LLRP ".field.value", FT_INT8,
+                                  BASE_DEC, NULL, 0x00, "llrp field s8 value", HFILL }},
+    { &hf_llrp_field_value_u16, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT16,
+                                  BASE_DEC, NULL, 0x00, "llrp field u16 value", HFILL }},
+    { &hf_llrp_field_value_s16, { "Value", PROTO_NAME_LLRP ".field.value", FT_INT16,
+                                  BASE_DEC, NULL, 0x00, "llrp field s16 value", HFILL }},
+    { &hf_llrp_field_value_u32, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT32,
+                                  BASE_DEC, NULL, 0x00, "llrp field u32 value", HFILL }},
+    { &hf_llrp_field_value_s32, { "Value", PROTO_NAME_LLRP ".field.value", FT_INT32,
+                                  BASE_DEC, NULL, 0x00, "llrp field s32 value", HFILL }},
+    { &hf_llrp_field_value_u64, { "Value", PROTO_NAME_LLRP ".field.value", FT_UINT64,
+                                  BASE_DEC, NULL, 0x00, "llrp field u64 value", HFILL }},
+    { &hf_llrp_field_value_s64, { "Value", PROTO_NAME_LLRP ".field.value", FT_INT64,
+                                  BASE_DEC, NULL, 0x00, "llrp field s64 value", HFILL }},
+    { &hf_llrp_field_value_variable, { "Value", PROTO_NAME_LLRP ".field.variable", FT_STRING,
+                                  BASE_NONE, NULL, 0x00, "llrp field variable-length value", HFILL }},
+    { &hf_llrp_field_enumeration, { "Enumeration", PROTO_NAME_LLRP ".field.enumeration", FT_STRING,
+                                  BASE_NONE, NULL, 0x00, "llrp field enumeration", HFILL }},
+};
+
+/* All LLRP dissection display subtrees */
+static gint ett_llrp_message = -1;
+static gint ett_llrp_field = -1;
+static gint ett_llrp_parameter = -1;
+static gint *ett_llrp[]=
+{
+    &ett_llrp_message,
+    &ett_llrp_field,
+    &ett_llrp_parameter
+};  
+
+
+unsigned long llrp_ws_ntohl(unsigned long source)
+{
+    return pntohl(&source);
+}
+t_llrp_ntohl llrp_ntohl = llrp_ws_ntohl;
+
+unsigned short llrp_ws_ntohs(unsigned short source)
+{
+    return pntohs(&source);
+}
+t_llrp_ntohs llrp_ntohs = llrp_ws_ntohs;
+
+/* --------------------------------------------------------------------------------------- */
+/* WireShark-Specific Parser Callbacks                                                     */
+
+static void llrp_ws_DescendParseTree(t_llrp_parse_context *context, t_llrp_parse_info *info,
+ proto_tree *tree)
+{
+    if(context->depth>= LLRP_MAX_PARAMETER_DEPTH)
+    {
+        #ifdef LLRP_DISSECTOR_DEBUG
+        g_warning("Maximum parse depth exceeded (%u)", context->depth);
+        #endif /* LLRP_DISSECTOR_DEBUG */
+        info->quiet_parse= 1;
+        return;
+    }
+
+    info->quiet_parse= 0;
+    info->tree[context->depth]= tree;
+}
+
+static void llrp_ws_AscendParseTree(t_llrp_parse_context *context, t_llrp_parse_info *info)
+{
+    if(context->depth< LLRP_MAX_PARAMETER_DEPTH)
+        info->quiet_parse= 0;
+}
+
+unsigned char *llrp_ws_StreamRead(void *context, const unsigned long length,
+ const int wait_forever, unsigned long *consumed)
+{
+    t_llrp_parse_context *ctxt = (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info = (t_llrp_parse_info *) ctxt->data;
+    unsigned char *buffer;
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("llrp_ws_StreamRead (offset %u, length %u)", info->tvb_offset, length);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    buffer = (unsigned char *) tvb_get_ptr(info->tvb, info->tvb_offset, length);
+    if(buffer != NULL)
+    {
+        info->tvb_offset += length;
+        *consumed = length;
+    }
+
+    return buffer;
+}
+
+unsigned long llrp_ws_StreamGetOffset(void *context)
+{
+    t_llrp_parse_context *ctxt = (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info = (t_llrp_parse_info *) ctxt->data;
+    
+    g_warning("llrp_ws_StreamGetOffset (offset %u)", info->tvb_offset);
+    return info->tvb_offset;
+}                                                                  
+
+int llrp_ws_HandleMessageStart(void *context, const unsigned char version,
+ const unsigned short type, const unsigned long length, const unsigned long id, const char *name)
+{
+    proto_item *item;
+    proto_tree *tree;
+    t_llrp_parse_context *ctxt = (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info = (t_llrp_parse_info *) ctxt->data;
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("llrp_ws_HandleMessageStart (type %d)", type);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    if(ctxt->depth != 0)
+    {
+        #ifdef LLRP_DISSECTOR_DEBUG
+        g_warning("Invalid parse depth (%d)", ctxt->depth);
+        #endif /* LLRP_DISSECTOR_DEBUG */
+        return 0; /* abort parsing */
+    }
+
+    if(info->tree[0] == NULL)
+    {
+        #ifdef LLRP_DISSECTOR_DEBUG
+        g_warning("llrp_ws_HandleMessageStart: no display tree!", type);
+        #endif /* LLRP_DISSECTOR_DEBUG */
+        tree = NULL;
+        info->quiet_parse = 1;
+    }
+    else
+    {
+        info->quiet_parse = 0;
+        if(check_col(info->pinfo->cinfo, COL_INFO))
+            col_add_fstr(info->pinfo->cinfo, COL_INFO, "%s (type %u, ID %u)", name, type, id);
+
+        /* Show a dissection tree node for the standard LLRP header information */
+        item = proto_tree_add_item(proto_tree_get_root(info->tree[0]), proto_epc_llrp, info->tvb, 0, -1, FALSE);
+        proto_item_append_text(item, ": %s (ID %u)", name, id);
+        tree = proto_item_add_subtree(item, ett_llrp_message);      
+
+        /* Display the standard header data */
+        proto_tree_add_uint(tree, hf_llrp_message_version, info->tvb, 0, 1, version);
+        proto_tree_add_uint(tree, hf_llrp_message_type, info->tvb, 0, 2, type);
+        proto_tree_add_uint(tree, hf_llrp_message_length, info->tvb, 2, 4, length);
+        proto_tree_add_uint(tree, hf_llrp_message_id, info->tvb, 6, 4, id);
+    }
+
+    llrp_ws_DescendParseTree(ctxt, info, tree);
+    return 1; /* continue parsing */
+}     
+
+void llrp_ws_HandleField(void *context, const unsigned short field_index, const unsigned char type,
+ const char *name, const unsigned long bitlength, const unsigned char *data,
+ t_llrp_enumeration *enumeration)
+{
+    proto_tree *tree= NULL;
+    const char *enumeration_name;
+    unsigned short enumeration_value;
+    t_llrp_parse_context *ctxt= (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info= (t_llrp_parse_info *) ctxt->data;
+    unsigned long bytelength= (bitlength/8)+((bitlength%8) ? 1 : 0);
+    unsigned long total_length= bytelength+(LLRP_FIELDTYPE_IS_VARIABLE(type) ? 2 : 0);
+    unsigned long count= 0;
+    gint tvb_offset = info->tvb_offset;
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("llrp_ws_HandleField (type %d)", type);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    if(ctxt->depth> 0 && !info->quiet_parse)
+    {
+        proto_item *item;
+        proto_tree *parent_tree= info->tree[(ctxt->depth)-1];
+
+        if(parent_tree!= NULL)
+        {
+            item= proto_tree_add_uint_format_value(parent_tree, hf_llrp_message_field, info->tvb,
+             tvb_offset-total_length, total_length, type, "%s (%s)", name,
+             llrp_field_type_to_name(type));
+            tree= proto_item_add_subtree(item, ett_llrp_field);
+            proto_tree_add_uint_format_value(tree, hf_llrp_field_type, info->tvb,
+             tvb_offset-total_length, total_length, type, "%s (%u)",
+             llrp_field_type_to_name(type), type);
+            if(LLRP_FIELDTYPE_IS_VARIABLE(type))
+            {
+                count= bitlength/llrp_variable_field_bitlength[LLRP_FIELDTYPE_INDEX_VARIABLE(type)];
+                proto_tree_add_uint(tree, hf_llrp_field_count, info->tvb,
+                 tvb_offset-total_length, 2, count);                 
+            }
+            proto_tree_add_uint(tree, hf_llrp_field_bitlength, info->tvb,
+             tvb_offset-total_length, total_length, bitlength);
+            switch(type)
+            {
+                case LLRP_FIELDTYPE_u1:
+                    proto_tree_add_uint_format_value(tree, hf_llrp_field_value_u1, info->tvb,
+                     tvb_offset-bytelength, bytelength, *data, "%d (%s)", *data,
+                     (*data) ? "True" : "False");
+                    enumeration_value= *data;
+                    break;
+                case LLRP_FIELDTYPE_u2:
+                    proto_tree_add_uint(tree, hf_llrp_field_value_u2, info->tvb,
+                     tvb_offset-bytelength, bytelength, *data);
+                    enumeration_value= *data;
+                    break;
+                case LLRP_FIELDTYPE_u8:
+                    proto_tree_add_uint_format_value(tree, hf_llrp_field_value_u8, info->tvb,
+                     tvb_offset-bytelength, bytelength, *data, "0x%02x (%u)", *data, *data);
+                    enumeration_value= *data;
+                    break;
+                case LLRP_FIELDTYPE_s8:
+                    proto_tree_add_int_format_value(tree, hf_llrp_field_value_s8, info->tvb,
+                     tvb_offset-bytelength, bytelength, *data, "0x%02x (%d)", *data, *data);
+                    enumeration_value= *data;
+                    break;
+                case LLRP_FIELDTYPE_u16:
+                {
+                    unsigned short value= pntohs(((unsigned short*)data));
+                    proto_tree_add_uint_format_value(tree, hf_llrp_field_value_u16, info->tvb,
+                     tvb_offset-bytelength, bytelength, value, "0x%04x (%u)", value, value);
+                    enumeration_value= value;
+                    break;
+                }
+                case LLRP_FIELDTYPE_s16:
+                {
+                    unsigned short value= pntohs(((unsigned short*)data));
+                    proto_tree_add_int_format_value(tree, hf_llrp_field_value_s16, info->tvb,
+                     tvb_offset-bytelength, bytelength, value, "0x%04x (%d)", value, value);
+                    enumeration_value= value;
+                    break;
+                }
+                case LLRP_FIELDTYPE_u32:
+                {
+                    unsigned long value= pntohl(((unsigned long*)data));
+
+                    #ifdef LLRP_RESOLVE_VENDOR_ID
+                    /* Note: this is a little hackish - anyone could name a field
+                     *  "VendorIdentifier" in their vendor extension and potentially
+                     *  get bogus extra information... */
+                    if(strcmp(name, "VendorIdentifier") == 0)
+                    {
+                        proto_tree_add_uint_format_value(tree, hf_llrp_field_value_u32, info->tvb,
+                         tvb_offset-bytelength, bytelength, value, "%s (0x%08x, %u)",
+                         llrp_ws_find_vendor_id(value), value, value);
+                    }
+                    else
+                    #endif /* LLRP_RESOLVE_VENDOR_ID */
+                    {
+                        proto_tree_add_uint_format_value(tree, hf_llrp_field_value_u32, info->tvb,
+                         tvb_offset-bytelength, bytelength, value, "0x%08x (%u)", value, value);
+                    }
+                    break;
+                }
+                case LLRP_FIELDTYPE_s32:
+                {
+                    unsigned long value= pntohl(((unsigned long*)data));
+                    proto_tree_add_int_format_value(tree, hf_llrp_field_value_s32, info->tvb,
+                     tvb_offset-bytelength, bytelength, value, "0x%08x (%d)", value, value);
+                    break;
+                }
+                case LLRP_FIELDTYPE_u64:
+                {
+                    guint64 value= pntoh64((guint64*)data);
+                    proto_tree_add_uint64_format_value(tree, hf_llrp_field_value_u64, info->tvb,
+                     tvb_offset-bytelength, bytelength, value,
+                     "0x%0" G_GINT64_MODIFIER "x (%" G_GINT64_MODIFIER "u)", value, value);
+                    break;
+                }
+                case LLRP_FIELDTYPE_s64:
+                {
+                    guint64 value= pntoh64((guint64*)data);
+                    proto_tree_add_int64_format_value(tree, hf_llrp_field_value_s64, info->tvb,
+                     tvb_offset-bytelength, bytelength, value,
+                     "0x%0" G_GINT64_MODIFIER "x (%" G_GINT64_MODIFIER "d)", value, value);
+                    break;
+                }
+                case LLRP_FIELDTYPE_utf8v:
+                {
+                    char *string;
+                    string= (char *) malloc(bytelength+3);
+                    if(string!= NULL)
+                    {
+                        memcpy(string+1, data, bytelength);
+                        string[0]= '"';
+                        string[bytelength+1]= '"';
+                        string[bytelength+2]= '\0';
+                        proto_tree_add_string(tree, hf_llrp_field_value_variable, info->tvb,
+                         tvb_offset-bytelength, bytelength, string);
+                        free(string);
+                    }
+                    break;
+                }
+                case LLRP_FIELDTYPE_u8v:
+                case LLRP_FIELDTYPE_s8v:
+                {
+                    char *string;
+                    string= (char *) malloc(6*count);
+                    if(string!= NULL)
+                    {
+                        unsigned short idx;
+                        string[0]= '\0';
+                        for(idx= 0; idx< count; idx++)
+                        {
+                            sprintf(string+strlen(string), "%s%d",
+                             (idx>0) ? ", " : "", data[idx]);
+                        }
+                        proto_tree_add_string(tree, hf_llrp_field_value_variable, info->tvb,
+                         tvb_offset-bytelength, bytelength, string);
+                        free(string);
+                    }
+                    break;
+                }                
+                case LLRP_FIELDTYPE_u16v:
+                case LLRP_FIELDTYPE_s16v:
+                {
+                    char *string;
+                    string= (char *) malloc(8*count);
+                    if(string!= NULL)
+                    {
+                        unsigned short idx;
+                        string[0]= '\0';
+                        for(idx= 0; idx< count; idx++)
+                        {
+                            sprintf(string+strlen(string), "%s%d",
+                             (idx>0) ? ", " : "", pntohs(&data[idx*2]));
+                        }
+                        proto_tree_add_string(tree, hf_llrp_field_value_variable, info->tvb,
+                         tvb_offset-bytelength, bytelength, string);
+                        free(string);
+                    }
+                    break;
+                }
+                case LLRP_FIELDTYPE_u32v:
+                case LLRP_FIELDTYPE_s32v:
+                {
+                    char *string;
+                    string= (char *) malloc(13*count);
+                    if(string!= NULL)
+                    {
+                        unsigned short idx;
+                        string[0]= '\0';
+                        for(idx= 0; idx< count; idx++)
+                        {
+                            sprintf(string+strlen(string), "%s%d",
+                             (idx>0) ? ", " : "", pntohl(&data[idx*4]));
+                        }
+                        proto_tree_add_string(tree, hf_llrp_field_value_variable, info->tvb,
+                         tvb_offset-bytelength, bytelength, string);
+                        free(string);
+                    }
+                    break;
+                }
+                case LLRP_FIELDTYPE_u64v:
+                case LLRP_FIELDTYPE_s64v:
+                {
+                    char *string;
+                    string= (char *) malloc(23*count);
+                    if(string!= NULL)
+                    {
+                        unsigned short idx;
+                        string[0]= '\0';
+                        for(idx= 0; idx< count; idx++)
+                        {
+                            sprintf(string+strlen(string), "%s%d",
+                             (idx>0) ? ", " : "", pntoh64(&data[idx*8]));
+                        }
+                        proto_tree_add_string(tree, hf_llrp_field_value_variable, info->tvb,
+                         tvb_offset-bytelength, bytelength, string);
+                        free(string);
+                    }
+                    break;
+                }
+                default:
+                    break;
+            }
+
+            if(enumeration!= NULL)
+            {
+                enumeration_name= llrp_enumeration_to_name(enumeration, enumeration_value);
+                if(enumeration_name!= NULL)
+                {
+                    proto_tree_add_string(tree, hf_llrp_field_enumeration, info->tvb,
+                     tvb_offset-bytelength, bytelength, enumeration_name);
+                }
+            }
+        }
+    }
+}
+
+void llrp_ws_HandleParameterStart(void *context, const unsigned short type, const char *name,
+ const unsigned short length)
+{
+    proto_tree *tree = NULL;
+    t_llrp_parse_context *ctxt = (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info = (t_llrp_parse_info *) ctxt->data;
+    gint tvb_offset, tvb_length, type_length;
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("llrp_ws_HandleParameterStart (type %d)", type);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    if(ctxt->depth> 0 && !info->quiet_parse)
+    {
+        proto_item *item;
+        proto_tree *parent_tree = info->tree[(ctxt->depth)-1];
+
+        if(parent_tree!= NULL)
+        {
+            if(LLRP_PARAMETER_IS_TV(type))
+            {
+                tvb_offset = info->tvb_offset - 1;
+                tvb_length = length + 1;
+                type_length = 1;
+            }
+            else
+            {
+                tvb_offset = info->tvb_offset - 4;
+                tvb_length = length + 4;
+                type_length = 2;
+            }
+
+            item = proto_tree_add_uint_format_value(parent_tree, hf_llrp_message_parm, info->tvb,
+             tvb_offset, tvb_length, type, "%s (type %u)", name, type);
+            tree = proto_item_add_subtree(item, ett_llrp_parameter);
+            proto_tree_add_uint_format_value(tree, hf_llrp_parameter_type, info->tvb,
+             tvb_offset, type_length, type,
+             (LLRP_PARAMETER_IS_TV(type)) ? "%u (TV-encoded)" : "%u (TLV-encoded)", type);
+            if(LLRP_PARAMETER_IS_TLV(type))
+                proto_tree_add_uint(tree, hf_llrp_parameter_length, info->tvb, tvb_offset+2, 2, length);
+        }
+    }
+
+    llrp_ws_DescendParseTree(ctxt, info, tree);
+}
+
+void llrp_ws_HandleCustomParameterStart(void *context, const unsigned short type,
+ const unsigned long vendorID, const unsigned long subtype, const char *name,
+ const unsigned short length)
+{
+    proto_tree *tree = NULL;
+    t_llrp_parse_context *ctxt = (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info = (t_llrp_parse_info *) ctxt->data;
+    gint tvb_offset, tvb_length, type_length;
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("llrp_ws_HandleCustomParameterStart (type %u, vendorID %u, subtype %u)", type, vendorID, subtype);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    if(ctxt->depth> 0 && !info->quiet_parse)
+    {
+        proto_item *item;
+        proto_tree *parent_tree = info->tree[(ctxt->depth)-1];
+
+        if(parent_tree!= NULL)
+        {
+            /* All custom parameters are TLV */
+            tvb_offset = info->tvb_offset - 4;
+            tvb_length = length + 4;
+            type_length = 2;
+
+            #ifdef LLRP_RESOLVE_VENDOR_ID
+            item = proto_tree_add_uint_format_value(parent_tree, hf_llrp_message_parm, info->tvb,
+             tvb_offset, tvb_length, type, "%s (%s (%u), subtype %u)", name,
+             llrp_ws_find_vendor_id(vendorID), vendorID, subtype);
+            #else
+            item = proto_tree_add_uint_format_value(parent_tree, hf_llrp_message_parm, info->tvb,
+             tvb_offset, tvb_length, type, "%s (%u, subtype %u)", name, vendorID, subtype);
+            #endif
+            tree = proto_item_add_subtree(item, ett_llrp_parameter);
+
+            #ifdef LLRP_RESOLVE_VENDOR_ID
+            proto_tree_add_uint_format_value(tree, hf_llrp_custparm_vendorid, info->tvb,
+             tvb_offset, type_length, vendorID, "%u (%s)", vendorID, llrp_ws_find_vendor_id(vendorID));
+            #else
+            proto_tree_add_uint_format_value(tree, hf_llrp_custparm_vendorid, info->tvb,
+             tvb_offset, type_length, vendorID, "%u", vendorID);
+            #endif /* LLRP_RESOLVE_VENDOR_ID */  
+            proto_tree_add_uint_format_value(tree, hf_llrp_custparm_subtype, info->tvb,
+             tvb_offset, type_length, subtype, "%u", subtype);
+            proto_tree_add_uint(tree, hf_llrp_parameter_length, info->tvb, tvb_offset+2, 2, length);
+        }
+    }
+
+    llrp_ws_DescendParseTree(ctxt, info, tree);
+}
+
+void llrp_ws_HandleParameterFinished(void *context, const unsigned short type, const char *name,
+ const unsigned short length)
+{
+    t_llrp_parse_context *ctxt= (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info= (t_llrp_parse_info *) ctxt->data;
+
+    llrp_ws_AscendParseTree(ctxt, info);
+}
+
+void llrp_ws_HandleCustomParameterFinished(void *context, const unsigned short type,
+ const unsigned long vendorID, const unsigned long subtype, const char *name,
+ const unsigned short length)
+{
+    t_llrp_parse_context *ctxt= (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info= (t_llrp_parse_info *) ctxt->data;
+
+    llrp_ws_AscendParseTree(ctxt, info);
+}
+
+#define LLRP_DEBUG_MAX_STRING_LENGTH 160 /* characters */
+void llrp_ws_HandleParseError(void *context, const unsigned char code, const unsigned short item,
+ const char *function_name, const char *format, ...)
+{
+    t_llrp_parse_context *ctxt= (t_llrp_parse_context *) context;
+    t_llrp_parse_info *info= (t_llrp_parse_info *) ctxt->data;
+    va_list argList;
+    char message[LLRP_DEBUG_MAX_STRING_LENGTH+1];
+
+    if(ctxt->depth> 0 && !info->quiet_parse)
+    {
+        proto_tree *parent_tree= info->tree[(ctxt->depth)-1];
+        if(parent_tree!= NULL)
+        {
+            va_start(argList, format);
+            g_vsnprintf(message, LLRP_DEBUG_MAX_STRING_LENGTH, format, argList);
+            message[LLRP_DEBUG_MAX_STRING_LENGTH] = '\0';
+            proto_tree_add_text(parent_tree, info->tvb, 0, 0, message);
+            va_end(argList);
+        }
+    }
+}
+
+void llrp_ws_HandleDebugMessage(void *context, const char *function_name, const char *format, ...)
+{
+    #ifdef LLRP_PARSER_DEBUG
+    va_list argList;
+    char message[LLRP_DEBUG_MAX_STRING_LENGTH+1];
+
+    va_start(argList, format);
+    g_vsnprintf(message, LLRP_DEBUG_MAX_STRING_LENGTH, format, argList);
+    message[LLRP_DEBUG_MAX_STRING_LENGTH]= '\0';
+    g_warning(message);
+    va_end(argList);
+    #endif /* LLRP_PARSER_DEBUG */
+}
+
+/* --------------------------------------------------------------------------------------- */
+/* Dissector                                                                               */
+
+static t_llrp_parse_validator *llrp_parse_validator_list[]=
+{
+    &llrp_v1_0_parse_validator,
+    &llrp_llrp_Intermec_parse_validator
+};
+
+static t_llrp_parse_context parse_context = {
+    0 /*depth*/, llrp_parse_validator_list,
+    sizeof(llrp_parse_validator_list)/sizeof(llrp_parse_validator_list[0]),
+    llrp_ws_StreamRead, llrp_ws_StreamGetOffset, llrp_ws_HandleMessageStart,
+    NULL /*message finished*/, llrp_ws_HandleField, NULL /*field complete*/,
+    llrp_ws_HandleParameterStart, llrp_ws_HandleParameterFinished,
+    llrp_ws_HandleCustomParameterStart, llrp_ws_HandleCustomParameterFinished,
+    NULL /*all parameters complete*/, llrp_ws_HandleParseError, llrp_ws_HandleDebugMessage,
+    (void *) &llrp_parse_info
+};
+
+static guint get_epc_llrp_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
+{
+    guint length;
+    /* Peek into the header to determine the total message length */
+    length = (guint) tvb_get_ntohl(tvb, offset+2); 
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("get_epc_llrp_message_len: offset=%d, length=%u", offset, length);
+    #endif /* LLRP_DISSECTOR_DEBUG */
+    return length;
+}
+
+static int dissect_epc_llrp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{   
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("dissect_epc_llrp_message start");
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    /* Make the protocol column in the packet list display the protocol name */
+    if(check_col(pinfo->cinfo, COL_PROTOCOL))
+        col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_SHORT_DESCRIPTION_LLRP);
+
+    /* Start with a clean info column */
+    if(check_col(pinfo->cinfo, COL_INFO))
+        col_clear(pinfo->cinfo, COL_INFO);
+
+    if(tree)
+    {
+        memset(&llrp_parse_info, 0, sizeof(llrp_parse_info));
+
+        /* Dissect the contents of the message */
+        llrp_parse_info.tree[0] = tree;
+        llrp_parse_info.tvb = tvb;
+        llrp_parse_info.pinfo = pinfo;
+        llrp_ParseMessage(&parse_context);
+    }
+
+    #ifdef LLRP_DISSECTOR_DEBUG
+    g_warning("dissect_epc_llrp_message finished");
+    #endif /* LLRP_DISSECTOR_DEBUG */
+
+    return 0;
+}
+
+static int dissect_epc_llrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+    /* Allow the TCP stream to be automatically reassembled. The message dissector should
+     *  not be called until an entire message is available. */
+    tcp_dissect_pdus(tvb, pinfo, tree, TRUE, LLRP_HEADER_LENGTH, get_epc_llrp_message_len,
+     dissect_epc_llrp_message);
+    return 0;
+}
+
+void proto_reg_handoff_epc_llrp(void)
+{
+    static int llrp_prefs_initialized = FALSE;
+    static dissector_handle_t epc_llrp_handle;
+
+    if(!llrp_prefs_initialized)
+    {
+        epc_llrp_handle = create_dissector_handle(dissect_epc_llrp, proto_epc_llrp);
+        llrp_prefs_initialized = TRUE;
+    }
+    else
+    {
+        dissector_delete("tcp.port", gbl_llrpTcpPort, epc_llrp_handle);
+    }
+
+    /* The only binding for LLRP is TCP */
+    dissector_add("tcp.port", gbl_llrpTcpPort, epc_llrp_handle);
+}    
+
+static void prefs_register_epc_llrp()
+{
+    module_t *llrp_module;
+
+    /* Register a configuration option for port */
+    llrp_module = prefs_register_protocol(proto_epc_llrp, proto_reg_handoff_epc_llrp);
+
+    /* Allow specification of an alternate TCP port number */
+    prefs_register_uint_preference(llrp_module, "tcp.port", "LLRP TCP Port",
+     "Set the TCP port for LLRP messages", 10, &gbl_llrpTcpPort);
+} /* prefs_register_epc_llrp */
+
+/* Filtering engine registration */
+void proto_register_epc_llrp(void)
+{
+    /* Register the LLRP protocol */
+    if(proto_epc_llrp == -1)
+    {
+        proto_epc_llrp = proto_register_protocol(PROTO_DESCRIPTION_LLRP,
+         PROTO_SHORT_DESCRIPTION_LLRP, PROTO_NAME_LLRP);
+    }
+
+    proto_register_field_array(proto_epc_llrp, hf_llrp, array_length(hf_llrp));
+    proto_register_subtree_array(ett_llrp, array_length(ett_llrp));
+
+    /* Allow dissector to find be found by name. */
+    new_register_dissector(PROTO_NAME_LLRP, dissect_epc_llrp, proto_epc_llrp);
+
+    /* Register a list of settable preferences for the LLRP dissector */
+    prefs_register_epc_llrp();
+}
+
+/* --------------------------------------------------------------------------------------- */
+/* Private Helper Functions                                                                */
+
+#ifdef LLRP_RESOLVE_VENDOR_ID
+static const char llrp_ws_unknown_vendor_id[] = "Unknown Vendor ID";
+
+static const char *llrp_ws_find_vendor_id(const unsigned long vendor_id)
+{
+    return val_to_str((guint32) vendor_id, sminmpec_values, llrp_ws_unknown_vendor_id);
+}
+#endif /* LLRP_RESOLVE_VENDOR_ID */
+
diff --git a/plugins/llrp/plugin.rc.in b/plugins/llrp/plugin.rc.in
new file mode 100644 (file)
index 0000000..bb6159c
--- /dev/null
@@ -0,0 +1,33 @@
+#include "winver.h"
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION @RC_MODULE_VERSION@
+ PRODUCTVERSION @RC_VERSION@
+ FILEFLAGSMASK 0x0L
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_PRERELEASE+VS_FF_SPECIALBUILD+VS_FF_DEBUG
+#else
+ FILEFLAGS VS_FF_PRERELEASE+VS_FF_SPECIALBUILD
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_DLL
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "The Wireshark developer community, http://www.wireshark.org/\0"
+            VALUE "FileDescription", "@PACKAGE@ dissector\0"
+            VALUE "FileVersion", "@MODULE_VERSION@\0"
+            VALUE "InternalName", "@PACKAGE@ @MODULE_VERSION@\0"
+            VALUE "LegalCopyright", "Copyright © 2008 Intermec Corp. <matt.poduska@intermec.com>\0"
+            VALUE "OriginalFilename", "@PLUGIN_NAME@.dll\0"
+            VALUE "ProductName", "Wireshark\0"
+            VALUE "ProductVersion", "@VERSION@\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1200
+    END
+END