From Matt Poduska via bug 1957 (with minor changes):
[obnox/wireshark/wip.git] / plugins / llrp / llrpparse.h
1 /* EPCglobal Low-Level Reader Protocol Packet Dissector
2  *
3  * Copyright 2008, Intermec Technologies Corp. <matt.poduska@intermec.com>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1999 Gerald Combs
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  * 
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  * 
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24  */   
25
26 #ifndef _LLRP_PARSER_H
27 #define _LLRP_PARSER_H
28
29 #include "llrpparsetypes.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif /* __cplusplus */
34
35 /* --------------------------------------------------------------------------------------- */
36 /* Parse error codes, passed as a parameter in t_llrp_HandleParseError                     */
37
38 #define LLRP_CONTEXT_ERROR                             0x00    
39
40 /* Message Errors */
41 #define LLRP_PARSE_ERROR_MESSAGE_DATA_UNDERFLOW        0x10
42 #define LLRP_PARSE_ERROR_MESSAGE_TYPE_UNKNOWN          0x11
43
44 /* Parameter Errors */
45 #define LLRP_PARSE_ERROR_PARAMETER_TYPE_UNKNOWN        0x50
46 #define LLRP_PARSE_ERROR_PARAMETER_TV_NOT_FOUND        0x51
47 #define LLRP_PARSE_ERROR_PARAMETER_DATA_UNDERFLOW      0x52
48 #define LLRP_PARSE_ERROR_PARAMETER_DATA_OVERFLOW       0x53
49
50 /* Field Errors */
51 #define LLRP_PARSE_ERROR_FIELD_TYPE_UNKNOWN            0x90
52 #define LLRP_PARSE_ERROR_FIELD_DATA_UNDERFLOW          0x91
53 #define LLRP_PARSE_ERROR_FIELD_DATA_OVERFLOW           0x92
54
55 /* --------------------------------------------------------------------------------------- */
56 /* Endian swappers                                                                         */
57 /*   For portability, these functions must be defined externally. Often, they will map     */
58 /*   directly to ntohs().                                                                  */
59
60 typedef unsigned short (*t_llrp_ntohs)(unsigned short value);
61 typedef unsigned long (*t_llrp_ntohl)(unsigned long value);
62
63 extern t_llrp_ntohs llrp_ntohs;
64 extern t_llrp_ntohl llrp_ntohl;
65
66 /* --------------------------------------------------------------------------------------- */
67 /* LLRP message parsing context                                                            */
68
69 /* Consume 'length' bytes from the stream, set 'consumed' to the number of bytes
70     successfully consumed, return a pointer to the first consumed byte. */
71 typedef unsigned char *(*t_llrp_StreamRead)(void *context, const unsigned long length,
72  const int wait_forever, unsigned long *consumed);
73
74 /* Return the number of bytes consumed from stream */
75 typedef unsigned long (*t_llrp_StreamGetOffset)(void *context);
76
77 /* Called upon successful parsing of an LLRP message header. If the parser should continue
78  *  parsing this message, nonzero should be returned. If the parser should abort parsing this
79  *  message, zero should be returned. */
80 typedef int (*t_llrp_HandleMessage)(void *context, const unsigned char version,
81  const unsigned short type, const unsigned long length, const unsigned long id, const char *name);
82
83 /* Called upon successful parsing of an LLRP field. Note that data is in network byte order. */
84 typedef void (*t_llrp_HandleField)(void *context, const unsigned short field_index,
85  const unsigned char type, const char *name, const unsigned long bitlength,
86  const unsigned char *data, t_llrp_enumeration *enumeration);
87
88 /* Called upon completion of parsing all fields in a parameter/message */
89 typedef void (*t_llrp_HandleFieldComplete)(void *context, const unsigned short field_count);
90
91 /* Called upon successful parsing of an LLRP parameter */
92 typedef void (*t_llrp_HandleParameter)(void *context, const unsigned short type, const char *name,
93  const unsigned short length);
94
95 /* Called upon successful parsing of an LLRP custom parameter */
96 typedef void (*t_llrp_HandleCustomParameter)(void *context, const unsigned short type,
97  const unsigned long vendorID, const unsigned long subtype, const char *name,
98  const unsigned short length);
99
100 /* Called upon completion of parsing all parameters */
101 typedef void (*t_llrp_HandleAllParametersComplete)(void *context);
102
103 /* Called upon detection of a parsing error */
104 typedef void (*t_llrp_HandleParseError)(void *context, const unsigned char code,
105  const unsigned short item, const char *function_name, const char *format, ...);
106
107 /* Called by the parser to report an informational/debug message */
108 typedef void (*t_llrp_HandleDebugMessage)(void *context, const char *function_name,
109  const char *format, ...);
110
111 typedef struct
112 {
113     unsigned char depth; /* Parse tree depth (message header is always parsed at depth 0) */
114
115     t_llrp_parse_validator **validator_list;
116     unsigned char validator_count;
117
118     /* Callback functions for stream management */
119     t_llrp_StreamRead stream_read_handler;
120     t_llrp_StreamGetOffset stream_get_offset_handler;
121
122     /* Callback functions for handling parsing events */
123     t_llrp_HandleMessage message_start_handler;
124     t_llrp_HandleMessage message_finished_handler;
125     t_llrp_HandleField field_handler;
126     t_llrp_HandleFieldComplete field_complete_handler;
127     t_llrp_HandleParameter parameter_start_handler;
128     t_llrp_HandleParameter parameter_finished_handler;
129     t_llrp_HandleCustomParameter custom_parameter_start_handler;
130     t_llrp_HandleCustomParameter custom_parameter_finished_handler;
131     t_llrp_HandleAllParametersComplete all_parameters_complete_handler;
132     t_llrp_HandleParseError parse_error_handler;
133     t_llrp_HandleDebugMessage debug_message_handler;
134
135     void *data; /* user-defined data */
136 } t_llrp_parse_context;
137
138 /* --------------------------------------------------------------------------------------- */
139 /* Exported Functions                                                                      */
140
141 #define LLRP_PARSE_RESULT_SUCCESS      0  /* parse successful */
142 #define LLRP_PARSE_RESULT_PARSE_FAILED 1  /* received message, parse failed */
143 #define LLRP_PARSE_RESULT_NO_PARSE     2  /* no message received */
144 #define LLRP_PARSE_RESULT_FAILURE      3  /* unspecified failure */
145 int llrp_ParseMessage(t_llrp_parse_context *context);
146
147 #ifdef __cplusplus
148 }
149 #endif /* __cplusplus */
150
151 #endif /* _LLRP_PARSER_H */