Rename the routines that handle dissector tables with unsigned integer
[obnox/wireshark/wip.git] / epan / dissectors / packet-assa_r3.c
1 /* packet-assa_r3.c
2  * Routines for R3 packet dissection
3  * Copyright (c) 2009 Assa Abloy USA <jcwren@assaabloyusa.com>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 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 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <glib.h>
31 #include <epan/packet.h>
32 #include <epan/expert.h>
33 #include <epan/dissectors/packet-tcp.h>
34
35 #include "packet-assa_r3_public.h"
36
37 /*
38  *  Wireshark ID of the R3 protocol
39  */
40 static gint proto_r3 = -1;
41
42 /*
43  *  Packet variables
44  */
45 static gint hf_r3_tildex3ds = -1;          /* Got ~~~ds */
46
47 static gint hf_r3_header = -1;             /* Packet header */
48 static gint hf_r3_payload = -1;            /* Packet payload */
49 static gint hf_r3_tail = -1;               /* Packet tail */
50
51 static gint hf_r3_sigil = -1;              /* Packet sigil */
52 static gint hf_r3_address = -1;            /* Packet address */
53 static gint hf_r3_packetnumber = -1;       /* Packet number */
54 static gint hf_r3_packetlength = -1;       /* Packet length */
55 static gint hf_r3_encryption = -1;         /* Packet encryption scheme */
56 static gint hf_r3_crc = -1;                /* Packet CRC */
57 static gint hf_r3_crc_bad = -1;            /* Packet CRC bad (for filtering) */
58 static gint hf_r3_xor = -1;                /* Packet Xor */
59 static gint hf_r3_xor_bad = -1;            /* Packet Xor bad (for filtering) */
60
61 static gint hf_r3_commandlength = -1;      /* Command length */
62 static gint hf_r3_command = -1;            /* Command (cmdCommand_e) */
63 static gint hf_r3_commanddata = -1;        /* Command data (not always present) */
64
65 static gint hf_r3_commandmfglength = -1;   /* Mfg Command length */
66 static gint hf_r3_commandmfg = -1;         /* Mfg Command (cmdCommand_e) */
67 static gint hf_r3_commandmfgdata = -1;     /* Mfg Command data (not always present) */
68
69 static gint hf_r3_responselength = -1;     /* Response length */
70 static gint hf_r3_responsecommand = -1;    /* Response command */
71 static gint hf_r3_responsetype = -1;       /* Response type (responseType_e) */
72 static gint hf_r3_responsetocommand = -1;  /* Response to command (cmdCommand_e) */
73 static gint hf_r3_responsedata = -1;       /* Response data (not always present) */
74
75 static gint hf_r3_upstreamcommand = -1;
76
77 static gint hf_r3_upstreamfield = -1;                /* Upstream field (length + type + data) */
78 static gint hf_r3_upstreamfieldlength = -1;          /* Upstream field length */
79 static gint hf_r3_upstreamfieldtype = -1;            /* Upstream field type (upstreamField_e) */
80 static gint hf_r3_upstreamfielddatalen = -1;         /* Upstream field data length */
81 static gint hf_r3_upstreamfielderror = -1;           /* Upstream field is unknown type */
82 static gint hf_r3_upstreamfieldarray [UPSTREAMFIELD_LAST];
83
84 static gint hf_r3_configitems = -1;
85 static gint hf_r3_configitem = -1;
86 static gint hf_r3_configfield = -1;
87 static gint hf_r3_configitemlength = -1;
88 static gint hf_r3_configitemtype = -1;
89 static gint hf_r3_configitemdata = -1;
90 static gint hf_r3_configitemdata_bool = -1;
91 static gint hf_r3_configitemdata_8 = -1;
92 static gint hf_r3_configitemdata_16 = -1;
93 static gint hf_r3_configitemdata_32 = -1;
94 static gint hf_r3_configitemdata_string = -1;
95
96 static gint hf_r3_timezonearray [32];
97
98 static gint hf_r3_expireon_year = -1;
99 static gint hf_r3_expireon_month = -1;
100 static gint hf_r3_expireon_day = -1;
101
102 static gint hf_r3_datetime_year = -1;
103 static gint hf_r3_datetime_month = -1;
104 static gint hf_r3_datetime_day = -1;
105 static gint hf_r3_datetime_dow = -1;
106 static gint hf_r3_datetime_hours = -1;
107 static gint hf_r3_datetime_minutes = -1;
108 static gint hf_r3_datetime_seconds = -1;
109 static gint hf_r3_datetime_dst = -1;
110
111 static gint hf_r3_eventlog_recordnumber = -1;
112 static gint hf_r3_eventlog_year = -1;
113 static gint hf_r3_eventlog_month = -1;
114 static gint hf_r3_eventlog_day = -1;
115 static gint hf_r3_eventlog_hour = -1;
116 static gint hf_r3_eventlog_minute = -1;
117 static gint hf_r3_eventlog_second = -1;
118 static gint hf_r3_eventlog_usernumber = -1;
119 static gint hf_r3_eventlog_event = -1;
120
121 static gint hf_r3_declinedlog_recordnumber = -1;
122 static gint hf_r3_declinedlog_year = -1;
123 static gint hf_r3_declinedlog_month = -1;
124 static gint hf_r3_declinedlog_day = -1;
125 static gint hf_r3_declinedlog_hour = -1;
126 static gint hf_r3_declinedlog_minute = -1;
127 static gint hf_r3_declinedlog_second = -1;
128 static gint hf_r3_declinedlog_usernumber = -1;
129 static gint hf_r3_declinedlog_cred1type = -1;
130 static gint hf_r3_declinedlog_cred2type = -1;
131 static gint hf_r3_declinedlog_cred1 = -1;
132 static gint hf_r3_declinedlog_cred2 = -1;
133
134 static gint hf_r3_alarmlog_recordnumber = -1;
135 static gint hf_r3_alarmlog_year = -1;
136 static gint hf_r3_alarmlog_month = -1;
137 static gint hf_r3_alarmlog_day = -1;
138 static gint hf_r3_alarmlog_hour = -1;
139 static gint hf_r3_alarmlog_minute = -1;
140 static gint hf_r3_alarmlog_second = -1;
141 static gint hf_r3_alarmlog_id = -1;
142 static gint hf_r3_alarmlog_usernumber = -1;
143
144 static gint hf_r3_debugmsg = -1;
145
146 static gint hf_r3_setdate_year = -1;
147 static gint hf_r3_setdate_month = -1;
148 static gint hf_r3_setdate_day = -1;
149 static gint hf_r3_setdate_dow = -1;
150 static gint hf_r3_setdate_hours = -1;
151 static gint hf_r3_setdate_minutes = -1;
152 static gint hf_r3_setdate_seconds = -1;
153
154 static gint hf_r3_deleteusers = -1;
155
156 static gint hf_r3_defineexception_number = -1;
157 static gint hf_r3_defineexception_startdate_month = -1;
158 static gint hf_r3_defineexception_startdate_day = -1;
159 static gint hf_r3_defineexception_startdate_hours = -1;
160 static gint hf_r3_defineexception_startdate_minutes = -1;
161 static gint hf_r3_defineexception_enddate_month = -1;
162 static gint hf_r3_defineexception_enddate_day = -1;
163 static gint hf_r3_defineexception_enddate_hours = -1;
164 static gint hf_r3_defineexception_enddate_minutes = -1;
165
166 static gint hf_r3_defineexceptiongroup_number = -1;
167 static gint hf_r3_defineexceptiongroup_bits = -1;
168
169 static gint hf_r3_definecalendar_number = -1;
170 static gint hf_r3_definecalendar_bits = -1;
171
172 static gint hf_r3_definetimezone_number = -1;
173 static gint hf_r3_definetimezone_starttime_hours = -1;
174 static gint hf_r3_definetimezone_starttime_minutes = -1;
175 static gint hf_r3_definetimezone_endtime_hours = -1;
176 static gint hf_r3_definetimezone_endtime_minutes = -1;
177 static gint hf_r3_definetimezone_daymap [7];
178 static gint hf_r3_definetimezone_exceptiongroup = -1;
179 static gint hf_r3_definetimezone_mode = -1;
180 static gint hf_r3_definetimezone_calendar = -1;
181
182 static gint hf_r3_rmtauthretry_sequence = -1;
183 static gint hf_r3_rmtauthretry_retry = -1;
184
185 static gint hf_r3_eventlogdump_starttime_year = -1;
186 static gint hf_r3_eventlogdump_starttime_month = -1;
187 static gint hf_r3_eventlogdump_starttime_day = -1;
188 static gint hf_r3_eventlogdump_starttime_hours = -1;
189 static gint hf_r3_eventlogdump_starttime_minutes = -1;
190 static gint hf_r3_eventlogdump_endtime_year = -1;
191 static gint hf_r3_eventlogdump_endtime_month = -1;
192 static gint hf_r3_eventlogdump_endtime_day = -1;
193 static gint hf_r3_eventlogdump_endtime_hours = -1;
194 static gint hf_r3_eventlogdump_endtime_minutes = -1;
195 static gint hf_r3_eventlogdump_user = -1;
196
197 static gint hf_r3_declinedlogdump_starttime_year = -1;
198 static gint hf_r3_declinedlogdump_starttime_month = -1;
199 static gint hf_r3_declinedlogdump_starttime_day = -1;
200 static gint hf_r3_declinedlogdump_starttime_hours = -1;
201 static gint hf_r3_declinedlogdump_starttime_minutes = -1;
202 static gint hf_r3_declinedlogdump_endtime_year = -1;
203 static gint hf_r3_declinedlogdump_endtime_month = -1;
204 static gint hf_r3_declinedlogdump_endtime_day = -1;
205 static gint hf_r3_declinedlogdump_endtime_hours = -1;
206 static gint hf_r3_declinedlogdump_endtime_minutes = -1;
207
208 static gint hf_r3_alarmlogdump_starttime_year = -1;
209 static gint hf_r3_alarmlogdump_starttime_month = -1;
210 static gint hf_r3_alarmlogdump_starttime_day = -1;
211 static gint hf_r3_alarmlogdump_starttime_hours = -1;
212 static gint hf_r3_alarmlogdump_starttime_minutes = -1;
213 static gint hf_r3_alarmlogdump_endtime_year = -1;
214 static gint hf_r3_alarmlogdump_endtime_month = -1;
215 static gint hf_r3_alarmlogdump_endtime_day = -1;
216 static gint hf_r3_alarmlogdump_endtime_hours = -1;
217 static gint hf_r3_alarmlogdump_endtime_minutes = -1;
218
219 static gint hf_r3_nvramclearoptions [16];
220
221 static gint hf_r3_writeeventlog_user = -1;
222 static gint hf_r3_writeeventlog_event = -1;
223
224 static gint hf_r3_powertableselection = -1;
225
226 static gint hf_r3_filter_type = -1;
227 static gint hf_r3_filter_list = -1;
228
229 static gint hf_r3_alarm_length = -1;
230 static gint hf_r3_alarm_id = -1;
231 static gint hf_r3_alarm_state = -1;
232
233 static gint hf_r3_dpac_action = -1;
234 static gint hf_r3_dpac_waittime = -1;
235 static gint hf_r3_dpac_command = -1;
236
237 static gint hf_r3_dpacreply_stuff = -1;
238 static gint hf_r3_dpacreply_length = -1;
239 static gint hf_r3_dpacreply_reply = -1;
240
241 static gint hf_r3_mfgfield_length = -1;
242 static gint hf_r3_mfgfield = -1;
243 static gint hf_r3_mfgfield_data = -1;
244
245 static gint hf_r3_mfgsetserialnumber = -1;
246 static gint hf_r3_mfgsetcryptkey = -1;
247 static gint hf_r3_mfgdumpnvram = -1;
248 static gint hf_r3_mfgremoteunlock = -1;
249 static gint hf_r3_mfgtestpreserve = -1;
250
251 static gint hf_r3_adc [8];
252
253 static gint hf_r3_hardwareid_board = -1;
254 static gint hf_r3_hardwareid_cpuid = -1;
255 static gint hf_r3_hardwareid_cpurev = -1;
256
257 static gint hf_r3_testkeypad = -1;
258 static gint hf_r3_testmagcard = -1;
259 static gint hf_r3_testproxcard = -1;
260
261 static gint hf_r3_nvramdump_record = -1;
262 static gint hf_r3_nvramdump_length = -1;
263 static gint hf_r3_nvramdump_data = -1;
264
265 static gint hf_r3_nvramdumprle_record = -1;
266 static gint hf_r3_nvramdumprle_length = -1;
267 static gint hf_r3_nvramdumprle_data = -1;
268
269 static gint hf_r3_iopins_lat = -1;
270 static gint hf_r3_iopins_port = -1;
271 static gint hf_r3_iopins_tris = -1;
272
273 static gint hf_r3_mortisepins_s1 = -1;
274 static gint hf_r3_mortisepins_s2 = -1;
275 static gint hf_r3_mortisepins_s3 = -1;
276 static gint hf_r3_mortisepins_s4 = -1;
277
278 static gint hf_r3_checksumresults = -1;
279 static gint hf_r3_checksumresults_field = -1;
280 static gint hf_r3_checksumresults_length = -1;
281 static gint hf_r3_checksumresults_state = -1;
282
283 static gint hf_r3_forceoptions_length = -1;
284 static gint hf_r3_forceoptions_item = -1;
285 static gint hf_r3_forceoptions_state_8= -1;
286 static gint hf_r3_forceoptions_state_16 = -1;
287 static gint hf_r3_forceoptions_state_24 = -1;
288 static gint hf_r3_forceoptions_state_32 = -1;
289
290 static gint hf_r3_peekpoke_operation = -1;
291 static gint hf_r3_peekpoke_address = -1;
292 static gint hf_r3_peekpoke_length = -1;
293 static gint hf_r3_peekpoke_poke8 = -1;
294 static gint hf_r3_peekpoke_poke16 = -1;
295 static gint hf_r3_peekpoke_poke24 = -1;
296 static gint hf_r3_peekpoke_poke32 = -1;
297 static gint hf_r3_peekpoke_pokestring = -1;
298
299 static gint hf_r3_firmwaredownload_length = -1;
300 static gint hf_r3_firmwaredownload_record = -1;
301 static gint hf_r3_firmwaredownload_action = -1;
302 static gint hf_r3_firmwaredownload_timeout = -1;
303 static gint hf_r3_firmwaredownload_nvram = -1;
304 static gint hf_r3_firmwaredownload_address = -1;
305 static gint hf_r3_firmwaredownload_bytes = -1;
306 static gint hf_r3_firmwaredownload_data = -1;
307 static gint hf_r3_firmwaredownload_crc = -1;
308 static gint hf_r3_firmwaredownload_crc_bad = -1;
309
310 static gint hf_r3_nvramchecksumvalue = -1;
311 static gint hf_r3_nvramchecksumvalue_fixup = -1;
312
313 static gint hf_r3_capabilities = -1;
314 static gint hf_r3_capabilities_length = -1;
315 static gint hf_r3_capabilities_type = -1;
316 static gint hf_r3_capabilities_value = -1;
317
318 static gint hf_r3_lockstate_passage = -1;
319 static gint hf_r3_lockstate_panic = -1;
320 static gint hf_r3_lockstate_lockout = -1;
321 static gint hf_r3_lockstate_relock = -1;
322 static gint hf_r3_lockstate_autoopen = -1;
323 static gint hf_r3_lockstate_nextauto = -1;
324 static gint hf_r3_lockstate_lockstate = -1;
325 static gint hf_r3_lockstate_wantstate = -1;
326 static gint hf_r3_lockstate_remote = -1;
327 static gint hf_r3_lockstate_update = -1;
328 static gint hf_r3_lockstate_exceptionspresent = -1;
329 static gint hf_r3_lockstate_exceptionsactive = -1;
330 static gint hf_r3_lockstate_timezonespresent = -1;
331 static gint hf_r3_lockstate_timezonesactive = -1;
332 static gint hf_r3_lockstate_autounlockspresent = -1;
333 static gint hf_r3_lockstate_autounlocksactive = -1;
334 static gint hf_r3_lockstate_uapmspresent = -1;
335 static gint hf_r3_lockstate_uapmsactive = -1;
336 static gint hf_r3_lockstate_uapmrelockspresent = -1;
337 static gint hf_r3_lockstate_uapmreslocksactive = -1;
338 static gint hf_r3_lockstate_nvramprotect = -1;
339 static gint hf_r3_lockstate_nvramchecksum = -1;
340
341 static gint hf_r3_mortisestatelog = -1;
342 static gint hf_r3_mortisestatelog_pointer = -1;
343 static gint hf_r3_mortisestatelog_mortisetype = -1;
344 static gint hf_r3_mortisestatelog_waiting = -1;
345 static gint hf_r3_mortisestatelog_state = -1;
346 static gint hf_r3_mortisestatelog_last = -1;
347 static gint hf_r3_mortisestatelog_event = -1;
348
349 static gint hf_r3_timerchain_newtick = -1;
350 static gint hf_r3_timerchain_currentboundary = -1;
351 static gint hf_r3_timerchain_tasktag = -1;
352 static gint hf_r3_timerchain_address = -1;
353 static gint hf_r3_timerchain_reload = -1;
354 static gint hf_r3_timerchain_boundary = -1;
355 static gint hf_r3_timerchain_count = -1;
356 static gint hf_r3_timerchain_flags = -1;
357
358 static gint hf_r3_taskflags_taskid = -1;
359 static gint hf_r3_taskflags_flags = -1;
360
361 static gint hf_r3_checkpointlog_entryptr = -1;
362 static gint hf_r3_checkpointlog_rcon = -1;
363 static gint hf_r3_checkpointlog_checkpoint = -1;
364
365 static gint hf_r3_cpuregisters_intcon = -1;
366 static gint hf_r3_cpuregisters_intcon2 = -1;
367 static gint hf_r3_cpuregisters_intcon3 = -1;
368 static gint hf_r3_cpuregisters_pir1 = -1;
369 static gint hf_r3_cpuregisters_pir2 = -1;
370 static gint hf_r3_cpuregisters_pir3 = -1;
371 static gint hf_r3_cpuregisters_pie1 = -1;
372 static gint hf_r3_cpuregisters_pie2 = -1;
373 static gint hf_r3_cpuregisters_pie3 = -1;
374 static gint hf_r3_cpuregisters_ipr1 = -1;
375 static gint hf_r3_cpuregisters_ipr2 = -1;
376 static gint hf_r3_cpuregisters_ipr3 = -1;
377 static gint hf_r3_cpuregisters_rcon = -1;
378 static gint hf_r3_cpuregisters_osccon = -1;
379 static gint hf_r3_cpuregisters_rcsta = -1;
380 static gint hf_r3_cpuregisters_txsta = -1;
381 static gint hf_r3_cpuregisters_rcsta2 = -1;
382 static gint hf_r3_cpuregisters_txsta2 = -1;
383 static gint hf_r3_cpuregisters_wdtcon = -1;
384
385 static gint hf_r3_cpuregisters_intcon_rbif = -1;
386 static gint hf_r3_cpuregisters_intcon_int0if = -1;
387 static gint hf_r3_cpuregisters_intcon_tmr0if = -1;
388 static gint hf_r3_cpuregisters_intcon_rbie = -1;
389 static gint hf_r3_cpuregisters_intcon_int0ie = -1;
390 static gint hf_r3_cpuregisters_intcon_tmr0ie = -1;
391 static gint hf_r3_cpuregisters_intcon_giel = -1;
392 static gint hf_r3_cpuregisters_intcon_gieh = -1;
393 static gint hf_r3_cpuregisters_intcon2_rbip = -1;
394 static gint hf_r3_cpuregisters_intcon2_int3ip = -1;
395 static gint hf_r3_cpuregisters_intcon2_tmr0ip = -1;
396 static gint hf_r3_cpuregisters_intcon2_intedg3 = -1;
397 static gint hf_r3_cpuregisters_intcon2_intedg2 = -1;
398 static gint hf_r3_cpuregisters_intcon2_intedg1 = -1;
399 static gint hf_r3_cpuregisters_intcon2_intedg0 = -1;
400 static gint hf_r3_cpuregisters_intcon2_rbpu = -1;
401 static gint hf_r3_cpuregisters_intcon3_int1if = -1;
402 static gint hf_r3_cpuregisters_intcon3_int2if = -1;
403 static gint hf_r3_cpuregisters_intcon3_int3if = -1;
404 static gint hf_r3_cpuregisters_intcon3_int1ie = -1;
405 static gint hf_r3_cpuregisters_intcon3_int2ie = -1;
406 static gint hf_r3_cpuregisters_intcon3_int3ie = -1;
407 static gint hf_r3_cpuregisters_intcon3_int1ip = -1;
408 static gint hf_r3_cpuregisters_intcon3_int2ip = -1;
409 static gint hf_r3_cpuregisters_pir1_tmr1if = -1;
410 static gint hf_r3_cpuregisters_pir1_tmr2if = -1;
411 static gint hf_r3_cpuregisters_pir1_ccp1if = -1;
412 static gint hf_r3_cpuregisters_pir1_ssp1if = -1;
413 static gint hf_r3_cpuregisters_pir1_tx1if = -1;
414 static gint hf_r3_cpuregisters_pir1_rc1if = -1;
415 static gint hf_r3_cpuregisters_pir1_adif = -1;
416 static gint hf_r3_cpuregisters_pir1_pspif = -1;
417 static gint hf_r3_cpuregisters_pir2_ccp2if = -1;
418 static gint hf_r3_cpuregisters_pir2_tmr3if = -1;
419 static gint hf_r3_cpuregisters_pir2_hlvdif = -1;
420 static gint hf_r3_cpuregisters_pir2_bcl1if = -1;
421 static gint hf_r3_cpuregisters_pir2_eeif = -1;
422 static gint hf_r3_cpuregisters_pir2_unused5 = -1;
423 static gint hf_r3_cpuregisters_pir2_cmif = -1;
424 static gint hf_r3_cpuregisters_pir2_oscfif = -1;
425 static gint hf_r3_cpuregisters_pir3_ccp3if = -1;
426 static gint hf_r3_cpuregisters_pir3_ccp4if = -1;
427 static gint hf_r3_cpuregisters_pir3_ccp5if = -1;
428 static gint hf_r3_cpuregisters_pir3_tmr4if = -1;
429 static gint hf_r3_cpuregisters_pir3_tx2if = -1;
430 static gint hf_r3_cpuregisters_pir3_rc2if = -1;
431 static gint hf_r3_cpuregisters_pir3_bcl2if = -1;
432 static gint hf_r3_cpuregisters_pir3_ssp2if = -1;
433 static gint hf_r3_cpuregisters_pie1_tmr1ie = -1;
434 static gint hf_r3_cpuregisters_pie1_tmr2ie = -1;
435 static gint hf_r3_cpuregisters_pie1_ccp1ie = -1;
436 static gint hf_r3_cpuregisters_pie1_ssp1ie = -1;
437 static gint hf_r3_cpuregisters_pie1_tx1ie = -1;
438 static gint hf_r3_cpuregisters_pie1_rc1ie = -1;
439 static gint hf_r3_cpuregisters_pie1_adie = -1;
440 static gint hf_r3_cpuregisters_pie1_pspie = -1;
441 static gint hf_r3_cpuregisters_pie2_oscfie = -1;
442 static gint hf_r3_cpuregisters_pie2_cmie = -1;
443 static gint hf_r3_cpuregisters_pie2_unused2 = -1;
444 static gint hf_r3_cpuregisters_pie2_eeie = -1;
445 static gint hf_r3_cpuregisters_pie2_bcl1ie = -1;
446 static gint hf_r3_cpuregisters_pie2_hlvdie = -1;
447 static gint hf_r3_cpuregisters_pie2_tmr3ie = -1;
448 static gint hf_r3_cpuregisters_pie2_ccp2ie = -1;
449 static gint hf_r3_cpuregisters_pie3_ccp3ie = -1;
450 static gint hf_r3_cpuregisters_pie3_ccp4ie = -1;
451 static gint hf_r3_cpuregisters_pie3_ccp5ie = -1;
452 static gint hf_r3_cpuregisters_pie3_tmr4ie = -1;
453 static gint hf_r3_cpuregisters_pie3_tx2ie = -1;
454 static gint hf_r3_cpuregisters_pie3_rc2ie = -1;
455 static gint hf_r3_cpuregisters_pie3_bcl2ie = -1;
456 static gint hf_r3_cpuregisters_pie3_ssp2ie = -1;
457 static gint hf_r3_cpuregisters_ipr1_tmr1ip = -1;
458 static gint hf_r3_cpuregisters_ipr1_tmr2ip = -1;
459 static gint hf_r3_cpuregisters_ipr1_ccp1ip = -1;
460 static gint hf_r3_cpuregisters_ipr1_ssp1ip = -1;
461 static gint hf_r3_cpuregisters_ipr1_tx1ip = -1;
462 static gint hf_r3_cpuregisters_ipr1_rc1ip = -1;
463 static gint hf_r3_cpuregisters_ipr1_adip = -1;
464 static gint hf_r3_cpuregisters_ipr1_pspip = -1;
465 static gint hf_r3_cpuregisters_ipr2_ccp2ip = -1;
466 static gint hf_r3_cpuregisters_ipr2_tmr3ip = -1;
467 static gint hf_r3_cpuregisters_ipr2_hlvdip = -1;
468 static gint hf_r3_cpuregisters_ipr2_bcl1ip = -1;
469 static gint hf_r3_cpuregisters_ipr2_eeip = -1;
470 static gint hf_r3_cpuregisters_ipr2_unused5 = -1;
471 static gint hf_r3_cpuregisters_ipr2_cmip = -1;
472 static gint hf_r3_cpuregisters_ipr2_oscfip = -1;
473 static gint hf_r3_cpuregisters_ipr3_ccp2ip = -1;
474 static gint hf_r3_cpuregisters_ipr3_ccp4ip = -1;
475 static gint hf_r3_cpuregisters_ipr3_ccp5ip = -1;
476 static gint hf_r3_cpuregisters_ipr3_tmr4ip = -1;
477 static gint hf_r3_cpuregisters_ipr3_tx2ip = -1;
478 static gint hf_r3_cpuregisters_ipr3_rc2ip = -1;
479 static gint hf_r3_cpuregisters_ipr3_bcl2ip = -1;
480 static gint hf_r3_cpuregisters_ipr3_ssp2ip = -1;
481 static gint hf_r3_cpuregisters_rcon_bor = -1;
482 static gint hf_r3_cpuregisters_rcon_por = -1;
483 static gint hf_r3_cpuregisters_rcon_pd = -1;
484 static gint hf_r3_cpuregisters_rcon_to = -1;
485 static gint hf_r3_cpuregisters_rcon_unused4 = -1;
486 static gint hf_r3_cpuregisters_rcon_ri = -1;
487 static gint hf_r3_cpuregisters_rcon_sboren = -1;
488 static gint hf_r3_cpuregisters_rcon_ipen = -1;
489 static gint hf_r3_cpuregisters_osccon_scs0 = -1;
490 static gint hf_r3_cpuregisters_osccon_scs1 = -1;
491 static gint hf_r3_cpuregisters_osccon_iofs = -1;
492 static gint hf_r3_cpuregisters_osccon_osts = -1;
493 static gint hf_r3_cpuregisters_osccon_ircf0 = -1;
494 static gint hf_r3_cpuregisters_osccon_ircf1 = -1;
495 static gint hf_r3_cpuregisters_osccon_ircf2 = -1;
496 static gint hf_r3_cpuregisters_osccon_idlen = -1;
497 static gint hf_r3_cpuregisters_rcsta_rx9d = -1;
498 static gint hf_r3_cpuregisters_rcsta_oerr = -1;
499 static gint hf_r3_cpuregisters_rcsta_ferr = -1;
500 static gint hf_r3_cpuregisters_rcsta_adden = -1;
501 static gint hf_r3_cpuregisters_rcsta_cren = -1;
502 static gint hf_r3_cpuregisters_rcsta_sren = -1;
503 static gint hf_r3_cpuregisters_rcsta_rx9 = -1;
504 static gint hf_r3_cpuregisters_rcsta_spen = -1;
505 static gint hf_r3_cpuregisters_txsta_tx9d = -1;
506 static gint hf_r3_cpuregisters_txsta_trmt = -1;
507 static gint hf_r3_cpuregisters_txsta_brgh = -1;
508 static gint hf_r3_cpuregisters_txsta_sendb = -1;
509 static gint hf_r3_cpuregisters_txsta_sync = -1;
510 static gint hf_r3_cpuregisters_txsta_txen = -1;
511 static gint hf_r3_cpuregisters_txsta_tx9 = -1;
512 static gint hf_r3_cpuregisters_txsta_csrc = -1;
513 static gint hf_r3_cpuregisters_rcsta2_rx9d = -1;
514 static gint hf_r3_cpuregisters_rcsta2_oerr = -1;
515 static gint hf_r3_cpuregisters_rcsta2_ferr = -1;
516 static gint hf_r3_cpuregisters_rcsta2_adden = -1;
517 static gint hf_r3_cpuregisters_rcsta2_cren = -1;
518 static gint hf_r3_cpuregisters_rcsta2_sren = -1;
519 static gint hf_r3_cpuregisters_rcsta2_rx9 = -1;
520 static gint hf_r3_cpuregisters_rcsta2_spen = -1;
521 static gint hf_r3_cpuregisters_txsta2_tx9d = -1;
522 static gint hf_r3_cpuregisters_txsta2_trmt = -1;
523 static gint hf_r3_cpuregisters_txsta2_brgh = -1;
524 static gint hf_r3_cpuregisters_txsta2_sendb = -1;
525 static gint hf_r3_cpuregisters_txsta2_sync = -1;
526 static gint hf_r3_cpuregisters_txsta2_txen = -1;
527 static gint hf_r3_cpuregisters_txsta2_tx9 = -1;
528 static gint hf_r3_cpuregisters_txsta2_csrc = -1;
529 static gint hf_r3_cpuregisters_wdtcon_swdten = -1;
530 static gint hf_r3_cpuregisters_wdtcon_unused1 = -1;
531 static gint hf_r3_cpuregisters_wdtcon_unused2 = -1;
532 static gint hf_r3_cpuregisters_wdtcon_unused3 = -1;
533 static gint hf_r3_cpuregisters_wdtcon_unused4 = -1;
534 static gint hf_r3_cpuregisters_wdtcon_unused5 = -1;
535 static gint hf_r3_cpuregisters_wdtcon_unused6 = -1;
536 static gint hf_r3_cpuregisters_wdtcon_unused7 = -1;
537
538 static gint hf_r3_dumpm41t81_reg00 = -1;
539 static gint hf_r3_dumpm41t81_reg01 = -1;
540 static gint hf_r3_dumpm41t81_reg02 = -1;
541 static gint hf_r3_dumpm41t81_reg03 = -1;
542 static gint hf_r3_dumpm41t81_reg04 = -1;
543 static gint hf_r3_dumpm41t81_reg05 = -1;
544 static gint hf_r3_dumpm41t81_reg06 = -1;
545 static gint hf_r3_dumpm41t81_reg07 = -1;
546 static gint hf_r3_dumpm41t81_reg08 = -1;
547 static gint hf_r3_dumpm41t81_reg09 = -1;
548 static gint hf_r3_dumpm41t81_reg0a = -1;
549 static gint hf_r3_dumpm41t81_reg0b = -1;
550 static gint hf_r3_dumpm41t81_reg0c = -1;
551 static gint hf_r3_dumpm41t81_reg0d = -1;
552 static gint hf_r3_dumpm41t81_reg0e = -1;
553 static gint hf_r3_dumpm41t81_reg0f = -1;
554 static gint hf_r3_dumpm41t81_reg10 = -1;
555 static gint hf_r3_dumpm41t81_reg11 = -1;
556 static gint hf_r3_dumpm41t81_reg12 = -1;
557 static gint hf_r3_dumpm41t81_reg13 = -1;
558
559 static gint hf_r3_dumpm41t81_reg00_sec1 = -1;
560 static gint hf_r3_dumpm41t81_reg00_sec01 = -1;
561 static gint hf_r3_dumpm41t81_reg01_st = -1;
562 static gint hf_r3_dumpm41t81_reg01_10sec = -1;
563 static gint hf_r3_dumpm41t81_reg01_1sec = -1;
564 static gint hf_r3_dumpm41t81_reg02_notused = -1;
565 static gint hf_r3_dumpm41t81_reg02_10min = -1;
566 static gint hf_r3_dumpm41t81_reg02_1min = -1;
567 static gint hf_r3_dumpm41t81_reg03_cbe = -1;
568 static gint hf_r3_dumpm41t81_reg03_cb = -1;
569 static gint hf_r3_dumpm41t81_reg03_10hour = -1;
570 static gint hf_r3_dumpm41t81_reg03_1hour = -1;
571 static gint hf_r3_dumpm41t81_reg04_notused = -1;
572 static gint hf_r3_dumpm41t81_reg04_dow = -1;
573 static gint hf_r3_dumpm41t81_reg05_notused = -1;
574 static gint hf_r3_dumpm41t81_reg05_10day = -1;
575 static gint hf_r3_dumpm41t81_reg05_1day = -1;
576 static gint hf_r3_dumpm41t81_reg06_notused = -1;
577 static gint hf_r3_dumpm41t81_reg06_10month = -1;
578 static gint hf_r3_dumpm41t81_reg06_1month = -1;
579 static gint hf_r3_dumpm41t81_reg07_10year = -1;
580 static gint hf_r3_dumpm41t81_reg07_1year = -1;
581 static gint hf_r3_dumpm41t81_reg08_out = -1;
582 static gint hf_r3_dumpm41t81_reg08_ft = -1;
583 static gint hf_r3_dumpm41t81_reg08_s = -1;
584 static gint hf_r3_dumpm41t81_reg08_cal = -1;
585 static gint hf_r3_dumpm41t81_reg09_notused = -1;
586 static gint hf_r3_dumpm41t81_reg09_bmb = -1;
587 static gint hf_r3_dumpm41t81_reg09_rb = -1;
588 static gint hf_r3_dumpm41t81_reg0a_afe = -1;
589 static gint hf_r3_dumpm41t81_reg0a_sqwe = -1;
590 static gint hf_r3_dumpm41t81_reg0a_abe = -1;
591 static gint hf_r3_dumpm41t81_reg0a_10monthalm = -1;
592 static gint hf_r3_dumpm41t81_reg0a_1monthalm = -1;
593 static gint hf_r3_dumpm41t81_reg0b_rpt5 = -1;
594 static gint hf_r3_dumpm41t81_reg0b_rpt4 = -1;
595 static gint hf_r3_dumpm41t81_reg0b_10dayalm = -1;
596 static gint hf_r3_dumpm41t81_reg0b_1dayalm = -1;
597 static gint hf_r3_dumpm41t81_reg0c_rpt3 = -1;
598 static gint hf_r3_dumpm41t81_reg0c_ht = -1;
599 static gint hf_r3_dumpm41t81_reg0c_10houralm = -1;
600 static gint hf_r3_dumpm41t81_reg0c_1houralm = -1;
601 static gint hf_r3_dumpm41t81_reg0d_rpt2 = -1;
602 static gint hf_r3_dumpm41t81_reg0d_10minalm = -1;
603 static gint hf_r3_dumpm41t81_reg0d_1minalm = -1;
604 static gint hf_r3_dumpm41t81_reg0e_rpt1 = -1;
605 static gint hf_r3_dumpm41t81_reg0e_10secalm = -1;
606 static gint hf_r3_dumpm41t81_reg0e_1secalm = -1;
607 static gint hf_r3_dumpm41t81_reg0f_wdf = -1;
608 static gint hf_r3_dumpm41t81_reg0f_af = -1;
609 static gint hf_r3_dumpm41t81_reg0f_notused = -1;
610 static gint hf_r3_dumpm41t81_reg10_notused = -1;
611 static gint hf_r3_dumpm41t81_reg11_notused = -1;
612 static gint hf_r3_dumpm41t81_reg12_notused = -1;
613 static gint hf_r3_dumpm41t81_reg13_rs = -1;
614 static gint hf_r3_dumpm41t81_reg13_notused = -1;
615
616 static gint hf_r3_debuglog_recordnumber = -1;
617 static gint hf_r3_debuglog_flags = -1;
618 static gint hf_r3_debuglog_tick = -1;
619
620 static gint hf_r3_adduserparamtype = -1;
621 static gint hf_r3_adduserparamtypelength = -1;
622 static gint hf_r3_adduserparamtypetype = -1;
623 static gint hf_r3_adduserparamtypedatalen = -1;
624 static gint hf_r3_adduserparamtypeerror = -1;
625 static gint hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_LAST];
626
627 /*
628  *  These control the expansion of proto_item_add_subtree() added items
629  */
630 static gint ett_r3 = -1;
631 static gint ett_r3header = -1;
632 static gint ett_r3tail = -1;
633 static gint ett_r3payload = -1;
634 static gint ett_r3cmd = -1;
635 static gint ett_r3configitem = -1;
636 static gint ett_r3upstreamcommand = -1;
637 static gint ett_r3upstreamfield = -1;
638 static gint ett_r3timezone = -1;
639 static gint ett_r3expireon = -1;
640 static gint ett_r3datetime = -1;
641 static gint ett_r3eventlogrecord = -1;
642 static gint ett_r3declinedlogrecord = -1;
643 static gint ett_r3alarmlogrecord = -1;
644 static gint ett_r3debugmsg = -1;
645 static gint ett_r3defineexceptionstartdate = -1;
646 static gint ett_r3defineexceptionenddate = -1;
647 static gint ett_r3defineexceptiongroupbits = -1;
648 static gint ett_r3definecalendarmonth [13] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
649 static gint ett_r3definetimezonestarttime = -1;
650 static gint ett_r3definetimezoneendtime = -1;
651 static gint ett_r3definetimezonedaymap = -1;
652 static gint ett_r3eventlogdumpstarttime = -1;
653 static gint ett_r3eventlogdumpendtime = -1;
654 static gint ett_r3declinedlogdumpstarttime = -1;
655 static gint ett_r3declinedlogdumpendtime = -1;
656 static gint ett_r3alarmlogdumpstarttime = -1;
657 static gint ett_r3alarmlogdumpendtime = -1;
658 static gint ett_r3clearnvram = -1;
659 static gint ett_r3filters = -1;
660 static gint ett_r3alarmlist = -1;
661 static gint ett_r3alarmcfg = -1;
662 static gint ett_r3commandmfg = -1;
663 static gint ett_r3serialnumber = -1;
664 static gint ett_r3iopins = -1;
665 static gint ett_r3checksumresults = -1;
666 static gint ett_r3checksumresultsfield = -1;
667 static gint ett_r3forceoptions = -1;
668 static gint ett_r3peekpoke = -1;
669 static gint ett_r3downloadfirmware = -1;
670 static gint ett_r3capabilities = -1;
671 static gint ett_r3lockstate = -1;
672 static gint ett_r3mortisestatelog = -1;
673 static gint ett_r3timerchain = -1;
674 static gint ett_r3taskflags = -1;
675 static gint ett_r3taskflagsentry = -1;
676 static gint ett_r3checkpointlog = -1;
677 static gint ett_r3checkpointlogentry = -1;
678 static gint ett_r3cpuregisters = -1;
679 static gint ett_r3cpuregister = -1;
680 static gint ett_r3m41t81registers = -1;
681 static gint ett_r3m41t81register = -1;
682 static gint ett_r3debuglogrecord = -1;
683 static gint ett_r3setdatetime = -1;
684 static gint ett_r3manageuser = -1;
685
686 /*
687  *  Setup protocol subtree array
688  */
689 static gint *ett [] =
690 {
691   &ett_r3,
692   &ett_r3header,
693   &ett_r3tail,
694   &ett_r3payload,
695   &ett_r3cmd,
696   &ett_r3configitem,
697   &ett_r3upstreamcommand,
698   &ett_r3upstreamfield,
699   &ett_r3timezone,
700   &ett_r3expireon,
701   &ett_r3datetime,
702   &ett_r3eventlogrecord,
703   &ett_r3declinedlogrecord,
704   &ett_r3alarmlogrecord,
705   &ett_r3debugmsg,
706   &ett_r3defineexceptionstartdate,
707   &ett_r3defineexceptionenddate,
708   &ett_r3defineexceptiongroupbits,
709   &ett_r3definecalendarmonth [1],
710   &ett_r3definecalendarmonth [2],
711   &ett_r3definecalendarmonth [3],
712   &ett_r3definecalendarmonth [4],
713   &ett_r3definecalendarmonth [5],
714   &ett_r3definecalendarmonth [6],
715   &ett_r3definecalendarmonth [7],
716   &ett_r3definecalendarmonth [8],
717   &ett_r3definecalendarmonth [9],
718   &ett_r3definecalendarmonth [10],
719   &ett_r3definecalendarmonth [11],
720   &ett_r3definecalendarmonth [12],
721   &ett_r3definetimezonestarttime,
722   &ett_r3definetimezoneendtime,
723   &ett_r3definetimezonedaymap,
724   &ett_r3eventlogdumpstarttime,
725   &ett_r3eventlogdumpendtime,
726   &ett_r3declinedlogdumpstarttime,
727   &ett_r3declinedlogdumpendtime,
728   &ett_r3alarmlogdumpstarttime,
729   &ett_r3alarmlogdumpendtime,
730   &ett_r3clearnvram,
731   &ett_r3filters,
732   &ett_r3alarmlist,
733   &ett_r3alarmcfg,
734   &ett_r3commandmfg,
735   &ett_r3serialnumber,
736   &ett_r3iopins,
737   &ett_r3checksumresults,
738   &ett_r3checksumresultsfield,
739   &ett_r3forceoptions,
740   &ett_r3peekpoke,
741   &ett_r3downloadfirmware,
742   &ett_r3capabilities,
743   &ett_r3lockstate,
744   &ett_r3mortisestatelog,
745   &ett_r3timerchain,
746   &ett_r3taskflags,
747   &ett_r3taskflagsentry,
748   &ett_r3checkpointlog,
749   &ett_r3checkpointlogentry,
750   &ett_r3cpuregisters,
751   &ett_r3cpuregister,
752   &ett_r3m41t81registers,
753   &ett_r3m41t81register,
754   &ett_r3debuglogrecord,
755   &ett_r3setdatetime,
756   &ett_r3manageuser
757 };
758
759 /*
760  *  Indicates next command to be processed as a manufacturing command
761  */
762 static gint mfgCommandFlag = FALSE;
763
764 /*
765  *  Some enums that don't exist in public.h and should
766  */
767 typedef enum
768 {
769   CHECKPOINT_NONE = 0,
770   CHECKPOINT_ADC,
771   CHECKPOINT_DPAC1,
772   CHECKPOINT_DPAC2,
773   CHECKPOINT_I2C1,
774   CHECKPOINT_I2C2,
775   CHECKPOINT_I2C3,
776   CHECKPOINT_I2C4,
777   CHECKPOINT_I2C5,
778   CHECKPOINT_I2C6,
779   CHECKPOINT_I2C7,
780   CHECKPOINT_I2C8,
781   CHECKPOINT_I2C9,
782   CHECKPOINT_I2C10,
783   CHECKPOINT_I2C11,
784   CHECKPOINT_I2C12,
785   CHECKPOINT_I2C13,
786   CHECKPOINT_I2C14,
787   CHECKPOINT_I2C15,
788   CHECKPOINT_I2C16,
789   CHECKPOINT_I2C17,
790   CHECKPOINT_I2C18,
791   CHECKPOINT_I2C19,
792   CHECKPOINT_I2C20,
793   CHECKPOINT_I2C21,
794   CHECKPOINT_I2C22,
795   CHECKPOINT_I2C23,
796   CHECKPOINT_I2C24,
797   CHECKPOINT_I2C25,
798   CHECKPOINT_I2C26,
799   CHECKPOINT_I2C27,
800   CHECKPOINT_I2C28,
801   CHECKPOINT_I2C29,
802   CHECKPOINT_I2C30,
803   CHECKPOINT_I2C31,
804   CHECKPOINT_I2C32,
805   CHECKPOINT_I2C33,
806   CHECKPOINT_I2C34,
807   CHECKPOINT_I2C35,
808   CHECKPOINT_I2C36,
809   CHECKPOINT_I2C37,
810   CHECKPOINT_I2C38,
811   CHECKPOINT_I2C39,
812   CHECKPOINT_I2C40,
813   CHECKPOINT_I2C41,
814   CHECKPOINT_I2C42,
815   CHECKPOINT_I2C43,
816   CHECKPOINT_I2C44,
817   CHECKPOINT_I2C45,
818   CHECKPOINT_NVRAM,
819   CHECKPOINT_SERIAL1,
820   CHECKPOINT_SERIAL2,
821   CHECKPOINT_SERIAL3,
822   CHECKPOINT_WANDERING,
823   CHECKPOINT_STRAYHPINT,
824   CHECKPOINT_STRAYLPINT,
825   CHECKPOINT_TESTWDT,
826   CHECKPOINT_DPACDEBUG,
827   CHECKPOINT_LAST
828 }
829 checkPoint_e;
830
831 typedef enum
832 {
833   CONFIGTYPE_NONE = 0,
834   CONFIGTYPE_BOOL,
835   CONFIGTYPE_8,
836   CONFIGTYPE_16,
837   CONFIGTYPE_32,
838   CONFIGTYPE_STRING,
839   CONFIGTYPE_LAST
840 }
841 configType_e;
842
843 typedef enum
844 {
845   DOWNLOADFIRMWARE_START = 0,
846   DOWNLOADFIRMWARE_DATA,
847   DOWNLOADFIRMWARE_COMPLETE,
848   DOWNLOADFIRMWARE_ABORT,
849   DOWNLOADFIRMWARE_RESET,
850   DOWNLOADFIRMWARE_LAST
851 }
852 downloadFirmware_e;
853
854 typedef enum
855 {
856   MORTISEEVENT_DX_THROWN = 0,
857   MORTISEEVENT_DX_RETRACTED,
858   MORTISEEVENT_LX_RETRACTED,
859   MORTISEEVENT_LX_EXTENDED,
860   MORTISEEVENT_AX_EXTENDED,
861   MORTISEEVENT_AX_RETRACTED,
862   MORTISEEVENT_RX_DEPRESSED,
863   MORTISEEVENT_RX_RELEASED,
864   MORTISEEVENT_PX_OPEN,
865   MORTISEEVENT_PX_CLOSED,
866   MORTISEEVENT_MX_UNLOCKED,
867   MORTISEEVENT_MX_LOCKED,
868   MORTISEEVENT_LAST,
869   MORTISEEVENT_IGNORE
870 }
871 mortiseEvent_e;
872
873 /*
874  *  Print things with nice textual names
875  */
876 static const value_string r3_accessmodenames [] =
877 {
878   { ACCESSMODE_NONE,            "ACCESMODE_NONE" },
879   { ACCESSMODE_PRIMARYONLY,     "ACCESSMODE_PRIMARYONLY" },
880   { ACCESSMODE_PRIMARYORAUX,    "ACCESSMODE_PRIMARYORAUX" },
881   { ACCESSMODE_PRIMARYANDAUX,   "ACCESSMODE_PRIMARYANDAUX" },
882   { ACCESSMODE_PRIMARYTHENAUX,  "ACCESSMODE_PRIMARYTHENAUX" },
883   { 0,                          NULL }
884 };
885 static value_string_ext r3_accessmodenames_ext = VALUE_STRING_EXT_INIT(r3_accessmodenames);
886
887 static const value_string r3_adduserparamtypenames [] =
888 {
889   { ADDUSERPARAMTYPE_DISPOSITION,      "ADDUSERPARAMTYPE_DISPOSITION" },
890   { ADDUSERPARAMTYPE_USERNO,           "ADDUSERPARAMTYPE_USERNO" },
891   { ADDUSERPARAMTYPE_ACCESSALWAYS,     "ADDUSERPARAMTYPE_ACCESSALWAYS" },
892   { ADDUSERPARAMTYPE_ACCESSMODE,       "ADDUSERPARAMTYPE_ACCESSMODE" },
893   { ADDUSERPARAMTYPE_CACHED,           "ADDUSERPARAMTYPE_CACHED" },
894   { ADDUSERPARAMTYPE_USERTYPE,         "ADDUSERPARAMTYPE_USERTYPE" },
895   { ADDUSERPARAMTYPE_PRIMARYFIELD,     "ADDUSERPARAMTYPE_PRIMARYFIELD" },
896   { ADDUSERPARAMTYPE_PRIMARYFIELDTYPE, "ADDUSERPARAMTYPE_PRIMARYFIELDTYPE" },
897   { ADDUSERPARAMTYPE_AUXFIELD,         "ADDUSERPARAMTYPE_AUXFIELD" },
898   { ADDUSERPARAMTYPE_AUXFIELDTYPE,     "ADDUSERPARAMTYPE_AUXFIELDTYPE" },
899   { ADDUSERPARAMTYPE_TIMEZONE,         "ADDUSERPARAMTYPE_TIMEZONE" },
900   { ADDUSERPARAMTYPE_EXPIREON,         "ADDUSERPARAMTYPE_EXPIREON" },
901   { ADDUSERPARAMTYPE_USECOUNT,         "ADDUSERPARAMTYPE_USECOUNT" },
902   { ADDUSERPARAMTYPE_EXCEPTIONGROUP,   "ADDUSERPARAMTYPE_EXCEPTIONGROUP" },
903   { 0,                                 NULL }
904 };
905 static value_string_ext r3_adduserparamtypenames_ext = VALUE_STRING_EXT_INIT(r3_adduserparamtypenames);
906
907 static const value_string r3_alarmidnames [] =
908 {
909   { ALARMID_NONE,         "ALARMID_NONE" },
910   { ALARMID_VALIDIN,      "ALARMID_VALIDIN" },
911   { ALARMID_DENIEDACCESS, "ALARMID_DENIEDACCESS" },
912   { ALARMID_SECURED,      "ALARMID_SECURED" },
913   { ALARMID_DOORFORCED,   "ALARMID_DOORFORCED" },
914   { ALARMID_KEYOVERRIDE,  "ALARMID_KEYOVERRIDE" },
915   { ALARMID_INVALIDENTRY, "ALARMID_INVALIDENTRY" },
916   { ALARMID_DOORAJAR,     "ALARMID_DOORAJAR" },
917   { ALARMID_LOWBATTERY,   "ALARMID_LOWBATTERY" },
918   { ALARMID_RXHELD,       "ALARMID_RXHELD" },
919   { 0,                    NULL }
920 };
921 static value_string_ext r3_alarmidnames_ext = VALUE_STRING_EXT_INIT(r3_alarmidnames);
922
923 static const value_string r3_capabilitiesnames [] =
924 {
925   { CAPABILITIES_USERS,           "CAPABILITIES_USERS" },
926   { CAPABILITIES_TIMEZONES,       "CAPABILITIES_TIMEZONES" },
927   { CAPABILITIES_EXCEPTIONS,      "CAPABILITIES_EXCEPTIONS" },
928   { CAPABILITIES_EXCEPTIONGROUPS, "CAPABILITIES_EXCEPTIONGROUPS" },
929   { CAPABILITIES_EVENTLOG,        "CAPABILITIES_EVENTLOG" },
930   { CAPABILITIES_DECLINEDLOG,     "CAPABILITIES_DECLINEDLOG" },
931   { CAPABILITIES_ALARMLOG,        "CAPABILITIES_ALARMLOG" },
932   { CAPABILITIES_TOTALEVENTS,     "CAPABILITIES_TOTALEVENTS" },
933   { 0,                            NULL }
934 };
935 static value_string_ext r3_capabilitiesnames_ext = VALUE_STRING_EXT_INIT(r3_capabilitiesnames);
936
937 static const value_string r3_checkpointnames [] =
938 {
939   { CHECKPOINT_NONE,       "CHECKPOINT_NONE" },
940   { CHECKPOINT_ADC,        "CHECKPOINT_ADC" },
941   { CHECKPOINT_DPAC1,      "CHECKPOINT_DPAC1" },
942   { CHECKPOINT_DPAC2,      "CHECKPOINT_DPAC2" },
943   { CHECKPOINT_I2C1,       "CHECKPOINT_I2C1" },
944   { CHECKPOINT_I2C2,       "CHECKPOINT_I2C2" },
945   { CHECKPOINT_I2C3,       "CHECKPOINT_I2C3" },
946   { CHECKPOINT_I2C4,       "CHECKPOINT_I2C4" },
947   { CHECKPOINT_I2C5,       "CHECKPOINT_I2C5" },
948   { CHECKPOINT_I2C6,       "CHECKPOINT_I2C6" },
949   { CHECKPOINT_I2C7,       "CHECKPOINT_I2C7" },
950   { CHECKPOINT_I2C8,       "CHECKPOINT_I2C8" },
951   { CHECKPOINT_I2C9,       "CHECKPOINT_I2C9" },
952   { CHECKPOINT_I2C10,      "CHECKPOINT_I2C10" },
953   { CHECKPOINT_I2C11,      "CHECKPOINT_I2C11" },
954   { CHECKPOINT_I2C12,      "CHECKPOINT_I2C12" },
955   { CHECKPOINT_I2C13,      "CHECKPOINT_I2C13" },
956   { CHECKPOINT_I2C14,      "CHECKPOINT_I2C14" },
957   { CHECKPOINT_I2C15,      "CHECKPOINT_I2C15" },
958   { CHECKPOINT_I2C16,      "CHECKPOINT_I2C16" },
959   { CHECKPOINT_I2C17,      "CHECKPOINT_I2C17" },
960   { CHECKPOINT_I2C18,      "CHECKPOINT_I2C18" },
961   { CHECKPOINT_I2C19,      "CHECKPOINT_I2C19" },
962   { CHECKPOINT_I2C20,      "CHECKPOINT_I2C20" },
963   { CHECKPOINT_I2C21,      "CHECKPOINT_I2C21" },
964   { CHECKPOINT_I2C22,      "CHECKPOINT_I2C22" },
965   { CHECKPOINT_I2C23,      "CHECKPOINT_I2C23" },
966   { CHECKPOINT_I2C24,      "CHECKPOINT_I2C24" },
967   { CHECKPOINT_I2C25,      "CHECKPOINT_I2C25" },
968   { CHECKPOINT_I2C26,      "CHECKPOINT_I2C26" },
969   { CHECKPOINT_I2C27,      "CHECKPOINT_I2C27" },
970   { CHECKPOINT_I2C28,      "CHECKPOINT_I2C28" },
971   { CHECKPOINT_I2C29,      "CHECKPOINT_I2C29" },
972   { CHECKPOINT_I2C30,      "CHECKPOINT_I2C30" },
973   { CHECKPOINT_I2C31,      "CHECKPOINT_I2C31" },
974   { CHECKPOINT_I2C32,      "CHECKPOINT_I2C32" },
975   { CHECKPOINT_I2C33,      "CHECKPOINT_I2C33" },
976   { CHECKPOINT_I2C34,      "CHECKPOINT_I2C34" },
977   { CHECKPOINT_I2C35,      "CHECKPOINT_I2C35" },
978   { CHECKPOINT_I2C36,      "CHECKPOINT_I2C36" },
979   { CHECKPOINT_I2C37,      "CHECKPOINT_I2C37" },
980   { CHECKPOINT_I2C38,      "CHECKPOINT_I2C38" },
981   { CHECKPOINT_I2C39,      "CHECKPOINT_I2C39" },
982   { CHECKPOINT_I2C40,      "CHECKPOINT_I2C40" },
983   { CHECKPOINT_I2C41,      "CHECKPOINT_I2C41" },
984   { CHECKPOINT_I2C42,      "CHECKPOINT_I2C42" },
985   { CHECKPOINT_I2C43,      "CHECKPOINT_I2C43" },
986   { CHECKPOINT_I2C44,      "CHECKPOINT_I2C44" },
987   { CHECKPOINT_I2C45,      "CHECKPOINT_I2C45" },
988   { CHECKPOINT_NVRAM,      "CHECKPOINT_NVRAM" },
989   { CHECKPOINT_SERIAL1,    "CHECKPOINT_SERIAL1" },
990   { CHECKPOINT_SERIAL2,    "CHECKPOINT_SERIAL2" },
991   { CHECKPOINT_SERIAL3,    "CHECKPOINT_SERIAL3" },
992   { CHECKPOINT_WANDERING,  "CHECKPOINT_WANDERING" },
993   { CHECKPOINT_STRAYHPINT, "CHECKPOINT_STRAYHPINT" },
994   { CHECKPOINT_STRAYLPINT, "CHECKPOINT_STRAYLPINT" },
995   { CHECKPOINT_TESTWDT,    "CHECKPOINT_TESTWDT" },
996   { CHECKPOINT_DPACDEBUG,  "CHECKPOINT_DPACDEBUG" },
997   { 0,                     NULL }
998 };
999 static value_string_ext r3_checkpointnames_ext = VALUE_STRING_EXT_INIT(r3_checkpointnames);
1000
1001 static const value_string r3_checksumresultnames [] =
1002 {
1003   { CHECKSUMRESULT_CONFIGURATIONNVRAM,  "CHECKSUMRESULT_CONFIGURATIONNVRAM" },
1004   { CHECKSUMRESULT_EXCEPTIONS,          "CHECKSUMRESULT_EXCEPTIONS" },
1005   { CHECKSUMRESULT_EXCEPTIONGROUPS,     "CHECKSUMRESULT_EXCEPTIONGROUPS" },
1006   { CHECKSUMRESULT_TZCALENDARS,         "CHECKSUMRESULT_TZCALENDARS" },
1007   { CHECKSUMRESULT_TIMEZONES,           "CHECKSUMRESULT_TIMEZONES" },
1008   { CHECKSUMRESULT_USERS,               "CHECKSUMRESULT_USERS" },
1009   { CHECKSUMRESULT_CACHELRU,            "CHECKSUMRESULT_CACHELRU" },
1010   { 0,                                  NULL }
1011 };
1012 static value_string_ext r3_checksumresultnames_ext = VALUE_STRING_EXT_INIT(r3_checksumresultnames);
1013
1014 static const value_string r3_cmdnames [] =
1015 {
1016   { CMD_RESPONSE,                  "CMD_RESPONSE" },
1017   { CMD_HANDSHAKE,                 "CMD_HANDSHAKE" },
1018   { CMD_KILLSESSION,               "CMD_KILLSESSION" },
1019   { CMD_QUERYSERIALNUMBER,         "CMD_QUERYSERIALNUMBER" },
1020   { CMD_QUERYVERSION,              "CMD_QUERYVERSION" },
1021   { CMD_SETDATETIME,               "CMD_SETDATETIME" },
1022   { CMD_QUERYDATETIME,             "CMD_QUERYDATETIME" },
1023   { CMD_SETCONFIG,                 "CMD_SETCONFIG" },
1024   { CMD_GETCONFIG,                 "CMD_GETCONFIG" },
1025   { CMD_MANAGEUSER,                "CMD_MANAGEUSER" },
1026   { CMD_DELETEUSERS,               "CMD_DELETEUSERS" },
1027   { CMD_DEFINEEXCEPTION,           "CMD_DEFINEEXCEPTION" },
1028   { CMD_DEFINEEXCEPTIONGROUP,      "CMD_DEFINEEXCEPTIONGROUP" },
1029   { CMD_DEFINECALENDAR,            "CMD_DEFINECALENDAR" },
1030   { CMD_DEFINETIMEZONE,            "CMD_DEFINETIMEZONE" },
1031   { CMD_RMTAUTHRETRY,              "CMD_RMTAUTHRETRY" },
1032   { CMD_FILTERS,                   "CMD_FILTERS" },
1033   { CMD_ALARMCONFIGURE,            "CMD_ALARMCONFIGURE" },
1034   { CMD_EVENTLOGDUMP,              "CMD_EVENTLOGDUMP" },
1035   { CMD_DECLINEDLOGDUMP,           "CMD_DECLINEDLOGDUMP" },
1036   { CMD_ALARMLOGDUMP,              "CMD_ALARMLOGDUMP" },
1037   { CMD_DOWNLOADFIRMWARE,          "CMD_DOWNLOADFIRMWARE" },
1038   { CMD_DOWNLOADFIRMWARETIMEOUT,   "CMD_DOWNLOADFIRMWARETIMEOUT" },
1039   { CMD_POWERTABLESELECTION,       "CMD_POWERTABLESELECTION" },
1040   { CMD_CLEARNVRAM,                "CMD_CLEARNVRAM" },
1041   { CMD_DPAC,                      "CMD_DPAC" },
1042   { CMD_SELFTEST,                  "CMD_SELFTEST" },
1043   { CMD_RESET,                     "CMD_RESET" },
1044   { CMD_LOGWRITE,                  "CMD_LOGWRITE" },
1045   { CMD_MFGCOMMAND,                "CMD_MFGCOMMAND" },
1046   { CMD_NVRAMBACKUP,               "CMD_NVRAMBACKUP" },
1047   { CMD_EXTENDEDRESPONSE,          "CMD_EXTENDEDRESPONSE" },
1048   { 0,                             NULL }
1049 };
1050 static value_string_ext r3_cmdnames_ext = VALUE_STRING_EXT_INIT(r3_cmdnames);
1051
1052 static const value_string r3_cmdmfgnames [] =
1053 {
1054   { CMDMFG_SETSERIALNUMBER,       "CMDMFG_SETSERIALNUMBER" },
1055   { CMDMFG_SETCRYPTKEY,           "CMDMFG_SETCRYPTKEY" },
1056   { CMDMFG_DUMPNVRAM,             "CMDMFG_DUMPNVRAM" },
1057   { CMDMFG_TERMINAL,              "CMDMFG_TERMINAL" },
1058   { CMDMFG_REMOTEUNLOCK,          "CMDMFG_REMOTEUNLOCK" },
1059   { CMDMFG_AUXCTLRVERSION,        "CMDMFG_AUXCTLRVERSION" },
1060   { CMDMFG_IOPINS,                "CMDMFG_IOPINS" },
1061   { CMDMFG_ADCS,                  "CMDMFG_ADCS" },
1062   { CMDMFG_HARDWAREID,            "CMDMFG_HARDWAREID" },
1063   { CMDMFG_CHECKPOINTLOGDUMP,     "CMDMFG_CHECKPOINTLOGDUMP" },
1064   { CMDMFG_CHECKPOINTLOGCLEAR,    "CMDMFG_CHECKPOINTLOGCLEAR" },
1065   { CMDMFG_READREGISTERS,         "CMDMFG_READREGISTERS" },
1066   { CMDMFG_FORCEOPTIONS,          "CMDMFG_FORCEOPTIONS" },
1067   { CMDMFG_COMMUSER,              "CMDMFG_COMMUSER" },
1068   { CMDMFG_DUMPKEYPAD,            "CMDMFG_DUMPKEYPAD" },
1069   { CMDMFG_BATTERYCHECK,          "CMDMFG_BATTERYCHECK" },
1070   { CMDMFG_RAMREFRESH,            "CMDMFG_RAMREFRESH" },
1071   { CMDMFG_TASKFLAGS,             "CMDMFG_TASKFLAGS" },
1072   { CMDMFG_TIMERCHAIN,            "CMDMFG_TIMERCHAIN" },
1073   { CMDMFG_PEEKPOKE,              "CMDMFG_PEEKPOKE" },
1074   { CMDMFG_LOCKSTATE,             "CMDMFG_LOCKSTATE" },
1075   { CMDMFG_CAPABILITIES,          "CMDMFG_CAPABILITIES" },
1076   { CMDMFG_DUMPM41T81,            "CMDMFG_DUMPM41T81" },
1077   { CMDMFG_DEBUGLOGDUMP,          "CMDMFG_DEBUGLOGDUMP" },
1078   { CMDMFG_DEBUGLOGCLEAR,         "CMDMFG_DEBUGLOGCLEAR" },
1079   { CMDMFG_TESTWDT,               "CMDMFG_TESTWDT" },
1080   { CMDMFG_QUERYCKSUM,            "CMDMFG_QUERYCKSUM" },
1081   { CMDMFG_VALIDATECHECKSUMS,     "CMDMFG_VALIDATECHECKSUMS" },
1082   { CMDMFG_REBUILDLRUCACHE,       "CMDMFG_REBUILDLRUCACHE" },
1083   { CMDMFG_TZUPDATE,              "CMDMFG_TZUPDATE" },
1084   { CMDMFG_TESTPRESERVE,          "CMDMFG_TESTPRESERVE" },
1085   { CMDMFG_MORTISESTATELOGDUMP,   "CMDMFG_MORTISESTATELOGDUMP" },
1086   { CMDMFG_MORTISESTATELOGCLEAR,  "CMDMFG_MORTISESTATELOGCLEAR" },
1087   { CMDMFG_MORTISEPINS,           "CMDMFG_MORTISEPINS" },
1088   { CMDMFG_HALTANDCATCHFIRE,      "CMDMFG_HALTANDCATCHFIRE" },
1089   { 0,                            NULL }
1090 };
1091 static value_string_ext r3_cmdmfgnames_ext = VALUE_STRING_EXT_INIT(r3_cmdmfgnames);
1092
1093 static const value_string r3_configitemnames [] =
1094 {
1095   { CONFIGITEM_SERIAL_NUMBER,               "CONFIGITEM_SERIAL_NUMBER" },
1096   { CONFIGITEM_CRYPT_KEY,                   "CONFIGITEM_CRYPT_KEY" },
1097   { CONFIGITEM_HARDWARE_OPTIONS_MFG,        "CONFIGITEM_HARDWARE_OPTIONS_MFG" },
1098   { CONFIGITEM_HARDWARE_OPTIONS,            "CONFIGITEM_HARDWARE_OPTIONS" },
1099   { CONFIGITEM_NVRAM_CHANGES,               "CONFIGITEM_NVRAM_CHANGES" },
1100   { CONFIGITEM_NVRAMDIRTY,                  "CONFIGITEM_NVRAMDIRTY" },
1101   { CONFIGITEM_NVRAM_WV,                    "CONFIGITEM_NVRAM_WV" },
1102   { CONFIGITEM_ENABLE_WDT,                  "CONFIGITEM_ENABLE_WDT" },
1103   { CONFIGITEM_EARLY_ACK,                   "CONFIGITEM_EARLY_ACK" },
1104   { CONFIGITEM_CONSOLE_AES_ONLY,            "CONFIGITEM_CONSOLE_AES_ONLY" },
1105   { CONFIGITEM_RADIO_AES_ONLY,              "CONFIGITEM_RADIO_AES_ONLY" },
1106   { CONFIGITEM_NDRLE,                       "CONFIGITEM_NDRLE" },
1107   { CONFIGITEM_SOMF,                        "CONFIGITEM_SOMF" },
1108   { CONFIGITEM_NOGAF,                       "CONFIGITEM_NOGAF" },
1109   { CONFIGITEM_CARD_READER_POWER,           "CONFIGITEM_CARD_READER_POWER" },
1110   { CONFIGITEM_PROX_ENABLE,                 "CONFIGITEM_PROX_ENABLE" },
1111   { CONFIGITEM_CKSUMCONFIG,                 "CONFIGITEM_CKSUMCONFIG" },
1112   { CONFIGITEM_DAILY_BATTERY_CHECK,         "CONFIGITEM_DAILY_BATTERY_CHECK" },
1113   { CONFIGITEM_DAILY_BATTERY_CHECK_HOUR,    "CONFIGITEM_DAILY_BATTERY_CHECK_HOUR" },
1114   { CONFIGITEM_BATTERY_LOW,                 "CONFIGITEM_BATTERY_LOW" },
1115   { CONFIGITEM_LRU_HEAD,                    "CONFIGITEM_LRU_HEAD" },
1116   { CONFIGITEM_LRU_TAIL,                    "CONFIGITEM_LRU_TAIL" },
1117   { CONFIGITEM_RTC_CALIBRATION,             "CONFIGITEM_RTC_CALIBRATION" },
1118   { CONFIGITEM_ACVREQUESTER,                "CONFIGITEM_ACVREQUESTER" },
1119   { CONFIGITEM_LOCAL_LED,                   "CONFIGITEM_LOCAL_LED" },
1120   { CONFIGITEM_ERRCNT_XORLEN,               "CONFIGITEM_ERRCNT_XORLEN" },
1121   { CONFIGITEM_ERRCNT_CRC,                  "CONFIGITEM_ERRCNT_CRC" },
1122   { CONFIGITEM_ERRCNT_NOTSIGIL,             "CONFIGITEM_ERRCNT_NOTSIGIL" },
1123   { CONFIGITEM_ERRCNT_TIMEOUT,              "CONFIGITEM_ERRCNT_TIMEOUT" },
1124   { CONFIGITEM_ERRCNT_TOOLONG,              "CONFIGITEM_ERRCNT_TOOLONG" },
1125   { CONFIGITEM_ERRCNT_TOOSHORT,             "CONFIGITEM_ERRCNT_TOOSHORT" },
1126   { CONFIGITEM_ERRCNT_HITDEFAULT,           "CONFIGITEM_ERRCNT_HITDEFAULT" },
1127   { CONFIGITEM_ERRCNT_OVERRUN,              "CONFIGITEM_ERRCNT_OVERRUN" },
1128   { CONFIGITEM_ERRCNT_UARTFE,               "CONFIGITEM_ERRCNT_UARTFE" },
1129   { CONFIGITEM_ERRCNT_UARTOE,               "CONFIGITEM_ERRCNT_UARTOE" },
1130   { CONFIGITEM_DST_SET,                     "CONFIGITEM_DST_SET" },
1131   { CONFIGITEM_DST_MODE,                    "CONFIGITEM_DST_MODE" },
1132   { CONFIGITEM_DST_FORWARD_MONTH,           "CONFIGITEM_DST_FORWARD_MONTH" },
1133   { CONFIGITEM_DST_FORWARD_DOM,             "CONFIGITEM_DST_FORWARD_DOM" },
1134   { CONFIGITEM_DST_FORWARD_OOD,             "CONFIGITEM_DST_FORWARD_OOD" },
1135   { CONFIGITEM_DST_FORWARD_DOW,             "CONFIGITEM_DST_FORWARD_DOW" },
1136   { CONFIGITEM_DST_FORWARD_HOUR,            "CONFIGITEM_DST_FORWARD_HOUR" },
1137   { CONFIGITEM_DST_FORWARD_MINUTE,          "CONFIGITEM_DST_FORWARD_MINUTE" },
1138   { CONFIGITEM_DST_FORWARD_ADJUST,          "CONFIGITEM_DST_FORWARD_ADJUST" },
1139   { CONFIGITEM_DST_BACK_MONTH,              "CONFIGITEM_DST_BACK_MONTH" },
1140   { CONFIGITEM_DST_BACK_DOM,                "CONFIGITEM_DST_BACK_DOM" },
1141   { CONFIGITEM_DST_BACK_OOD,                "CONFIGITEM_DST_BACK_OOD" },
1142   { CONFIGITEM_DST_BACK_DOW,                "CONFIGITEM_DST_BACK_DOW" },
1143   { CONFIGITEM_DST_BACK_HOUR,               "CONFIGITEM_DST_BACK_HOUR" },
1144   { CONFIGITEM_DST_BACK_MINUTE,             "CONFIGITEM_DST_BACK_MINUTE" },
1145   { CONFIGITEM_DST_BACK_ADJUST,             "CONFIGITEM_DST_BACK_ADJUST" },
1146   { CONFIGITEM_EVENTLOG_ZEROMEM,            "CONFIGITEM_EVENTLOG_ZEROMEM" },
1147   { CONFIGITEM_EVENTLOG_BEGIN,              "CONFIGITEM_EVENTLOG_BEGIN" },
1148   { CONFIGITEM_EVENTLOG_RECORD,             "CONFIGITEM_EVENTLOG_RECORD" },
1149   { CONFIGITEM_EVENTLOG_ENTRIES,            "CONFIGITEM_EVENTLOG_ENTRIES" },
1150   { CONFIGITEM_EVENTLOG_WARNDEVICE,         "CONFIGITEM_EVENTLOG_WARNDEVICE" },
1151   { CONFIGITEM_EVENTLOG_WARNEVERY,          "CONFIGITEM_EVENTLOG_WARNEVERY" },
1152   { CONFIGITEM_EVENTLOG_RMTDEVICE,          "CONFIGITEM_EVENTLOG_RMTDEVICE" },
1153   { CONFIGITEM_DECLINEDLOG_ZEROMEM,         "CONFIGITEM_DECLINEDLOG_ZEROMEM" },
1154   { CONFIGITEM_DECLINEDLOG_BEGIN,           "CONFIGITEM_DECLINEDLOG_BEGIN" },
1155   { CONFIGITEM_DECLINEDLOG_RECORD,          "CONFIGITEM_DECLINEDLOG_RECORD" },
1156   { CONFIGITEM_DECLINEDLOG_ENTRIES,         "CONFIGITEM_DECLINEDLOG_ENTRIES" },
1157   { CONFIGITEM_DECLINEDLOG_WARNDEVICE,      "CONFIGITEM_DECLINEDLOG_WARNDEVICE" },
1158   { CONFIGITEM_DECLINEDLOG_WARNEVERY,       "CONFIGITEM_DECLINEDLOG_WARNEVERY" },
1159   { CONFIGITEM_DECLINEDLOG_RMTDEVICE,       "CONFIGITEM_DECLINEDLOG_RMTDEVICE" },
1160   { CONFIGITEM_ALARMLOG_ZEROMEM,            "CONFIGITEM_ALARMLOG_ZEROMEM" },
1161   { CONFIGITEM_ALARMLOG_BEGIN,              "CONFIGITEM_ALARMLOG_BEGIN" },
1162   { CONFIGITEM_ALARMLOG_RECORD,             "CONFIGITEM_ALARMLOG_RECORD" },
1163   { CONFIGITEM_ALARMLOG_ENTRIES,            "CONFIGITEM_ALARMLOG_ENTRIES" },
1164   { CONFIGITEM_ALARMLOG_WARNDEVICE,         "CONFIGITEM_ALARMLOG_WARNDEVICE" },
1165   { CONFIGITEM_ALARMLOG_WARNEVERY,          "CONFIGITEM_ALARMLOG_WARNEVERY" },
1166   { CONFIGITEM_ALARMLOG_RMTDEVICE,          "CONFIGITEM_ALARMLOG_RMTDEVICE" },
1167   { CONFIGITEM_VISIBLE_FEEDBACK,            "CONFIGITEM_VISIBLE_FEEDBACK" },
1168   { CONFIGITEM_AUDIBLE_FEEDBACK,            "CONFIGITEM_AUDIBLE_FEEDBACK" },
1169   { CONFIGITEM_VISIBLE_INDICATORS,          "CONFIGITEM_VISIBLE_INDICATORS" },
1170   { CONFIGITEM_AUDIBLE_INDICATORS,          "CONFIGITEM_AUDIBLE_INDICATORS" },
1171   { CONFIGITEM_2NDPINDURATION,              "CONFIGITEM_2NDPINDURATION" },
1172   { CONFIGITEM_LOCKOUT_ATTEMPTS,            "CONFIGITEM_LOCKOUT_ATTEMPTS" },
1173   { CONFIGITEM_LOCKOUT_DURATION,            "CONFIGITEM_LOCKOUT_DURATION" },
1174   { CONFIGITEM_KEYPAD_INACTIVITY,           "CONFIGITEM_KEYPAD_INACTIVITY" },
1175   { CONFIGITEM_ICIDLE_DURATION,             "CONFIGITEM_ICIDLE_DURATION" },
1176   { CONFIGITEM_WRITE_DECLINED_LOG,          "CONFIGITEM_WRITE_DECLINED_LOG" },
1177   { CONFIGITEM_LOW_BATTERY_INDICATOR,       "CONFIGITEM_LOW_BATTERY_INDICATOR" },
1178   { CONFIGITEM_PANIC_MODE,                  "CONFIGITEM_PANIC_MODE" },
1179   { CONFIGITEM_TIMEZONE_ENABLE,             "CONFIGITEM_TIMEZONE_ENABLE" },
1180   { CONFIGITEM_EXCEPTION_ENABLE,            "CONFIGITEM_EXCEPTION_ENABLE" },
1181   { CONFIGITEM_AUTOUNLOCK_ENABLE,           "CONFIGITEM_AUTOUNLOCK_ENABLE" },
1182   { CONFIGITEM_LOCK_PRIORITY_EMERGENCY,     "CONFIGITEM_LOCK_PRIORITY_EMERGENCY" },
1183   { CONFIGITEM_LOCK_PRIORITY_SUPERVISOR,    "CONFIGITEM_LOCK_PRIORITY_SUPERVISOR" },
1184   { CONFIGITEM_LOCK_PRIORITY_USER,          "CONFIGITEM_LOCK_PRIORITY_USER" },
1185   { CONFIGITEM_LOCK_PRIORITY_PASSAGE,       "CONFIGITEM_LOCK_PRIORITY_PASSAGE" },
1186   { CONFIGITEM_LOCK_PRIORITY_PANIC,         "CONFIGITEM_LOCK_PRIORITY_PANIC" },
1187   { CONFIGITEM_LOCK_PRIORITY_LOCKOUT,       "CONFIGITEM_LOCK_PRIORITY_LOCKOUT" },
1188   { CONFIGITEM_LOCK_PRIORITY_RELOCK,        "CONFIGITEM_LOCK_PRIORITY_RELOCK" },
1189   { CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN,    "CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN" },
1190   { CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE,  "CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE" },
1191   { CONFIGITEM_LOCK_PRIORITY_REMOTE,        "CONFIGITEM_LOCK_PRIORITY_REMOTE" },
1192   { CONFIGITEM_LOCK_TYPE,                   "CONFIGITEM_LOCK_TYPE" },
1193   { CONFIGITEM_DOUBLE_PULSE,                "CONFIGITEM_DOUBLE_PULSE" },
1194   { CONFIGITEM_DOUBLE_DELAY,                "CONFIGITEM_DOUBLE_DELAY" },
1195   { CONFIGITEM_MOTOR_DURATION,              "CONFIGITEM_MOTOR_DURATION" },
1196   { CONFIGITEM_MORTISE_TYPE,                "CONFIGITEM_MORTISE_TYPE" },
1197   { CONFIGITEM_UNLOCK_TIME,                 "CONFIGITEM_UNLOCK_TIME" },
1198   { CONFIGITEM_EXT_UNLOCK_TIME,             "CONFIGITEM_EXT_UNLOCK_TIME" },
1199   { CONFIGITEM_DOOR_AJAR_TIME,              "CONFIGITEM_DOOR_AJAR_TIME" },
1200   { CONFIGITEM_SESSION_TIMEOUT,             "CONFIGITEM_SESSION_TIMEOUT" },
1201   { CONFIGITEM_RETRY_ON_TIMEOUT,            "CONFIGITEM_RETRY_ON_TIMEOUT" },
1202   { CONFIGITEM_UNSOLICITED_ENCRYPT,         "CONFIGITEM_UNSOLICITED_ENCRYPT" },
1203   { CONFIGITEM_RMT_AUTH_TIMEOUT,            "CONFIGITEM_RMT_AUTH_TIMEOUT" },
1204   { CONFIGITEM_RMT_AUTH_DEVICE,             "CONFIGITEM_RMT_AUTH_DEVICE" },
1205   { CONFIGITEM_ALARM_DEVICE,                "CONFIGITEM_ALARM_DEVICE" },
1206   { CONFIGITEM_NOTIFY_DEVICE,               "CONFIGITEM_NOTIFY_DEVICE" },
1207   { CONFIGITEM_COMMUSER_DEVICE,             "CONFIGITEM_COMMUSER_DEVICE" },
1208   { CONFIGITEM_SCHEDULER_DEVICE,            "CONFIGITEM_SCHEDULER_DEVICE" },
1209   { CONFIGITEM_SCHEDULER_TYPE,              "CONFIGITEM_SCHEDULER_TYPE" },
1210   { CONFIGITEM_SCHEDULER_AWAKE,             "CONFIGITEM_SCHEDULER_AWAKE" },
1211   { CONFIGITEM_SCHEDULER_PERIOD,            "CONFIGITEM_SCHEDULER_PERIOD" },
1212   { CONFIGITEM_SCHEDULER_HOD,               "CONFIGITEM_SCHEDULER_HOD" },
1213   { CONFIGITEM_SCHEDULER_DOW,               "CONFIGITEM_SCHEDULER_DOW" },
1214   { CONFIGITEM_SCHEDULER_DOM,               "CONFIGITEM_SCHEDULER_DOM" },
1215   { CONFIGITEM_SCHEDULER_HM1,               "CONFIGITEM_SCHEDULER_HM1" },
1216   { CONFIGITEM_SCHEDULER_HM2,               "CONFIGITEM_SCHEDULER_HM2" },
1217   { CONFIGITEM_SCHEDULER_HM3,               "CONFIGITEM_SCHEDULER_HM3" },
1218   { CONFIGITEM_SCHEDULER_HM4,               "CONFIGITEM_SCHEDULER_HM4" },
1219   { CONFIGITEM_RADIO_TYPE,                  "CONFIGITEM_RADIO_TYPE" },
1220   { CONFIGITEM_RADIO_MODE,                  "CONFIGITEM_RADIO_MODE" },
1221   { CONFIGITEM_RADIO_TIMEOUT,               "CONFIGITEM_RADIO_TIMEOUT" },
1222   { CONFIGITEM_RADIO_ATTEMPTS,              "CONFIGITEM_RADIO_ATTEMPTS" },
1223   { CONFIGITEM_RADIO_HOUSEKEEPING,          "CONFIGITEM_RADIO_HOUSEKEEPING" },
1224   { CONFIGITEM_RADIO_LEAPUSERNAME,          "CONFIGITEM_RADIO_LEAPUSERNAME" },
1225   { CONFIGITEM_RADIO_LEAPPASSWORD,          "CONFIGITEM_RADIO_LEAPPASSWORD" },
1226   { CONFIGITEM_INHIBIT_VOLTAGE,             "CONFIGITEM_INHIBIT_VOLTAGE" },
1227   { CONFIGITEM_LOW_VOLTAGE,                 "CONFIGITEM_LOW_VOLTAGE" },
1228   { CONFIGITEM_PT_RANGE_1,                  "CONFIGITEM_PT_RANGE_1" },
1229   { CONFIGITEM_PT_RANGE_2,                  "CONFIGITEM_PT_RANGE_2" },
1230   { CONFIGITEM_PT_RANGE_3,                  "CONFIGITEM_PT_RANGE_3" },
1231   { CONFIGITEM_PT_RANGE_4,                  "CONFIGITEM_PT_RANGE_4" },
1232   { CONFIGITEM_PT_RANGE_5,                  "CONFIGITEM_PT_RANGE_5" },
1233   { CONFIGITEM_PT_RANGE_6,                  "CONFIGITEM_PT_RANGE_6" },
1234   { CONFIGITEM_PT_RANGE_7,                  "CONFIGITEM_PT_RANGE_7" },
1235   { CONFIGITEM_PT_RANGE_8,                  "CONFIGITEM_PT_RANGE_8" },
1236   { CONFIGITEM_MAGCARD_IFS,                 "CONFIGITEM_MAGCARD_IFS" },
1237   { CONFIGITEM_MAGCARD_FIELDS,              "CONFIGITEM_MAGCARD_FIELDS" },
1238   { CONFIGITEM_MAGCARD_OFFSET,              "CONFIGITEM_MAGCARD_OFFSET" },
1239   { CONFIGITEM_MAGCARD_DIGITS,              "CONFIGITEM_MAGCARD_DIGITS" },
1240   { CONFIGITEM_ALARMS,                      "CONFIGITEM_ALARMS" },
1241   { CONFIGITEM_FILTERS,                     "CONFIGITEM_FILTERS" },
1242   { CONFIGITEM_ALARMSTATE,                  "CONFIGITEM_ALARMSTATE" },
1243   { CONFIGITEM_DOORSTATE,                   "CONFIGITEM_DOORSTATE" },
1244   { CONFIGITEM_DPACDEBUG,                   "CONFIGITEM_DPACDEBUG" },
1245   { CONFIGITEM_FAILOPENSECURE,              "CONFIGITEM_FAILOPENSECURE" },
1246   { CONFIGITEM_REPLACED_VOLTAGE,            "CONFIGITEM_REPLACED_VOLTAGE" },
1247   { CONFIGITEM_RX_HELD_TIME,                "CONFIGITEM_RX_HELD_TIME" },
1248   { CONFIGITEM_PACKET_TIMEOUT,              "CONFIGITEM_PACKET_TIMEOUT" },
1249   { CONFIGITEM_EXTENDEDRESPONSE,            "CONFIGITEM_EXTENDEDRESPONSE" },
1250   { CONFIGITEM_PASSAGEMODEINDICATOR,        "CONFIGITEM_PASSAGEMODEINDICATOR" },
1251   { CONFIGITEM_PFMRETURNTIME,               "CONFIGITEM_PFMRETURNTIME" },
1252   { 0,                                      NULL }
1253 };
1254 static value_string_ext r3_configitemnames_ext = VALUE_STRING_EXT_INIT(r3_configitemnames);
1255
1256 static const value_string r3_configtypenames [] =
1257 {
1258   { CONFIGTYPE_NONE,    "CONFIGTYPE_NONE" },
1259   { CONFIGTYPE_BOOL,    "CONFIGTYPE_BOOL" },
1260   { CONFIGTYPE_8,       "CONFIGTYPE_8" },
1261   { CONFIGTYPE_16,      "CONFIGTYPE_16" },
1262   { CONFIGTYPE_32,      "CONFIGTYPE_32" },
1263   { CONFIGTYPE_STRING,  "CONFIGTYPE_STRING" },
1264   { 0,                  NULL }
1265 };
1266 static value_string_ext r3_configtypenames_ext = VALUE_STRING_EXT_INIT(r3_configtypenames);
1267
1268 static const value_string r3_dispositionnames [] =
1269 {
1270   { DISPOSITION_ADD,      "DISPOSITION_ADD" },
1271   { DISPOSITION_REPLACE,  "DISPOSITION_REPLACE" },
1272   { DISPOSITION_UPDATE,   "DISPOSITION_UPDATE" },
1273   { DISPOSITION_DELETE,   "DISPOSITION_DELETE" },
1274   { DISPOSITION_RETRIEVE, "DISPOSITION_RETRIEVE" },
1275   { 0,                    NULL }
1276 };
1277 static value_string_ext r3_dispositionnames_ext = VALUE_STRING_EXT_INIT(r3_dispositionnames);
1278
1279 static const value_string r3_deleteusersnames [] =
1280 {
1281   { DELETEUSERS_ALL,    "DELETEUSER_ALL" },
1282   { DELETEUSERS_CACHED, "DELETEUSER_CACHED" },
1283   { 0,                  NULL }
1284 };
1285 static value_string_ext r3_deleteusersnames_ext = VALUE_STRING_EXT_INIT(r3_deleteusersnames);
1286
1287 static const value_string r3_downloadfirmwarenames [] =
1288 {
1289   { DOWNLOADFIRMWARE_START,    "DOWNLOADFIRMWARE_START" },
1290   { DOWNLOADFIRMWARE_DATA,     "DOWNLOADFIRMWARE_DATA" },
1291   { DOWNLOADFIRMWARE_COMPLETE, "DOWNLOADFIRMWARE_COMPLETE" },
1292   { DOWNLOADFIRMWARE_ABORT,    "DOWNLOADFIRMWARE_ABORT" },
1293   { DOWNLOADFIRMWARE_RESET,    "DOWNLOADFIRMWARE_RESET" },
1294   { 0,                         NULL }
1295 };
1296 static value_string_ext r3_downloadfirmwarenames_ext = VALUE_STRING_EXT_INIT(r3_downloadfirmwarenames);
1297
1298 static const value_string r3_encryptionschemenames [] =
1299 {
1300   { ENCRYPTIONSCHEME_NONE,    "ENCRYPTIONSCHEME_NONE" },
1301   { ENCRYPTIONSCHEME_ROLLING, "ENCRYPTIONSCHEME_ROLLING" },
1302   { ENCRYPTIONSCHEME_SN,      "ENCRYPTIONSCHEME_SN" },
1303   { ENCRYPTIONSCHEME_AESIV,   "ENCRYPTIONSCHEME_AESIV" },
1304   { ENCRYPTIONSCHEME_AES,     "ENCRYPTIONSCHEME_AES" },
1305   { 0,                        NULL }
1306 };
1307 static value_string_ext r3_encryptionschemenames_ext = VALUE_STRING_EXT_INIT(r3_encryptionschemenames);
1308
1309 static const value_string r3_eventnames [] =
1310 {
1311   { EVENT_INVALIDPIN,           "EVENT_INVALIDPIN" },
1312   { EVENT_USER,                 "EVENT_USER" },
1313   { EVENT_ONETIME,              "EVENT_ONETIME" },
1314   { EVENT_PASSAGEBEGIN,         "EVENT_PASSAGEBEGIN" },
1315   { EVENT_PASSAGEEND,           "EVENT_PASSAGEEND" },
1316   { EVENT_BADTIME,              "EVENT_BADTIME" },
1317   { EVENT_LOCKEDOUT,            "EVENT_LOCKEDOUT" },
1318   { EVENT_LOWBATTERY,           "EVENT_LOWBATTERY" },
1319   { EVENT_DEADBATTERY,          "EVENT_DEADBATTERY" },
1320   { EVENT_BATTERYREPLACED,      "EVENT_BATTERYREPLACED" },
1321   { EVENT_USERADDED,            "EVENT_USERADDED" },
1322   { EVENT_USERDELETED,          "EVENT_USERDELETED" },
1323   { EVENT_EMERGENCY,            "EVENT_EMERGENCY" },
1324   { EVENT_PANIC,                "EVENT_PANIC" },
1325   { EVENT_RELOCK,               "EVENT_RELOCK" },
1326   { EVENT_LOCKOUTBEGIN,         "EVENT_LOCKOUTBEGIN" },
1327   { EVENT_LOCKOUTEND,           "EVENT_LOCKOUTEND" },
1328   { EVENT_RESET,                "EVENT_RESET" },
1329   { EVENT_DATETIMESET,          "EVENT_DATETIMESET" },
1330   { EVENT_LOGCLEARED,           "EVENT_LOGCLEARED" },
1331   { EVENT_DBRESET,              "EVENT_DBRESET" },
1332   { EVENT_COMMSTARTED,          "EVENT_COMMSTARTED" },
1333   { EVENT_COMMENDED,            "EVENT_COMMENDED" },
1334   { EVENT_FIRMWAREABORT,        "EVENT_FIRMWAREABORT" },
1335   { EVENT_FIRMWAREERROR,        "EVENT_FIRMWAREERROR" },
1336   { EVENT_FIRMWARETIMEOUT,      "EVENT_FIRMWARETIMEOUT" },
1337   { EVENT_DSTFALLBACK,          "EVENT_DSTFALLBACK" },
1338   { EVENT_DSTSPRINGFORWARD,     "EVENT_DSTSPRINGFORWARD" },
1339   { EVENT_BOLTTHROWN,           "EVENT_BOLTTHROWN" },
1340   { EVENT_BOLTRETRACTED,        "EVENT_BOLTRETRACTED" },
1341   { EVENT_MASTERCODE,           "EVENT_MASTERCODE" },
1342   { EVENT_COMMUSER,             "EVENT_COMMUSER" },
1343   { EVENT_DPACDISABLED,         "EVENT_DPACDISABLED" },
1344   { EVENT_NOTIFY,               "EVENT_NOTIFY" },
1345   { EVENT_EXPIRED,              "EVENT_EXPIRED" },
1346   { EVENT_SUPERVISOR,           "EVENT_SUPERVISOR" },
1347   { EVENT_MCCENTER,             "EVENT_MCCENTER" },
1348   { EVENT_MCCEXIT,              "EVENT_MCCEXIT" },
1349   { EVENT_SERIALRXOVERRUN,      "EVENT_SERIALRXOVERRUN" },
1350   { EVENT_DPACRXOVERRUN,        "EVENT_DPACRXOVERRUN" },
1351   { EVENT_NVRAMPBCLEAR,         "EVENT_NVRAMPBCLEAR" },
1352   { EVENT_NVRAMLAYOUTCHANGE,    "EVENT_NVRAMLAYOUTCHANGE" },
1353   { EVENT_NVRAMOK,              "EVENT_NVRAMOK" },
1354   { EVENT_USERREPLACED,         "EVENT_USERREPLACED" },
1355   { EVENT_RADIOTIMEOUT,         "EVENT_RADIOTIMEOUT" },
1356   { EVENT_SUSPENDEDUSER,        "EVENT_SUSPENDEDUSER" },
1357   { EVENT_USERUPDATED,          "EVENT_USERUPDATED" },
1358   { EVENT_DOORBOLTED,           "EVENT_DOORBOLTED" },
1359   { EVENT_PANICACTIVE,          "EVENT_PANICACTIVE" },
1360   { EVENT_PASSAGEACTIVE,        "EVENT_PASSAGEACTIVE" },
1361   { EVENT_PASSAGEINACTIVE,      "EVENT_PASSAGEINACTIVE" },
1362   { EVENT_BADACCESSMODE,        "EVENT_BADACCESSMODE" },
1363   { EVENT_CLOCKERR,             "EVENT_CLOCKERR" },
1364   { EVENT_REMOTEUNLOCK,         "EVENT_REMOTEUNLOCK" },
1365   { EVENT_TZHAUDISABLED,        "EVENT_TZHAUDISABLED" },
1366   { EVENT_EVENTLOGWRAPPED,      "EVENT_EVENTLOGWRAPPED" },
1367   { EVENT_DECLINEDLOGWRAPPED,   "EVENT_DECLINEDLOGWRAPPED" },
1368   { EVENT_ALARMLOGWRAPPED,      "EVENT_ALARMLOGWRAPPED" },
1369   { EVENT_RADIOBUSYEMERGENCY,   "EVENT_RADIOBUSYEMERGENCY" },
1370   { EVENT_RADIOBUSYSUPERVISOR,  "EVENT_RADIOBUSYSUPERVISOR" },
1371   { EVENT_RADIOBUSYONETIME,     "EVENT_RADIOBUSYONETIME" },
1372   { EVENT_RADIOBUSYUSER,        "EVENT_RADIOBUSYUSER" },
1373   { EVENT_RADIOBUSYPANIC,       "EVENT_RADIOBUSYPANIC" },
1374   { EVENT_RADIOBUSYREX,         "EVENT_RADIOBUSYREX" },
1375   { EVENT_RADIOBUSYLOCKOUT,     "EVENT_RADIOBUSYLOCKOUT" },
1376   { EVENT_RADIOBUSYRELOCK,      "EVENT_RADIOBUSYRELOCK" },
1377   { EVENT_BATTERYCHECKHELDOFF,  "EVENT_BATTERYCHECKHELDOFF" },
1378   { EVENT_RMTAUTHREQUEST,       "EVENT_RMTAUTHREQUEST" },
1379   { EVENT_FIRMWAREUPDATE,       "EVENT_FIRMWAREUPDATE" },
1380   { EVENT_FIRMWAREUPDATEFAILED, "EVENT_FIRMWAREUPDATEFAILED" },
1381   { EVENT_MSMFAILURE,           "EVENT_MSMFAILURE" },
1382   { EVENT_CLOCKRESET,           "EVENT_CLOCKRESET" },
1383   { EVENT_POWERFAIL,            "EVENT_POWERFAIL" },
1384   { EVENT_DPAC501WENTSTUPID,    "EVENT_DPAC501WENTSTUPID" },
1385   { EVENT_CHECKSUMCONFIG,       "EVENT_CHECKSUMCONFIG" },
1386   { EVENT_CHECKSUMTZ,           "EVENT_CHECKSUMTZ" },
1387   { EVENT_DEBUG,                "EVENT_DEBUG" },
1388   { 0,                          NULL }
1389 };
1390 static value_string_ext r3_eventnames_ext = VALUE_STRING_EXT_INIT(r3_eventnames);
1391
1392 static const value_string r3_fieldtypenames [] =
1393 {
1394   { FIELDTYPE_NONE,     "FIELDTYPE_NONE" },
1395   { FIELDTYPE_PIN,      "FIELDTYPE_PIN" },
1396   { FIELDTYPE_PROX,     "FIELDTYPE_PROX" },
1397   { FIELDTYPE_MAGCARD,  "FIELDTYPE_MAGCARD" },
1398   { 0,                  NULL }
1399 };
1400 static value_string_ext r3_fieldtypenames_ext = VALUE_STRING_EXT_INIT(r3_fieldtypenames);
1401
1402 static const value_string r3_filtereventnames [] =
1403 {
1404   { EVENT_INVALIDPIN,           "EVENT_INVALIDPIN" },
1405   { EVENT_USER,                 "EVENT_USER" },
1406   { EVENT_ONETIME,              "EVENT_ONETIME" },
1407   { EVENT_PASSAGEBEGIN,         "EVENT_PASSAGEBEGIN" },
1408   { EVENT_PASSAGEEND,           "EVENT_PASSAGEEND" },
1409   { EVENT_BADTIME,              "EVENT_BADTIME" },
1410   { EVENT_LOCKEDOUT,            "EVENT_LOCKEDOUT" },
1411   { EVENT_LOWBATTERY,           "EVENT_LOWBATTERY" },
1412   { EVENT_DEADBATTERY,          "EVENT_DEADBATTERY" },
1413   { EVENT_BATTERYREPLACED,      "EVENT_BATTERYREPLACED" },
1414   { EVENT_USERADDED,            "EVENT_USERADDED" },
1415   { EVENT_USERDELETED,          "EVENT_USERDELETED" },
1416   { EVENT_EMERGENCY,            "EVENT_EMERGENCY" },
1417   { EVENT_PANIC,                "EVENT_PANIC" },
1418   { EVENT_RELOCK,               "EVENT_RELOCK" },
1419   { EVENT_LOCKOUTBEGIN,         "EVENT_LOCKOUTBEGIN" },
1420   { EVENT_LOCKOUTEND,           "EVENT_LOCKOUTEND" },
1421   { EVENT_RESET,                "EVENT_RESET" },
1422   { EVENT_DATETIMESET,          "EVENT_DATETIMESET" },
1423   { EVENT_LOGCLEARED,           "EVENT_LOGCLEARED" },
1424   { EVENT_DBRESET,              "EVENT_DBRESET" },
1425   { EVENT_COMMSTARTED,          "EVENT_COMMSTARTED" },
1426   { EVENT_COMMENDED,            "EVENT_COMMENDED" },
1427   { EVENT_FIRMWAREABORT,        "EVENT_FIRMWAREABORT" },
1428   { EVENT_FIRMWAREERROR,        "EVENT_FIRMWAREERROR" },
1429   { EVENT_FIRMWARETIMEOUT,      "EVENT_FIRMWARETIMEOUT" },
1430   { EVENT_DSTFALLBACK,          "EVENT_DSTFALLBACK" },
1431   { EVENT_DSTSPRINGFORWARD,     "EVENT_DSTSPRINGFORWARD" },
1432   { EVENT_BOLTTHROWN,           "EVENT_BOLTTHROWN" },
1433   { EVENT_BOLTRETRACTED,        "EVENT_BOLTRETRACTED" },
1434   { EVENT_MASTERCODE,           "EVENT_MASTERCODE" },
1435   { EVENT_COMMUSER,             "EVENT_COMMUSER" },
1436   { EVENT_DPACDISABLED,         "EVENT_DPACDISABLED" },
1437   { EVENT_NOTIFY,               "EVENT_NOTIFY" },
1438   { EVENT_EXPIRED,              "EVENT_EXPIRED" },
1439   { EVENT_SUPERVISOR,           "EVENT_SUPERVISOR" },
1440   { EVENT_MCCENTER,             "EVENT_MCCENTER" },
1441   { EVENT_MCCEXIT,              "EVENT_MCCEXIT" },
1442   { EVENT_SERIALRXOVERRUN,      "EVENT_SERIALRXOVERRUN" },
1443   { EVENT_DPACRXOVERRUN,        "EVENT_DPACRXOVERRUN" },
1444   { EVENT_NVRAMPBCLEAR,         "EVENT_NVRAMPBCLEAR" },
1445   { EVENT_NVRAMLAYOUTCHANGE,    "EVENT_NVRAMLAYOUTCHANGE" },
1446   { EVENT_NVRAMOK,              "EVENT_NVRAMOK" },
1447   { EVENT_USERREPLACED,         "EVENT_USERREPLACED" },
1448   { EVENT_RADIOTIMEOUT,         "EVENT_RADIOTIMEOUT" },
1449   { EVENT_SUSPENDEDUSER,        "EVENT_SUSPENDEDUSER" },
1450   { EVENT_USERUPDATED,          "EVENT_USERUPDATED" },
1451   { EVENT_DOORBOLTED,           "EVENT_DOORBOLTED" },
1452   { EVENT_PANICACTIVE,          "EVENT_PANICACTIVE" },
1453   { EVENT_PASSAGEACTIVE,        "EVENT_PASSAGEACTIVE" },
1454   { EVENT_PASSAGEINACTIVE,      "EVENT_PASSAGEINACTIVE" },
1455   { EVENT_BADACCESSMODE,        "EVENT_BADACCESSMODE" },
1456   { EVENT_CLOCKERR,             "EVENT_CLOCKERR" },
1457   { EVENT_REMOTEUNLOCK,         "EVENT_REMOTEUNLOCK" },
1458   { EVENT_TZHAUDISABLED,        "EVENT_TZHAUDISABLED" },
1459   { EVENT_EVENTLOGWRAPPED,      "EVENT_EVENTLOGWRAPPED" },
1460   { EVENT_DECLINEDLOGWRAPPED,   "EVENT_DECLINEDLOGWRAPPED" },
1461   { EVENT_ALARMLOGWRAPPED,      "EVENT_ALARMLOGWRAPPED" },
1462   { EVENT_RADIOBUSYEMERGENCY,   "EVENT_RADIOBUSYEMERGENCY" },
1463   { EVENT_RADIOBUSYSUPERVISOR,  "EVENT_RADIOBUSYSUPERVISOR" },
1464   { EVENT_RADIOBUSYONETIME,     "EVENT_RADIOBUSYONETIME" },
1465   { EVENT_RADIOBUSYUSER,        "EVENT_RADIOBUSYUSER" },
1466   { EVENT_RADIOBUSYPANIC,       "EVENT_RADIOBUSYPANIC" },
1467   { EVENT_RADIOBUSYREX,         "EVENT_RADIOBUSYREX" },
1468   { EVENT_RADIOBUSYLOCKOUT,     "EVENT_RADIOBUSYLOCKOUT" },
1469   { EVENT_RADIOBUSYRELOCK,      "EVENT_RADIOBUSYRELOCK" },
1470   { EVENT_BATTERYCHECKHELDOFF,  "EVENT_BATTERYCHECKHELDOFF" },
1471   { EVENT_RMTAUTHREQUEST,       "EVENT_RMTAUTHREQUEST" },
1472   { EVENT_FIRMWAREUPDATE,       "EVENT_FIRMWAREUPDATE" },
1473   { EVENT_FIRMWAREUPDATEFAILED, "EVENT_FIRMWAREUPDATEFAILED" },
1474   { EVENT_MSMFAILURE,           "EVENT_MSMFAILURE" },
1475   { EVENT_CLOCKRESET,           "EVENT_CLOCKRESET" },
1476   { EVENT_POWERFAIL,            "EVENT_POWERFAIL" },
1477   { EVENT_DPAC501WENTSTUPID,    "EVENT_DPAC501WENTSTUPID" },
1478   { EVENT_CHECKSUMCONFIG,       "EVENT_CHECKSUMCONFIG" },
1479   { EVENT_CHECKSUMTZ,           "EVENT_CHECKSUMTZ" },
1480   { EVENT_DEBUG,                "EVENT_DEBUG" },
1481   { 0xfe,                       "(Enable All Filters)" },
1482   { 0xff,                       "(Disable All Filters)" },
1483   { 0,                          NULL }
1484 };
1485 static value_string_ext r3_filtereventnames_ext = VALUE_STRING_EXT_INIT(r3_filtereventnames);
1486
1487 static const value_string r3_filtertypenames [] =
1488 {
1489   { FILTERSELECT_RECORDING, "FILTERSELECT_RECORDING" },
1490   { FILTERSELECT_REPORTING, "FILTERSELECT_REPORTING" },
1491   { 0,                      NULL }
1492 };
1493 static value_string_ext r3_filtertypenames_ext = VALUE_STRING_EXT_INIT(r3_filtertypenames);
1494
1495 static const value_string r3_forceitemnames [] =
1496 {
1497   { FORCEITEM_RADIOPOWER,  "FORCEITEM_RADIOPOWER" },
1498   { FORCEITEM_RADIOENABLE, "FORCEITEM_RADIOENABLE" },
1499   { FORCEITEM_LEDRED,      "FORCEITEM_LEDRED" },
1500   { FORCEITEM_LEDGREEN,    "FORCEITEM_LEDGREEN" },
1501   { FORCEITEM_LEDYELLOW,   "FORCEITEM_LEDYELLOW" },
1502   { FORCEITEM_PIEZO,       "FORCEITEM_PIEZO" },
1503   { FORCEITEM_MAGPOWER,    "FORCEITEM_MAGPOWER" },
1504   { FORCEITEM_MAGLEDA,     "FORCEITEM_MAGLEDA" },
1505   { FORCEITEM_MAGLEDB,     "FORCEITEM_MAGLEDB" },
1506   { FORCEITEM_PROXPOWER,   "FORCEITEM_PROXPOWER" },
1507   { FORCEITEM_PROXPING,    "FORCEITEM_PROXPING" },
1508   { FORCEITEM_PROXMODE,    "FORCEITEM_PROXMODE" },
1509   { FORCEITEM_I2CPOWER,    "FORCEITEM_I2CPOWER" },
1510   { FORCEITEM_MOTORARUN,   "FORCEITEM_MOTORARUN" },
1511   { FORCEITEM_MOTORBRUN,   "FORCEITEM_MOTORBRUN" },
1512   { FORCEITEM_VMON,        "FORCEITEM_VMON" },
1513   { FORCEITEM_PROX,        "FORCEITEM_PROX" },
1514   { FORCEITEM_MORTISETEST, "FORCEITEM_MORTISETEST" },
1515   { FORCEITEM_KEYPADTEST,  "FORCEITEM_KEYPADTEST" },
1516   { FORCEITEM_MAGTEST,     "FORCEITEM_MAGTEST" },
1517   { FORCEITEM_PROXTEST,    "FORCEITEM_PROXTEST" },
1518   { 0,                     NULL }
1519 };
1520 static value_string_ext r3_forceitemnames_ext = VALUE_STRING_EXT_INIT(r3_forceitemnames);
1521
1522 static const value_string r3_mfgfieldnames [] =
1523 {
1524   { MFGFIELD_IOPINS,              "MFGFIELD_IOPINS" },
1525   { MFGFIELD_ADCS,                "MFGFIELD_ADCS" },
1526   { MFGFIELD_HARDWAREID,          "MFGFIELD_HARDWAREID" },
1527   { MFGFIELD_CHECKPOINTLOG,       "MFGFIELD_CHECKPOINTLOG" },
1528   { MFGFIELD_CPUREGISTERS,        "MFGFIELD_CPUREGISTERS" },
1529   { MFGFIELD_TASKFLAGS,           "MFGFIELD_TASKFLAGS" },
1530   { MFGFIELD_TIMERCHAIN,          "MFGFIELD_TIMERCHAIN" },
1531   { MFGFIELD_PEEKPOKE,            "MFGFIELD_PEEKPOKE" },
1532   { MFGFIELD_LOCKSTATE,           "MFGFIELD_LOCKSTATE" },
1533   { MFGFIELD_CAPABILITIES,        "MFGFIELD_CAPABILITIES" },
1534   { MFGFIELD_DUMPM41T81,          "MFGFIELD_DUMPM41T81" },
1535   { MFGFIELD_NVRAMCHECKSUMVALUE,  "MFGFIELD_NVRAMCHECKSUMVALUE" },
1536   { MFGFIELD_CHECKSUMRESULTS,     "MFGFIELD_CHECKSUMRESULTS" },
1537   { MFGFIELD_MORTISESTATELOG,     "MFGFIELD_MORTISESTATELOG" },
1538   { MFGFIELD_MORTISEPINS,         "MFGFIELD_MORTISEPINS" },
1539   { MFGFIELD_KEYPADCHAR,          "MFGFIELD_KEYPADCHAR" },
1540   { MFGFIELD_MAGCARD,             "MFGFIELD_MAGCARD" },
1541   { MFGFIELD_PROXCARD,            "MFGFIELD_PROXCARD" },
1542   { 0,                            NULL }
1543 };
1544 static value_string_ext r3_mfgfieldnames_ext = VALUE_STRING_EXT_INIT(r3_mfgfieldnames);
1545
1546 static const value_string r3_mortiseeventnames [] =
1547 {
1548   { MORTISEEVENT_DX_THROWN,    "MORTISEEVENT_DX_THROWN" },
1549   { MORTISEEVENT_DX_RETRACTED, "MORTISEEVENT_DX_RETRACTED" },
1550   { MORTISEEVENT_LX_RETRACTED, "MORTISEEVENT_LX_RETRACTED" },
1551   { MORTISEEVENT_LX_EXTENDED,  "MORTISEEVENT_LX_EXTENDED" },
1552   { MORTISEEVENT_AX_EXTENDED,  "MORTISEEVENT_AX_EXTENDED" },
1553   { MORTISEEVENT_AX_RETRACTED, "MORTISEEVENT_AX_RETRACTED" },
1554   { MORTISEEVENT_RX_DEPRESSED, "MORTISEEVENT_RX_DEPRESSED" },
1555   { MORTISEEVENT_RX_RELEASED,  "MORTISEEVENT_RX_RELEASED" },
1556   { MORTISEEVENT_PX_OPEN,      "MORTISEEVENT_PX_OPEN" },
1557   { MORTISEEVENT_PX_CLOSED,    "MORTISEEVENT_PX_CLOSED" },
1558   { MORTISEEVENT_MX_UNLOCKED,  "MORTISEEVENT_MX_UNLOCKED" },
1559   { MORTISEEVENT_MX_LOCKED,    "MORTISEEVENT_MX_LOCKED" },
1560   { MORTISEEVENT_LAST,         "MORTISEEVENT_LAST" },
1561   { MORTISEEVENT_IGNORE,       "MORTISEEVENT_IGNORE" },
1562   { 0,                         NULL }
1563 };
1564 static value_string_ext r3_mortiseeventnames_ext = VALUE_STRING_EXT_INIT(r3_mortiseeventnames);
1565
1566 static const value_string r3_mortisetypenames [] =
1567 {
1568   { MORTISETYPE_NONE,      "MORTISETYPE_NONE" },
1569   { MORTISETYPE_S82276,    "MORTISETYPE_S82276" },
1570   { MORTISETYPE_S82277,    "MORTISETYPE_S82277" },
1571   { MORTISETYPE_S82278,    "MORTISETYPE_S82278" },
1572   { MORTISETYPE_S82279,    "MORTISETYPE_S82279" },
1573   { MORTISETYPE_S10G77,    "MORTISETYPE_S10G77" },
1574   { MORTISETYPE_S8877,     "MORTISETYPE_S8877" },
1575   { MORTISETYPE_S8878,     "MORTISETYPE_S8878" },
1576   { MORTISETYPE_S8977,     "MORTISETYPE_S8977" },
1577   { MORTISETYPE_S8978,     "MORTISETYPE_S8978" },
1578   { MORTISETYPE_CRML20x36, "MORTISETYPE_CRML20x36" },
1579   { MORTISETYPE_CRML20x35, "MORTISETYPE_CRML20x35" },
1580   { MORTISETYPE_CRML20x34, "MORTISETYPE_CRML20x34" },
1581   { MORTISETYPE_CRML20x33, "MORTISETYPE_CRML20x33" },
1582   { MORTISETYPE_CRCL33x34, "MORTISETYPE_CRCL33x34" },
1583   { MORTISETYPE_CR9X34,    "MORTISETYPE_CR9X34" },
1584   { MORTISETYPE_CR9X33,    "MORTISETYPE_CR9X33" },
1585   { MORTISETYPE_CR9MX34,   "MORTISETYPE_CR9MX34" },
1586   { MORTISETYPE_CR9MX33,   "MORTISETYPE_CR9MX33" },
1587   { 0,                     NULL }
1588 };
1589 static value_string_ext r3_mortisetypenames_ext = VALUE_STRING_EXT_INIT(r3_mortisetypenames);
1590
1591 static const value_string r3_peekpokenames [] =
1592 {
1593   { PEEKPOKE_READU8,      "PEEKPOKE_READU8" },
1594   { PEEKPOKE_READU16,     "PEEKPOKE_READU16" },
1595   { PEEKPOKE_READU24,     "PEEKPOKE_READU24" },
1596   { PEEKPOKE_READU32,     "PEEKPOKE_READU32" },
1597   { PEEKPOKE_READSTRING,  "PEEKPOKE_READSTRING" },
1598   { PEEKPOKE_WRITEU8,     "PEEKPOKE_WRITEU8" },
1599   { PEEKPOKE_WRITEU16,    "PEEKPOKE_WRITEU16" },
1600   { PEEKPOKE_WRITEU24,    "PEEKPOKE_WRITEU24" },
1601   { PEEKPOKE_WRITEU32,    "PEEKPOKE_WRITEU32" },
1602   { PEEKPOKE_WRITESTRING, "PEEKPOKE_WRITESTRING" },
1603   { 0,                    NULL }
1604 };
1605 static value_string_ext r3_peekpokenames_ext = VALUE_STRING_EXT_INIT(r3_peekpokenames);
1606
1607 static const value_string r3_ppmisourcenames [] =
1608 {
1609   { PPMISOURCE_NONE,    "PPMISOURCE_NONE" },
1610   { PPMISOURCE_PIN,     "PPMISOURCE_PIN" },
1611   { PPMISOURCE_PROX,    "PPMISOURCE_PROX" },
1612   { PPMISOURCE_MAGCARD, "PPMISOURCE_MAGCARD" },
1613   { 0,                  NULL }
1614 };
1615 static value_string_ext r3_ppmisourcenames_ext = VALUE_STRING_EXT_INIT(r3_ppmisourcenames);
1616
1617 static const value_string r3_responsetypenames [] =
1618 {
1619   { RESPONSETYPE_OK,                  "RESPONSETYPE_OK" },
1620   { RESPONSETYPE_ERROR,               "RESPONSETYPE_ERROR" },
1621   { RESPONSETYPE_HASDATA,             "RESPONSETYPE_HASDATA" },
1622   { RESPONSETYPE_NOHANDLER,           "RESPONSETYPE_NOHANDLER" },
1623   { RESPONSETYPE_NOSESSION,           "RESPONSETYPE_NOSESSION" },
1624   { RESPONSETYPE_BADCOMMAND,          "RESPONSETYPE_BADCOMMAND" },
1625   { RESPONSETYPE_BADPARAMETER,        "RESPONSETYPE_BADPARAMETER" },
1626   { RESPONSETYPE_BADPARAMETERLEN,     "RESPONSETYPE_BADPARAMETERLEN" },
1627   { RESPONSETYPE_MISSINGPARAMETER,    "RESPONSETYPE_MISSINGPARAMETER" },
1628   { RESPONSETYPE_DUPLICATEPARAMETER,  "RESPONSETYPE_DUPLICATEPARAMETER" },
1629   { RESPONSETYPE_PARAMETERCONFLICT,   "RESPONSETYPE_PARAMETERCONFLICT" },
1630   { RESPONSETYPE_BADDEVICE,           "RESPONSETYPE_BADDEVICE" },
1631   { RESPONSETYPE_NVRAMERROR,          "RESPONSETYPE_NVRAMERROR" },
1632   { RESPONSETYPE_NVRAMERRORNOACK,     "RESPONSETYPE_NVRAMERRORNOACK" },
1633   { RESPONSETYPE_NVRAMERRORNOACK32,   "RESPONSETYPE_NVRAMERRORNOACK32" },
1634   { RESPONSETYPE_NOTI2CADDRESS,       "RESPONSETYPE_NOTI2CADDRESS" },
1635   { RESPONSETYPE_FIRMWAREERROR,       "RESPONSETYPE_FIRMWAREERROR" },
1636   { RESPONSETYPE_DUMPINPROGRESS,      "RESPONSETYPE_DUMPINPROGRESS" },
1637   { RESPONSETYPE_INTERNALERROR,       "RESPONSETYPE_INTERNALERROR" },
1638   { RESPONSETYPE_NOTIMPLEMENTED,      "RESPONSETYPE_NOTIMPLEMENTED" },
1639   { RESPONSETYPE_PINFORMATERROR,      "RESPONSETYPE_PINFORMATERROR" },
1640   { RESPONSETYPE_PINEXISTS,           "RESPONSETYPE_PINEXISTS" },
1641   { RESPONSETYPE_PINNOTFOUND,         "RESPONSETYPE_PINNOTFOUND" },
1642   { RESPONSETYPE_USERACTIVE,          "RESPONSETYPE_USERACTIVE" },
1643   { RESPONSETYPE_USERINACTIVE,        "RESPONSETYPE_USERINACTIVE" },
1644   { RESPONSETYPE_PARENTNOTFOUND,      "RESPONSETYPE_PARENTNOTFOUND" },
1645   { RESPONSETYPE_NOCHAIN,             "RESPONSETYPE_NOCHAIN" },
1646   { RESPONSETYPE_CAUGHTINLOOP,        "RESPONSETYPE_CAUGHTINLOOP" },
1647   { RESPONSETYPE_EVENTFILTERED,       "RESPONSETYPE_EVENTFILTERED" },
1648   { RESPONSETYPE_PAYLOADTOOLARGE,     "RESPONSETYPE_PAYLOADTOOLARGE" },
1649   { RESPONSETYPE_ENDOFDATA,           "RESPONSETYPE_ENDOFDATA" },
1650   { RESPONSETYPE_RMTAUTHREJECTED,     "RESPONSETYPE_RMTAUTHREJECTED" },
1651   { RESPONSETYPE_NVRAMVERSIONERROR,   "RESPONSETYPE_NVRAMVERSIONERROR" },
1652   { RESPONSETYPE_NOHARDWARE,          "RESPONSETYPE_NOHARDWARE" },
1653   { RESPONSETYPE_SCHEDULERCONFLICT,   "RESPONSETYPE_SCHEDULERCONFLICT" },
1654   { RESPONSETYPE_NVRAMWRITEERROR,     "RESPONSETYPE_NVRAMWRITEERROR" },
1655   { RESPONSETYPE_DECLINEDFILTERED,    "RESPONSETYPE_DECLINEDFILTERED" },
1656   { RESPONSETYPE_NECONFIGPARM,        "RESPONSETYPE_NECONFIGPARM" },
1657   { RESPONSETYPE_FLASHERASEERROR,     "RESPONSETYPE_FLASHERASEERROR" },
1658   { RESPONSETYPE_FLASHWRITEERROR,     "RESPONSETYPE_FLASHWRITEERROR" },
1659   { RESPONSETYPE_BADNVBACKUP,         "RESPONSETYPE_BADNVBACKUP" },
1660   { RESPONSETYPE_EARLYACK,            "RESPONSETYPE_EARLYACK" },
1661   { RESPONSETYPE_ALARMFILTERED,       "RESPONSETYPE_ALARMFILTERED" },
1662   { RESPONSETYPE_ACVFAILURE,          "RESPONSETYPE_ACVFAILURE" },
1663   { RESPONSETYPE_USERCHECKSUMERROR,   "RESPONSETYPE_USERCHECKSUMERROR" },
1664   { RESPONSETYPE_CHECKSUMERROR,       "RESPONSETYPE_CHECKSUMERROR" },
1665   { RESPONSETYPE_RTCSQWFAILURE,       "RESPONSETYPE_RTCSQWFAILURE" },
1666   { RESPONSETYPE_PRIORITYSHUTDOWN,    "RESPONSETYPE_PRIORITYSHUTDOWN" },
1667   { RESPONSETYPE_NOTMODIFIABLE,       "RESPONSETYPE_NOTMODIFIABLE" },
1668   { RESPONSETYPE_CANTPRESERVE,        "RESPONSETYPE_CANTPRESERVE" },
1669   { RESPONSETYPE_INPASSAGEMODE,       "RESPONSETYPE_INPASSAGEMODE" },
1670   { 0,                                NULL }
1671 };
1672 static value_string_ext r3_responsetypenames_ext = VALUE_STRING_EXT_INIT(r3_responsetypenames);
1673
1674 static const value_string r3_timezonemodenames [] =
1675 {
1676   { TIMEZONEMODE_NORMAL,    "TIMEZONEMODE_NORMAL" },
1677   { TIMEZONEMODE_EXCLUSION, "TIMEZONEMODE_EXCLUSION" },
1678   { TIMEZONEMODE_AUTOTIME,  "TIMEZONEMODE_AUTOTIME" },
1679   { TIMEZONEMODE_AUTOFPT,   "TIMEZONEMODE_AUTOFPT" },
1680   { TIMEZONEMODE_UAPM,      "TIMEZONEMODE_UAPM" },
1681   { 0,                      NULL }
1682 };
1683 static value_string_ext r3_timezonemodenames_ext = VALUE_STRING_EXT_INIT(r3_timezonemodenames);
1684
1685 static const value_string r3_upstreamcommandnames [] =
1686 {
1687   { UPSTREAMCOMMAND_RESERVED,           "UPSTREAMCOMMAND_RESERVED" },
1688   { UPSTREAMCOMMAND_DEBUGMSG,           "UPSTREAMCOMMAND_DEBUGMSG" },
1689   { UPSTREAMCOMMAND_QUERYVERSION,       "UPSTREAMCOMMAND_QUERYVERSION" },
1690   { UPSTREAMCOMMAND_QUERYDATETIME,      "UPSTREAMCOMMAND_QUERYDATETIME" },
1691   { UPSTREAMCOMMAND_QUERYSERIALNUMBER,  "UPSTREAMCOMMAND_QUERYSERIALNUMBER" },
1692   { UPSTREAMCOMMAND_DUMPEVENTLOG,       "UPSTREAMCOMMAND_DUMPEVENTLOG" },
1693   { UPSTREAMCOMMAND_DUMPNVRAM,          "UPSTREAMCOMMAND_DUMPNVRAM" },
1694   { UPSTREAMCOMMAND_RMTAUTHREQUEST,     "UPSTREAMCOMMAND_RMTAUTHREQUEST" },
1695   { UPSTREAMCOMMAND_RETRIEVEUSER,       "UPSTREAMCOMMAND_RETRIEVEUSER" },
1696   { UPSTREAMCOMMAND_QUERYCONFIG,        "UPSTREAMCOMMAND_QUERYCONFIG" },
1697   { UPSTREAMCOMMAND_RMTEVENTLOGRECORD,  "UPSTREAMCOMMAND_RMTEVENTLOGRECORD" },
1698   { UPSTREAMCOMMAND_DPAC,               "UPSTREAMCOMMAND_DPAC" },
1699   { UPSTREAMCOMMAND_NOTIFY,             "UPSTREAMCOMMAND_NOTIFY" },
1700   { UPSTREAMCOMMAND_MFG,                "UPSTREAMCOMMAND_MFG" },
1701   { UPSTREAMCOMMAND_EVENTLOGWARNING,    "UPSTREAMCOMMAND_EVENTLOGWARNING" },
1702   { UPSTREAMCOMMAND_DUMPNVRAMRLE,       "UPSTREAMCOMMAND_DUMPNVRAMRLE" },
1703   { UPSTREAMCOMMAND_RMTDECLINEDRECORD,  "UPSTREAMCOMMAND_RMTDECLINEDRECORD" },
1704   { UPSTREAMCOMMAND_DECLINEDWARNING,    "UPSTREAMCOMMAND_DECLINEDWARNING" },
1705   { UPSTREAMCOMMAND_DUMPDECLINEDLOG,    "UPSTREAMCOMMAND_DUMPDECLINEDLOG" },
1706   { UPSTREAMCOMMAND_RMTALARMRECORD,     "UPSTREAMCOMMAND_RMTALARMRECORD" },
1707   { UPSTREAMCOMMAND_ALARMWARNING,       "UPSTREAMCOMMAND_ALARMWARNING" },
1708   { UPSTREAMCOMMAND_DUMPALARMLOG,       "UPSTREAMCOMMAND_DUMPALARMLOG" },
1709   { UPSTREAMCOMMAND_CONNECTSCHEDULER,   "UPSTREAMCOMMAND_CONNECTSCHEDULER" },
1710   { UPSTREAMCOMMAND_CONNECTCOMMUSER,    "UPSTREAMCOMMAND_CONNECTCOMMUSER" },
1711   { UPSTREAMCOMMAND_CONNECTALARM,       "UPSTREAMCOMMAND_CONNECTALARM" },
1712   { UPSTREAMCOMMAND_DUMPDEBUGLOG,       "UPSTREAMCOMMAND_DUMPDEBUGLOG" },
1713   { 0,                                  NULL }
1714 };
1715 static value_string_ext r3_upstreamcommandnames_ext = VALUE_STRING_EXT_INIT(r3_upstreamcommandnames);
1716
1717 static const value_string r3_upstreamfieldnames [] =
1718 {
1719   { UPSTREAMFIELD_NOTUSED,              "UPSTREAMFIELD_NOTUSED" },
1720   { UPSTREAMFIELD_SERIALNUMBER,         "UPSTREAMFIELD_SERIALNUMBER" },
1721   { UPSTREAMFIELD_NAR,                  "UPSTREAMFIELD_NAR" },
1722   { UPSTREAMFIELD_ENTRYDEVICE,          "UPSTREAMFIELD_ENTRYDEVICE" },
1723   { UPSTREAMFIELD_PPMIFIELDTYPE,        "UPSTREAMFIELD_PPMIFIELDTYPE" },
1724   { UPSTREAMFIELD_PIN,                  "UPSTREAMFIELD_PIN" },
1725   { UPSTREAMFIELD_SEQUENCENUMBER,       "UPSTREAMFIELD_SEQUENCENUMBER" },
1726   { UPSTREAMFIELD_RESPONSEWINDOW,       "UPSTREAMFIELD_RESPONSEWINDOW" },
1727   { UPSTREAMFIELD_USERNUMBER,           "UPSTREAMFIELD_USERNUMBER" },
1728   { UPSTREAMFIELD_VERSION,              "UPSTREAMFIELD_VERSION" },
1729   { UPSTREAMFIELD_EVENTLOGRECORD,       "UPSTREAMFIELD_EVENTLOGRECORD" },
1730   { UPSTREAMFIELD_DATETIME,             "UPSTREAMFIELD_DATETIME" },
1731   { UPSTREAMFIELD_EVENTLOGRECORDCOUNT,  "UPSTREAMFIELD_EVENTLOGRECORDCOUNT" },
1732   { UPSTREAMFIELD_DECLINEDRECORDCOUNT,  "UPSTREAMFIELD_DECLINEDRECORDCOUNT" },
1733   { UPSTREAMFIELD_DECLINEDRECORD,       "UPSTREAMFIELD_DECLINEDRECORD" },
1734   { UPSTREAMFIELD_USERTYPE,             "UPSTREAMFIELD_USERTYPE" },
1735   { UPSTREAMFIELD_ACCESSALWAYS,         "UPSTREAMFIELD_ACCESSALWAYS" },
1736   { UPSTREAMFIELD_CACHED,               "UPSTREAMFIELD_CACHED" },
1737   { UPSTREAMFIELD_PRIMARYFIELDTYPE,     "UPSTREAMFIELD_PRIMARYFIELDTYPE" },
1738   { UPSTREAMFIELD_AUXFIELDTYPE,         "UPSTREAMFIELD_AUXFIELDTYPE" },
1739   { UPSTREAMFIELD_ACCESSMODE,           "UPSTREAMFIELD_ACCESSMODE" },
1740   { UPSTREAMFIELD_EXPIREON,             "UPSTREAMFIELD_EXPIREON" },
1741   { UPSTREAMFIELD_USECOUNT,             "UPSTREAMFIELD_USECOUNT" },
1742   { UPSTREAMFIELD_TIMEZONE,             "UPSTREAMFIELD_TIMEZONE" },
1743   { UPSTREAMFIELD_EXCEPTIONGROUP,       "UPSTREAMFIELD_EXCEPTIONGROUP" },
1744   { UPSTREAMFIELD_PRIMARYPIN,           "UPSTREAMFIELD_PRIMARYPIN" },
1745   { UPSTREAMFIELD_AUXPIN,               "UPSTREAMFIELD_AUXPIN" },
1746   { UPSTREAMFIELD_ALARMRECORDCOUNT,     "UPSTREAMFIELD_ALARMRECORDCOUNT" },
1747   { UPSTREAMFIELD_ALARMRECORD,          "UPSTREAMFIELD_ALARMRECORD" },
1748   { UPSTREAMFIELD_AUXCTLRVERSION,       "UPSTREAMFIELD_AUXCTLRVERSION" },
1749   { 0,                                  NULL }
1750 };
1751 static value_string_ext r3_upstreamfieldnames_ext = VALUE_STRING_EXT_INIT(r3_upstreamfieldnames);
1752
1753 static const value_string r3_usertypenames [] =
1754 {
1755   { USERTYPE_NONE,        "USERTYPE_NONE" },
1756   { USERTYPE_MASTER,      "USERTYPE_MASTER" },
1757   { USERTYPE_EMERGENCY,   "USERTYPE_EMERGENCY" },
1758   { USERTYPE_SUPERVISOR,  "USERTYPE_SUPERVISOR" },
1759   { USERTYPE_USER,        "USERTYPE_USER" },
1760   { USERTYPE_EXTENDED,    "USERTYPE_EXTENDED" },
1761   { USERTYPE_PASSAGE,     "USERTYPE_PASSAGE" },
1762   { USERTYPE_ONETIME,     "USERTYPE_ONETIME" },
1763   { USERTYPE_PANIC,       "USERTYPE_PANIC" },
1764   { USERTYPE_LOCKOUT,     "USERTYPE_LOCKOUT" },
1765   { USERTYPE_RELOCK,      "USERTYPE_RELOCK" },
1766   { USERTYPE_NOTIFY,      "USERTYPE_NOTIFY" },
1767   { USERTYPE_COMM,        "USERTYPE_COMM" },
1768   { USERTYPE_SUSPENDED,   "USERTYPE_SUSPENDED" },
1769   { 0,                    NULL }
1770 };
1771 static value_string_ext r3_usertypenames_ext = VALUE_STRING_EXT_INIT(r3_usertypenames);
1772
1773 static const value_string r3_mfgnvramdumpnames [] =
1774 {
1775   {  0, "All" },
1776   {  1, "PIC" },
1777   {  2, "User" },
1778   {  3, "Event" },
1779   {  0, NULL }
1780 };
1781 static value_string_ext r3_mfgnvramdumpnames_ext = VALUE_STRING_EXT_INIT(r3_mfgnvramdumpnames);
1782
1783 static const value_string r3_mfgremoteunlocknames [] =
1784 {
1785   {  0, "Normal" },
1786   {  1, "Unlock" },
1787   {  2, "Lock" },
1788   {  0, NULL }
1789 };
1790 static value_string_ext r3_mfgremoteunlocknames_ext = VALUE_STRING_EXT_INIT(r3_mfgremoteunlocknames);
1791
1792 static const value_string r3_mfgtestpreservenames [] =
1793 {
1794   {  0, "Save" },
1795   {  1, "Restore" },
1796   {  0, NULL }
1797 };
1798 static value_string_ext r3_mfgtestpreservenames_ext = VALUE_STRING_EXT_INIT(r3_mfgtestpreservenames);
1799
1800 static const value_string r3_daynames [] =
1801 {
1802   { 0,  "Sunday" },
1803   { 1,  "Monday" },
1804   { 2,  "Tueday" },
1805   { 3,  "Wednesday" },
1806   { 4,  "Thursday" },
1807   { 5,  "Friday" },
1808   { 6,  "Saturday" },
1809   { 0,  NULL }
1810 };
1811 static value_string_ext r3_daynames_ext = VALUE_STRING_EXT_INIT(r3_daynames);
1812
1813 static const value_string r3_monthnames [] =
1814 {
1815   {  0, "ERROR!" },
1816   {  1, "January" },
1817   {  2, "February" },
1818   {  3, "March" },
1819   {  4, "April" },
1820   {  5, "May" },
1821   {  6, "June" },
1822   {  7, "July" },
1823   {  8, "August" },
1824   {  9, "September" },
1825   { 10, "October" },
1826   { 11, "November" },
1827   { 12, "December" },
1828   {  0, NULL }
1829 };
1830 static value_string_ext r3_monthnames_ext = VALUE_STRING_EXT_INIT(r3_monthnames);
1831
1832 static const value_string r3_monthdaynames [] =
1833 {
1834   {  0, "ERROR!" },
1835   {  1, " 1st" },
1836   {  2, " 2nd" },
1837   {  3, " 3rd" },
1838   {  4, " 4th" },
1839   {  5, " 5th" },
1840   {  6, " 6th" },
1841   {  7, " 7th" },
1842   {  8, " 8th" },
1843   {  9, " 9th" },
1844   { 10, "10th" },
1845   { 11, "11th" },
1846   { 12, "12th" },
1847   { 13, "13th" },
1848   { 14, "14th" },
1849   { 15, "15th" },
1850   { 16, "16th" },
1851   { 17, "17th" },
1852   { 18, "18th" },
1853   { 19, "19th" },
1854   { 20, "20th" },
1855   { 21, "21st" },
1856   { 22, "22nd" },
1857   { 23, "23rd" },
1858   { 24, "24th" },
1859   { 25, "25th" },
1860   { 26, "26th" },
1861   { 27, "27th" },
1862   { 28, "28th" },
1863   { 29, "29th" },
1864   { 30, "30th" },
1865   { 31, "31st" },
1866   {  0, NULL   }
1867 };
1868 static value_string_ext r3_monthdaynames_ext = VALUE_STRING_EXT_INIT(r3_monthdaynames);
1869
1870 static const value_string r3_powertablenames [] =
1871 {
1872   {  1, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
1873   {  2, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
1874   {  3, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
1875   {  4, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {12, 11, 11, 10, 10,  9,  9,  8}" },
1876   {  5, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {13, 12, 12, 11, 11, 10, 10,  9}" },
1877   {  6, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {14, 13, 13, 12, 12, 11, 11, 10}" },
1878   {  7, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {15, 14, 14, 13, 13, 12, 12, 11}" },
1879   {  8, "CONFIGITEM_PT_RANGE_1..CONFIGITEM_PT_RANGE_8 = {16, 15, 15, 14, 14, 13, 13, 12}" },
1880   {  0, NULL }
1881 };
1882 static value_string_ext r3_powertablenames_ext = VALUE_STRING_EXT_INIT(r3_powertablenames);
1883
1884 static const true_false_string tfs_rmtauthretry_flags =
1885 {
1886   "Retry",
1887   "Deny"
1888 };
1889
1890 static const true_false_string tfs_mortisepins_flags =
1891 {
1892   "High",
1893   "Low"
1894 };
1895
1896 static const true_false_string tfs_errornoerror_flags =
1897 {
1898   "Error",
1899   "No Error"
1900 };
1901
1902 static const string_string r3_snmanufacturernames [] =
1903 {
1904   { "IT", "ITS" },
1905   { "KC", "Kimchuk" },
1906   { NULL, NULL }
1907 };
1908
1909 static const string_string r3_snyearnames [] =
1910 {
1911   { "5",  "2005" },
1912   { "6",  "2006" },
1913   { "7",  "2007" },
1914   { "8",  "2008" },
1915   { "9",  "2009" },
1916   { "0",  "2010" },
1917   { "1",  "2011" },
1918   { "2",  "2012" },
1919   { "3",  "2013" },
1920   { "4",  "2014" },
1921   { NULL, NULL }
1922 };
1923
1924 static const string_string r3_snmodelnames [] =
1925 {
1926   { "H",  "Sx controller" },
1927   { "J",  "Px controller" },
1928   { "D",  "PG offline interface board" },
1929   { "E",  "Px online interface board" },
1930   { "N",  "Ethernet-PD board" },
1931   { "O",  "CAM board" },
1932   { NULL, NULL }
1933 };
1934
1935 static const string_string r3_sngroupnames [] =
1936 {
1937   { "S",  "Sargent" },
1938   { "P",  "Persona" },
1939   { "C",  "Corbin-Russwin" },
1940   { NULL, NULL }
1941 };
1942
1943 static const string_string r3_snnidnames [] =
1944 {
1945   { "A",  "Ethernet" },
1946   { "B",  "DPAC 802.11b" },
1947   { "C",  "DPAC 802.11bg" },
1948   { "D",  "Zigbee" },
1949   { "E",  "GPRS" },
1950   { NULL, NULL }
1951 };
1952
1953 static const string_string r3_snhidnames [] =
1954 {
1955   { "00", "[None]" },
1956   { "01", "Keypad" },
1957   { "02", "eProx" },
1958   { "03", "eProx, Keypad" },
1959   { "04", "iProx" },
1960   { "05", "iProx, Keypad" },
1961   { "06", "iProx, eProx" },
1962   { "07", "iProx, eProx, Keypad" },
1963   { "08", "Mag Card" },
1964   { "09", "Mag Card, Keypad" },
1965   { "0a", "Mag Card, eProx" },
1966   { "0b", "Mag Card, eProx, Keypad" },
1967   { "0c", "Mag Card, iProx" },
1968   { "0d", "Mag Card, iProx, Keypad" },
1969   { "0e", "Mag Card, iProx, eProx" },
1970   { "0f", "Mag Card, iProx, eProx, Keypad" },
1971   { "10", "Biometric" },
1972   { "11", "Biometric, Keypad" },
1973   { "12", "Biometric, eProx" },
1974   { "13", "Biometric, eProx, Keypad" },
1975   { "14", "Biometric, iProx" },
1976   { "15", "Biometric, iProx, Keypad" },
1977   { "16", "Biometric, iProx, eProx" },
1978   { "17", "Biometric, iProx, eProx, Keypad" },
1979   { "18", "Biometric, Mag Card" },
1980   { "19", "Biometric, Mag Card, Keypad" },
1981   { "1a", "Biometric, Mag Card, eProx" },
1982   { "1b", "Biometric, Mag Card, eProx, Keypad" },
1983   { "1c", "Biometric, Mag Card, iProx" },
1984   { "1d", "Biometric, Mag Card, iProx, Keypad" },
1985   { "1e", "Biometric, Mag Card, iProx, eProx" },
1986   { "1f", "Biometric, Mag Card, iProx, eProx, Keypad" },
1987   { NULL, NULL }
1988 };
1989
1990 static const string_string r3_snpowersupplynames [] =
1991 {
1992   { "A",  "Batteries" },
1993   { "B",  "External power" },
1994   { "C",  "Power over Ethernet" },
1995   { "D",  "External power w/ backup" },
1996   { "E",  "Power over Ethernet w/ backup" },
1997   { NULL, NULL }
1998 };
1999
2000 static const string_string r3_snmortisenames [] =
2001 {
2002   { "A",  "Sargent 82276 mortise" },
2003   { "B",  "Sargent 82277 mortise" },
2004   { "C",  "Sargent 82278 mortise" },
2005   { "D",  "Sargent 82279 mortise" },
2006   { "E",  "Sargent 10G77 bored" },
2007   { "F",  "Sargent 8877 exit" },
2008   { "G",  "Sargent 8878 exit" },
2009   { "H",  "Sargent 8977 exit" },
2010   { "I",  "Sargent 8878 exit" },
2011   { "J",  "Corbin-Russwin ML20736/ML20836 mortise" },
2012   { "K",  "Corbin-Russwin ML20735/ML20835 mortise" },
2013   { "L",  "Corbin-Russwin ML20734/ML20834 mortise" },
2014   { "M",  "Corbin-Russwin ML20733/ML20833 mortise" },
2015   { "N",  "Corbin-Russwin CL33734/CL33834 bored" },
2016   { "O",  "Corbin-Russwin 9734/9834 exit" },
2017   { "P",  "Corbin-Russwin 9733/9833 exit" },
2018   { "Q",  "Corbin-Russwin 9M734/9M834 exit" },
2019   { "R",  "Corbin-Russwin 9M733/9M833 exit" },
2020   { NULL, NULL }
2021 };
2022
2023 /*
2024  *  Mapping table so dissect_r3_cmd_setconfig() knows what the configuration item type is
2025  */
2026 typedef struct
2027 {
2028   configItem_e configItem;
2029   configType_e configType;
2030 }
2031 configMap_t;
2032
2033 static configMap_t configMap [] =
2034 {
2035   { CONFIGITEM_SERIAL_NUMBER,               CONFIGTYPE_STRING },
2036   { CONFIGITEM_CRYPT_KEY,                   CONFIGTYPE_STRING },
2037   { CONFIGITEM_HARDWARE_OPTIONS_MFG,        CONFIGTYPE_16 },
2038   { CONFIGITEM_HARDWARE_OPTIONS,            CONFIGTYPE_16 },
2039   { CONFIGITEM_NVRAM_CHANGES,               CONFIGTYPE_16 },
2040   { CONFIGITEM_NVRAMDIRTY,                  CONFIGTYPE_BOOL },
2041   { CONFIGITEM_NVRAM_WV,                    CONFIGTYPE_BOOL },
2042   { CONFIGITEM_ENABLE_WDT,                  CONFIGTYPE_BOOL },
2043   { CONFIGITEM_EARLY_ACK,                   CONFIGTYPE_BOOL },
2044   { CONFIGITEM_CONSOLE_AES_ONLY,            CONFIGTYPE_BOOL },
2045   { CONFIGITEM_RADIO_AES_ONLY,              CONFIGTYPE_BOOL },
2046   { CONFIGITEM_NDRLE,                       CONFIGTYPE_BOOL },
2047   { CONFIGITEM_SOMF,                        CONFIGTYPE_BOOL },
2048   { CONFIGITEM_NOGAF,                       CONFIGTYPE_BOOL },
2049   { CONFIGITEM_CARD_READER_POWER,           CONFIGTYPE_BOOL },
2050   { CONFIGITEM_PROX_ENABLE,                 CONFIGTYPE_BOOL },
2051   { CONFIGITEM_CKSUMCONFIG,                 CONFIGTYPE_BOOL },
2052   { CONFIGITEM_DAILY_BATTERY_CHECK,         CONFIGTYPE_BOOL },
2053   { CONFIGITEM_DAILY_BATTERY_CHECK_HOUR,    CONFIGTYPE_8 },
2054   { CONFIGITEM_BATTERY_LOW,                 CONFIGTYPE_BOOL },
2055   { CONFIGITEM_LRU_HEAD,                    CONFIGTYPE_16 },
2056   { CONFIGITEM_LRU_TAIL,                    CONFIGTYPE_16 },
2057   { CONFIGITEM_RTC_CALIBRATION,             CONFIGTYPE_8 },
2058   { CONFIGITEM_ACVREQUESTER,                CONFIGTYPE_8 },
2059   { CONFIGITEM_LOCAL_LED,                   CONFIGTYPE_8 },
2060   { CONFIGITEM_ERRCNT_XORLEN,               CONFIGTYPE_16 },
2061   { CONFIGITEM_ERRCNT_CRC,                  CONFIGTYPE_16 },
2062   { CONFIGITEM_ERRCNT_NOTSIGIL,             CONFIGTYPE_16 },
2063   { CONFIGITEM_ERRCNT_TIMEOUT,              CONFIGTYPE_16 },
2064   { CONFIGITEM_ERRCNT_TOOLONG,              CONFIGTYPE_16 },
2065   { CONFIGITEM_ERRCNT_TOOSHORT,             CONFIGTYPE_16 },
2066   { CONFIGITEM_ERRCNT_HITDEFAULT,           CONFIGTYPE_16 },
2067   { CONFIGITEM_ERRCNT_OVERRUN,              CONFIGTYPE_16 },
2068   { CONFIGITEM_ERRCNT_UARTFE,               CONFIGTYPE_16 },
2069   { CONFIGITEM_ERRCNT_UARTOE,               CONFIGTYPE_16 },
2070   { CONFIGITEM_DST_SET,                     CONFIGTYPE_BOOL },
2071   { CONFIGITEM_DST_MODE,                    CONFIGTYPE_8 },
2072   { CONFIGITEM_DST_FORWARD_MONTH,           CONFIGTYPE_8 },
2073   { CONFIGITEM_DST_FORWARD_DOM,             CONFIGTYPE_8 },
2074   { CONFIGITEM_DST_FORWARD_OOD,             CONFIGTYPE_8 },
2075   { CONFIGITEM_DST_FORWARD_DOW,             CONFIGTYPE_8 },
2076   { CONFIGITEM_DST_FORWARD_HOUR,            CONFIGTYPE_8 },
2077   { CONFIGITEM_DST_FORWARD_MINUTE,          CONFIGTYPE_8 },
2078   { CONFIGITEM_DST_FORWARD_ADJUST,          CONFIGTYPE_8 },
2079   { CONFIGITEM_DST_BACK_MONTH,              CONFIGTYPE_8 },
2080   { CONFIGITEM_DST_BACK_DOM,                CONFIGTYPE_8 },
2081   { CONFIGITEM_DST_BACK_OOD,                CONFIGTYPE_8 },
2082   { CONFIGITEM_DST_BACK_DOW,                CONFIGTYPE_8 },
2083   { CONFIGITEM_DST_BACK_HOUR,               CONFIGTYPE_8 },
2084   { CONFIGITEM_DST_BACK_MINUTE,             CONFIGTYPE_8 },
2085   { CONFIGITEM_DST_BACK_ADJUST,             CONFIGTYPE_8 },
2086   { CONFIGITEM_EVENTLOG_ZEROMEM,            CONFIGTYPE_BOOL },
2087   { CONFIGITEM_EVENTLOG_BEGIN,              CONFIGTYPE_16 },
2088   { CONFIGITEM_EVENTLOG_RECORD,             CONFIGTYPE_16 },
2089   { CONFIGITEM_EVENTLOG_ENTRIES,            CONFIGTYPE_16 },
2090   { CONFIGITEM_EVENTLOG_WARNDEVICE,         CONFIGTYPE_8 },
2091   { CONFIGITEM_EVENTLOG_WARNEVERY,          CONFIGTYPE_16 },
2092   { CONFIGITEM_EVENTLOG_RMTDEVICE,          CONFIGTYPE_8 },
2093   { CONFIGITEM_DECLINEDLOG_ZEROMEM,         CONFIGTYPE_BOOL },
2094   { CONFIGITEM_DECLINEDLOG_BEGIN,           CONFIGTYPE_16 },
2095   { CONFIGITEM_DECLINEDLOG_RECORD,          CONFIGTYPE_16 },
2096   { CONFIGITEM_DECLINEDLOG_ENTRIES,         CONFIGTYPE_16 },
2097   { CONFIGITEM_DECLINEDLOG_WARNDEVICE,      CONFIGTYPE_8 },
2098   { CONFIGITEM_DECLINEDLOG_WARNEVERY,       CONFIGTYPE_16 },
2099   { CONFIGITEM_DECLINEDLOG_RMTDEVICE,       CONFIGTYPE_8 },
2100   { CONFIGITEM_ALARMLOG_ZEROMEM,            CONFIGTYPE_BOOL },
2101   { CONFIGITEM_ALARMLOG_BEGIN,              CONFIGTYPE_16 },
2102   { CONFIGITEM_ALARMLOG_RECORD,             CONFIGTYPE_16 },
2103   { CONFIGITEM_ALARMLOG_ENTRIES,            CONFIGTYPE_16 },
2104   { CONFIGITEM_ALARMLOG_WARNDEVICE,         CONFIGTYPE_8 },
2105   { CONFIGITEM_ALARMLOG_WARNEVERY,          CONFIGTYPE_16 },
2106   { CONFIGITEM_ALARMLOG_RMTDEVICE,          CONFIGTYPE_8 },
2107   { CONFIGITEM_VISIBLE_FEEDBACK,            CONFIGTYPE_BOOL },
2108   { CONFIGITEM_AUDIBLE_FEEDBACK,            CONFIGTYPE_BOOL },
2109   { CONFIGITEM_VISIBLE_INDICATORS,          CONFIGTYPE_BOOL },
2110   { CONFIGITEM_AUDIBLE_INDICATORS,          CONFIGTYPE_BOOL },
2111   { CONFIGITEM_2NDPINDURATION,              CONFIGTYPE_8 },
2112   { CONFIGITEM_LOCKOUT_ATTEMPTS,            CONFIGTYPE_8 },
2113   { CONFIGITEM_LOCKOUT_DURATION,            CONFIGTYPE_8 },
2114   { CONFIGITEM_KEYPAD_INACTIVITY,           CONFIGTYPE_8 },
2115   { CONFIGITEM_ICIDLE_DURATION,             CONFIGTYPE_8 },
2116   { CONFIGITEM_WRITE_DECLINED_LOG,          CONFIGTYPE_BOOL },
2117   { CONFIGITEM_LOW_BATTERY_INDICATOR,       CONFIGTYPE_BOOL },
2118   { CONFIGITEM_PANIC_MODE,                  CONFIGTYPE_BOOL },
2119   { CONFIGITEM_TIMEZONE_ENABLE,             CONFIGTYPE_BOOL },
2120   { CONFIGITEM_EXCEPTION_ENABLE,            CONFIGTYPE_BOOL },
2121   { CONFIGITEM_AUTOUNLOCK_ENABLE,           CONFIGTYPE_BOOL },
2122   { CONFIGITEM_LOCK_PRIORITY_EMERGENCY,     CONFIGTYPE_8 },
2123   { CONFIGITEM_LOCK_PRIORITY_SUPERVISOR,    CONFIGTYPE_8 },
2124   { CONFIGITEM_LOCK_PRIORITY_USER,          CONFIGTYPE_8 },
2125   { CONFIGITEM_LOCK_PRIORITY_PASSAGE,       CONFIGTYPE_8 },
2126   { CONFIGITEM_LOCK_PRIORITY_PANIC,         CONFIGTYPE_8 },
2127   { CONFIGITEM_LOCK_PRIORITY_LOCKOUT,       CONFIGTYPE_8 },
2128   { CONFIGITEM_LOCK_PRIORITY_RELOCK,        CONFIGTYPE_8 },
2129   { CONFIGITEM_LOCK_PRIORITY_BOLTTHROWN,    CONFIGTYPE_8 },
2130   { CONFIGITEM_LOCK_PRIORITY_CONFIGCHANGE,  CONFIGTYPE_8 },
2131   { CONFIGITEM_LOCK_PRIORITY_REMOTE,        CONFIGTYPE_8 },
2132   { CONFIGITEM_LOCK_TYPE,                   CONFIGTYPE_8 },
2133   { CONFIGITEM_DOUBLE_PULSE,                CONFIGTYPE_BOOL },
2134   { CONFIGITEM_DOUBLE_DELAY,                CONFIGTYPE_8 },
2135   { CONFIGITEM_MOTOR_DURATION,              CONFIGTYPE_8 },
2136   { CONFIGITEM_MORTISE_TYPE,                CONFIGTYPE_8 },
2137   { CONFIGITEM_UNLOCK_TIME,                 CONFIGTYPE_8 },
2138   { CONFIGITEM_EXT_UNLOCK_TIME,             CONFIGTYPE_8 },
2139   { CONFIGITEM_DOOR_AJAR_TIME,              CONFIGTYPE_8 },
2140   { CONFIGITEM_SESSION_TIMEOUT,             CONFIGTYPE_8 },
2141   { CONFIGITEM_RETRY_ON_TIMEOUT,            CONFIGTYPE_BOOL },
2142   { CONFIGITEM_UNSOLICITED_ENCRYPT,         CONFIGTYPE_8 },
2143   { CONFIGITEM_RMT_AUTH_TIMEOUT,            CONFIGTYPE_8 },
2144   { CONFIGITEM_RMT_AUTH_DEVICE,             CONFIGTYPE_8 },
2145   { CONFIGITEM_ALARM_DEVICE,                CONFIGTYPE_8 },
2146   { CONFIGITEM_NOTIFY_DEVICE,               CONFIGTYPE_8 },
2147   { CONFIGITEM_COMMUSER_DEVICE,             CONFIGTYPE_8 },
2148   { CONFIGITEM_SCHEDULER_DEVICE,            CONFIGTYPE_8 },
2149   { CONFIGITEM_SCHEDULER_TYPE,              CONFIGTYPE_8 },
2150   { CONFIGITEM_SCHEDULER_AWAKE,             CONFIGTYPE_8 },
2151   { CONFIGITEM_SCHEDULER_PERIOD,            CONFIGTYPE_16 },
2152   { CONFIGITEM_SCHEDULER_HOD,               CONFIGTYPE_STRING },
2153   { CONFIGITEM_SCHEDULER_DOW,               CONFIGTYPE_8 },
2154   { CONFIGITEM_SCHEDULER_DOM,               CONFIGTYPE_32 },
2155   { CONFIGITEM_SCHEDULER_HM1,               CONFIGTYPE_16 },
2156   { CONFIGITEM_SCHEDULER_HM2,               CONFIGTYPE_16 },
2157   { CONFIGITEM_SCHEDULER_HM3,               CONFIGTYPE_16 },
2158   { CONFIGITEM_SCHEDULER_HM4,               CONFIGTYPE_16 },
2159   { CONFIGITEM_RADIO_TYPE,                  CONFIGTYPE_8 },
2160   { CONFIGITEM_RADIO_MODE,                  CONFIGTYPE_8 },
2161   { CONFIGITEM_RADIO_TIMEOUT,               CONFIGTYPE_8 },
2162   { CONFIGITEM_RADIO_ATTEMPTS,              CONFIGTYPE_8 },
2163   { CONFIGITEM_RADIO_HOUSEKEEPING,          CONFIGTYPE_8 },
2164   { CONFIGITEM_RADIO_LEAPUSERNAME,          CONFIGTYPE_STRING },
2165   { CONFIGITEM_RADIO_LEAPPASSWORD,          CONFIGTYPE_STRING },
2166   { CONFIGITEM_INHIBIT_VOLTAGE,             CONFIGTYPE_8 },
2167   { CONFIGITEM_LOW_VOLTAGE,                 CONFIGTYPE_8 },
2168   { CONFIGITEM_PT_RANGE_1,                  CONFIGTYPE_8 },
2169   { CONFIGITEM_PT_RANGE_2,                  CONFIGTYPE_8 },
2170   { CONFIGITEM_PT_RANGE_3,                  CONFIGTYPE_8 },
2171   { CONFIGITEM_PT_RANGE_4,                  CONFIGTYPE_8 },
2172   { CONFIGITEM_PT_RANGE_5,                  CONFIGTYPE_8 },
2173   { CONFIGITEM_PT_RANGE_6,                  CONFIGTYPE_8 },
2174   { CONFIGITEM_PT_RANGE_7,                  CONFIGTYPE_8 },
2175   { CONFIGITEM_PT_RANGE_8,                  CONFIGTYPE_8 },
2176   { CONFIGITEM_MAGCARD_IFS,                 CONFIGTYPE_BOOL },
2177   { CONFIGITEM_MAGCARD_FIELDS,              CONFIGTYPE_8 },
2178   { CONFIGITEM_MAGCARD_OFFSET,              CONFIGTYPE_8 },
2179   { CONFIGITEM_MAGCARD_DIGITS,              CONFIGTYPE_8 },
2180   { CONFIGITEM_ALARMS,                      CONFIGTYPE_STRING },
2181   { CONFIGITEM_FILTERS,                     CONFIGTYPE_STRING },
2182   { CONFIGITEM_ALARMSTATE,                  CONFIGTYPE_8 },
2183   { CONFIGITEM_DOORSTATE,                   CONFIGTYPE_8 },
2184   { CONFIGITEM_DPACDEBUG,                   CONFIGTYPE_BOOL },
2185   { CONFIGITEM_FAILOPENSECURE,              CONFIGTYPE_BOOL },
2186   { CONFIGITEM_REPLACED_VOLTAGE,            CONFIGTYPE_8 },
2187   { CONFIGITEM_RX_HELD_TIME,                CONFIGTYPE_8 },
2188   { CONFIGITEM_PACKET_TIMEOUT,              CONFIGTYPE_8 },
2189   { CONFIGITEM_EXTENDEDRESPONSE,            CONFIGTYPE_BOOL },
2190   { CONFIGITEM_PASSAGEMODEINDICATOR,        CONFIGTYPE_BOOL },
2191   { CONFIGITEM_PFMRETURNTIME,               CONFIGTYPE_8 }
2192 };
2193
2194 /*
2195  *
2196  */
2197 static hf_register_info hf [] =
2198 {
2199   { &hf_r3_tildex3ds, { "DPAC Attention", "r3.dpac_attention", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2200
2201   { &hf_r3_header,  { "Header",   "r3.header",  FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2202   { &hf_r3_payload, { "Payload",  "r3.payload", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2203   { &hf_r3_tail,    { "Tail",     "r3.tail",    FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2204
2205   { &hf_r3_sigil,        { "Sigil",         "r3.sigil",        FT_UINT8,   BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2206   { &hf_r3_address,      { "Address",       "r3.address",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2207   { &hf_r3_packetnumber, { "Packet Number", "r3.packetnumber", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2208   { &hf_r3_packetlength, { "Packet Length", "r3.packetlength", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2209   { &hf_r3_encryption,   { "Crypt Type",    "r3.encryption",   FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_encryptionschemenames_ext, 0x0, NULL, HFILL }},
2210   { &hf_r3_crc,          { "CRC",           "r3.crc",          FT_UINT16,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2211   { &hf_r3_crc_bad,      { "Bad CRC",       "r3.crc_bad",      FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2212   { &hf_r3_xor,          { "XOR",           "r3.xor",          FT_UINT8,   BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2213   { &hf_r3_xor_bad,      { "Bad XOR",       "r3.xor_bad",      FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2214
2215   { &hf_r3_commandlength, { "Command Length", "r3.command.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2216   { &hf_r3_command,       { "Command",        "r3.command.command", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_cmdnames_ext, 0x0, NULL, HFILL }},
2217   { &hf_r3_commanddata,   { "Command Data",   "r3.command.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2218
2219   { &hf_r3_commandmfglength, { "Mfg Command Length", "r3.commandmfg.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2220   { &hf_r3_commandmfg,       { "Mfg Command",        "r3.commandmfg.command", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_cmdmfgnames_ext, 0x0, NULL, HFILL }},
2221   { &hf_r3_commandmfgdata,   { "Mfg Command Data",   "r3.commandmfg.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2222
2223   { &hf_r3_responselength,    { "Response Length",      "r3.response.length",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2224   { &hf_r3_responsecommand,   { "Response Command",     "r3.response.command",      FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_cmdnames_ext, 0x0, NULL, HFILL }},
2225   { &hf_r3_responsetype,      { "Response Type",        "r3.response.responsetype", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_responsetypenames_ext, 0x0, NULL, HFILL }},
2226   { &hf_r3_responsetocommand, { "Response To Command",  "r3.response.to_command",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_cmdnames_ext, 0x0, NULL, HFILL }},
2227   { &hf_r3_responsedata,      { "Response Data",        "r3.response.data",         FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2228
2229   { &hf_r3_upstreamcommand, { "Upstream Command", "r3.upstreamcommand.command", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_upstreamcommandnames_ext, 0x0, NULL, HFILL }},
2230
2231   { &hf_r3_upstreamfield,                                           { "Upstream Field",         "r3.upstreamfield",                     FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2232   { &hf_r3_upstreamfieldlength,                                     { "Field Length",           "r3.upstreamfield.length",              FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2233   { &hf_r3_upstreamfieldtype,                                       { "Field Type",             "r3.upstreamfield.type",                FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_upstreamfieldnames_ext, 0x0, NULL, HFILL }},
2234   { &hf_r3_upstreamfielddatalen,                                    { "Data Length",            "r3.upstreamfield.datalen",             FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2235   { &hf_r3_upstreamfielderror,                                      { "Error",                  "r3.upstreamfield.error",               FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2236   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_SERIALNUMBER],         { "Serial Number",          "r3.upstreamfield.serialnumber",        FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2237   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_NAR],                  { "Next Available Record",  "r3.upstreamfield.nar",                 FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2238   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ENTRYDEVICE],          { "Entry Device",           "r3.upstreamfield.entrydevice",         FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2239   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PPMIFIELDTYPE],        { "PPMI Field Type",        "r3.upstreamfield.ppmifieldtype",       FT_UINT8,   BASE_HEX_DEC|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2240   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PIN],                  { "PIN",                    "r3.upstreamfield.pin",                 FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2241   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_SEQUENCENUMBER],       { "Sequence Number",        "r3.upstreamfield.sequencenumber",      FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2242   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_RESPONSEWINDOW],       { "Response Window",        "r3.upstreamfield.responsewindow",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2243   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USERNUMBER],           { "User Number",            "r3.upstreamfield.usernumber",          FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2244   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_VERSION],              { "Version",                "r3.upstreamfield.version",             FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2245   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EVENTLOGRECORD],       { "Event Log Record",       "r3.upstreamfield.eventlogrecord",      FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2246   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DATETIME],             { "Date/Time",              "r3.upstreamfield.datetime",            FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2247   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EVENTLOGRECORDCOUNT],  { "Event Log Record Count", "r3.upstreamfield.eventlogrecordcount", FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2248   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DECLINEDRECORDCOUNT],  { "Declined Log Record",    "r3.upstreamfield.declinedlogrecord",   FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2249   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_DECLINEDRECORD],       { "Declined Log",           "r3.upstreamfield.declinedlog",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2250   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USERTYPE],             { "User Type",              "r3.upstreamfield.usertype",            FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_usertypenames_ext, 0x0, NULL, HFILL }},
2251   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ACCESSALWAYS],         { "Access Always",          "r3.upstreamfield.accessalways",        FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2252   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_CACHED],               { "Cached",                 "r3.upstreamfield.cached",              FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2253   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PRIMARYFIELDTYPE],     { "Primary Field Type",     "r3.upstreamfield.primaryfieldtype",    FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2254   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXFIELDTYPE],         { "Aux Field Type",         "r3.upstreamfield.auxfieldtype",        FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2255   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ACCESSMODE],           { "Access Mode",            "r3.upstreamfield.accessmode",          FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_accessmodenames_ext, 0x0, NULL, HFILL }},
2256   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EXPIREON],             { "Expire On",              "r3.upstreamfield.expireon",            FT_UINT24,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2257   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_USECOUNT],             { "Use Count",              "r3.upstreamfield.usecount",            FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2258   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_TIMEZONE],             { "Timezone",               "r3.upstreamfield.timezone",            FT_UINT32,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2259   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_EXCEPTIONGROUP],       { "Exception Group",        "r3.upstreamfield.exceptiongroup",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2260   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_PRIMARYPIN],           { "Primary PIN",            "r3.upstreamfield.primarypin",          FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2261   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXPIN],               { "Aux PIN",                "r3.upstreamfield.auxpin",              FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2262   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ALARMRECORDCOUNT],     { "Alarm Record Count",     "r3.upstreamfield.alarmrecordcount",    FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2263   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_ALARMRECORD],          { "Alarm Record",           "r3.upstreamfield.alarmrecord",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2264   { &hf_r3_upstreamfieldarray [UPSTREAMFIELD_AUXCTLRVERSION],       { "Aux Controller Version", "r3.upstreamfield.auxctlrversion",      FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2265
2266   { &hf_r3_configitems,           { "Configuration Item List",    "r3.configitems",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2267   { &hf_r3_configitem,            { "Configuration Item",         "r3.configitem",              FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_configitemnames_ext, 0x0, NULL, HFILL }},
2268   { &hf_r3_configfield,           { "Config Field",               "r3.configfield",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2269   { &hf_r3_configitemlength,      { "Configuration Item Length",  "r3.configitem.length",       FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2270   { &hf_r3_configitemtype,        { "Configuration Item Type",    "r3.configitem.type",         FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_configtypenames_ext, 0x0, NULL, HFILL }},
2271   { &hf_r3_configitemdata,        { "Configuration Item Data",    "r3.configitem.data",         FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2272   { &hf_r3_configitemdata_bool,   { "Configuration Item Boolean", "r3.configitem.data_boolean", FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2273   { &hf_r3_configitemdata_8,      { "Configuration Item 8-bit",   "r3.configitem.data_8",       FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2274   { &hf_r3_configitemdata_16,     { "Configuration Item 16-bit",  "r3.configitem.data_16",      FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2275   { &hf_r3_configitemdata_32,     { "Configuration Item 32-bit",  "r3.configitem.data_32",      FT_UINT32,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2276   { &hf_r3_configitemdata_string, { "Configuration Item String",  "r3.configitem.data_string",  FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2277
2278   { &hf_r3_timezonearray [ 0], { "Timezone  0", "r3.timezone.0",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
2279   { &hf_r3_timezonearray [ 1], { "Timezone  1", "r3.timezone.1",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
2280   { &hf_r3_timezonearray [ 2], { "Timezone  2", "r3.timezone.2",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
2281   { &hf_r3_timezonearray [ 3], { "Timezone  3", "r3.timezone.3",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
2282   { &hf_r3_timezonearray [ 4], { "Timezone  4", "r3.timezone.4",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
2283   { &hf_r3_timezonearray [ 5], { "Timezone  5", "r3.timezone.5",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
2284   { &hf_r3_timezonearray [ 6], { "Timezone  6", "r3.timezone.6",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
2285   { &hf_r3_timezonearray [ 7], { "Timezone  7", "r3.timezone.7",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000080, NULL, HFILL }},
2286   { &hf_r3_timezonearray [ 8], { "Timezone  8", "r3.timezone.8",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000100, NULL, HFILL }},
2287   { &hf_r3_timezonearray [ 9], { "Timezone  9", "r3.timezone.9",  FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000200, NULL, HFILL }},
2288   { &hf_r3_timezonearray [10], { "Timezone 10", "r3.timezone.10", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000400, NULL, HFILL }},
2289   { &hf_r3_timezonearray [11], { "Timezone 11", "r3.timezone.11", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00000800, NULL, HFILL }},
2290   { &hf_r3_timezonearray [12], { "Timezone 12", "r3.timezone.12", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00001000, NULL, HFILL }},
2291   { &hf_r3_timezonearray [13], { "Timezone 13", "r3.timezone.13", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00002000, NULL, HFILL }},
2292   { &hf_r3_timezonearray [14], { "Timezone 14", "r3.timezone.14", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00004000, NULL, HFILL }},
2293   { &hf_r3_timezonearray [15], { "Timezone 15", "r3.timezone.15", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00008000, NULL, HFILL }},
2294   { &hf_r3_timezonearray [16], { "Timezone 16", "r3.timezone.16", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00010000, NULL, HFILL }},
2295   { &hf_r3_timezonearray [17], { "Timezone 17", "r3.timezone.17", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00020000, NULL, HFILL }},
2296   { &hf_r3_timezonearray [18], { "Timezone 18", "r3.timezone.18", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00040000, NULL, HFILL }},
2297   { &hf_r3_timezonearray [19], { "Timezone 19", "r3.timezone.19", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00080000, NULL, HFILL }},
2298   { &hf_r3_timezonearray [20], { "Timezone 20", "r3.timezone.20", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00100000, NULL, HFILL }},
2299   { &hf_r3_timezonearray [21], { "Timezone 21", "r3.timezone.21", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00200000, NULL, HFILL }},
2300   { &hf_r3_timezonearray [22], { "Timezone 22", "r3.timezone.22", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00400000, NULL, HFILL }},
2301   { &hf_r3_timezonearray [23], { "Timezone 23", "r3.timezone.23", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x00800000, NULL, HFILL }},
2302   { &hf_r3_timezonearray [24], { "Timezone 24", "r3.timezone.24", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x01000000, NULL, HFILL }},
2303   { &hf_r3_timezonearray [25], { "Timezone 25", "r3.timezone.25", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x02000000, NULL, HFILL }},
2304   { &hf_r3_timezonearray [26], { "Timezone 26", "r3.timezone.26", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x04000000, NULL, HFILL }},
2305   { &hf_r3_timezonearray [27], { "Timezone 27", "r3.timezone.27", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x08000000, NULL, HFILL }},
2306   { &hf_r3_timezonearray [28], { "Timezone 28", "r3.timezone.28", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x10000000, NULL, HFILL }},
2307   { &hf_r3_timezonearray [29], { "Timezone 29", "r3.timezone.29", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x20000000, NULL, HFILL }},
2308   { &hf_r3_timezonearray [30], { "Timezone 30", "r3.timezone.30", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x40000000, NULL, HFILL }},
2309   { &hf_r3_timezonearray [31], { "Timezone 31", "r3.timezone.31", FT_BOOLEAN, 32, TFS (&tfs_enabled_disabled), 0x80000000, NULL, HFILL }},
2310
2311   { &hf_r3_expireon_year,  { "Expiration Year",  "r3.expireon.year",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2312   { &hf_r3_expireon_month, { "Expiration Month", "r3.expireon.month", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2313   { &hf_r3_expireon_day,   { "Expiration Day",   "r3.expireon.day",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2314
2315   { &hf_r3_datetime_year,    { "Date/Time Year",    "r3.datetime.year",    FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2316   { &hf_r3_datetime_month,   { "Date/Time Month",   "r3.datetime.month",   FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2317   { &hf_r3_datetime_day,     { "Date/Time Day",     "r3.datetime.day",     FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2318   { &hf_r3_datetime_dow,     { "Date/Time DOW",     "r3.datetime.dow",     FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_daynames_ext, 0x0, NULL, HFILL }},
2319   { &hf_r3_datetime_hours,   { "Date/Time Hours",   "r3.datetime.hours",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2320   { &hf_r3_datetime_minutes, { "Date/Time Minutes", "r3.datetime.minutes", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2321   { &hf_r3_datetime_seconds, { "Date/Time Seconds", "r3.datetime.seconds", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2322   { &hf_r3_datetime_dst,     { "Date/Time DST",     "r3.datetime.dst",     FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2323
2324   { &hf_r3_eventlog_recordnumber, { "Record Number", "r3.eventlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2325   { &hf_r3_eventlog_year,         { "Year",          "r3.eventlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2326   { &hf_r3_eventlog_month,        { "Month",         "r3.eventlog.month",        FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2327   { &hf_r3_eventlog_day,          { "Day",           "r3.eventlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2328   { &hf_r3_eventlog_hour,         { "Hours",         "r3.eventlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2329   { &hf_r3_eventlog_minute,       { "Minutes",       "r3.eventlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2330   { &hf_r3_eventlog_second,       { "Seconds",       "r3.eventlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2331   { &hf_r3_eventlog_usernumber,   { "User Number",   "r3.eventlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2332   { &hf_r3_eventlog_event,        { "ID",            "r3.eventlog.id",           FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_eventnames_ext, 0x0, NULL, HFILL }},
2333
2334   { &hf_r3_declinedlog_recordnumber, { "Record Number",     "r3.declinedlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2335   { &hf_r3_declinedlog_year,         { "Year",              "r3.declinedlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2336   { &hf_r3_declinedlog_month,        { "Month",             "r3.declinedlog.month",        FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2337   { &hf_r3_declinedlog_day,          { "Day",               "r3.declinedlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2338   { &hf_r3_declinedlog_hour,         { "Hours",             "r3.declinedlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2339   { &hf_r3_declinedlog_minute,       { "Minutes",           "r3.declinedlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2340   { &hf_r3_declinedlog_second,       { "Seconds",           "r3.declinedlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2341   { &hf_r3_declinedlog_usernumber,   { "User Number",       "r3.declinedlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2342   { &hf_r3_declinedlog_cred1type,    { "Credential 1 Type", "r3.declinedlog.cred1type",    FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_fieldtypenames_ext, 0x0, NULL, HFILL }},
2343   { &hf_r3_declinedlog_cred2type,    { "Credential 2 Type", "r3.declinedlog.cred2type",    FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_fieldtypenames_ext, 0x0, NULL, HFILL }},
2344   { &hf_r3_declinedlog_cred1,        { "Credential 1",      "r3.declinedlog.cred1",        FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2345   { &hf_r3_declinedlog_cred2,        { "Credential 2",      "r3.declinedlog.cred2",        FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2346
2347   { &hf_r3_alarmlog_recordnumber, { "Record Number", "r3.alarmlog.recordnumber", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2348   { &hf_r3_alarmlog_year,         { "Year",          "r3.alarmlog.year",         FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2349   { &hf_r3_alarmlog_month,        { "Month",         "r3.alarmlog.month",        FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2350   { &hf_r3_alarmlog_day,          { "Day",           "r3.alarmlog.day",          FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2351   { &hf_r3_alarmlog_hour,         { "Hours",         "r3.alarmlog.hours",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2352   { &hf_r3_alarmlog_minute,       { "Minutes",       "r3.alarmlog.minutes",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2353   { &hf_r3_alarmlog_second,       { "Seconds",       "r3.alarmlog.seconds",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2354   { &hf_r3_alarmlog_id,           { "ID",            "r3.alarmlog.id",           FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_alarmidnames_ext, 0x0, NULL, HFILL }},
2355   { &hf_r3_alarmlog_usernumber,   { "User Number",   "r3.alarmlog.usernumber",   FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2356
2357   { &hf_r3_debugmsg, { "Debug Message", "r3.debug", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2358
2359   { &hf_r3_setdate_year,    { "Year",        "r3.setdate.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2360   { &hf_r3_setdate_month,   { "Month",       "r3.setdate.month",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2361   { &hf_r3_setdate_day,     { "Day",         "r3.setdate.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2362   { &hf_r3_setdate_dow,     { "Day-Of-Week", "r3.setdate.dow",     FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_daynames_ext, 0x0, NULL, HFILL }},
2363   { &hf_r3_setdate_hours,   { "Hours",       "r3.setdate.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2364   { &hf_r3_setdate_minutes, { "Minutes",     "r3.setdate.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2365   { &hf_r3_setdate_seconds, { "Seconds",     "r3.setdate.seconds", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2366
2367   { &hf_r3_deleteusers, { "Delete Users", "r3.deleteusers", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_deleteusersnames_ext, 0x0, NULL, HFILL }},
2368
2369   { &hf_r3_defineexception_number,            { "Exception Number", "r3.defineexception.number",        FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2370   { &hf_r3_defineexception_startdate_month,   { "Start Month",      "r3.defineexception.start.month",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2371   { &hf_r3_defineexception_startdate_day,     { "Start Day",        "r3.defineexception.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2372   { &hf_r3_defineexception_startdate_hours,   { "Start Hours",      "r3.defineexception.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2373   { &hf_r3_defineexception_startdate_minutes, { "Start Minutes",    "r3.defineexception.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2374   { &hf_r3_defineexception_enddate_month,     { "End Month",        "r3.defineexception.end.month",     FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2375   { &hf_r3_defineexception_enddate_day,       { "End Day",          "r3.defineexception.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2376   { &hf_r3_defineexception_enddate_hours,     { "End Hours",        "r3.defineexception.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2377   { &hf_r3_defineexception_enddate_minutes,   { "End Minutes",      "r3.defineexception.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2378
2379   { &hf_r3_defineexceptiongroup_number, { "Define Exception Group Number",    "r3.defineexceptiongroup.number", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2380   { &hf_r3_defineexceptiongroup_bits,   { "Define Exception Group Bit Field", "r3.defineexceptiongroup.field",  FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2381
2382   { &hf_r3_definecalendar_number, { "Define Calendar Number",    "r3.definecalendar.number", FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2383   { &hf_r3_definecalendar_bits,   { "Define Calendar Bit Field", "r3.definecalendar.field",  FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2384
2385   { &hf_r3_definetimezone_number,            { "Timezone Number",  "r3.definetimezone.number",           FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2386   { &hf_r3_definetimezone_starttime_hours,   { "Start Hours",      "r3.definetimezone.start.hours",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2387   { &hf_r3_definetimezone_starttime_minutes, { "Start Minutes",    "r3.definetimezone.start.minutes",    FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2388   { &hf_r3_definetimezone_endtime_hours,     { "End Hours",        "r3.definetimezone.end.hours",        FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2389   { &hf_r3_definetimezone_endtime_minutes,   { "End Minutes",      "r3.definetimezone.end.minutes",      FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2390   { &hf_r3_definetimezone_daymap [0],        { "Sunday",           "r3.definetimezone.daymap.sunday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
2391   { &hf_r3_definetimezone_daymap [1],        { "Monday",           "r3.definetimezone.daymap.monday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
2392   { &hf_r3_definetimezone_daymap [2],        { "Tuesday",          "r3.definetimezone.daymap.tuesday",   FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
2393   { &hf_r3_definetimezone_daymap [3],        { "Wednesday",        "r3.definetimezone.daymap.wednesday", FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
2394   { &hf_r3_definetimezone_daymap [4],        { "Thursday",         "r3.definetimezone.daymap.thursday",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
2395   { &hf_r3_definetimezone_daymap [5],        { "Friday",           "r3.definetimezone.daymap.friday",    FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
2396   { &hf_r3_definetimezone_daymap [6],        { "Saturday",         "r3.definetimezone.daymap.saturday",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
2397   { &hf_r3_definetimezone_exceptiongroup,    { "Exception Group",  "r3.definetimezone.exceptiongroup",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2398   { &hf_r3_definetimezone_mode,              { "Mode",             "r3.definetimezone.mode",             FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_timezonemodenames_ext, 0x0, NULL, HFILL }},
2399   { &hf_r3_definetimezone_calendar,          { "Calendar",         "r3.definetimezone.calendar",         FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2400
2401   { &hf_r3_rmtauthretry_sequence, { "Remote Auth Retry Sequence",  "r3.rmtauthretry.sequence",  FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2402   { &hf_r3_rmtauthretry_retry,    { "Remote Auth Retry Mode",      "r3.rmtauthretry.mode",      FT_BOOLEAN, 8, TFS (&tfs_rmtauthretry_flags), 0x0, NULL, HFILL }},
2403
2404   { &hf_r3_eventlogdump_starttime_year,    { "Start Year",    "r3.eventlogdump.start.year",     FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2405   { &hf_r3_eventlogdump_starttime_month,   { "Start Month",   "r3.eventlogdump.start.month",    FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2406   { &hf_r3_eventlogdump_starttime_day,     { "Start Day",     "r3.eventlogdump.start.day",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2407   { &hf_r3_eventlogdump_starttime_hours,   { "Start Hours",   "r3.eventlogdump.start.hours",    FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2408   { &hf_r3_eventlogdump_starttime_minutes, { "Start Minutes", "r3.eventlogdump.start.minutes",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2409   { &hf_r3_eventlogdump_endtime_year,      { "End Year",      "r3.eventlogdump.end.year",       FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2410   { &hf_r3_eventlogdump_endtime_month,     { "End Month",     "r3.eventlogdump.end.month",      FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2411   { &hf_r3_eventlogdump_endtime_day,       { "End Day",       "r3.eventlogdump.end.day",        FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2412   { &hf_r3_eventlogdump_endtime_hours,     { "End Hours",     "r3.eventlogdump.end.hours",      FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2413   { &hf_r3_eventlogdump_endtime_minutes,   { "End Minutes",   "r3.eventlogdump.end.minutes",    FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2414   { &hf_r3_eventlogdump_user,              { "Filter User",   "r3.eventlogdump.user",           FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2415
2416   { &hf_r3_declinedlogdump_starttime_year,    { "Start Year",    "r3.declinedlogdump.start.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2417   { &hf_r3_declinedlogdump_starttime_month,   { "Start Month",   "r3.declinedlogdump.start.month",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2418   { &hf_r3_declinedlogdump_starttime_day,     { "Start Day",     "r3.declinedlogdump.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2419   { &hf_r3_declinedlogdump_starttime_hours,   { "Start Hours",   "r3.declinedlogdump.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2420   { &hf_r3_declinedlogdump_starttime_minutes, { "Start Minutes", "r3.declinedlogdump.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2421   { &hf_r3_declinedlogdump_endtime_year,      { "End Year",      "r3.declinedlogdump.end.year",      FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2422   { &hf_r3_declinedlogdump_endtime_month,     { "End Month",     "r3.declinedlogdump.end.month",     FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2423   { &hf_r3_declinedlogdump_endtime_day,       { "End Day",       "r3.declinedlogdump.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2424   { &hf_r3_declinedlogdump_endtime_hours,     { "End Hours",     "r3.declinedlogdump.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2425   { &hf_r3_declinedlogdump_endtime_minutes,   { "End Minutes",   "r3.declinedlogdump.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2426
2427   { &hf_r3_alarmlogdump_starttime_year,    { "Start Year",    "r3.alarmlogdump.start.year",    FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2428   { &hf_r3_alarmlogdump_starttime_month,   { "Start Month",   "r3.alarmlogdump.start.month",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2429   { &hf_r3_alarmlogdump_starttime_day,     { "Start Day",     "r3.alarmlogdump.start.day",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2430   { &hf_r3_alarmlogdump_starttime_hours,   { "Start Hours",   "r3.alarmlogdump.start.hours",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2431   { &hf_r3_alarmlogdump_starttime_minutes, { "Start Minutes", "r3.alarmlogdump.start.minutes", FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2432   { &hf_r3_alarmlogdump_endtime_year,      { "End Year",      "r3.alarmlogdump.end.year",      FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2433   { &hf_r3_alarmlogdump_endtime_month,     { "End Month",     "r3.alarmlogdump.end.month",     FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_monthnames_ext, 0x0, NULL, HFILL }},
2434   { &hf_r3_alarmlogdump_endtime_day,       { "End Day",       "r3.alarmlogdump.end.day",       FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2435   { &hf_r3_alarmlogdump_endtime_hours,     { "End Hours",     "r3.alarmlogdump.end.hours",     FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2436   { &hf_r3_alarmlogdump_endtime_minutes,   { "End Minutes",   "r3.alarmlogdump.end.minutes",   FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2437
2438   { &hf_r3_nvramclearoptions [ 0], { "NVRAMCLEAROPTIONS_CFGINSTALLER",    "r3.nvramclear.cfginstaller",    FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000001, NULL, HFILL }},
2439   { &hf_r3_nvramclearoptions [ 1], { "NVRAMCLEAROPTIONS_CFGADMIN",        "r3.nvramclear.cfgadmin",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000002, NULL, HFILL }},
2440   { &hf_r3_nvramclearoptions [ 2], { "NVRAMCLEAROPTIONS_EXCEPTIONS",      "r3.nvramclear.exceptions",      FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000004, NULL, HFILL }},
2441   { &hf_r3_nvramclearoptions [ 3], { "NVRAMCLEAROPTIONS_EXCEPTIONGROUPS", "r3.nvramclear.exceptiongroups", FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000008, NULL, HFILL }},
2442   { &hf_r3_nvramclearoptions [ 4], { "NVRAMCLEAROPTIONS_CALENDARS",       "r3.nvramclear.calendars",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000010, NULL, HFILL }},
2443   { &hf_r3_nvramclearoptions [ 5], { "NVRAMCLEAROPTIONS_TIMEZONES",       "r3.nvramclear.timezones",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000020, NULL, HFILL }},
2444   { &hf_r3_nvramclearoptions [ 6], { "NVRAMCLEAROPTIONS_FILTERS",         "r3.nvramclear.filters",         FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000040, NULL, HFILL }},
2445   { &hf_r3_nvramclearoptions [ 7], { "NVRAMCLEAROPTIONS_EVENTLOG",        "r3.nvramclear.eventlog",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000080, NULL, HFILL }},
2446   { &hf_r3_nvramclearoptions [ 8], { "NVRAMCLEAROPTIONS_USERDATA",        "r3.nvramclear.userdata",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000100, NULL, HFILL }},
2447   { &hf_r3_nvramclearoptions [ 9], { "NVRAMCLEAROPTIONS_DECLINEDLOG",     "r3.nvramclear.declinedlog",     FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000200, NULL, HFILL }},
2448   { &hf_r3_nvramclearoptions [10], { "NVRAMCLEAROPTIONS_ALARMLOG",        "r3.nvramclear.alarmlog",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000400, NULL, HFILL }},
2449   { &hf_r3_nvramclearoptions [11], { "NVRAMCLEAROPTIONS_LRUCACHE",        "r3.nvramclear.lrucache",        FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00000800, NULL, HFILL }},
2450   { &hf_r3_nvramclearoptions [12], { "NVRAMCLEAROPTIONS_DBHASH",          "r3.nvramclear.dbhash",          FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00001000, NULL, HFILL }},
2451   { &hf_r3_nvramclearoptions [13], { "NVRAMCLEAROPTIONS_CFGSYSTEM",       "r3.nvramclear.cfgsystem",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00002000, NULL, HFILL }},
2452   { &hf_r3_nvramclearoptions [14], { "NVRAMCLEAROPTIONS_UNUSED",          "r3.nvramclear.unused",          FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00004000, NULL, HFILL }},
2453   { &hf_r3_nvramclearoptions [15], { "NVRAMCLEAROPTIONS_USEBACKUP",       "r3.nvramclear.usebackup",       FT_BOOLEAN, 16, TFS (&tfs_enabled_disabled), 0x00008000, NULL, HFILL }},
2454
2455   { &hf_r3_writeeventlog_user,  { "User",  "r3.writeeventlog.user",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2456   { &hf_r3_writeeventlog_event, { "Event", "r3.writeeventlog.event", FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_eventnames_ext, 0x0, NULL, HFILL }},
2457
2458   { &hf_r3_powertableselection, { "Table", "r3.powertableselection", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_powertablenames_ext, 0x0, NULL, HFILL }},
2459
2460   { &hf_r3_filter_type, { "Type",  "r3.filter.type",  FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_filtertypenames_ext, 0x0, NULL, HFILL }},
2461   { &hf_r3_filter_list, { "Event", "r3.filter.event", FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_filtereventnames_ext, 0x0, NULL, HFILL }},
2462
2463   { &hf_r3_alarm_length, { "Length", "r3.alarm.length", FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2464   { &hf_r3_alarm_id,     { "ID",     "r3.alarm.id",     FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_alarmidnames_ext, 0x0, NULL, HFILL }},
2465   { &hf_r3_alarm_state,  { "State",  "r3.alarm.state",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x0, NULL, HFILL }},
2466
2467   { &hf_r3_mfgfield_length, { "Field Length", "r3.mfgfield.length",  FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2468   { &hf_r3_mfgfield,        { "Field",        "r3.mfgfield.field",   FT_UINT8, BASE_DEC_HEX|BASE_EXT_STRING, &r3_mfgfieldnames_ext, 0x0, NULL, HFILL }},
2469   { &hf_r3_mfgfield_data,   { "Field Data",   "r3.mfgfield.data",    FT_NONE,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2470
2471   { &hf_r3_mfgsetserialnumber, { "Serial Number", "r3.mfgsetserialnumber", FT_STRING, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2472   { &hf_r3_mfgsetcryptkey,     { "Crypt Key",     "r3.mfgsetcryptkey",     FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2473   { &hf_r3_mfgdumpnvram,       { "NVRAM Section", "r3.mfgnvramdump",       FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_mfgnvramdumpnames_ext, 0x0, NULL, HFILL }},
2474   { &hf_r3_mfgremoteunlock,    { "Remote Unlock", "r3.mfgremoteunlock",    FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_mfgremoteunlocknames_ext, 0x0, NULL, HFILL }},
2475   { &hf_r3_mfgtestpreserve,    { "Preserve Mode", "r3.mfgtestpreserve",    FT_UINT8,  BASE_DEC_HEX|BASE_EXT_STRING, &r3_mfgtestpreservenames_ext, 0x0, NULL, HFILL }},
2476
2477   { &hf_r3_adc [0], { "ADC 0", "r3.adc.0", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2478   { &hf_r3_adc [1], { "ADC 1", "r3.adc.1", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2479   { &hf_r3_adc [2], { "ADC 2", "r3.adc.2", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2480   { &hf_r3_adc [3], { "ADC 3", "r3.adc.3", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2481   { &hf_r3_adc [4], { "ADC 4", "r3.adc.4", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2482   { &hf_r3_adc [5], { "ADC 5", "r3.adc.5", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2483   { &hf_r3_adc [6], { "ADC 6", "r3.adc.6", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2484   { &hf_r3_adc [7], { "ADC 7", "r3.adc.7", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2485
2486   { &hf_r3_hardwareid_board,  { "Board ID", "r3.hardwareid.board",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2487   { &hf_r3_hardwareid_cpuid,  { "CPU ID",   "r3.hardwareid.cpuid",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2488   { &hf_r3_hardwareid_cpurev, { "CPU Rev",  "r3.hardwareid.cpurev", FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2489
2490   { &hf_r3_testkeypad,   { "Keypad Char",  "r3.test.keypad",   FT_UINT8,  BASE_HEX,  NULL, 0x0, NULL, HFILL }},
2491   { &hf_r3_testmagcard,  { "Mag Card",     "r3.test.magcard",  FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2492   { &hf_r3_testproxcard, { "Prox Card",    "r3.test.proxcard", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2493
2494   { &hf_r3_nvramdump_record, { "Record Number", "r3.nvramdump.record",  FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2495   { &hf_r3_nvramdump_length, { "Record Length", "r3.nvramdump.length",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2496   { &hf_r3_nvramdump_data,   { "Record Data",   "r3.nvramdump.data",    FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2497
2498   { &hf_r3_nvramdumprle_record, { "Record Number", "r3.nvramdumprle.record",  FT_UINT24, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2499   { &hf_r3_nvramdumprle_length, { "Record Length", "r3.nvramdumprle.length",  FT_UINT8,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2500   { &hf_r3_nvramdumprle_data,   { "Record Data",   "r3.nvramdumprle.data",    FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2501
2502   { &hf_r3_iopins_lat,  { "LAT",  "r3.iopins.lat",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2503   { &hf_r3_iopins_port, { "PORT", "r3.iopins.port",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2504   { &hf_r3_iopins_tris, { "TRIS", "r3.iopins.tris",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2505
2506   { &hf_r3_mortisepins_s1, { "Mortise Pin S1", "r3.mortisepins.s1", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000001, NULL, HFILL }},
2507   { &hf_r3_mortisepins_s2, { "Mortise Pin S2", "r3.mortisepins.s2", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000002, NULL, HFILL }},
2508   { &hf_r3_mortisepins_s3, { "Mortise Pin S3", "r3.mortisepins.s3", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000004, NULL, HFILL }},
2509   { &hf_r3_mortisepins_s4, { "Mortise Pin S4", "r3.mortisepins.s4", FT_BOOLEAN, 8, TFS (&tfs_mortisepins_flags), 0x00000008, NULL, HFILL }},
2510
2511   { &hf_r3_checksumresults ,       { "Checksum Results", "r3.checksumresults",        FT_NONE,    BASE_NONE, NULL, 0x0, NULL, HFILL }},
2512   { &hf_r3_checksumresults_field,  { "Field",            "r3.checksumresults.field",  FT_UINT8,   BASE_HEX|BASE_EXT_STRING, & r3_checksumresultnames_ext, 0x0, NULL, HFILL }},
2513   { &hf_r3_checksumresults_length, { "Length",           "r3.checksumresults.length", FT_UINT8,   BASE_HEX,  NULL, 0x0, NULL, HFILL }},
2514   { &hf_r3_checksumresults_state,  { "State",            "r3.checksumresults.state",  FT_BOOLEAN, 8,         TFS (&tfs_errornoerror_flags), 0x0, NULL, HFILL }},
2515
2516   { &hf_r3_forceoptions_item,      { "Item",   "r3.forceoptions.item",   FT_UINT8,   BASE_HEX_DEC|BASE_EXT_STRING, &r3_forceitemnames_ext, 0x0, NULL, HFILL }},
2517   { &hf_r3_forceoptions_length,    { "Length", "r3.forceoptions.length", FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2518   { &hf_r3_forceoptions_state_8,   { "State",  "r3.forceoptions.state",  FT_BOOLEAN, 8,            TFS (&tfs_enabled_disabled), 0x0, NULL, HFILL }},
2519   { &hf_r3_forceoptions_state_16,  { "State",  "r3.forceoptions.state",  FT_UINT16,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2520   { &hf_r3_forceoptions_state_24,  { "State",  "r3.forceoptions.state",  FT_UINT24,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2521   { &hf_r3_forceoptions_state_32,  { "State",  "r3.forceoptions.state",  FT_UINT32,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2522
2523   { &hf_r3_peekpoke_operation,  { "Operation",    "r3.peekpoke.operation",  FT_UINT8,  BASE_HEX_DEC|BASE_EXT_STRING, &r3_peekpokenames_ext, 0x0, NULL, HFILL }},
2524   { &hf_r3_peekpoke_address,    { "Address",      "r3.peekpoke.address",    FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2525   { &hf_r3_peekpoke_length,     { "Length",       "r3.peekpoke.length",     FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2526   { &hf_r3_peekpoke_poke8,      { "8 Bit Value",  "r3.peekpoke.poke8",      FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2527   { &hf_r3_peekpoke_poke16,     { "16 Bit Value", "r3.peekpoke.poke16",     FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2528   { &hf_r3_peekpoke_poke24,     { "24 Bit Value", "r3.peekpoke.poke24",     FT_UINT24, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2529   { &hf_r3_peekpoke_poke32,     { "32 Bit Value", "r3.peekpoke.poke32",     FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2530   { &hf_r3_peekpoke_pokestring, { "String Value", "r3.peekpoke.pokestring", FT_BYTES,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2531
2532   { &hf_r3_firmwaredownload_length,  { "Length",        "r3.firmwaredownload.length",  FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2533   { &hf_r3_firmwaredownload_record,  { "Record Number", "r3.firmwaredownload.record",  FT_UINT16,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2534   { &hf_r3_firmwaredownload_action,  { "Action",        "r3.firmwaredownload.action",  FT_UINT8,   BASE_HEX_DEC|BASE_EXT_STRING, &r3_downloadfirmwarenames_ext, 0x0, NULL, HFILL }},
2535   { &hf_r3_firmwaredownload_timeout, { "Timeout",       "r3.firmwaredownload.timeout", FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2536   { &hf_r3_firmwaredownload_nvram,   { "NVRAM",         "r3.firmwaredownload.nvram",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2537   { &hf_r3_firmwaredownload_address, { "Address",       "r3.firmwaredownload.address", FT_UINT32,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2538   { &hf_r3_firmwaredownload_bytes,   { "Bytes",         "r3.firmwaredownload.bytes",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2539   { &hf_r3_firmwaredownload_data,    { "Data",          "r3.firmwaredownload.data",    FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2540   { &hf_r3_firmwaredownload_crc,     { "CRC",           "r3.firmwaredownload.crc",     FT_UINT16,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2541   { &hf_r3_firmwaredownload_crc_bad, { "Bad CRC",       "r3.firmwaredownload.crc_bad", FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2542
2543   { &hf_r3_nvramchecksumvalue,       { "Value", "r3.nvramchecksum.value", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2544   { &hf_r3_nvramchecksumvalue_fixup, { "Fixup", "r3.nvramchecksum.fixup", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
2545
2546   { &hf_r3_capabilities,        { "Capability", "r3.capabilities",      FT_NONE,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2547   { &hf_r3_capabilities_length, { "Length",     "r3.capabilities.length", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2548   { &hf_r3_capabilities_type,   { "Type",       "r3.capabilities.type",   FT_UINT8,  BASE_HEX_DEC|BASE_EXT_STRING, &r3_capabilitiesnames_ext, 0x0, NULL, HFILL }},
2549   { &hf_r3_capabilities_value,  { "Value",      "r3.capabilities.value",  FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2550
2551   { &hf_r3_lockstate_passage,            { "Passage",              "r3.lockstate.passage",            FT_BOOLEAN, 24, NULL, 0x00000001, NULL, HFILL }},
2552   { &hf_r3_lockstate_panic,              { "Panic",                "r3.lockstate.panic",              FT_BOOLEAN, 24, NULL, 0x00000002, NULL, HFILL }},
2553   { &hf_r3_lockstate_lockout,            { "Lockout",              "r3.lockstate.lockout",            FT_BOOLEAN, 24, NULL, 0x00000004, NULL, HFILL }},
2554   { &hf_r3_lockstate_relock,             { "Relock",               "r3.lockstate.relock",             FT_BOOLEAN, 24, NULL, 0x00000008, NULL, HFILL }},
2555   { &hf_r3_lockstate_autoopen,           { "Auto Open",            "r3.lockstate.autoopen",           FT_BOOLEAN, 24, NULL, 0x00000010, NULL, HFILL }},
2556   { &hf_r3_lockstate_nextauto,           { "Next Auto",            "r3.lockstate.nextauto",           FT_BOOLEAN, 24, NULL, 0x00000020, NULL, HFILL }},
2557   { &hf_r3_lockstate_lockstate,          { "Lock State",           "r3.lockstate.lockstate",          FT_BOOLEAN, 24, NULL, 0x00000040, NULL, HFILL }},
2558   { &hf_r3_lockstate_wantstate,          { "Want State",           "r3.lockstate.wantstate",          FT_BOOLEAN, 24, NULL, 0x00000080, NULL, HFILL }},
2559   { &hf_r3_lockstate_remote,             { "Remote",               "r3.lockstate.remote",             FT_BOOLEAN, 24, NULL, 0x00000100, NULL, HFILL }},
2560   { &hf_r3_lockstate_update,             { "Update",               "r3.lockstate.update",             FT_BOOLEAN, 24, NULL, 0x00000200, NULL, HFILL }},
2561   { &hf_r3_lockstate_exceptionspresent,  { "Exceptions Present",   "r3.lockstate.exceptionspresent",  FT_BOOLEAN, 24, NULL, 0x00000400, NULL, HFILL }},
2562   { &hf_r3_lockstate_exceptionsactive,   { "Exceptions Active",    "r3.lockstate.exceptionsactive",   FT_BOOLEAN, 24, NULL, 0x00000800, NULL, HFILL }},
2563   { &hf_r3_lockstate_timezonespresent,   { "Timezones Presents",   "r3.lockstate.timezonespresent",   FT_BOOLEAN, 24, NULL, 0x00001000, NULL, HFILL }},
2564   { &hf_r3_lockstate_timezonesactive,    { "Timezones Active",     "r3.lockstate.timezonesactive",    FT_BOOLEAN, 24, NULL, 0x00002000, NULL, HFILL }},
2565   { &hf_r3_lockstate_autounlockspresent, { "Auto Unlocks Present", "r3.lockstate.autounlockspresent", FT_BOOLEAN, 24, NULL, 0x00004000, NULL, HFILL }},
2566   { &hf_r3_lockstate_autounlocksactive,  { "Auto Unlocks Active",  "r3.lockstate.autounlocksactive",  FT_BOOLEAN, 24, NULL, 0x00008000, NULL, HFILL }},
2567   { &hf_r3_lockstate_uapmspresent,       { "UAPMs Present",        "r3.lockstate.uapmspresent",       FT_BOOLEAN, 24, NULL, 0x00010000, NULL, HFILL }},
2568   { &hf_r3_lockstate_uapmsactive,        { "UAPMs Active",         "r3.lockstate.uapmsactive",        FT_BOOLEAN, 24, NULL, 0x00020000, NULL, HFILL }},
2569   { &hf_r3_lockstate_uapmrelockspresent, { "UAPM Relocks Present", "r3.lockstate.uapmrelockspresent", FT_BOOLEAN, 24, NULL, 0x00040000, NULL, HFILL }},
2570   { &hf_r3_lockstate_uapmreslocksactive, { "UAPM Relocks Active",  "r3.lockstate.uapmreslocksactive", FT_BOOLEAN, 24, NULL, 0x00080000, NULL, HFILL }},
2571   { &hf_r3_lockstate_nvramprotect,       { "NVRAM Protect",        "r3.lockstate.nvramprotect",       FT_BOOLEAN, 24, NULL, 0x00100000, NULL, HFILL }},
2572   { &hf_r3_lockstate_nvramchecksum,      { "MVRAM Checksum",       "r3.lockstate.nvramchecksum",      FT_BOOLEAN, 24, NULL, 0x00200000, NULL, HFILL }},
2573
2574   { &hf_r3_mortisestatelog,             { "Mortise State Log",       "r3.mortisestatelog",             FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2575   { &hf_r3_mortisestatelog_pointer,     { "Event Pointer",           "r3.mortisestatelog.pointer",     FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2576   { &hf_r3_mortisestatelog_mortisetype, { "Mortise Type",            "r3.mortisestatelog.mortisetype", FT_UINT8,   BASE_HEX_DEC|BASE_EXT_STRING, &r3_mortisetypenames_ext, 0x0, NULL, HFILL }},
2577   { &hf_r3_mortisestatelog_waiting,     { "Waiting For Door Closed", "r3.mortisestatelog.waiting",     FT_BOOLEAN, 8,            TFS (&tfs_true_false ), 0x00, NULL, HFILL }},
2578   { &hf_r3_mortisestatelog_state,       { "State",                   "r3.mortisestatelog.state",       FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2579   { &hf_r3_mortisestatelog_last,        { "Last State",              "r3.mortisestatelog.laststate",   FT_UINT8,   BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2580   { &hf_r3_mortisestatelog_event,       { "Event",                   "r3.mortisestatelog.event",       FT_UINT8,   BASE_HEX_DEC|BASE_EXT_STRING, &r3_mortiseeventnames_ext, 0x0, NULL, HFILL }},
2581
2582   { &hf_r3_timerchain_newtick,         { "New Tick",         "r3.timerchain.newtick",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2583   { &hf_r3_timerchain_currentboundary, { "Current Boundary", "r3.timerchain.currentboundary", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2584   { &hf_r3_timerchain_tasktag,         { "Task Tag",         "r3.timerchain.tasktag",         FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2585   { &hf_r3_timerchain_address,         { "Address",          "r3.timerchain.address",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2586   { &hf_r3_timerchain_reload,          { "Reload",           "r3.timerchain.reload",          FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2587   { &hf_r3_timerchain_boundary,        { "Boundary",         "r3.timerchain.boundary",        FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2588   { &hf_r3_timerchain_count,           { "Count",            "r3.timerchain.count",           FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2589   { &hf_r3_timerchain_flags,           { "Flags",            "r3.timerchain.flags",           FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2590
2591   { &hf_r3_taskflags_taskid, { "Task ID", "r3.taskflags.taskid", FT_UINT8,  BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2592   { &hf_r3_taskflags_flags,  { "Flags",   "r3.taskflags.flags",  FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2593
2594   { &hf_r3_checkpointlog_entryptr,   { "Entry Pointer", "r3.checkpointlog.entrypointer",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2595   { &hf_r3_checkpointlog_rcon,       { "RCON",          "r3.checkpointlog.rcon",          FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2596   { &hf_r3_checkpointlog_checkpoint, { "Checkpoint",    "r3.checkpointlog.checkpoint",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2597
2598   { &hf_r3_cpuregisters_intcon,  { "INTCON",  "r3.cpuregisters.intcon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2599   { &hf_r3_cpuregisters_intcon2, { "INTCON2", "r3.cpuregisters.intcon2", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2600   { &hf_r3_cpuregisters_intcon3, { "INTCON3", "r3.cpuregisters.intcon3", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2601   { &hf_r3_cpuregisters_pir1,    { "PIR1",    "r3.cpuregisters.pir1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2602   { &hf_r3_cpuregisters_pir2,    { "PIR2",    "r3.cpuregisters.pir2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2603   { &hf_r3_cpuregisters_pir3,    { "PIR3",    "r3.cpuregisters.pir3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2604   { &hf_r3_cpuregisters_pie1,    { "PIE1",    "r3.cpuregisters.pie1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2605   { &hf_r3_cpuregisters_pie2,    { "PIE2",    "r3.cpuregisters.pie2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2606   { &hf_r3_cpuregisters_pie3,    { "PIE3",    "r3.cpuregisters.pie3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2607   { &hf_r3_cpuregisters_ipr1,    { "IPR1",    "r3.cpuregisters.ipr1",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2608   { &hf_r3_cpuregisters_ipr2,    { "IPR2",    "r3.cpuregisters.ipr2",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2609   { &hf_r3_cpuregisters_ipr3,    { "IPR3",    "r3.cpuregisters.ipr3",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2610   { &hf_r3_cpuregisters_rcon,    { "RCON",    "r3.cpuregisters.rcon",    FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2611   { &hf_r3_cpuregisters_osccon,  { "OSCCON",  "r3.cpuregisters.osccon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2612   { &hf_r3_cpuregisters_rcsta,   { "RCSTA",   "r3.cpuregisters.rcsta",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2613   { &hf_r3_cpuregisters_txsta,   { "TXSTA",   "r3.cpuregisters.txsta",   FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2614   { &hf_r3_cpuregisters_rcsta2,  { "RCSTA2",  "r3.cpuregisters.rcsta2",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2615   { &hf_r3_cpuregisters_txsta2,  { "TXSTA2",  "r3.cpuregisters.txsta2",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2616   { &hf_r3_cpuregisters_wdtcon,  { "WDTCON",  "r3.cpuregisters.wdtcon",  FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2617
2618   { &hf_r3_cpuregisters_intcon_rbif,     { "INTCON.RBIF",     "r3.cpuregisters.intcon.rbif",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2619   { &hf_r3_cpuregisters_intcon_int0if,   { "INTCON.INT0IF",   "r3.cpuregisters.intcon.int0if",   FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2620   { &hf_r3_cpuregisters_intcon_tmr0if,   { "INTCON.TMR0IF",   "r3.cpuregisters.intcon.tmr0if",   FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2621   { &hf_r3_cpuregisters_intcon_rbie,     { "INTCON.RBIE",     "r3.cpuregisters.intcon.rbie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2622   { &hf_r3_cpuregisters_intcon_int0ie,   { "INTCON.INT0IE",   "r3.cpuregisters.intcon.int0ie",   FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2623   { &hf_r3_cpuregisters_intcon_tmr0ie,   { "INTCON.TMR0IE",   "r3.cpuregisters.intcon.tmr0ie",   FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2624   { &hf_r3_cpuregisters_intcon_giel,     { "INTCON.GIEL",     "r3.cpuregisters.intcon.giel",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2625   { &hf_r3_cpuregisters_intcon_gieh,     { "INTCON.GIEH",     "r3.cpuregisters.intcon.gieh",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2626   { &hf_r3_cpuregisters_intcon2_rbip,    { "INTCON2.RBIP",    "r3_cpuregisters_intcon2_rbip",    FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2627   { &hf_r3_cpuregisters_intcon2_int3ip,  { "INTCON2.INT3IP",  "r3_cpuregisters_intcon2_int3ip",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2628   { &hf_r3_cpuregisters_intcon2_tmr0ip,  { "INTCON2.TMR0IP",  "r3_cpuregisters_intcon2_tmr0ip",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2629   { &hf_r3_cpuregisters_intcon2_intedg3, { "INTCON2.INTEDG3", "r3_cpuregisters_intcon2_intedg3", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2630   { &hf_r3_cpuregisters_intcon2_intedg2, { "INTCON2.INTEDG2", "r3_cpuregisters_intcon2_intedg2", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2631   { &hf_r3_cpuregisters_intcon2_intedg1, { "INTCON2.INTEDG1", "r3_cpuregisters_intcon2_intedg1", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2632   { &hf_r3_cpuregisters_intcon2_intedg0, { "INTCON2.INTEDG0", "r3_cpuregisters_intcon2_intedg0", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2633   { &hf_r3_cpuregisters_intcon2_rbpu,    { "INTCON2.RBPU",    "r3_cpuregisters_intcon2_rbpu",    FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2634   { &hf_r3_cpuregisters_intcon3_int1if,  { "INTCON3.INT1IF",  "r3.cpuregisters.intcon3.int1if",  FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2635   { &hf_r3_cpuregisters_intcon3_int2if,  { "INTCON3.INT2IF",  "r3.cpuregisters.intcon3.int2if",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2636   { &hf_r3_cpuregisters_intcon3_int3if,  { "INTCON3.INT3IF",  "r3.cpuregisters.intcon3.int3if",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2637   { &hf_r3_cpuregisters_intcon3_int1ie,  { "INTCON3.INT1IE",  "r3.cpuregisters.intcon3.int1ie",  FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2638   { &hf_r3_cpuregisters_intcon3_int2ie,  { "INTCON3.INT2IE",  "r3.cpuregisters.intcon3.int2ie",  FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2639   { &hf_r3_cpuregisters_intcon3_int3ie,  { "INTCON3.INT3IE",  "r3.cpuregisters.intcon3.int3ie",  FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2640   { &hf_r3_cpuregisters_intcon3_int1ip,  { "INTCON3.INT1IP",  "r3.cpuregisters.intcon3.int1ip",  FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2641   { &hf_r3_cpuregisters_intcon3_int2ip,  { "INTCON3.INT2IP",  "r3.cpuregisters.intcon3.int2ip",  FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2642   { &hf_r3_cpuregisters_pir1_tmr1if,     { "PIR1.TMR1IF",     "r3.cpuregisters.pir1.tmr1if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2643   { &hf_r3_cpuregisters_pir1_tmr2if,     { "PIR1.TMR2IF",     "r3.cpuregisters.pir1.tmr2if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2644   { &hf_r3_cpuregisters_pir1_ccp1if,     { "PIR1.CCP1IF",     "r3.cpuregisters.pir1.ccp1if",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2645   { &hf_r3_cpuregisters_pir1_ssp1if,     { "PIR1.SSP1IF",     "r3.cpuregisters.pir1.ssp1if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2646   { &hf_r3_cpuregisters_pir1_tx1if,      { "PIR1.TX1IF",      "r3.cpuregisters.pir1.tx1if",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2647   { &hf_r3_cpuregisters_pir1_rc1if,      { "PIR1.RC1IF",      "r3.cpuregisters.pir1.rc1if",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2648   { &hf_r3_cpuregisters_pir1_adif,       { "PIR1.ADIF",       "r3.cpuregisters.pir1.adif",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2649   { &hf_r3_cpuregisters_pir1_pspif,      { "PIR1.PSPIF",      "r3.cpuregisters.pir1.pspif",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2650   { &hf_r3_cpuregisters_pir2_ccp2if,     { "PIR2.CCP2IF",     "r3.cpuregisters.pir2.ccp2if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2651   { &hf_r3_cpuregisters_pir2_tmr3if,     { "PIR2.TMR3IF",     "r3.cpuregisters.pir2.tmr3if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2652   { &hf_r3_cpuregisters_pir2_hlvdif,     { "PIR2.HLVDIF",     "r3.cpuregisters.pir2.hlvdif",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2653   { &hf_r3_cpuregisters_pir2_bcl1if,     { "PIR2.BCL1IF",     "r3.cpuregisters.pir2.bcl1if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2654   { &hf_r3_cpuregisters_pir2_eeif,       { "PIR2.EEIF",       "r3.cpuregisters.pir2.eeif",       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2655   { &hf_r3_cpuregisters_pir2_unused5,    { "PIR2.UNUSED5",    "r3.cpuregisters.pir2.unused5",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2656   { &hf_r3_cpuregisters_pir2_cmif,       { "PIR2.CMIF",       "r3.cpuregisters.pir2.cmif",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2657   { &hf_r3_cpuregisters_pir2_oscfif,     { "PIR2.OSCFIF",     "r3.cpuregisters.pir2.oscfif",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2658   { &hf_r3_cpuregisters_pir3_ccp3if,     { "PIR3.CCP3IF",     "r3.cpuregisters.pir3.ccp3if",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2659   { &hf_r3_cpuregisters_pir3_ccp4if,     { "PIR3.CCP4IF",     "r3.cpuregisters.pir3.ccp4if",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2660   { &hf_r3_cpuregisters_pir3_ccp5if,     { "PIR3.CCP5IF",     "r3.cpuregisters.pir3.ccp5if",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2661   { &hf_r3_cpuregisters_pir3_tmr4if,     { "PIR3.TMR4IF",     "r3.cpuregisters.pir3.tmr4if",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2662   { &hf_r3_cpuregisters_pir3_tx2if,      { "PIR3.TX2IF",      "r3.cpuregisters.pir3.tx2if",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2663   { &hf_r3_cpuregisters_pir3_rc2if,      { "PIR3.RC2IF",      "r3.cpuregisters.pir3.rc2if",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2664   { &hf_r3_cpuregisters_pir3_bcl2if,     { "PIR3.BCL2IF",     "r3.cpuregisters.pir3.bcl2if",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2665   { &hf_r3_cpuregisters_pir3_ssp2if,     { "PIR3.SSP2IF",     "r3.cpuregisters.pir3.ssp2if",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2666   { &hf_r3_cpuregisters_pie1_tmr1ie,     { "PIE1.TMR1IE",     "r3.cpuregisters.pie1.tmr1ie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2667   { &hf_r3_cpuregisters_pie1_tmr2ie,     { "PIE1.TMR2IE",     "r3.cpuregisters.pie1.tmr2ie",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2668   { &hf_r3_cpuregisters_pie1_ccp1ie,     { "PIE1.CCP1IE",     "r3.cpuregisters.pie1.ccp1ie",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2669   { &hf_r3_cpuregisters_pie1_ssp1ie,     { "PIE1.SSP1IE",     "r3.cpuregisters.pie1.ssp1ie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2670   { &hf_r3_cpuregisters_pie1_tx1ie,      { "PIE1.TX1IE",      "r3.cpuregisters.pie1.tx1ie",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2671   { &hf_r3_cpuregisters_pie1_rc1ie,      { "PIE1.RC1IE",      "r3.cpuregisters.pie1.rc1ie",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2672   { &hf_r3_cpuregisters_pie1_adie,       { "PIE1.ADIE",       "r3.cpuregisters.pie1.adie",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2673   { &hf_r3_cpuregisters_pie1_pspie,      { "PIE1.PSPIE",      "r3.cpuregisters.pie1.pspie",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2674   { &hf_r3_cpuregisters_pie2_oscfie,     { "PIE2.OSCFIE",     "r3.cpuregisters.pie2.oscfie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2675   { &hf_r3_cpuregisters_pie2_cmie,       { "PIE2.CMIE",       "r3.cpuregisters.pie2.cmie",       FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2676   { &hf_r3_cpuregisters_pie2_unused2,    { "PIE2.UNUSED2",    "r3.cpuregisters.pie2.unused2",    FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2677   { &hf_r3_cpuregisters_pie2_eeie,       { "PIE2.EEIE",       "r3.cpuregisters.pie2.eeie",       FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2678   { &hf_r3_cpuregisters_pie2_bcl1ie,     { "PIE2.BCL1IE",     "r3.cpuregisters.pie2.bcl1ie",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2679   { &hf_r3_cpuregisters_pie2_hlvdie,     { "PIE2.HLVDIE",     "r3.cpuregisters.pie2.hlvdie",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2680   { &hf_r3_cpuregisters_pie2_tmr3ie,     { "PIE2.TMR3IE",     "r3.cpuregisters.pie2.tmr3ie",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2681   { &hf_r3_cpuregisters_pie2_ccp2ie,     { "PIE2.CCP2IE",     "r3.cpuregisters.pie2.ccp2ie",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2682   { &hf_r3_cpuregisters_pie3_ccp3ie,     { "PIE3.CCP3IE",     "r3.cpuregisters.pie3.ccp3ie",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2683   { &hf_r3_cpuregisters_pie3_ccp4ie,     { "PIE3.CCP4IE",     "r3.cpuregisters.pie3.ccp4ie",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2684   { &hf_r3_cpuregisters_pie3_ccp5ie,     { "PIE3.CCP5IE",     "r3.cpuregisters.pie3.ccp5ie",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2685   { &hf_r3_cpuregisters_pie3_tmr4ie,     { "PIE3.TMR4IE",     "r3.cpuregisters.pie3.tmr4ie",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2686   { &hf_r3_cpuregisters_pie3_tx2ie,      { "PIE3.TX2IE",      "r3.cpuregisters.pie3.tx2ie",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2687   { &hf_r3_cpuregisters_pie3_rc2ie,      { "PIE3.RC2IE",      "r3.cpuregisters.pie3.rc2ie",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2688   { &hf_r3_cpuregisters_pie3_bcl2ie,     { "PIE3.BCL2IE",     "r3.cpuregisters.pie3.bcl2ie",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2689   { &hf_r3_cpuregisters_pie3_ssp2ie,     { "PIE3.SSP2IE",     "r3.cpuregisters.pie3.ssp2ie",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2690   { &hf_r3_cpuregisters_ipr1_tmr1ip,     { "IPR1.TMR1IP",     "r3.cpuregisters.ipr1.tmr1ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2691   { &hf_r3_cpuregisters_ipr1_tmr2ip,     { "IPR1.TMR2IP",     "r3.cpuregisters.ipr1.tmr2ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2692   { &hf_r3_cpuregisters_ipr1_ccp1ip,     { "IPR1.CCP1IP",     "r3.cpuregisters.ipr1.ccp1ip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2693   { &hf_r3_cpuregisters_ipr1_ssp1ip,     { "IPR1.SSP1IP",     "r3.cpuregisters.ipr1.ssp1ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2694   { &hf_r3_cpuregisters_ipr1_tx1ip,      { "IPR1.TX1IP",      "r3.cpuregisters.ipr1.tx1ip",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2695   { &hf_r3_cpuregisters_ipr1_rc1ip,      { "IPR1.RC1IP",      "r3.cpuregisters.ipr1.rc1ip",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2696   { &hf_r3_cpuregisters_ipr1_adip,       { "IPR1.ADIP",       "r3.cpuregisters.ipr1.adip",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2697   { &hf_r3_cpuregisters_ipr1_pspip,      { "IPR1.PSPIP",      "r3.cpuregisters.ipr1.pspip",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2698   { &hf_r3_cpuregisters_ipr2_ccp2ip,     { "IPR2.CCP2IP",     "r3.cpuregisters.ipr2.ccp2ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2699   { &hf_r3_cpuregisters_ipr2_tmr3ip,     { "IPR2.TMR3IP",     "r3.cpuregisters.ipr2.tmr3ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2700   { &hf_r3_cpuregisters_ipr2_hlvdip,     { "IPR2.HLVDIP",     "r3.cpuregisters.ipr2.hlvdip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2701   { &hf_r3_cpuregisters_ipr2_bcl1ip,     { "IPR2.BCL1IP",     "r3.cpuregisters.ipr2.bcl1ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2702   { &hf_r3_cpuregisters_ipr2_eeip,       { "IPR2.EEIP",       "r3.cpuregisters.ipr2.eeip",       FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2703   { &hf_r3_cpuregisters_ipr2_unused5,    { "IPR2.UNUSED5",    "r3.cpuregisters.ipr2.unused5",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2704   { &hf_r3_cpuregisters_ipr2_cmip,       { "IPR2.CMIP",       "r3.cpuregisters.ipr2.cmip",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2705   { &hf_r3_cpuregisters_ipr2_oscfip,     { "IPR2.OSCFIP",     "r3.cpuregisters.ipr2.oscfip",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2706   { &hf_r3_cpuregisters_ipr3_ccp2ip,     { "IPR3.CCP2IP",     "r3.cpuregisters.ipr3.ccp2ip",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2707   { &hf_r3_cpuregisters_ipr3_ccp4ip,     { "IPR3.CCP4IP",     "r3.cpuregisters.ipr3.ccp4ip",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2708   { &hf_r3_cpuregisters_ipr3_ccp5ip,     { "IPR3.CCP5IP",     "r3.cpuregisters.ipr3.ccp5ip",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2709   { &hf_r3_cpuregisters_ipr3_tmr4ip,     { "IPR3.TMR4IP",     "r3.cpuregisters.ipr3.tmr4ip",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2710   { &hf_r3_cpuregisters_ipr3_tx2ip,      { "IPR3.TX2IP",      "r3.cpuregisters.ipr3.tx2ip",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2711   { &hf_r3_cpuregisters_ipr3_rc2ip,      { "IPR3.RC2IP",      "r3.cpuregisters.ipr3.rc2ip",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2712   { &hf_r3_cpuregisters_ipr3_bcl2ip,     { "IPR3.BCL2IP",     "r3.cpuregisters.ipr3.bcl2ip",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2713   { &hf_r3_cpuregisters_ipr3_ssp2ip,     { "IPR3.SSP2IP",     "r3.cpuregisters.ipr3.ssp2ip",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2714   { &hf_r3_cpuregisters_rcon_bor,        { "RCON./BOR",       "r3.cpuregisters.rcon.bor",        FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2715   { &hf_r3_cpuregisters_rcon_por,        { "RCON./POR",       "r3.cpuregisters.rcon.por",        FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2716   { &hf_r3_cpuregisters_rcon_pd,         { "RCON./PD",        "r3.cpuregisters.rcon.pd",         FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2717   { &hf_r3_cpuregisters_rcon_to,         { "RCON./TO",        "r3.cpuregisters.rcon.to",         FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2718   { &hf_r3_cpuregisters_rcon_unused4,    { "RCON.UNUSED4",    "r3.cpuregisters.rcon.unused4",    FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2719   { &hf_r3_cpuregisters_rcon_ri,         { "RCON./RI",        "r3.cpuregisters.rcon.ri",         FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2720   { &hf_r3_cpuregisters_rcon_sboren,     { "RCON.SBOREN",     "r3.cpuregisters.rcon.sboren",     FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2721   { &hf_r3_cpuregisters_rcon_ipen,       { "RCON.IPEN",       "r3.cpuregisters.rcon.ipen",       FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2722   { &hf_r3_cpuregisters_osccon_scs0,     { "OSCCON.SCS0",     "r3.cpuregisters.osccon.scs0",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2723   { &hf_r3_cpuregisters_osccon_scs1,     { "OSCCON.SCS1",     "r3.cpuregisters.osccon.scs1",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2724   { &hf_r3_cpuregisters_osccon_iofs,     { "OSCCON.IOFS",     "r3.cpuregisters.osccon.iofs",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2725   { &hf_r3_cpuregisters_osccon_osts,     { "OSCCON.OSTS",     "r3.cpuregisters.osccon.osts",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2726   { &hf_r3_cpuregisters_osccon_ircf0,    { "OSCCON.IRCF0",    "r3.cpuregisters.osccon.ircf0",    FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2727   { &hf_r3_cpuregisters_osccon_ircf1,    { "OSCCON.IRCF1",    "r3.cpuregisters.osccon.ircf1",    FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2728   { &hf_r3_cpuregisters_osccon_ircf2,    { "OSCCON.IRCF2",    "r3.cpuregisters.osccon.ircf2",    FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2729   { &hf_r3_cpuregisters_osccon_idlen,    { "OSCCON.IDLEN",    "r3.cpuregisters.osccon.idlen",    FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2730   { &hf_r3_cpuregisters_rcsta_rx9d,      { "RCSTA.RX9D",      "r3.cpuregisters.rcsta.rx9d",      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2731   { &hf_r3_cpuregisters_rcsta_oerr,      { "RCSTA.OERR",      "r3.cpuregisters.rcsta.oerr",      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2732   { &hf_r3_cpuregisters_rcsta_ferr,      { "RCSTA.FERR",      "r3.cpuregisters.rcsta.ferr",      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2733   { &hf_r3_cpuregisters_rcsta_adden,     { "RCSTA.ADDEN",     "r3.cpuregisters.rcsta.adden",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2734   { &hf_r3_cpuregisters_rcsta_cren,      { "RCSTA.CREN",      "r3.cpuregisters.rcsta.cren",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2735   { &hf_r3_cpuregisters_rcsta_sren,      { "RCSTA.SREN",      "r3.cpuregisters.rcsta.sren",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2736   { &hf_r3_cpuregisters_rcsta_rx9,       { "RCSTA.RX9",       "r3.cpuregisters.rcsta.rx9",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2737   { &hf_r3_cpuregisters_rcsta_spen,      { "RCSTA.SPEN",      "r3.cpuregisters.rcsta.spen",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2738   { &hf_r3_cpuregisters_txsta_tx9d,      { "TXSTA.TX9D",      "r3.cpuregisters.txsta.tx9d",      FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2739   { &hf_r3_cpuregisters_txsta_trmt,      { "TXSTA.TRMT",      "r3.cpuregisters.txsta.trmt",      FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2740   { &hf_r3_cpuregisters_txsta_brgh,      { "TXSTA.BRGH",      "r3.cpuregisters.txsta.brgh",      FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2741   { &hf_r3_cpuregisters_txsta_sendb,     { "TXSTA.SENDB",     "r3.cpuregisters.txsta.sendb",     FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2742   { &hf_r3_cpuregisters_txsta_sync,      { "TXSTA.SYNC",      "r3.cpuregisters.txsta.sync",      FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2743   { &hf_r3_cpuregisters_txsta_txen,      { "TXSTA.TXEN",      "r3.cpuregisters.txsta.txen",      FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2744   { &hf_r3_cpuregisters_txsta_tx9,       { "TXSTA.TX9",       "r3.cpuregisters.txsta.tx9",       FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2745   { &hf_r3_cpuregisters_txsta_csrc,      { "TXSTA.CSRC",      "r3.cpuregisters.txsta.csrc",      FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2746   { &hf_r3_cpuregisters_rcsta2_rx9d,     { "RCSTA2.RX9D",     "r3.cpuregisters.rcsta2.rx9d",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2747   { &hf_r3_cpuregisters_rcsta2_oerr,     { "RCSTA2.OERR",     "r3.cpuregisters.rcsta2.oerr",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2748   { &hf_r3_cpuregisters_rcsta2_ferr,     { "RCSTA2.FERR",     "r3.cpuregisters.rcsta2.ferr",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2749   { &hf_r3_cpuregisters_rcsta2_adden,    { "RCSTA2.ADDEN",    "r3.cpuregisters.rcsta2.adden",    FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2750   { &hf_r3_cpuregisters_rcsta2_cren,     { "RCSTA2.CREN",     "r3.cpuregisters.rcsta2.cren",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2751   { &hf_r3_cpuregisters_rcsta2_sren,     { "RCSTA2.SREN",     "r3.cpuregisters.rcsta2.sren",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2752   { &hf_r3_cpuregisters_rcsta2_rx9,      { "RCSTA2.RX9",      "r3.cpuregisters.rcsta2.rx9",      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2753   { &hf_r3_cpuregisters_rcsta2_spen,     { "RCSTA2.SPEN",     "r3.cpuregisters.rcsta2.spen",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2754   { &hf_r3_cpuregisters_txsta2_tx9d,     { "TXSTA2.TX9D",     "r3.cpuregisters.txsta2.tx9d",     FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2755   { &hf_r3_cpuregisters_txsta2_trmt,     { "TXSTA2.TRMT",     "r3.cpuregisters.txsta2.trmt",     FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2756   { &hf_r3_cpuregisters_txsta2_brgh,     { "TXSTA2.BRGH",     "r3.cpuregisters.txsta2.brgh",     FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2757   { &hf_r3_cpuregisters_txsta2_sendb,    { "TXSTA2.SENDB",    "r3.cpuregisters.txsta2.sendb",    FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2758   { &hf_r3_cpuregisters_txsta2_sync,     { "TXSTA2.SYNC",     "r3.cpuregisters.txsta2.sync",     FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2759   { &hf_r3_cpuregisters_txsta2_txen,     { "TXSTA2.TXEN",     "r3.cpuregisters.txsta2.txen",     FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2760   { &hf_r3_cpuregisters_txsta2_tx9,      { "TXSTA2.TX9",      "r3.cpuregisters.txsta2.tx9",      FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2761   { &hf_r3_cpuregisters_txsta2_csrc,     { "TXSTA2.CSRC",     "r3.cpuregisters.txsta2.csrc",     FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2762   { &hf_r3_cpuregisters_wdtcon_swdten,   { "WDTCON.SWDTEN",   "r3.cpuregisters.wdtcon.swdten",   FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2763   { &hf_r3_cpuregisters_wdtcon_unused1,  { "WDTCON.UNUSED1",  "r3.cpuregisters.wdtcon.unused1",  FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2764   { &hf_r3_cpuregisters_wdtcon_unused2,  { "WDTCON.UNUSED2",  "r3.cpuregisters.wdtcon.unused2",  FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2765   { &hf_r3_cpuregisters_wdtcon_unused3,  { "WDTCON.UNUSED3",  "r3.cpuregisters.wdtcon.unused3",  FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2766   { &hf_r3_cpuregisters_wdtcon_unused4,  { "WDTCON.UNUSED4",  "r3.cpuregisters.wdtcon.unused4",  FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2767   { &hf_r3_cpuregisters_wdtcon_unused5,  { "WDTCON.UNUSED5",  "r3.cpuregisters.wdtcon.unused5",  FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2768   { &hf_r3_cpuregisters_wdtcon_unused6,  { "WDTCON.UNUSED6",  "r3.cpuregisters.wdtcon.unused6",  FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2769   { &hf_r3_cpuregisters_wdtcon_unused7,  { "WDTCON.UNUSED7",  "r3.cpuregisters.wdtcon.unused7",  FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
2770
2771   { &hf_r3_dumpm41t81_reg00, { "REG 0x00", "r3.m41t81.reg00", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2772   { &hf_r3_dumpm41t81_reg01, { "REG 0x01", "r3.m41t81.reg01", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2773   { &hf_r3_dumpm41t81_reg02, { "REG 0x02", "r3.m41t81.reg02", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2774   { &hf_r3_dumpm41t81_reg03, { "REG 0x03", "r3.m41t81.reg03", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2775   { &hf_r3_dumpm41t81_reg04, { "REG 0x04", "r3.m41t81.reg04", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2776   { &hf_r3_dumpm41t81_reg05, { "REG 0x05", "r3.m41t81.reg05", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2777   { &hf_r3_dumpm41t81_reg06, { "REG 0x06", "r3.m41t81.reg06", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2778   { &hf_r3_dumpm41t81_reg07, { "REG 0x07", "r3.m41t81.reg07", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2779   { &hf_r3_dumpm41t81_reg08, { "REG 0x08", "r3.m41t81.reg08", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2780   { &hf_r3_dumpm41t81_reg09, { "REG 0x09", "r3.m41t81.reg09", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2781   { &hf_r3_dumpm41t81_reg0a, { "REG 0x0a", "r3.m41t81.reg0a", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2782   { &hf_r3_dumpm41t81_reg0b, { "REG 0x0b", "r3.m41t81.reg0b", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2783   { &hf_r3_dumpm41t81_reg0c, { "REG 0x0c", "r3.m41t81.reg0c", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2784   { &hf_r3_dumpm41t81_reg0d, { "REG 0x0d", "r3.m41t81.reg0d", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2785   { &hf_r3_dumpm41t81_reg0e, { "REG 0x0e", "r3.m41t81.reg0e", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2786   { &hf_r3_dumpm41t81_reg0f, { "REG 0x0f", "r3.m41t81.reg0f", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2787   { &hf_r3_dumpm41t81_reg10, { "REG 0x10", "r3.m41t81.reg10", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2788   { &hf_r3_dumpm41t81_reg11, { "REG 0x11", "r3.m41t81.reg11", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2789   { &hf_r3_dumpm41t81_reg12, { "REG 0x12", "r3.m41t81.reg12", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2790   { &hf_r3_dumpm41t81_reg13, { "REG 0x13", "r3.m41t81.reg13", FT_UINT8, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2791
2792   { &hf_r3_dumpm41t81_reg00_sec1,       { ".1 Seconds",     "r3.m41t81.reg00.sec1",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2793   { &hf_r3_dumpm41t81_reg00_sec01,      { ".01 Seconds",    "r3.m41t81.reg00.sec01",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2794   { &hf_r3_dumpm41t81_reg01_st,         { "ST",             "r3.m41t81.reg01.st",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2795   { &hf_r3_dumpm41t81_reg01_10sec,      { "10 Seconds",     "r3.m41t81.reg01.10sec",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2796   { &hf_r3_dumpm41t81_reg01_1sec,       { "1 Seconds",      "r3.m41t81.reg01.1sec",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2797   { &hf_r3_dumpm41t81_reg02_notused,    { "(not used)",     "r3.m41t81.reg02.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2798   { &hf_r3_dumpm41t81_reg02_10min,      { "10 Minutes",     "r3.m41t81.reg02.10min",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2799   { &hf_r3_dumpm41t81_reg02_1min,       { "1 Minutes",      "r3.m41t81.reg02.1min",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2800   { &hf_r3_dumpm41t81_reg03_cbe,        { "CBE",            "r3.m41t81.reg03.cbe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2801   { &hf_r3_dumpm41t81_reg03_cb,         { "CB",             "r3.m41t81.reg03.cb",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2802   { &hf_r3_dumpm41t81_reg03_10hour,     { "10 Hours",       "r3.m41t81.reg03.10hour",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2803   { &hf_r3_dumpm41t81_reg03_1hour,      { "1 Hours",        "r3.m41t81.reg03.1hour",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2804   { &hf_r3_dumpm41t81_reg04_notused,    { "(not used)",     "r3.m41t81.reg04.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2805   { &hf_r3_dumpm41t81_reg04_dow,        { "DOW",            "r3.m41t81.reg04.dow",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2806   { &hf_r3_dumpm41t81_reg05_notused,    { "(not used)",     "r3.m41t81.reg05.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2807   { &hf_r3_dumpm41t81_reg05_10day,      { "10 Day",         "r3.m41t81.reg05.10day",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2808   { &hf_r3_dumpm41t81_reg05_1day,       { "1 Day",          "r3.m41t81.reg05.1day",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2809   { &hf_r3_dumpm41t81_reg06_notused,    { "(not used)",     "r3.m41t81.reg06.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2810   { &hf_r3_dumpm41t81_reg06_10month,    { "10 Month",       "r3.m41t81.reg06.10month",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2811   { &hf_r3_dumpm41t81_reg06_1month,     { "1 Month",        "r3.m41t81.reg06.1month",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2812   { &hf_r3_dumpm41t81_reg07_10year,     { "10 Year",        "r3.m41t81.reg07.10year",     FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2813   { &hf_r3_dumpm41t81_reg07_1year,      { "1 Year",         "r3.m41t81.reg07.1year",      FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2814   { &hf_r3_dumpm41t81_reg08_out,        { "OUT",            "r3.m41t81.reg08.out",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2815   { &hf_r3_dumpm41t81_reg08_ft,         { "FT",             "r3.m41t81.reg08.ft",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2816   { &hf_r3_dumpm41t81_reg08_s,          { "S",              "r3.m41t81.reg08.s",          FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2817   { &hf_r3_dumpm41t81_reg08_cal,        { "CAL",            "r3.m41t81.reg08.cal",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2818   { &hf_r3_dumpm41t81_reg09_notused,    { "(not used)",     "r3.m41t81.reg09.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2819   { &hf_r3_dumpm41t81_reg09_bmb,        { "BMB",            "r3.m41t81.reg09.bmb",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2820   { &hf_r3_dumpm41t81_reg09_rb,         { "RB",             "r3.m41t81.reg09.rb",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2821   { &hf_r3_dumpm41t81_reg0a_afe,        { "AFE",            "r3.m41t81.reg0a.afe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2822   { &hf_r3_dumpm41t81_reg0a_sqwe,       { "SQWE",           "r3.m41t81.reg0a.sqwe",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2823   { &hf_r3_dumpm41t81_reg0a_abe,        { "ABE",            "r3.m41t81.reg0a.abe",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2824   { &hf_r3_dumpm41t81_reg0a_10monthalm, { "10 Month Alarm", "r3.m41t81.reg0a.10monthalm", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2825   { &hf_r3_dumpm41t81_reg0a_1monthalm,  { "1 Month Alarm",  "r3.m41t81.reg0a.1monthalm",  FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2826   { &hf_r3_dumpm41t81_reg0b_rpt5,       { "RPT5",           "r3.m41t81.reg0b.rpt5",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2827   { &hf_r3_dumpm41t81_reg0b_rpt4,       { "RPT4",           "r3.m41t81.reg0b.rpt4",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2828   { &hf_r3_dumpm41t81_reg0b_10dayalm,   { "10 Day Alarm",   "r3.m41t81.reg0b.10dayalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2829   { &hf_r3_dumpm41t81_reg0b_1dayalm,    { "1 Day Alarm",    "r3.m41t81.reg0b.1dayalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2830   { &hf_r3_dumpm41t81_reg0c_rpt3,       { "RPT3",           "r3.m41t81.reg0c.rpt3",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2831   { &hf_r3_dumpm41t81_reg0c_ht,         { "HT",             "r3.m41t81.reg0c.ht",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2832   { &hf_r3_dumpm41t81_reg0c_10houralm,  { "10 Hour Alarm",  "r3.m41t81.reg0c.10houralm",  FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2833   { &hf_r3_dumpm41t81_reg0c_1houralm,   { "1 Hour Alarm",   "r3.m41t81.reg0c.1houralm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2834   { &hf_r3_dumpm41t81_reg0d_rpt2,       { "RPT2",           "r3.m41t81.reg0d.rpt2",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2835   { &hf_r3_dumpm41t81_reg0d_10minalm,   { "10 Min Alarm",   "r3.m41t81.reg0d.10minalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2836   { &hf_r3_dumpm41t81_reg0d_1minalm,    { "1 Min Alarm",    "r3.m41t81.reg0d.1minalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2837   { &hf_r3_dumpm41t81_reg0e_rpt1,       { "RPT1",           "r3.m41t81.reg0e.rpt1",       FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2838   { &hf_r3_dumpm41t81_reg0e_10secalm,   { "10 Sec Alarm",   "r3.m41t81.reg0e.10secalm",   FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2839   { &hf_r3_dumpm41t81_reg0e_1secalm,    { "1 Sec Alarm",    "r3.m41t81.reg0e.1secalm",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2840   { &hf_r3_dumpm41t81_reg0f_wdf,        { "WDF",            "r3.m41t81.reg0f.wdf",        FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2841   { &hf_r3_dumpm41t81_reg0f_af,         { "AF",             "r3.m41t81.reg0f.af",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2842   { &hf_r3_dumpm41t81_reg0f_notused,    { "(not used)",     "r3.m41t81.reg0f.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2843   { &hf_r3_dumpm41t81_reg10_notused,    { "(not used)",     "r3.m41t81.reg10.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2844   { &hf_r3_dumpm41t81_reg11_notused,    { "(not used)",     "r3.m41t81.reg11.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2845   { &hf_r3_dumpm41t81_reg12_notused,    { "(not used)",     "r3.m41t81.reg12.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2846   { &hf_r3_dumpm41t81_reg13_rs,         { "RS",             "r3.m41t81.reg13.rs",         FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2847   { &hf_r3_dumpm41t81_reg13_notused,    { "(not used)",     "r3.m41t81.reg13.notused",    FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2848
2849   { &hf_r3_debuglog_recordnumber, { "Record Number", "r3.debuglog.recordnumber", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2850   { &hf_r3_debuglog_flags,        { "Flags",         "r3.debuglog.flags",        FT_UINT32, BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2851   { &hf_r3_debuglog_tick,         { "Tick",          "r3.debuglog.tick",         FT_UINT16, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
2852
2853   { &hf_r3_adduserparamtype,                                          { "Upstream Field",     "r3.manageuser",                  FT_NONE,    BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2854   { &hf_r3_adduserparamtypelength,                                    { "Field Length",       "r3.manageuser.length",           FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2855   { &hf_r3_adduserparamtypetype,                                      { "Field Type",         "r3.manageuser.type",             FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_adduserparamtypenames_ext, 0x0, NULL, HFILL }},
2856   { &hf_r3_adduserparamtypedatalen,                                   { "Data Length",        "r3.manageuser.datalen",          FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2857   { &hf_r3_adduserparamtypeerror,                                     { "Error",              "r3.manageuser.error",            FT_STRING,  BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2858   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_DISPOSITION],      { "Disposition",        "r3.manageuser.disposition",      FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_dispositionnames_ext, 0x0, NULL, HFILL }},
2859   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USERNO],           { "User Number",        "r3.manageuser.usernumber",       FT_UINT16,  BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2860   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_ACCESSALWAYS],     { "Access Always",      "r3.manageuser.accessalways",     FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2861   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_ACCESSMODE],       { "Access Mode",        "r3.manageuser.accessmode",       FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_accessmodenames_ext, 0x0, NULL, HFILL }},
2862   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_CACHED],           { "Cached",             "r3.manageuser.cached",           FT_BOOLEAN, BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2863   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USERTYPE],         { "User Type",          "r3.manageuser.usertype",         FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_usertypenames_ext, 0x0, NULL, HFILL }},
2864   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_PRIMARYFIELD],     { "Primary Field",      "r3.manageuser.primaryfield",     FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2865   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_PRIMARYFIELDTYPE], { "Primary Field Type", "r3.manageuser.primaryfieldtype", FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2866   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_AUXFIELD],         { "Aux Field",          "r3.manageuser.auxfield",         FT_BYTES,   BASE_NONE,    NULL, 0x0, NULL, HFILL }},
2867   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_AUXFIELDTYPE],     { "Aux Field Type",     "r3.manageuser.auxfieldtype",     FT_UINT8,   BASE_DEC_HEX|BASE_EXT_STRING, &r3_ppmisourcenames_ext, 0x0, NULL, HFILL }},
2868   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_USECOUNT],         { "Use Count",          "r3.manageuser.usecount",         FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2869   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_EXCEPTIONGROUP],   { "Exception Group",    "r3.manageuser.exceptiongroup",   FT_UINT8,   BASE_DEC_HEX, NULL, 0x0, NULL, HFILL }},
2870   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_EXPIREON],         { "Expire On",          "r3.manageuser.expireon",         FT_UINT24,  BASE_HEX,     NULL, 0x0, NULL, HFILL }},
2871   { &hf_r3_adduserparamtypearray [ADDUSERPARAMTYPE_TIMEZONE],         { "Timezone",           "r3.manageuser.timezone",         FT_UINT32,  BASE_HEX,     NULL, 0x0, NULL, HFILL }}
2872 };
2873
2874 typedef struct dissectorParser_s
2875 {
2876   cmdCommand_e command;
2877   void (*dissector) (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *r3_tree);
2878 }
2879 dissectorParser_t;
2880
2881 /*
2882  *  Dissectors for each command
2883  */
2884 static void dissect_r3_cmd_response (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2885 static void dissect_r3_cmd_handshake (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2886 static void dissect_r3_cmd_killsession (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2887 static void dissect_r3_cmd_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2888 static void dissect_r3_cmd_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2889 static void dissect_r3_cmd_setdatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2890 static void dissect_r3_cmd_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2891 static void dissect_r3_cmd_setconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2892 static void dissect_r3_cmd_getconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2893 static void dissect_r3_cmd_manageuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2894 static void dissect_r3_cmd_deleteusers (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2895 static void dissect_r3_cmd_defineexception (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2896 static void dissect_r3_cmd_defineexceptiongroup (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2897 static void dissect_r3_cmd_definecalendar (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2898 static void dissect_r3_cmd_definetimezone (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2899 static void dissect_r3_cmd_rmtauthretry (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2900 static void dissect_r3_cmd_filters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2901 static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2902 static void dissect_r3_cmd_eventlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2903 static void dissect_r3_cmd_declinedlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2904 static void dissect_r3_cmd_alarmlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2905 static void dissect_r3_cmd_downloadfirmware (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2906 static void dissect_r3_cmd_downloadfirmwaretimeout (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2907 static void dissect_r3_cmd_powertableselection (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2908 static void dissect_r3_cmd_clearnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2909 static void dissect_r3_cmd_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2910 static void dissect_r3_cmd_selftest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2911 static void dissect_r3_cmd_reset (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2912 static void dissect_r3_cmd_logwrite (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2913 static void dissect_r3_cmd_mfgcommand (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2914 static void dissect_r3_cmd_nvrambackup (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2915 static void dissect_r3_cmd_extendedresponse (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2916
2917 static dissectorParser_t r3command_dissect [] =
2918 {
2919   { CMD_RESPONSE,                  dissect_r3_cmd_response },
2920   { CMD_HANDSHAKE,                 dissect_r3_cmd_handshake },
2921   { CMD_KILLSESSION,               dissect_r3_cmd_killsession },
2922   { CMD_QUERYSERIALNUMBER,         dissect_r3_cmd_queryserialnumber },
2923   { CMD_QUERYVERSION,              dissect_r3_cmd_queryversion },
2924   { CMD_SETDATETIME,               dissect_r3_cmd_setdatetime },
2925   { CMD_QUERYDATETIME,             dissect_r3_cmd_querydatetime },
2926   { CMD_SETCONFIG,                 dissect_r3_cmd_setconfig },
2927   { CMD_GETCONFIG,                 dissect_r3_cmd_getconfig },
2928   { CMD_MANAGEUSER,                dissect_r3_cmd_manageuser },
2929   { CMD_DELETEUSERS,               dissect_r3_cmd_deleteusers },
2930   { CMD_DEFINEEXCEPTION,           dissect_r3_cmd_defineexception },
2931   { CMD_DEFINEEXCEPTIONGROUP,      dissect_r3_cmd_defineexceptiongroup },
2932   { CMD_DEFINECALENDAR,            dissect_r3_cmd_definecalendar },
2933   { CMD_DEFINETIMEZONE,            dissect_r3_cmd_definetimezone },
2934   { CMD_RMTAUTHRETRY,              dissect_r3_cmd_rmtauthretry },
2935   { CMD_FILTERS,                   dissect_r3_cmd_filters },
2936   { CMD_ALARMCONFIGURE,            dissect_r3_cmd_alarmconfigure },
2937   { CMD_EVENTLOGDUMP,              dissect_r3_cmd_eventlogdump },
2938   { CMD_DECLINEDLOGDUMP,           dissect_r3_cmd_declinedlogdump },
2939   { CMD_ALARMLOGDUMP,              dissect_r3_cmd_alarmlogdump },
2940   { CMD_DOWNLOADFIRMWARE,          dissect_r3_cmd_downloadfirmware },
2941   { CMD_DOWNLOADFIRMWARETIMEOUT,   dissect_r3_cmd_downloadfirmwaretimeout },
2942   { CMD_POWERTABLESELECTION,       dissect_r3_cmd_powertableselection },
2943   { CMD_CLEARNVRAM,                dissect_r3_cmd_clearnvram },
2944   { CMD_DPAC,                      dissect_r3_cmd_dpac },
2945   { CMD_SELFTEST,                  dissect_r3_cmd_selftest },
2946   { CMD_RESET,                     dissect_r3_cmd_reset },
2947   { CMD_LOGWRITE,                  dissect_r3_cmd_logwrite },
2948   { CMD_MFGCOMMAND,                dissect_r3_cmd_mfgcommand },
2949   { CMD_NVRAMBACKUP,               dissect_r3_cmd_nvrambackup },
2950   { CMD_EXTENDEDRESPONSE,          dissect_r3_cmd_extendedresponse }
2951 };
2952
2953 static void dissect_r3_cmdmfg_setserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2954 static void dissect_r3_cmdmfg_setcryptkey (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2955 static void dissect_r3_cmdmfg_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2956 static void dissect_r3_cmdmfg_terminal (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2957 static void dissect_r3_cmdmfg_remoteunlock (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2958 static void dissect_r3_cmdmfg_auxctlrversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2959 static void dissect_r3_cmdmfg_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2960 static void dissect_r3_cmdmfg_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2961 static void dissect_r3_cmdmfg_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2962 static void dissect_r3_cmdmfg_checkpointlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2963 static void dissect_r3_cmdmfg_checkpointlogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2964 static void dissect_r3_cmdmfg_readregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2965 static void dissect_r3_cmdmfg_forceoptions (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2966 static void dissect_r3_cmdmfg_commuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2967 static void dissect_r3_cmdmfg_dumpkeypad (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2968 static void dissect_r3_cmdmfg_batterycheck (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2969 static void dissect_r3_cmdmfg_ramrefresh (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2970 static void dissect_r3_cmdmfg_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2971 static void dissect_r3_cmdmfg_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2972 static void dissect_r3_cmdmfg_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2973 static void dissect_r3_cmdmfg_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2974 static void dissect_r3_cmdmfg_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2975 static void dissect_r3_cmdmfg_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2976 static void dissect_r3_cmdmfg_debuglogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2977 static void dissect_r3_cmdmfg_debuglogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2978 static void dissect_r3_cmdmfg_testwdt (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2979 static void dissect_r3_cmdmfg_querycksum (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2980 static void dissect_r3_cmdmfg_validatechecksums (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2981 static void dissect_r3_cmdmfg_rebuildlrucache (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2982 static void dissect_r3_cmdmfg_tzupdate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2983 static void dissect_r3_cmdmfg_testpreserve (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2984 static void dissect_r3_cmdmfg_mortisestatelogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2985 static void dissect_r3_cmdmfg_mortisestatelogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2986 static void dissect_r3_cmdmfg_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2987 static void dissect_r3_cmdmfg_haltandcatchfire (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
2988
2989 static dissectorParser_t r3commandmfg_dissect [] =
2990 {
2991   { CMDMFG_SETSERIALNUMBER,       dissect_r3_cmdmfg_setserialnumber },
2992   { CMDMFG_SETCRYPTKEY,           dissect_r3_cmdmfg_setcryptkey },
2993   { CMDMFG_DUMPNVRAM,             dissect_r3_cmdmfg_dumpnvram },
2994   { CMDMFG_TERMINAL,              dissect_r3_cmdmfg_terminal },
2995   { CMDMFG_REMOTEUNLOCK,          dissect_r3_cmdmfg_remoteunlock },
2996   { CMDMFG_AUXCTLRVERSION,        dissect_r3_cmdmfg_auxctlrversion },
2997   { CMDMFG_IOPINS,                dissect_r3_cmdmfg_iopins },
2998   { CMDMFG_ADCS,                  dissect_r3_cmdmfg_adcs },
2999   { CMDMFG_HARDWAREID,            dissect_r3_cmdmfg_hardwareid },
3000   { CMDMFG_CHECKPOINTLOGDUMP,     dissect_r3_cmdmfg_checkpointlogdump },
3001   { CMDMFG_CHECKPOINTLOGCLEAR,    dissect_r3_cmdmfg_checkpointlogclear },
3002   { CMDMFG_READREGISTERS,         dissect_r3_cmdmfg_readregisters },
3003   { CMDMFG_FORCEOPTIONS,          dissect_r3_cmdmfg_forceoptions },
3004   { CMDMFG_COMMUSER,              dissect_r3_cmdmfg_commuser },
3005   { CMDMFG_DUMPKEYPAD,            dissect_r3_cmdmfg_dumpkeypad },
3006   { CMDMFG_BATTERYCHECK,          dissect_r3_cmdmfg_batterycheck },
3007   { CMDMFG_RAMREFRESH,            dissect_r3_cmdmfg_ramrefresh },
3008   { CMDMFG_TASKFLAGS,             dissect_r3_cmdmfg_taskflags },
3009   { CMDMFG_TIMERCHAIN,            dissect_r3_cmdmfg_timerchain },
3010   { CMDMFG_PEEKPOKE,              dissect_r3_cmdmfg_peekpoke },
3011   { CMDMFG_LOCKSTATE,             dissect_r3_cmdmfg_lockstate },
3012   { CMDMFG_CAPABILITIES,          dissect_r3_cmdmfg_capabilities },
3013   { CMDMFG_DUMPM41T81,            dissect_r3_cmdmfg_dumpm41t81 },
3014   { CMDMFG_DEBUGLOGDUMP,          dissect_r3_cmdmfg_debuglogdump },
3015   { CMDMFG_DEBUGLOGCLEAR,         dissect_r3_cmdmfg_debuglogclear },
3016   { CMDMFG_TESTWDT,               dissect_r3_cmdmfg_testwdt },
3017   { CMDMFG_QUERYCKSUM,            dissect_r3_cmdmfg_querycksum },
3018   { CMDMFG_VALIDATECHECKSUMS,     dissect_r3_cmdmfg_validatechecksums },
3019   { CMDMFG_REBUILDLRUCACHE,       dissect_r3_cmdmfg_rebuildlrucache },
3020   { CMDMFG_TZUPDATE,              dissect_r3_cmdmfg_tzupdate },
3021   { CMDMFG_TESTPRESERVE,          dissect_r3_cmdmfg_testpreserve },
3022   { CMDMFG_MORTISESTATELOGDUMP,   dissect_r3_cmdmfg_mortisestatelogdump },
3023   { CMDMFG_MORTISESTATELOGCLEAR,  dissect_r3_cmdmfg_mortisestatelogclear },
3024   { CMDMFG_MORTISEPINS,           dissect_r3_cmdmfg_mortisepins },
3025   { CMDMFG_HALTANDCATCHFIRE,      dissect_r3_cmdmfg_haltandcatchfire }
3026 };
3027
3028 static void dissect_r3_response_singlebyte (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3029 static void dissect_r3_response_hasdata (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3030
3031 static dissectorParser_t r3response_dissect [] =
3032 {
3033   { RESPONSETYPE_OK,                  dissect_r3_response_singlebyte },
3034   { RESPONSETYPE_ERROR,               dissect_r3_response_singlebyte },
3035   { RESPONSETYPE_HASDATA,             dissect_r3_response_hasdata },
3036   { RESPONSETYPE_NOHANDLER,           dissect_r3_response_singlebyte },
3037   { RESPONSETYPE_NOSESSION,           dissect_r3_response_singlebyte },
3038   { RESPONSETYPE_BADCOMMAND,          dissect_r3_response_singlebyte },
3039   { RESPONSETYPE_BADPARAMETER,        dissect_r3_response_singlebyte },
3040   { RESPONSETYPE_BADPARAMETERLEN,     dissect_r3_response_singlebyte },
3041   { RESPONSETYPE_MISSINGPARAMETER,    dissect_r3_response_singlebyte },
3042   { RESPONSETYPE_DUPLICATEPARAMETER,  dissect_r3_response_singlebyte },
3043   { RESPONSETYPE_PARAMETERCONFLICT,   dissect_r3_response_singlebyte },
3044   { RESPONSETYPE_BADDEVICE,           dissect_r3_response_singlebyte },
3045   { RESPONSETYPE_NVRAMERROR,          dissect_r3_response_singlebyte },
3046   { RESPONSETYPE_NVRAMERRORNOACK,     dissect_r3_response_singlebyte },
3047   { RESPONSETYPE_NVRAMERRORNOACK32,   dissect_r3_response_singlebyte },
3048   { RESPONSETYPE_NOTI2CADDRESS,       dissect_r3_response_singlebyte },
3049   { RESPONSETYPE_FIRMWAREERROR,       dissect_r3_response_singlebyte },
3050   { RESPONSETYPE_DUMPINPROGRESS,      dissect_r3_response_singlebyte },
3051   { RESPONSETYPE_INTERNALERROR,       dissect_r3_response_singlebyte },
3052   { RESPONSETYPE_NOTIMPLEMENTED,      dissect_r3_response_singlebyte },
3053   { RESPONSETYPE_PINFORMATERROR,      dissect_r3_response_singlebyte },
3054   { RESPONSETYPE_PINEXISTS,           dissect_r3_response_singlebyte },
3055   { RESPONSETYPE_PINNOTFOUND,         dissect_r3_response_singlebyte },
3056   { RESPONSETYPE_USERACTIVE,          dissect_r3_response_singlebyte },
3057   { RESPONSETYPE_USERINACTIVE,        dissect_r3_response_singlebyte },
3058   { RESPONSETYPE_PARENTNOTFOUND,      dissect_r3_response_singlebyte },
3059   { RESPONSETYPE_NOCHAIN,             dissect_r3_response_singlebyte },
3060   { RESPONSETYPE_CAUGHTINLOOP,        dissect_r3_response_singlebyte },
3061   { RESPONSETYPE_EVENTFILTERED,       dissect_r3_response_singlebyte },
3062   { RESPONSETYPE_PAYLOADTOOLARGE,     dissect_r3_response_singlebyte },
3063   { RESPONSETYPE_ENDOFDATA,           dissect_r3_response_singlebyte },
3064   { RESPONSETYPE_RMTAUTHREJECTED,     dissect_r3_response_singlebyte },
3065   { RESPONSETYPE_NVRAMVERSIONERROR,   dissect_r3_response_singlebyte },
3066   { RESPONSETYPE_NOHARDWARE,          dissect_r3_response_singlebyte },
3067   { RESPONSETYPE_SCHEDULERCONFLICT,   dissect_r3_response_singlebyte },
3068   { RESPONSETYPE_NVRAMWRITEERROR,     dissect_r3_response_singlebyte },
3069   { RESPONSETYPE_DECLINEDFILTERED,    dissect_r3_response_singlebyte },
3070   { RESPONSETYPE_NECONFIGPARM,        dissect_r3_response_singlebyte },
3071   { RESPONSETYPE_FLASHERASEERROR,     dissect_r3_response_singlebyte },
3072   { RESPONSETYPE_FLASHWRITEERROR,     dissect_r3_response_singlebyte },
3073   { RESPONSETYPE_BADNVBACKUP,         dissect_r3_response_singlebyte },
3074   { RESPONSETYPE_EARLYACK,            dissect_r3_response_singlebyte },
3075   { RESPONSETYPE_ALARMFILTERED,       dissect_r3_response_singlebyte },
3076   { RESPONSETYPE_ACVFAILURE,          dissect_r3_response_singlebyte },
3077   { RESPONSETYPE_USERCHECKSUMERROR,   dissect_r3_response_singlebyte },
3078   { RESPONSETYPE_CHECKSUMERROR,       dissect_r3_response_singlebyte },
3079   { RESPONSETYPE_RTCSQWFAILURE,       dissect_r3_response_singlebyte },
3080   { RESPONSETYPE_PRIORITYSHUTDOWN,    dissect_r3_response_singlebyte },
3081   { RESPONSETYPE_NOTMODIFIABLE,       dissect_r3_response_singlebyte },
3082   { RESPONSETYPE_CANTPRESERVE,        dissect_r3_response_singlebyte },
3083   { RESPONSETYPE_INPASSAGEMODE,       dissect_r3_response_singlebyte }
3084 };
3085
3086 static void dissect_r3_upstreamcommand_reserved (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3087 static void dissect_r3_upstreamcommand_debugmsg (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3088 static void dissect_r3_upstreamcommand_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3089 static void dissect_r3_upstreamcommand_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3090 static void dissect_r3_upstreamcommand_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3091 static void dissect_r3_upstreamcommand_dumpeventlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3092 static void dissect_r3_upstreamcommand_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3093 static void dissect_r3_upstreamcommand_rmtquthrequest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3094 static void dissect_r3_upstreamcommand_retrieveuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3095 static void dissect_r3_upstreamcommand_queryconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3096 static void dissect_r3_upstreamcommand_rmteventlogrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3097 static void dissect_r3_upstreamcommand_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3098 static void dissect_r3_upstreamcommand_notify (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3099 static void dissect_r3_upstreamcommand_mfg (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3100 static void dissect_r3_upstreamcommand_eventlogwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3101 static void dissect_r3_upstreamcommand_dumpnvramrle (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3102 static void dissect_r3_upstreamcommand_rmtdeclinedrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3103 static void dissect_r3_upstreamcommand_declinedwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3104 static void dissect_r3_upstreamcommand_dumpdeclinedlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3105 static void dissect_r3_upstreamcommand_rmtalarmrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3106 static void dissect_r3_upstreamcommand_alarmwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3107 static void dissect_r3_upstreamcommand_dumpalarmlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3108 static void dissect_r3_upstreamcommand_connectscheduler (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3109 static void dissect_r3_upstreamcommand_connectcommuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3110 static void dissect_r3_upstreamcommand_commandalarm (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3111 static void dissect_r3_upstreamcommand_dumpdebuglog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3112
3113 static dissectorParser_t r3upstreamcommand_dissect [] =
3114 {
3115   { UPSTREAMCOMMAND_RESERVED,           dissect_r3_upstreamcommand_reserved },
3116   { UPSTREAMCOMMAND_DEBUGMSG,           dissect_r3_upstreamcommand_debugmsg },
3117   { UPSTREAMCOMMAND_QUERYVERSION,       dissect_r3_upstreamcommand_queryversion },
3118   { UPSTREAMCOMMAND_QUERYDATETIME,      dissect_r3_upstreamcommand_querydatetime },
3119   { UPSTREAMCOMMAND_QUERYSERIALNUMBER,  dissect_r3_upstreamcommand_queryserialnumber },
3120   { UPSTREAMCOMMAND_DUMPEVENTLOG,       dissect_r3_upstreamcommand_dumpeventlog },
3121   { UPSTREAMCOMMAND_DUMPNVRAM,          dissect_r3_upstreamcommand_dumpnvram },
3122   { UPSTREAMCOMMAND_RMTAUTHREQUEST,     dissect_r3_upstreamcommand_rmtquthrequest },
3123   { UPSTREAMCOMMAND_RETRIEVEUSER,       dissect_r3_upstreamcommand_retrieveuser },
3124   { UPSTREAMCOMMAND_QUERYCONFIG,        dissect_r3_upstreamcommand_queryconfig },
3125   { UPSTREAMCOMMAND_RMTEVENTLOGRECORD,  dissect_r3_upstreamcommand_rmteventlogrecord },
3126   { UPSTREAMCOMMAND_DPAC,               dissect_r3_upstreamcommand_dpac },
3127   { UPSTREAMCOMMAND_NOTIFY,             dissect_r3_upstreamcommand_notify },
3128   { UPSTREAMCOMMAND_MFG,                dissect_r3_upstreamcommand_mfg },
3129   { UPSTREAMCOMMAND_EVENTLOGWARNING,    dissect_r3_upstreamcommand_eventlogwarning },
3130   { UPSTREAMCOMMAND_DUMPNVRAMRLE,       dissect_r3_upstreamcommand_dumpnvramrle },
3131   { UPSTREAMCOMMAND_RMTDECLINEDRECORD,  dissect_r3_upstreamcommand_rmtdeclinedrecord },
3132   { UPSTREAMCOMMAND_DECLINEDWARNING,    dissect_r3_upstreamcommand_declinedwarning },
3133   { UPSTREAMCOMMAND_DUMPDECLINEDLOG,    dissect_r3_upstreamcommand_dumpdeclinedlog },
3134   { UPSTREAMCOMMAND_RMTALARMRECORD,     dissect_r3_upstreamcommand_rmtalarmrecord },
3135   { UPSTREAMCOMMAND_ALARMWARNING,       dissect_r3_upstreamcommand_alarmwarning },
3136   { UPSTREAMCOMMAND_DUMPALARMLOG,       dissect_r3_upstreamcommand_dumpalarmlog },
3137   { UPSTREAMCOMMAND_CONNECTSCHEDULER,   dissect_r3_upstreamcommand_connectscheduler },
3138   { UPSTREAMCOMMAND_CONNECTCOMMUSER,    dissect_r3_upstreamcommand_connectcommuser },
3139   { UPSTREAMCOMMAND_CONNECTALARM,       dissect_r3_upstreamcommand_commandalarm },
3140   { UPSTREAMCOMMAND_DUMPDEBUGLOG,       dissect_r3_upstreamcommand_dumpdebuglog }
3141 };
3142
3143 static void dissect_r3_upstreammfgfield_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3144 static void dissect_r3_upstreammfgfield_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3145 static void dissect_r3_upstreammfgfield_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3146 static void dissect_r3_upstreammfgfield_checkpointlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3147 static void dissect_r3_upstreammfgfield_cpuregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3148 static void dissect_r3_upstreammfgfield_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3149 static void dissect_r3_upstreammfgfield_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3150 static void dissect_r3_upstreammfgfield_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3151 static void dissect_r3_upstreammfgfield_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3152 static void dissect_r3_upstreammfgfield_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3153 static void dissect_r3_upstreammfgfield_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3154 static void dissect_r3_upstreammfgfield_nvramchecksumvalue (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3155 static void dissect_r3_upstreammfgfield_checksumresults (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3156 static void dissect_r3_upstreammfgfield_mortisestatelog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3157 static void dissect_r3_upstreammfgfield_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3158 static void dissect_r3_upstreammfgfield_keypadchar (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3159 static void dissect_r3_upstreammfgfield_magcard (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3160 static void dissect_r3_upstreammfgfield_proxcard (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree);
3161
3162 static dissectorParser_t r3upstreammfgfield_dissect [] =
3163 {
3164   { MFGFIELD_IOPINS,              dissect_r3_upstreammfgfield_iopins },
3165   { MFGFIELD_ADCS,                dissect_r3_upstreammfgfield_adcs },
3166   { MFGFIELD_HARDWAREID,          dissect_r3_upstreammfgfield_hardwareid },
3167   { MFGFIELD_CHECKPOINTLOG,       dissect_r3_upstreammfgfield_checkpointlog },
3168   { MFGFIELD_CPUREGISTERS,        dissect_r3_upstreammfgfield_cpuregisters },
3169   { MFGFIELD_TASKFLAGS,           dissect_r3_upstreammfgfield_taskflags },
3170   { MFGFIELD_TIMERCHAIN,          dissect_r3_upstreammfgfield_timerchain },
3171   { MFGFIELD_PEEKPOKE,            dissect_r3_upstreammfgfield_peekpoke },
3172   { MFGFIELD_LOCKSTATE,           dissect_r3_upstreammfgfield_lockstate },
3173   { MFGFIELD_CAPABILITIES,        dissect_r3_upstreammfgfield_capabilities },
3174   { MFGFIELD_DUMPM41T81,          dissect_r3_upstreammfgfield_dumpm41t81 },
3175   { MFGFIELD_NVRAMCHECKSUMVALUE,  dissect_r3_upstreammfgfield_nvramchecksumvalue },
3176   { MFGFIELD_CHECKSUMRESULTS,     dissect_r3_upstreammfgfield_checksumresults },
3177   { MFGFIELD_MORTISESTATELOG,     dissect_r3_upstreammfgfield_mortisestatelog },
3178   { MFGFIELD_MORTISEPINS,         dissect_r3_upstreammfgfield_mortisepins },
3179   { MFGFIELD_KEYPADCHAR,          dissect_r3_upstreammfgfield_keypadchar },
3180   { MFGFIELD_MAGCARD,             dissect_r3_upstreammfgfield_magcard },
3181   { MFGFIELD_PROXCARD,            dissect_r3_upstreammfgfield_proxcard }
3182 };
3183
3184 /*
3185  * ***************************************************************************
3186  *
3187  *  Cannot use epan/crc routines as ccitt-x25 uses a starting value of 0xffff
3188  *  and we use 0x0000 (legacy compatibility).  If an override method to set
3189  *  the starting value existed, these could be replaced.
3190  */
3191 static const guint16 ccitt_16 [256] =
3192 {
3193   0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
3194   0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
3195   0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
3196   0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
3197   0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
3198   0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
3199   0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
3200   0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
3201   0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
3202   0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
3203   0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
3204   0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
3205   0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
3206   0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
3207   0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
3208   0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
3209   0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
3210   0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
3211   0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
3212   0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
3213   0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
3214   0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
3215   0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
3216   0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
3217   0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
3218   0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
3219   0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
3220   0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
3221   0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
3222   0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
3223   0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
3224   0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
3225 };
3226
3227 static guint16 utilCrcCalculate (const void *ptr, guint16 len, guint16 crc)
3228 {
3229   const guint8 *p = (guint8 *) ptr;
3230
3231   while (len--)
3232     crc = (guint16) ((crc << 8) ^ ccitt_16 [(crc >> 8) ^ *p++]);
3233
3234   return crc;
3235 }
3236
3237 /*
3238  * ***************************************************************************
3239  */
3240 static void dissect_serialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree, int hf_index)
3241 {
3242   proto_item *sn_item = NULL;
3243   proto_tree *sn_tree = NULL;
3244   const gchar *s = NULL;
3245
3246   tvb_ensure_bytes_exist (tvb, start_offset, 16);
3247
3248   sn_item = proto_tree_add_item (tree, hf_index, tvb, start_offset, 16, TRUE);
3249   sn_tree = proto_item_add_subtree (sn_item, ett_r3serialnumber);
3250
3251   s = tvb_get_ephemeral_string (tvb, start_offset +  0, 2);
3252   proto_tree_add_text (sn_tree, tvb, start_offset +  0, 2, "Manufacturer .. : %s (%s)", s, str_to_str (s, r3_snmanufacturernames, "[Unknown]"));
3253   s = tvb_get_ephemeral_string (tvb, start_offset +  2, 1);
3254   proto_tree_add_text (sn_tree, tvb, start_offset +  2, 1, "Year .......... : %s (%s)", s, str_to_str (s, r3_snyearnames, "[Unknown]"));
3255   s = tvb_get_ephemeral_string (tvb, start_offset +  3, 2);
3256   proto_tree_add_text (sn_tree, tvb, start_offset +  3, 2, "Week .......... : %s",      s);
3257   s = tvb_get_ephemeral_string (tvb, start_offset +  5, 1);
3258   proto_tree_add_text (sn_tree, tvb, start_offset +  5, 1, "Model ......... : %s (%s)", s, str_to_str (s, r3_snmodelnames, "[Unknown]"));
3259   s = tvb_get_ephemeral_string (tvb, start_offset +  6, 4);
3260   proto_tree_add_text (sn_tree, tvb, start_offset +  6, 4, "Sequence ...... : %s",      s);
3261   s = tvb_get_ephemeral_string (tvb, start_offset + 10, 1);
3262   proto_tree_add_text (sn_tree, tvb, start_offset + 10, 1, "Group ......... : %s (%s)", s, str_to_str (s, r3_sngroupnames, "[Unknown]"));
3263   s = tvb_get_ephemeral_string (tvb, start_offset + 11, 1);
3264   proto_tree_add_text (sn_tree, tvb, start_offset + 11, 1, "NID ........... : %s (%s)", s, str_to_str (s, r3_snnidnames, "[Unknown]"));
3265   s = tvb_get_ephemeral_string (tvb, start_offset + 12, 2);
3266   proto_tree_add_text (sn_tree, tvb, start_offset + 12, 2, "HID ........... : %s (%s)", s, str_to_str (s, r3_snhidnames, "[Unknown]"));
3267   s = tvb_get_ephemeral_string (tvb, start_offset + 14, 1);
3268   proto_tree_add_text (sn_tree, tvb, start_offset + 14, 1, "Power Supply .. : %s (%s)", s, str_to_str (s, r3_snpowersupplynames, "[Unknown]"));
3269   s = tvb_get_ephemeral_string (tvb, start_offset + 15, 1);
3270   proto_tree_add_text (sn_tree, tvb, start_offset + 15, 1, "Mortise ....... : %s (%s)", s, str_to_str (s, r3_snmortisenames, "[Unknown]"));
3271 }
3272
3273 /*
3274  * ***************************************************************************
3275  *
3276  * We've already ensured we have enough bytes in the table via tvb_ensure_bytes_exist()
3277  *
3278  */
3279 static void dissect_r3_upstreamfields (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length, packet_info *pinfo, proto_tree *tree)
3280 {
3281   guint32 offset = 0;
3282
3283   while (offset < tvb_reported_length (tvb))
3284   {
3285     guint32 fieldLength = tvb_get_guint8 (tvb, offset + 0);
3286     guint32 fieldType = tvb_get_guint8 (tvb, offset + 1);
3287     guint32 dataLength = fieldLength - 2;
3288     proto_item *upstreamfield_item = NULL;
3289     proto_tree *upstreamfield_tree = NULL;
3290     const gchar *usfn = NULL;
3291
3292     usfn = val_to_str_ext_const (fieldType, &r3_upstreamfieldnames_ext, "[Unknown Field]");
3293
3294     upstreamfield_item = proto_tree_add_none_format (tree, hf_r3_upstreamfield, tvb, offset + 0, fieldLength, "Upstream Field: %s (%u)", usfn, fieldType);
3295     upstreamfield_tree = proto_item_add_subtree (upstreamfield_item, ett_r3upstreamfield);
3296
3297     proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldlength, tvb, offset + 0, 1, TRUE);
3298     proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldtype, tvb, offset + 1, 1, TRUE);
3299
3300     offset += 2;
3301
3302     switch (fieldType)
3303     {
3304       /*
3305        *  Strings, booleans, 8 & 16 bit values
3306        */
3307       case UPSTREAMFIELD_NOTUSED :
3308       case UPSTREAMFIELD_PIN :
3309       case UPSTREAMFIELD_VERSION :
3310       case UPSTREAMFIELD_PRIMARYPIN :
3311       case UPSTREAMFIELD_AUXPIN :
3312       case UPSTREAMFIELD_AUXCTLRVERSION :
3313       case UPSTREAMFIELD_ACCESSALWAYS :
3314       case UPSTREAMFIELD_CACHED :
3315       case UPSTREAMFIELD_ENTRYDEVICE :
3316       case UPSTREAMFIELD_PPMIFIELDTYPE :
3317       case UPSTREAMFIELD_RESPONSEWINDOW :
3318       case UPSTREAMFIELD_USERTYPE :
3319       case UPSTREAMFIELD_PRIMARYFIELDTYPE :
3320       case UPSTREAMFIELD_AUXFIELDTYPE :
3321       case UPSTREAMFIELD_ACCESSMODE :
3322       case UPSTREAMFIELD_USECOUNT :
3323       case UPSTREAMFIELD_EXCEPTIONGROUP :
3324       case UPSTREAMFIELD_NAR :
3325       case UPSTREAMFIELD_SEQUENCENUMBER :
3326       case UPSTREAMFIELD_USERNUMBER :
3327       case UPSTREAMFIELD_EVENTLOGRECORDCOUNT :
3328       case UPSTREAMFIELD_DECLINEDRECORDCOUNT :
3329       case UPSTREAMFIELD_ALARMRECORDCOUNT :
3330         proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType], tvb, offset, dataLength, TRUE);
3331         break;
3332
3333       /*
3334        *  Special types
3335        */
3336       case UPSTREAMFIELD_SERIALNUMBER :
3337         {
3338           tvbuff_t *sn_tvb = tvb_new_subset (tvb, offset, dataLength, dataLength);
3339
3340           dissect_serialnumber (sn_tvb, 0, length, pinfo, upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType]);
3341         }
3342         break;
3343
3344       case UPSTREAMFIELD_EVENTLOGRECORD :
3345         {
3346           proto_item *eventlog_item = NULL;
3347           proto_tree *eventlog_tree = NULL;
3348
3349           if (dataLength != 9)
3350             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed event log field -- expected 9 octets");
3351           else
3352           {
3353             eventlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 9, "Event Log Record");
3354             eventlog_tree = proto_item_add_subtree (eventlog_item, ett_r3eventlogrecord);
3355
3356             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_year, tvb, offset + 0, 1, TRUE);
3357             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_month, tvb, offset + 1, 1, TRUE);
3358             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_day, tvb, offset + 2, 1, TRUE);
3359             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_hour, tvb, offset + 3, 1, TRUE);
3360             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_minute, tvb, offset + 4, 1, TRUE);
3361             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_second, tvb, offset + 5, 1, TRUE);
3362             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_usernumber, tvb, offset + 6, 2, TRUE);
3363             proto_tree_add_item (eventlog_tree, hf_r3_eventlog_event, tvb, offset + 8, 1, TRUE);
3364           }
3365         }
3366         break;
3367
3368       case UPSTREAMFIELD_DATETIME :
3369         {
3370           proto_item *datetime_item = NULL;
3371           proto_tree *datetime_tree = NULL;
3372
3373           if (dataLength != 8)
3374             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed date/time field -- expected 8 octets");
3375           else
3376           {
3377             datetime_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 8, "Date/Time: %02u/%02u/%02u-%u %02u:%02u:%02u %u",
3378                 tvb_get_guint8 (tvb, offset + 0), tvb_get_guint8 (tvb, offset + 1), tvb_get_guint8 (tvb, offset + 2), tvb_get_guint8 (tvb, offset + 3),
3379                 tvb_get_guint8 (tvb, offset + 4), tvb_get_guint8 (tvb, offset + 5), tvb_get_guint8 (tvb, offset + 6), tvb_get_guint8 (tvb, offset + 7));
3380             datetime_tree = proto_item_add_subtree (datetime_item, ett_r3datetime);
3381
3382             proto_tree_add_item (datetime_tree, hf_r3_datetime_year, tvb, offset + 0, 1, TRUE);
3383             proto_tree_add_item (datetime_tree, hf_r3_datetime_month, tvb, offset + 1, 1, TRUE);
3384             proto_tree_add_item (datetime_tree, hf_r3_datetime_day, tvb, offset + 2, 1, TRUE);
3385             proto_tree_add_item (datetime_tree, hf_r3_datetime_dow, tvb, offset + 3, 1, TRUE);
3386             proto_tree_add_item (datetime_tree, hf_r3_datetime_hours, tvb, offset + 4, 1, TRUE);
3387             proto_tree_add_item (datetime_tree, hf_r3_datetime_minutes, tvb, offset + 5, 1, TRUE);
3388             proto_tree_add_item (datetime_tree, hf_r3_datetime_seconds, tvb, offset + 6, 1, TRUE);
3389             proto_tree_add_item (datetime_tree, hf_r3_datetime_dst, tvb, offset + 7, 1, TRUE);
3390           }
3391         }
3392         break;
3393
3394       case UPSTREAMFIELD_DECLINEDRECORD :
3395         {
3396           proto_item *declinedlog_item = NULL;
3397           proto_tree *declinedlog_tree = NULL;
3398           guint8 cred1type = 0;
3399           guint8 cred2type = 0;
3400
3401           if (dataLength != 49)
3402             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed declined log field -- expected 49 octets");
3403           else
3404           {
3405             declinedlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 49, "Declined Log Record");
3406             declinedlog_tree = proto_item_add_subtree (declinedlog_item, ett_r3declinedlogrecord);
3407
3408             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_year, tvb, offset + 0, 1, TRUE);
3409             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_month, tvb, offset + 1, 1, TRUE);
3410             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_day, tvb, offset + 2, 1, TRUE);
3411             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_hour, tvb, offset + 3, 1, TRUE);
3412             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_minute, tvb, offset + 4, 1, TRUE);
3413             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_second, tvb, offset + 5, 1, TRUE);
3414             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_usernumber, tvb, offset + 6, 2, TRUE);
3415
3416             cred1type = tvb_get_guint8 (tvb, offset + 8) & 0x07;
3417             cred2type = (tvb_get_guint8 (tvb, offset + 8) & 0x38) >> 3;
3418
3419             proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred1type, tvb, offset, 1, cred1type);
3420             proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred2type, tvb, offset, 1, cred2type);
3421             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred1, tvb, offset + 9, 19, TRUE);
3422             proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred2, tvb, offset + 28, 19, TRUE);
3423           }
3424         }
3425         break;
3426
3427       case UPSTREAMFIELD_EXPIREON :
3428         {
3429           proto_item *expireon_item = NULL;
3430           proto_tree *expireon_tree = NULL;
3431
3432           if (dataLength != 3)
3433             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed expiration field -- expected 3 octets");
3434           else
3435           {
3436             expireon_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 3, "Expire YY/MM/DD: %02u/%02u/%02u",
3437                 tvb_get_guint8 (tvb, offset + 2), tvb_get_guint8 (tvb, offset + 0), tvb_get_guint8 (tvb, offset + 1));
3438             expireon_tree = proto_item_add_subtree (expireon_item, ett_r3expireon);
3439
3440             proto_tree_add_item (expireon_tree, hf_r3_expireon_month, tvb, offset + 0, 1, TRUE);
3441             proto_tree_add_item (expireon_tree, hf_r3_expireon_day, tvb, offset + 1, 1, TRUE);
3442             proto_tree_add_item (expireon_tree, hf_r3_expireon_year, tvb, offset + 2, 1, TRUE);
3443           }
3444         }
3445         break;
3446
3447       case UPSTREAMFIELD_TIMEZONE :
3448         {
3449           guint32 i;
3450           guint32 tz;
3451           proto_item *timezone_item = NULL;
3452           proto_tree *timezone_tree = NULL;
3453
3454           if (dataLength != 4)
3455             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed timezone field -- expected 4 octets");
3456           else
3457           {
3458             tz = tvb_get_letohl (tvb, offset);
3459             timezone_item = proto_tree_add_item (upstreamfield_tree, hf_r3_upstreamfieldarray [fieldType], tvb, offset, 4, TRUE);
3460             timezone_tree = proto_item_add_subtree (timezone_item, ett_r3timezone);
3461
3462             for (i = 0; i < 32; i++)
3463               proto_tree_add_boolean (timezone_tree, hf_r3_timezonearray [i], tvb, offset, 4, tz);
3464           }
3465         }
3466         break;
3467
3468       case UPSTREAMFIELD_ALARMRECORD :
3469         {
3470           proto_item *alarmlog_item = NULL;
3471           proto_tree *alarmlog_tree = NULL;
3472
3473           alarmlog_item = proto_tree_add_text (upstreamfield_tree, tvb, offset, 9, "Alarm Record");
3474           alarmlog_tree = proto_item_add_subtree (alarmlog_item, ett_r3alarmlogrecord);
3475
3476           if (dataLength != 9)
3477             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed alarm log field -- expected 9 octets");
3478           else
3479           {
3480             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_year, tvb, offset + 0, 1, TRUE);
3481             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_month, tvb, offset + 1, 1, TRUE);
3482             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_day, tvb, offset + 2, 1, TRUE);
3483             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_hour, tvb, offset + 3, 1, TRUE);
3484             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_minute, tvb, offset + 4, 1, TRUE);
3485             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_second, tvb, offset + 5, 1, TRUE);
3486             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_id, tvb, offset + 6, 1, TRUE);
3487             proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_usernumber, tvb, offset + 7, 2, TRUE);
3488           }
3489         }
3490         break;
3491
3492       default :
3493         proto_tree_add_none_format (upstreamfield_tree, hf_r3_upstreamfielderror, tvb, offset, dataLength, "Unknown Field Type");
3494         break;
3495     }
3496
3497     offset += dataLength;
3498   }
3499 }
3500
3501 /*
3502  * ***************************************************************************
3503  *
3504  *  These are passed a tvb that contains whatever occurs after the [UPSTREAMCOMMAND_*] byte
3505  */
3506 static void dissect_r3_upstreamcommand_reserved (tvbuff_t *tvb _U_, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree _U_)
3507 {
3508   DISSECTOR_ASSERT (0);
3509 }
3510
3511 static void dissect_r3_upstreamcommand_debugmsg (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3512 {
3513   proto_item *debugmsg_item = NULL;
3514   proto_tree *debugmsg_tree = NULL;
3515
3516   debugmsg_item = proto_tree_add_text (tree, tvb, start_offset, -1, "Debug message");
3517   debugmsg_tree = proto_item_add_subtree (debugmsg_item, ett_r3debugmsg);
3518
3519   proto_tree_add_item (debugmsg_tree, hf_r3_debugmsg, tvb, start_offset + 1, -1, TRUE);
3520 }
3521
3522 static void dissect_r3_upstreamcommand_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3523 {
3524   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3525 }
3526
3527 static void dissect_r3_upstreamcommand_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3528 {
3529   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3530 }
3531
3532 static void dissect_r3_upstreamcommand_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3533 {
3534   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3535 }
3536
3537 static void dissect_r3_upstreamcommand_dumpeventlog (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3538 {
3539   proto_item *eventlog_item = NULL;
3540   proto_tree *eventlog_tree = NULL;
3541   const gchar *en = NULL;
3542
3543   tvb_ensure_bytes_exist (tvb, start_offset, 11);
3544
3545   if (length != 11)
3546     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed event log record -- expected 10 octets");
3547   else
3548   {
3549     en = val_to_str_ext_const (tvb_get_guint8 (tvb, start_offset + 10), &r3_eventnames_ext, "[Unknown Event]");
3550
3551     eventlog_item = proto_tree_add_text (tree, tvb, start_offset, 10, "Event Log Record %u (%s)", tvb_get_letohs (tvb, start_offset + 0), en);
3552     eventlog_tree = proto_item_add_subtree (eventlog_item, ett_r3eventlogrecord);
3553
3554     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_recordnumber, tvb, start_offset + 0, 2, TRUE);
3555     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_year, tvb, start_offset + 2, 1, TRUE);
3556     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_month, tvb, start_offset + 3, 1, TRUE);
3557     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_day, tvb, start_offset + 4, 1, TRUE);
3558     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_hour, tvb, start_offset + 5, 1, TRUE);
3559     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_minute, tvb, start_offset + 6, 1, TRUE);
3560     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_second, tvb, start_offset + 7, 1, TRUE);
3561     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_usernumber, tvb, start_offset + 8, 2, TRUE);
3562     proto_tree_add_item (eventlog_tree, hf_r3_eventlog_event, tvb, start_offset + 10, 1, TRUE);
3563   }
3564 }
3565
3566 static void dissect_r3_upstreamcommand_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3567 {
3568   tvb_ensure_bytes_exist (tvb, start_offset, 3);
3569
3570   proto_tree_add_item (tree, hf_r3_nvramdump_record, tvb, start_offset + 0, 2, TRUE);
3571   proto_tree_add_item (tree, hf_r3_nvramdump_length, tvb, start_offset + 2, 1, TRUE);
3572   proto_tree_add_item (tree, hf_r3_nvramdump_data, tvb, start_offset + 3, tvb_get_guint8 (tvb, start_offset + 2), TRUE);
3573 }
3574
3575 static void dissect_r3_upstreamcommand_rmtquthrequest (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3576 {
3577   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3578 }
3579
3580 static void dissect_r3_upstreamcommand_retrieveuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3581 {
3582   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3583 }
3584
3585 static void dissect_r3_upstreamcommand_queryconfig (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3586 {
3587   guint32 offset = 0;
3588
3589   while (offset < tvb_reported_length (tvb))
3590   {
3591     proto_item *upstreamfield_item = NULL;
3592     proto_tree *upstreamfield_tree = NULL;
3593     const gchar *ci = NULL;
3594
3595     ci = val_to_str_ext_const (tvb_get_guint8 (tvb, offset + 1), &r3_configitemnames_ext, "[Unknown Configuration Item]");
3596
3597     upstreamfield_item = proto_tree_add_text (tree, tvb, offset + 0, tvb_get_guint8 (tvb, offset + 0), "Config Field: %s (%u)", ci, tvb_get_guint8 (tvb, offset + 1));
3598     upstreamfield_tree = proto_item_add_subtree (upstreamfield_item, ett_r3upstreamfield);
3599
3600     proto_tree_add_item (upstreamfield_tree, hf_r3_configitemlength, tvb, offset + 0, 1, TRUE);
3601     proto_tree_add_item (upstreamfield_tree, hf_r3_configitem, tvb, offset + 1, 1, TRUE);
3602     proto_tree_add_item (upstreamfield_tree, hf_r3_configitemtype, tvb, offset + 2, 1, TRUE);
3603
3604     switch (tvb_get_guint8 (tvb, offset + 2))
3605     {
3606       case CONFIGTYPE_NONE :
3607         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, TRUE);
3608         break;
3609
3610       case CONFIGTYPE_BOOL :
3611         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_bool, tvb, offset + 3, 1, TRUE);
3612         break;
3613
3614       case CONFIGTYPE_8 :
3615         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_8, tvb, offset + 3, 1, TRUE);
3616         break;
3617
3618       case CONFIGTYPE_16 :
3619         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_16, tvb, offset + 3, 2, TRUE);
3620         break;
3621
3622       case CONFIGTYPE_32 :
3623         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_32, tvb, offset + 3, 4, TRUE);
3624         break;
3625
3626       case CONFIGTYPE_STRING :
3627         proto_tree_add_item (upstreamfield_tree, hf_r3_configitemdata_string, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, TRUE);
3628         break;
3629
3630       default :
3631         proto_tree_add_none_format (upstreamfield_tree, hf_r3_upstreamfielderror, tvb, offset + 3, tvb_get_guint8 (tvb, offset + 0) - 3, "Unknown Field Type");
3632         break;
3633     }
3634
3635     offset += tvb_get_guint8 (tvb, offset + 0);
3636   }
3637 }
3638
3639 static void dissect_r3_upstreamcommand_rmteventlogrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3640 {
3641   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3642 }
3643
3644 static void dissect_r3_upstreamcommand_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3645 {
3646   proto_tree_add_item (tree, hf_r3_dpacreply_stuff, tvb, start_offset + 2, 1, TRUE);
3647   proto_tree_add_item (tree, hf_r3_dpacreply_length, tvb, start_offset + 3, 1, TRUE);
3648   proto_tree_add_item (tree, hf_r3_dpacreply_reply, tvb, start_offset + 4, -1, TRUE);
3649 }
3650
3651 static void dissect_r3_upstreamcommand_notify (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3652 {
3653   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3654 }
3655
3656 static void dissect_r3_upstreamcommand_mfg (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length, packet_info *pinfo, proto_tree *tree)
3657 {
3658   proto_item *mfg_item = NULL;
3659   proto_tree *mfg_tree = NULL;
3660   tvbuff_t *mfg_tvb = NULL;
3661   const gchar *cn;
3662
3663   mfg_tvb = tvb_new_subset (tvb, 2, tvb_reported_length (tvb) - 2, tvb_reported_length (tvb) - 2);
3664
3665   cn = val_to_str_ext_const (tvb_get_guint8 (tvb, 1), &r3_mfgfieldnames_ext, "[Unknown Mfg Field]");
3666
3667   proto_tree_add_item (tree, hf_r3_mfgfield_length, tvb, 0, 1, TRUE);
3668
3669   mfg_item = proto_tree_add_text (tree, tvb, 1, -1, "Upstream Manufacturing Field: %s (%u)", cn, tvb_get_guint8 (tvb, 1));
3670   mfg_tree = proto_item_add_subtree (mfg_item, ett_r3commandmfg);
3671
3672   proto_tree_add_item (mfg_tree, hf_r3_mfgfield, tvb, 1, 1, TRUE);
3673
3674   if (tvb_get_guint8 (tvb, 1) >= MFGFIELD_LAST)
3675     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Unknown manufacturing command value");
3676   else if (r3upstreammfgfield_dissect [tvb_get_guint8 (tvb, 1)].dissector)
3677     (*r3upstreammfgfield_dissect [tvb_get_guint8 (tvb, 1)].dissector) (mfg_tvb, 0, length, pinfo, mfg_tree);
3678 }
3679
3680 static void dissect_r3_upstreamcommand_eventlogwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3681 {
3682   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3683 }
3684
3685 static void dissect_r3_upstreamcommand_dumpnvramrle (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3686 {
3687   proto_tree_add_item (tree, hf_r3_nvramdumprle_record, tvb, start_offset + 0, 2, TRUE);
3688   proto_tree_add_item (tree, hf_r3_nvramdumprle_length, tvb, start_offset + 3, 1, TRUE);
3689   proto_tree_add_item (tree, hf_r3_nvramdumprle_data, tvb, start_offset + 4, tvb_get_guint8 (tvb, start_offset + 3), TRUE);
3690 }
3691
3692 static void dissect_r3_upstreamcommand_rmtdeclinedrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3693 {
3694   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3695 }
3696
3697 static void dissect_r3_upstreamcommand_declinedwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3698 {
3699   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3700 }
3701
3702 static void dissect_r3_upstreamcommand_dumpdeclinedlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3703 {
3704   proto_item *declinedlog_item = NULL;
3705   proto_tree *declinedlog_tree = NULL;
3706   guint8 cred1type = 0;
3707   guint8 cred2type = 0;
3708
3709   declinedlog_item = proto_tree_add_text (tree, tvb, start_offset, 49, "Declined Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
3710   declinedlog_tree = proto_item_add_subtree (declinedlog_item, ett_r3declinedlogrecord);
3711
3712   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_recordnumber, tvb, start_offset, 2, TRUE); start_offset += 2;
3713   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_year, tvb, start_offset, 1, TRUE);        start_offset += 1;
3714   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_month, tvb, start_offset, 1, TRUE);       start_offset += 1;
3715   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_day, tvb, start_offset, 1, TRUE);         start_offset += 1;
3716   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_hour, tvb, start_offset, 1, TRUE);        start_offset += 1;
3717   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_minute, tvb, start_offset, 1, TRUE);      start_offset += 1;
3718   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_second, tvb, start_offset, 1, TRUE);      start_offset += 1;
3719   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_usernumber, tvb, start_offset, 2, TRUE);   start_offset += 2;
3720
3721   cred1type = tvb_get_guint8 (tvb, start_offset) & 0x07;
3722   cred2type = (tvb_get_guint8 (tvb, start_offset) & 0x38) >> 3;
3723
3724   proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred1type, tvb, start_offset, 1, cred1type);   start_offset += 0;
3725   proto_tree_add_uint (declinedlog_tree, hf_r3_declinedlog_cred2type, tvb, start_offset, 1, cred2type);   start_offset += 1;
3726   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred1, tvb, start_offset, 19, TRUE);          start_offset += 19;
3727   proto_tree_add_item (declinedlog_tree, hf_r3_declinedlog_cred2, tvb, start_offset, 19, TRUE);
3728 }
3729
3730 static void dissect_r3_upstreamcommand_rmtalarmrecord (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3731 {
3732   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3733 }
3734
3735 static void dissect_r3_upstreamcommand_alarmwarning (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3736 {
3737   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3738 }
3739
3740 static void dissect_r3_upstreamcommand_dumpalarmlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3741 {
3742   proto_item *alarmlog_item = proto_tree_add_text (tree, tvb, start_offset, 9, "Alarm Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
3743   proto_tree *alarmlog_tree = proto_item_add_subtree (alarmlog_item, ett_r3alarmlogrecord);
3744
3745   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_recordnumber, tvb, start_offset + 0, 2, TRUE);
3746   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_year, tvb, start_offset + 2, 1, TRUE);
3747   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_month, tvb, start_offset + 3, 1, TRUE);
3748   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_day, tvb, start_offset + 4, 1, TRUE);
3749   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_hour, tvb, start_offset + 5, 1, TRUE);
3750   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_minute, tvb, start_offset + 6, 1, TRUE);
3751   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_second, tvb, start_offset + 7, 1, TRUE);
3752   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_id, tvb, start_offset + 8, 1, TRUE);
3753   proto_tree_add_item (alarmlog_tree, hf_r3_alarmlog_usernumber, tvb, start_offset + 9, 2, TRUE);
3754 }
3755
3756 static void dissect_r3_upstreamcommand_connectscheduler (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3757 {
3758   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3759 }
3760
3761 static void dissect_r3_upstreamcommand_connectcommuser (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3762 {
3763   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3764 }
3765
3766 static void dissect_r3_upstreamcommand_commandalarm (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
3767 {
3768   dissect_r3_upstreamfields (tvb, start_offset, length, pinfo, tree);
3769 }
3770
3771 static void dissect_r3_upstreamcommand_dumpdebuglog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3772 {
3773   proto_item *debuglog_item = proto_tree_add_text (tree, tvb, start_offset, 8, "Debug Log Record %u", tvb_get_letohs (tvb, start_offset + 0));
3774   proto_tree *debuglog_tree = proto_item_add_subtree (debuglog_item, ett_r3debuglogrecord);
3775
3776   proto_tree_add_item (debuglog_tree, hf_r3_debuglog_recordnumber, tvb, start_offset + 0, 2, TRUE);
3777   proto_tree_add_item (debuglog_tree, hf_r3_debuglog_flags, tvb, start_offset + 2, 4, TRUE);
3778   proto_tree_add_item (debuglog_tree, hf_r3_debuglog_tick, tvb, start_offset + 6, 2, TRUE);
3779 }
3780
3781 /*
3782  * ***************************************************************************
3783  */
3784 static void dissect_r3_upstreammfgfield_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
3785 {
3786   guint32 i;
3787   guint32 l = tvb_length_remaining (tvb, start_offset);
3788   char portname = 'A';
3789
3790   if (l % 3 != 0)
3791     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "IOPINS data length not modulo 3 == 0");
3792   else
3793   {
3794     for (i = 0; i < l; i += 3, portname++)
3795     {
3796       proto_item *port_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "Port %c Configuration", (portname == 'I') ? ++portname : portname);
3797       proto_tree *port_tree = proto_item_add_subtree (port_item, ett_r3iopins);
3798
3799       proto_tree_add_item (port_tree, hf_r3_iopins_lat, tvb, start_offset + i + 0, 1, TRUE);
3800       proto_tree_add_item (port_tree, hf_r3_iopins_port, tvb, start_offset + i + 1, 1, TRUE);
3801       proto_tree_add_item (port_tree, hf_r3_iopins_tris, tvb, start_offset + i + 2, 1, TRUE);
3802     }
3803   }
3804 }
3805
3806 static void dissect_r3_upstreammfgfield_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3807 {
3808   guint32 i;
3809
3810   for (i = 0; i < tvb_reported_length (tvb); i++)
3811   {
3812     proto_item *item = proto_tree_add_item (tree, hf_r3_adc [i], tvb, start_offset + i, 1, TRUE);
3813     proto_item_append_text (item, " (%.2f Volts)", (float) tvb_get_guint8 (tvb, start_offset + i) * 0.04154);
3814   }
3815 }
3816
3817 static void dissect_r3_upstreammfgfield_hardwareid (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3818 {
3819   proto_tree_add_item (tree, hf_r3_hardwareid_board, tvb, 0, 1, TRUE);
3820   proto_tree_add_item (tree, hf_r3_hardwareid_cpuid, tvb, 1, 2, TRUE);
3821   proto_tree_add_item (tree, hf_r3_hardwareid_cpurev, tvb, 3, 1, TRUE);
3822 }
3823
3824 static void dissect_r3_upstreammfgfield_checkpointlog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3825 {
3826   proto_item *cpl_item = NULL;
3827   proto_tree *cpl_tree = NULL;
3828   guint counter = 0;
3829   guint l = tvb_length_remaining (tvb, start_offset + 1);
3830   guint i;
3831
3832   proto_tree_add_item (tree, hf_r3_checkpointlog_entryptr, tvb, start_offset, 1, TRUE);
3833   cpl_item = proto_tree_add_text (tree, tvb, start_offset + 1, -1, "Checkpoint Log");
3834   cpl_tree = proto_item_add_subtree (cpl_item, ett_r3checkpointlog);
3835
3836   for (start_offset++, i = 0; i < l; i += 2, counter++)
3837   {
3838     guint rcon = tvb_get_guint8 (tvb, start_offset + i + 0);
3839     guint cp = tvb_get_guint8 (tvb, start_offset + i + 1);
3840     guint resettype = 0;
3841     proto_item *cpe_item = proto_tree_add_text (cpl_tree, tvb, start_offset + i + 0, 2, "Checkpoint Log Entry %u", counter);
3842     proto_tree *cpe_tree = proto_item_add_subtree (cpe_item, ett_r3checkpointlogentry);
3843     const gchar *resets [] = { "Stack underflow", "Stack overflow", "Power-On", "Software", "Brown-out", "MCLR in sleep", "WDT", "Normal", "[Unknown Reset Type]" };
3844     const gchar *desc;
3845
3846     desc = val_to_str_ext_const (cp, &r3_checkpointnames_ext, "[Unknown Checkpoint]");
3847
3848     if (rcon == 0xff)
3849       resettype = 8;
3850     else
3851     {
3852       rcon &= 0x1f;
3853
3854       if (rcon == 0x1c)
3855         resettype = 2;
3856       else if ((rcon & 0x10) == 0x00)
3857         resettype = 3;
3858       else if ((rcon & 0x1d) == 0x1c)
3859         resettype = 4;
3860       else if ((rcon & 0x0c) == 0x08)
3861         resettype = 5;
3862       else if ((rcon & 0x0c) == 0x04)
3863         resettype = 6;
3864       else
3865         resettype = 7;
3866     }
3867
3868     proto_item_append_text (cpe_item, " (%s, %s)", resets [resettype], desc);
3869     proto_item_append_text (proto_tree_add_item (cpe_tree, hf_r3_checkpointlog_rcon, tvb, start_offset + i + 0, 1, TRUE), " (%s)", resets [resettype]);
3870     proto_item_append_text (proto_tree_add_item (cpe_tree, hf_r3_checkpointlog_checkpoint, tvb, start_offset + i + 1, 1, TRUE), " (%s)", desc);
3871   }
3872 }
3873
3874 static void dissect_r3_upstreammfgfield_cpuregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
3875 {
3876   proto_tree *tmp_tree [19];
3877   proto_item *cr_item = proto_tree_add_text (tree, tvb, start_offset, -1, "CPU Registers");
3878   proto_tree *cr_tree = proto_item_add_subtree (cr_item, ett_r3cpuregisters);
3879
3880   tmp_tree [ 0] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon,  tvb, start_offset +  0, 1, TRUE), ett_r3cpuregister);
3881   tmp_tree [ 1] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon2, tvb, start_offset +  1, 1, TRUE), ett_r3cpuregister);
3882   tmp_tree [ 2] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_intcon3, tvb, start_offset +  2, 1, TRUE), ett_r3cpuregister);
3883   tmp_tree [ 3] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir1,    tvb, start_offset +  3, 1, TRUE), ett_r3cpuregister);
3884   tmp_tree [ 4] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir2,    tvb, start_offset +  4, 1, TRUE), ett_r3cpuregister);
3885   tmp_tree [ 5] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pir3,    tvb, start_offset +  5, 1, TRUE), ett_r3cpuregister);
3886   tmp_tree [ 6] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie1,    tvb, start_offset +  6, 1, TRUE), ett_r3cpuregister);
3887   tmp_tree [ 7] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie2,    tvb, start_offset +  7, 1, TRUE), ett_r3cpuregister);
3888   tmp_tree [ 8] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_pie3,    tvb, start_offset +  8, 1, TRUE), ett_r3cpuregister);
3889   tmp_tree [ 9] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr1,    tvb, start_offset +  9, 1, TRUE), ett_r3cpuregister);
3890   tmp_tree [10] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr2,    tvb, start_offset + 10, 1, TRUE), ett_r3cpuregister);
3891   tmp_tree [11] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_ipr3,    tvb, start_offset + 11, 1, TRUE), ett_r3cpuregister);
3892   tmp_tree [12] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcon,    tvb, start_offset + 12, 1, TRUE), ett_r3cpuregister);
3893   tmp_tree [13] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_osccon,  tvb, start_offset + 13, 1, TRUE), ett_r3cpuregister);
3894   tmp_tree [14] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcsta,   tvb, start_offset + 14, 1, TRUE), ett_r3cpuregister);
3895   tmp_tree [15] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_txsta,   tvb, start_offset + 15, 1, TRUE), ett_r3cpuregister);
3896   tmp_tree [16] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_rcsta2,  tvb, start_offset + 16, 1, TRUE), ett_r3cpuregister);
3897   tmp_tree [17] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_txsta2,  tvb, start_offset + 17, 1, TRUE), ett_r3cpuregister);
3898   tmp_tree [18] = proto_item_add_subtree (proto_tree_add_item (cr_tree, hf_r3_cpuregisters_wdtcon,  tvb, start_offset + 18, 1, TRUE), ett_r3cpuregister);
3899
3900   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_rbif,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3901   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_int0if,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3902   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_tmr0if,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3903   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_rbie,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3904   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_int0ie,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3905   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_tmr0ie,   tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3906   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_giel,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3907   proto_tree_add_boolean (tmp_tree [ 0], hf_r3_cpuregisters_intcon_gieh,     tvb, start_offset +  0, 1, tvb_get_guint8 (tvb, start_offset +  0));
3908   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_rbip,    tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3909   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_int3ip,  tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3910   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_tmr0ip,  tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3911   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg3, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3912   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg2, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3913   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg1, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3914   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_intedg0, tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3915   proto_tree_add_boolean (tmp_tree [ 1], hf_r3_cpuregisters_intcon2_rbpu,    tvb, start_offset +  1, 1, tvb_get_guint8 (tvb, start_offset +  1));
3916   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3917   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3918   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int3if,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3919   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3920   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3921   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int3ie,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3922   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int1ip,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3923   proto_tree_add_boolean (tmp_tree [ 2], hf_r3_cpuregisters_intcon3_int2ip,  tvb, start_offset +  2, 1, tvb_get_guint8 (tvb, start_offset +  2));
3924   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tmr1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3925   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tmr2if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3926   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_ccp1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3927   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_ssp1if,     tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3928   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_tx1if,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3929   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_rc1if,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3930   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_adif,       tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3931   proto_tree_add_boolean (tmp_tree [ 3], hf_r3_cpuregisters_pir1_pspif,      tvb, start_offset +  3, 1, tvb_get_guint8 (tvb, start_offset +  3));
3932   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_ccp2if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3933   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_tmr3if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3934   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_hlvdif,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3935   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_bcl1if,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3936   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_eeif,       tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3937   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_unused5,    tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3938   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_cmif,       tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3939   proto_tree_add_boolean (tmp_tree [ 4], hf_r3_cpuregisters_pir2_oscfif,     tvb, start_offset +  4, 1, tvb_get_guint8 (tvb, start_offset +  4));
3940   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp3if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3941   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp4if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3942   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ccp5if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3943   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_tmr4if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3944   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_tx2if,      tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3945   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_rc2if,      tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3946   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_bcl2if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3947   proto_tree_add_boolean (tmp_tree [ 5], hf_r3_cpuregisters_pir3_ssp2if,     tvb, start_offset +  5, 1, tvb_get_guint8 (tvb, start_offset +  5));
3948   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tmr1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3949   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tmr2ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3950   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_ccp1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3951   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_ssp1ie,     tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3952   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_tx1ie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3953   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_rc1ie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3954   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_adie,       tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3955   proto_tree_add_boolean (tmp_tree [ 6], hf_r3_cpuregisters_pie1_pspie,      tvb, start_offset +  6, 1, tvb_get_guint8 (tvb, start_offset +  6));
3956   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_oscfie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3957   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_cmie,       tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3958   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_unused2,    tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3959   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_eeie,       tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3960   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_bcl1ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3961   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_hlvdie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3962   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_tmr3ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3963   proto_tree_add_boolean (tmp_tree [ 7], hf_r3_cpuregisters_pie2_ccp2ie,     tvb, start_offset +  7, 1, tvb_get_guint8 (tvb, start_offset +  7));
3964   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp3ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3965   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp4ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3966   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ccp5ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3967   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_tmr4ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3968   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_tx2ie,      tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3969   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_rc2ie,      tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3970   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_bcl2ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3971   proto_tree_add_boolean (tmp_tree [ 8], hf_r3_cpuregisters_pie3_ssp2ie,     tvb, start_offset +  8, 1, tvb_get_guint8 (tvb, start_offset +  8));
3972   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tmr1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3973   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tmr2ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3974   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_ccp1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3975   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_ssp1ip,     tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3976   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_tx1ip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3977   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_rc1ip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3978   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_adip,       tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3979   proto_tree_add_boolean (tmp_tree [ 9], hf_r3_cpuregisters_ipr1_pspip,      tvb, start_offset +  9, 1, tvb_get_guint8 (tvb, start_offset +  9));
3980   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_ccp2ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3981   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_tmr3ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3982   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_hlvdip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3983   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_bcl1ip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3984   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_eeip,       tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3985   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_unused5,    tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3986   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_cmip,       tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3987   proto_tree_add_boolean (tmp_tree [10], hf_r3_cpuregisters_ipr2_oscfip,     tvb, start_offset + 10, 1, tvb_get_guint8 (tvb, start_offset + 10));
3988   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3989   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp4ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3990   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ccp5ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3991   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_tmr4ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3992   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_tx2ip,      tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3993   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_rc2ip,      tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3994   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_bcl2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3995   proto_tree_add_boolean (tmp_tree [11], hf_r3_cpuregisters_ipr3_ssp2ip,     tvb, start_offset + 11, 1, tvb_get_guint8 (tvb, start_offset + 11));
3996   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_bor,        tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
3997   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_por,        tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
3998   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_pd,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
3999   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_to,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
4000   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_unused4,    tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
4001   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_ri,         tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
4002   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_sboren,     tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
4003   proto_tree_add_boolean (tmp_tree [12], hf_r3_cpuregisters_rcon_ipen,       tvb, start_offset + 12, 1, tvb_get_guint8 (tvb, start_offset + 12));
4004   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_scs0,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4005   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_scs1,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4006   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_iofs,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4007   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_osts,     tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4008   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf0,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4009   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf1,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4010   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_ircf2,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4011   proto_tree_add_boolean (tmp_tree [13], hf_r3_cpuregisters_osccon_idlen,    tvb, start_offset + 13, 1, tvb_get_guint8 (tvb, start_offset + 13));
4012   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_rx9d,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4013   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_oerr,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4014   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_ferr,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4015   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_adden,     tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4016   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_cren,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4017   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_sren,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4018   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_rx9,       tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4019   proto_tree_add_boolean (tmp_tree [14], hf_r3_cpuregisters_rcsta_spen,      tvb, start_offset + 14, 1, tvb_get_guint8 (tvb, start_offset + 14));
4020   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_tx9d,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4021   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_trmt,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4022   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_brgh,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4023   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_sendb,     tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4024   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_sync,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4025   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_txen,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4026   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_tx9,       tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4027   proto_tree_add_boolean (tmp_tree [15], hf_r3_cpuregisters_txsta_csrc,      tvb, start_offset + 15, 1, tvb_get_guint8 (tvb, start_offset + 15));
4028   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_rx9d,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4029   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_oerr,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4030   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_ferr,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4031   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_adden,    tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4032   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_cren,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4033   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_sren,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4034   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_rx9,      tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4035   proto_tree_add_boolean (tmp_tree [16], hf_r3_cpuregisters_rcsta2_spen,     tvb, start_offset + 16, 1, tvb_get_guint8 (tvb, start_offset + 16));
4036   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_tx9d,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4037   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_trmt,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4038   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_brgh,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4039   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_sendb,    tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4040   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_sync,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4041   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_txen,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4042   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_tx9,      tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4043   proto_tree_add_boolean (tmp_tree [17], hf_r3_cpuregisters_txsta2_csrc,     tvb, start_offset + 17, 1, tvb_get_guint8 (tvb, start_offset + 17));
4044   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_swdten,   tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4045   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused1,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4046   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused2,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4047   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused3,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4048   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused4,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4049   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused5,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4050   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused6,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4051   proto_tree_add_boolean (tmp_tree [18], hf_r3_cpuregisters_wdtcon_unused7,  tvb, start_offset + 18, 1, tvb_get_guint8 (tvb, start_offset + 18));
4052 }
4053
4054 static void dissect_r3_upstreammfgfield_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4055 {
4056   guint l = tvb_length_remaining (tvb, start_offset);
4057   guint i;
4058
4059   proto_item *tfg_item = proto_tree_add_text (tree, tvb, start_offset, -1, "Task Flags (%u tasks)", l / 5);
4060   proto_tree *tfg_tree = proto_item_add_subtree (tfg_item, ett_r3taskflags);
4061
4062   for (i = 0; i < l; i += 5)
4063   {
4064     proto_item *tf_item = proto_tree_add_text (tfg_tree, tvb, start_offset + i, 5, "Task Flags (%2d: 0x%06x)", tvb_get_guint8 (tvb, start_offset + i + 0), tvb_get_letohl (tvb, start_offset + i + 1));
4065     proto_tree *tf_tree = proto_item_add_subtree (tf_item, ett_r3taskflagsentry);
4066
4067     proto_tree_add_item (tf_tree, hf_r3_taskflags_taskid, tvb, start_offset + i + 0, 1, TRUE);
4068     proto_tree_add_item (tf_tree, hf_r3_taskflags_flags, tvb, start_offset + i + 1, 4, TRUE);
4069   }
4070 }
4071
4072 static void dissect_r3_upstreammfgfield_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4073 {
4074   guint l = tvb_length_remaining (tvb, start_offset + 3);
4075   guint i;
4076
4077   proto_tree_add_item (tree, hf_r3_timerchain_newtick, tvb, start_offset + 0, 2, TRUE);
4078   proto_tree_add_item (tree, hf_r3_timerchain_currentboundary, tvb, start_offset + 2, 1, TRUE);
4079
4080   for (start_offset += 3, i = 0; i < l; i += 12)
4081   {
4082     proto_item *tc_item = proto_tree_add_text (tree, tvb, start_offset + i, 12, "Timer Chain Entry");
4083     proto_tree *tc_tree = proto_item_add_subtree (tc_item, ett_r3timerchain);
4084
4085     proto_tree_add_item (tc_tree, hf_r3_timerchain_tasktag, tvb, start_offset + i + 0, 1, TRUE);
4086     proto_tree_add_item (tc_tree, hf_r3_timerchain_address, tvb, start_offset + i + 1, 2, TRUE);
4087     proto_tree_add_item (tc_tree, hf_r3_timerchain_reload, tvb, start_offset + i + 3, 2, TRUE);
4088     proto_tree_add_item (tc_tree, hf_r3_timerchain_boundary, tvb, start_offset + i + 5, 1, TRUE);
4089     proto_tree_add_item (tc_tree, hf_r3_timerchain_count, tvb, start_offset + i + 6, 2, TRUE);
4090     proto_tree_add_item (tc_tree, hf_r3_timerchain_flags, tvb, start_offset + i + 8, 4, TRUE);
4091   }
4092 }
4093
4094 static void dissect_r3_upstreammfgfield_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4095 {
4096   guint i;
4097   guint l = tvb_length_remaining (tvb, start_offset);
4098
4099   for (i = 0; i < l; i += 3)
4100   {
4101     proto_item *peekpoke_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "%s", "");
4102     proto_tree *peekpoke_tree = proto_item_add_subtree (peekpoke_item, ett_r3peekpoke);
4103
4104     proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_operation, tvb, start_offset + i + 0, 1, TRUE);
4105     proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_address, tvb, start_offset + i + 1, 2, TRUE);
4106
4107     switch (tvb_get_guint8 (tvb, start_offset + i + 0))
4108     {
4109       case PEEKPOKE_READU8 :
4110         proto_item_append_text (peekpoke_item, "Read (8 Bits @ 0x%04x = 0x%02x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_guint8 (tvb, start_offset + i + 3));
4111         proto_item_set_len (peekpoke_item, 4);
4112         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke8, tvb, start_offset + i + 3, 1, TRUE);
4113         i += 1;
4114         break;
4115
4116       case PEEKPOKE_READU16 :
4117         proto_item_append_text (peekpoke_item, "Read (16 Bits @ 0x%04x = 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letohs (tvb, start_offset + i + 3));
4118         proto_item_set_len (peekpoke_item, 5);
4119         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke16, tvb, start_offset + i + 3, 2, TRUE);
4120         i += 2;
4121         break;
4122
4123       case PEEKPOKE_READU24 :
4124         proto_item_append_text (peekpoke_item, "Read (24 Bits @ 0x%04x = 0x%06x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letoh24 (tvb, start_offset + i + 3));
4125         proto_item_set_len (peekpoke_item, 6);
4126         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke24, tvb, start_offset + i + 3, 3, TRUE);
4127         i += 3;
4128         break;
4129
4130       case PEEKPOKE_READU32 :
4131         proto_item_append_text (peekpoke_item, "Read (32 Bits @ 0x%04x = 0x%08x)", tvb_get_letohs (tvb, start_offset + i + 1), tvb_get_letohl (tvb, start_offset + i + 3));
4132         proto_item_set_len (peekpoke_item, 7);
4133         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke32, tvb, start_offset + i + 3, 4, TRUE);
4134         i += 4;
4135         break;
4136
4137       case PEEKPOKE_READSTRING :
4138         proto_item_append_text (peekpoke_item, "Read (%u Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
4139         proto_item_set_len (peekpoke_item, 3 + 1 + tvb_get_guint8 (tvb, start_offset + i + 3));
4140         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE);
4141         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_pokestring, tvb, start_offset + i + 4, tvb_get_guint8 (tvb, start_offset + i + 3), TRUE);
4142         i += tvb_get_guint8 (tvb, start_offset + i + 3) + 1;
4143         break;
4144
4145       default :
4146         DISSECTOR_ASSERT (0);
4147     }
4148   }
4149 }
4150
4151 static void dissect_r3_upstreammfgfield_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4152 {
4153   proto_item *ls_item = proto_tree_add_text (tree, tvb, start_offset, tvb_length_remaining (tvb, start_offset), "Lock State (0x%06x)", tvb_get_letoh24 (tvb, start_offset));
4154   proto_tree *ls_tree = proto_item_add_subtree (ls_item, ett_r3lockstate);
4155   guint ls = tvb_get_letoh24 (tvb, start_offset);
4156
4157   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_passage, tvb, start_offset, 3, ls);
4158   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_panic, tvb, start_offset, 3, ls);
4159   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_lockout, tvb, start_offset, 3, ls);
4160   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_relock, tvb, start_offset, 3, ls);
4161   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autoopen, tvb, start_offset, 3, ls);
4162   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nextauto, tvb, start_offset, 3, ls);
4163   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_lockstate, tvb, start_offset, 3, ls);
4164   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_wantstate, tvb, start_offset, 3, ls);
4165   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_remote, tvb, start_offset, 3, ls);
4166   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_update, tvb, start_offset, 3, ls);
4167   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_exceptionspresent, tvb, start_offset, 3, ls);
4168   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_exceptionsactive, tvb, start_offset, 3, ls);
4169   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_timezonespresent, tvb, start_offset, 3, ls);
4170   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_timezonesactive, tvb, start_offset, 3, ls);
4171   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autounlockspresent, tvb, start_offset, 3, ls);
4172   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_autounlocksactive, tvb, start_offset, 3, ls);
4173   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmspresent, tvb, start_offset, 3, ls);
4174   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmsactive, tvb, start_offset, 3, ls);
4175   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmrelockspresent, tvb, start_offset, 3, ls);
4176   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_uapmreslocksactive, tvb, start_offset, 3, ls);
4177   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nvramprotect, tvb, start_offset, 3, ls);
4178   proto_tree_add_boolean (ls_tree, hf_r3_lockstate_nvramchecksum, tvb, start_offset, 3, ls);
4179 }
4180
4181 static void dissect_r3_upstreammfgfield_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4182 {
4183   proto_item *cf_item = NULL;
4184   proto_tree *cf_tree= NULL;
4185   guint l = tvb_length_remaining (tvb, start_offset);
4186   guint items = 0;
4187   guint octets;
4188   guint i;
4189
4190   i = start_offset;
4191   while (i < l)
4192   {
4193     items++;
4194     octets = tvb_get_guint8 (tvb, start_offset + i);
4195     if(!octets)
4196     {
4197       cf_item = proto_tree_add_text (tree, tvb, start_offset, l, "Capabilities (unknown items)");
4198       expert_add_info_format(pinfo, cf_item, PI_MALFORMED, PI_WARN, "Capabilities could not be decoded because length of 0 encountered");
4199       return;
4200     }
4201     i += octets;
4202   }
4203
4204   cf_item = proto_tree_add_text (tree, tvb, start_offset, l, "Capabilities (%u items)", items);
4205   cf_tree = proto_item_add_subtree (cf_item, ett_r3capabilities);
4206
4207   for (i = start_offset; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
4208   {
4209     proto_item *tmp_item = proto_tree_add_item (cf_tree, hf_r3_capabilities, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), TRUE);
4210     proto_tree *tmp_tree = proto_item_add_subtree (tmp_item, ett_r3capabilities);
4211     const gchar *fn;
4212
4213     fn = val_to_str_ext_const (tvb_get_guint8 (tvb, start_offset + i + 1), &r3_capabilitiesnames_ext, "[Unknown Field Name]");
4214
4215     proto_item_append_text (tmp_item, " (%s, %u)", fn, tvb_get_letohs (tvb, start_offset + i + 2));
4216     proto_tree_add_item (tmp_tree, hf_r3_capabilities_length, tvb, start_offset + i + 0, 1, TRUE);
4217     proto_tree_add_item (tmp_tree, hf_r3_capabilities_type, tvb, start_offset + i + 1, 1, TRUE);
4218     proto_tree_add_item (tmp_tree, hf_r3_capabilities_value, tvb, start_offset + i + 2, 2, TRUE);
4219   }
4220 }
4221
4222 static void dissect_r3_upstreammfgfield_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
4223 {
4224   proto_item *rtc_item = proto_tree_add_text (tree, tvb, start_offset, -1, "M41T81 RTC Registers");
4225   proto_tree *rtc_tree = proto_item_add_subtree (rtc_item, ett_r3m41t81registers);
4226   proto_tree *tmp_tree [20];
4227   guint offset_in_bits = start_offset * 8;
4228
4229   if (tvb_length_remaining (tvb, start_offset) != 20)
4230     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Length of M41T81 RTC register dump not 20 octets");
4231   else
4232   {
4233     tmp_tree [ 0] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg00, tvb, start_offset +  0, 1, TRUE), ett_r3m41t81register);
4234     tmp_tree [ 1] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg01, tvb, start_offset +  1, 1, TRUE), ett_r3m41t81register);
4235     tmp_tree [ 2] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg02, tvb, start_offset +  2, 1, TRUE), ett_r3m41t81register);
4236     tmp_tree [ 3] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg03, tvb, start_offset +  3, 1, TRUE), ett_r3m41t81register);
4237     tmp_tree [ 4] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg04, tvb, start_offset +  4, 1, TRUE), ett_r3m41t81register);
4238     tmp_tree [ 5] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg05, tvb, start_offset +  5, 1, TRUE), ett_r3m41t81register);
4239     tmp_tree [ 6] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg06, tvb, start_offset +  6, 1, TRUE), ett_r3m41t81register);
4240     tmp_tree [ 7] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg07, tvb, start_offset +  7, 1, TRUE), ett_r3m41t81register);
4241     tmp_tree [ 8] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg08, tvb, start_offset +  8, 1, TRUE), ett_r3m41t81register);
4242     tmp_tree [ 9] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg09, tvb, start_offset +  9, 1, TRUE), ett_r3m41t81register);
4243     tmp_tree [10] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0a, tvb, start_offset + 10, 1, TRUE), ett_r3m41t81register);
4244     tmp_tree [11] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0b, tvb, start_offset + 11, 1, TRUE), ett_r3m41t81register);
4245     tmp_tree [12] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0c, tvb, start_offset + 12, 1, TRUE), ett_r3m41t81register);
4246     tmp_tree [13] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0d, tvb, start_offset + 13, 1, TRUE), ett_r3m41t81register);
4247     tmp_tree [14] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0e, tvb, start_offset + 14, 1, TRUE), ett_r3m41t81register);
4248     tmp_tree [15] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg0f, tvb, start_offset + 15, 1, TRUE), ett_r3m41t81register);
4249     tmp_tree [16] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg10, tvb, start_offset + 16, 1, TRUE), ett_r3m41t81register);
4250     tmp_tree [17] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg11, tvb, start_offset + 17, 1, TRUE), ett_r3m41t81register);
4251     tmp_tree [18] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg12, tvb, start_offset + 18, 1, TRUE), ett_r3m41t81register);
4252     tmp_tree [19] = proto_item_add_subtree (proto_tree_add_item (rtc_tree, hf_r3_dumpm41t81_reg13, tvb, start_offset + 19, 1, TRUE), ett_r3m41t81register);
4253
4254     proto_tree_add_bits_item (tmp_tree [ 0], hf_r3_dumpm41t81_reg00_sec1,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4255     proto_tree_add_bits_item (tmp_tree [ 0], hf_r3_dumpm41t81_reg00_sec01,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4256     proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_st,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4257     proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_10sec,      tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4258     proto_tree_add_bits_item (tmp_tree [ 1], hf_r3_dumpm41t81_reg01_1sec,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4259     proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_notused,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4260     proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_10min,      tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4261     proto_tree_add_bits_item (tmp_tree [ 2], hf_r3_dumpm41t81_reg02_1min,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4262     proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_cbe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4263     proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_cb,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4264     proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_10hour,     tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4265     proto_tree_add_bits_item (tmp_tree [ 3], hf_r3_dumpm41t81_reg03_1hour,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4266     proto_tree_add_bits_item (tmp_tree [ 4], hf_r3_dumpm41t81_reg04_notused,    tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
4267     proto_tree_add_bits_item (tmp_tree [ 4], hf_r3_dumpm41t81_reg04_dow,        tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4268     proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_notused,    tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4269     proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_10day,      tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4270     proto_tree_add_bits_item (tmp_tree [ 5], hf_r3_dumpm41t81_reg05_1day,       tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4271     proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_notused,    tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4272     proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_10month,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4273     proto_tree_add_bits_item (tmp_tree [ 6], hf_r3_dumpm41t81_reg06_1month,     tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4274     proto_tree_add_bits_item (tmp_tree [ 7], hf_r3_dumpm41t81_reg07_10year,     tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4275     proto_tree_add_bits_item (tmp_tree [ 7], hf_r3_dumpm41t81_reg07_1year,      tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4276     proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_out,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4277     proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_ft,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4278     proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_s,          tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4279     proto_tree_add_bits_item (tmp_tree [ 8], hf_r3_dumpm41t81_reg08_cal,        tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
4280     proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_notused,    tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4281     proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_bmb,        tvb, offset_in_bits, 5, TRUE);  offset_in_bits += 5;
4282     proto_tree_add_bits_item (tmp_tree [ 9], hf_r3_dumpm41t81_reg09_rb,         tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4283     proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_afe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4284     proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_sqwe,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4285     proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_abe,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4286     proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_10monthalm, tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4287     proto_tree_add_bits_item (tmp_tree [10], hf_r3_dumpm41t81_reg0a_1monthalm,  tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4288     proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_rpt5,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4289     proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_rpt4,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4290     proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_10dayalm,   tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4291     proto_tree_add_bits_item (tmp_tree [11], hf_r3_dumpm41t81_reg0b_1dayalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4292     proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_rpt3,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4293     proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_ht,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4294     proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_10houralm,  tvb, offset_in_bits, 2, TRUE);  offset_in_bits += 2;
4295     proto_tree_add_bits_item (tmp_tree [12], hf_r3_dumpm41t81_reg0c_1houralm,   tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4296     proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_rpt2,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4297     proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_10minalm,   tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4298     proto_tree_add_bits_item (tmp_tree [13], hf_r3_dumpm41t81_reg0d_1minalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4299     proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_rpt1,       tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4300     proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_10secalm,   tvb, offset_in_bits, 3, TRUE);  offset_in_bits += 3;
4301     proto_tree_add_bits_item (tmp_tree [14], hf_r3_dumpm41t81_reg0e_1secalm,    tvb, offset_in_bits, 4, TRUE);  offset_in_bits += 4;
4302     proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_wdf,        tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4303     proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_af,         tvb, offset_in_bits, 1, TRUE);  offset_in_bits += 1;
4304     proto_tree_add_bits_item (tmp_tree [15], hf_r3_dumpm41t81_reg0f_notused,    tvb, offset_in_bits, 6, TRUE);  offset_in_bits += 6;
4305     proto_tree_add_bits_item (tmp_tree [16], hf_r3_dumpm41t81_reg10_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
4306     proto_tree_add_bits_item (tmp_tree [17], hf_r3_dumpm41t81_reg11_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
4307     proto_tree_add_bits_item (tmp_tree [18], hf_r3_dumpm41t81_reg12_notused,    tvb, offset_in_bits, 8, TRUE);  offset_in_bits += 8;
4308     proto_tree_add_bits_item (tmp_tree [19], hf_r3_dumpm41t81_reg13_rs,         tvb, offset_in_bits - 8, 4, TRUE);  offset_in_bits += 4;
4309     proto_tree_add_bits_item (tmp_tree [19], hf_r3_dumpm41t81_reg13_notused,    tvb, offset_in_bits - 8, 4, TRUE);  offset_in_bits += 4;
4310   }
4311 }
4312
4313 static void dissect_r3_upstreammfgfield_nvramchecksumvalue (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4314 {
4315   proto_tree_add_item (tree, hf_r3_nvramchecksumvalue, tvb, start_offset + 0, 4, TRUE);
4316   proto_tree_add_item (tree, hf_r3_nvramchecksumvalue_fixup, tvb, start_offset + 4, 4, TRUE);
4317 }
4318
4319 static void dissect_r3_upstreammfgfield_checksumresults (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
4320 {
4321   proto_item *cksum_item = NULL;
4322   proto_tree *cksum_tree= NULL;
4323   guint32 l = tvb_length_remaining (tvb, start_offset);
4324   guint32 error = FALSE;
4325   guint32 i;
4326
4327   if (l % 3 != 0)
4328     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Checksum results data length not modulo 3 == 0");
4329   else
4330   {
4331     for (i = start_offset; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
4332       error |= tvb_get_guint8 (tvb, start_offset + i + 2);
4333
4334     cksum_item = proto_tree_add_text (tree, tvb, start_offset, l, "Checksum Results (%s)", error ? "Error" : "No Errors");
4335     cksum_tree = proto_item_add_subtree (cksum_item, ett_r3checksumresults);
4336
4337     for (i = 0; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
4338     {
4339       proto_item *res_item = proto_tree_add_item (cksum_tree, hf_r3_checksumresults, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), TRUE);
4340       proto_tree *res_tree = proto_item_add_subtree (res_item, ett_r3checksumresultsfield);
4341       const gchar *fn;
4342
4343       fn = val_to_str_ext_const (tvb_get_guint8 (tvb, start_offset + i + 1), &r3_checksumresultnames_ext, "[Unknown Field Name]");
4344
4345       proto_item_append_text (res_item, " %s (%s)", fn, tvb_get_guint8 (tvb, start_offset + i + 2) ? "Error" : "No Error");
4346
4347       proto_tree_add_item (res_tree, hf_r3_checksumresults_length, tvb, start_offset + i + 0, 1, TRUE);
4348       proto_tree_add_item (res_tree, hf_r3_checksumresults_field, tvb, start_offset + i + 1, 1, TRUE);
4349       proto_tree_add_item (res_tree, hf_r3_checksumresults_state, tvb, start_offset + i + 2, 1, TRUE);
4350     }
4351   }
4352 }
4353
4354 static void dissect_r3_upstreammfgfield_mortisestatelog (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4355 {
4356   guint l = tvb_length_remaining (tvb, start_offset + 3);
4357   guint i = 0;
4358
4359   proto_tree_add_item (tree, hf_r3_mortisestatelog_pointer, tvb, start_offset + 0, 1, TRUE);
4360   proto_tree_add_item (tree, hf_r3_mortisestatelog_mortisetype, tvb, start_offset + 1, 1, TRUE);
4361   proto_tree_add_item (tree, hf_r3_mortisestatelog_waiting, tvb, start_offset + 2, 1, TRUE);
4362
4363   for (start_offset += 3, i = 0; i < l; i += 3)
4364   {
4365     guint state = tvb_get_guint8 (tvb, start_offset + i + 0);
4366     guint last = tvb_get_guint8 (tvb, start_offset + i + 1);
4367     guint event = tvb_get_guint8 (tvb, start_offset + i + 2);
4368     proto_item *ms_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "State Log Entry %2d (State=0x%02x, Last=0x%02x, Event=%s (0x%02x))", i / 3, state, last, val_to_str_ext_const (event, &r3_mortiseeventnames_ext, "[Unknown]"), event);
4369     proto_tree *ms_tree = proto_item_add_subtree (ms_item, ett_r3mortisestatelog);
4370
4371     proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_state, tvb, start_offset + i + 0, 1, TRUE);
4372     proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_last, tvb, start_offset + i + 1, 1, TRUE);
4373     proto_tree_add_item (ms_tree, hf_r3_mortisestatelog_event, tvb, start_offset + i + 2, 1, TRUE);
4374   }
4375 }
4376
4377 static void dissect_r3_upstreammfgfield_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4378 {
4379   proto_item *iopins_item = proto_tree_add_text (tree, tvb, start_offset, 1, "Mortise Pin States (0x%02x)", tvb_get_guint8 (tvb, start_offset));
4380   proto_tree *iopins_tree = proto_item_add_subtree (iopins_item, ett_r3iopins);
4381
4382   proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s1, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
4383   proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s2, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
4384   proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s3, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
4385   proto_tree_add_boolean (iopins_tree, hf_r3_mortisepins_s4, tvb, start_offset, 1, tvb_get_guint8 (tvb, start_offset));
4386 }
4387
4388 static void dissect_r3_upstreammfgfield_keypadchar (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4389 {
4390   proto_item_append_text (proto_tree_add_item (tree, hf_r3_testkeypad, tvb, 0, 1, TRUE), " ('%c')", tvb_get_guint8 (tvb, 0));
4391 }
4392
4393 static void dissect_r3_upstreammfgfield_magcard (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4394 {
4395   proto_tree_add_item (tree, hf_r3_testmagcard, tvb, 0, -1, TRUE);
4396 }
4397
4398 static void dissect_r3_upstreammfgfield_proxcard (tvbuff_t *tvb, guint32 start_offset _U_, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4399 {
4400   proto_tree_add_item (tree, hf_r3_testproxcard, tvb, 0, -1, TRUE);
4401 }
4402
4403 /*
4404  * ***************************************************************************
4405  *
4406  *  This is passed a tvb that contains [length] [CMD_RESPONSE] [responseType_e] [cmdCommand_e]
4407  */
4408 static void dissect_r3_response_singlebyte (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4409 {
4410   proto_tree_add_item (tree, hf_r3_responsetype, tvb, start_offset + 2, 1, TRUE);
4411   proto_tree_add_item (tree, hf_r3_responsetocommand, tvb, start_offset + 3, 1, TRUE);
4412 }
4413
4414 /*
4415  *  This is passed a tvb that contains [length] [CMD_RESPONSE] [RESPONSETYPE_HASDATA] [UPSTREAMCOMMAND_*]
4416  */
4417 static void dissect_r3_response_hasdata (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
4418 {
4419   proto_item *upstreamcommand_item = NULL;
4420   proto_tree *upstreamcommand_tree = NULL;
4421   tvbuff_t *upstreamcommand_tvb;
4422   guint32 commandPacketLen;
4423   const gchar *ct = NULL;
4424
4425   tvb_ensure_bytes_exist (tvb, start_offset, 4);
4426   commandPacketLen = tvb_get_guint8 (tvb, 0);
4427   upstreamcommand_tvb = tvb_new_subset (tvb, 4, commandPacketLen - 4, commandPacketLen - 4);
4428
4429   if (tvb_get_guint8 (tvb, 1) != CMD_RESPONSE)
4430     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 1 not CMD_RESPONSE");
4431   else if (tvb_get_guint8 (tvb, 2) != RESPONSETYPE_HASDATA)
4432     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 2 not RESPONSE_HASDATA");
4433   else if (tvb_get_guint8 (tvb, 3) >= UPSTREAMCOMMAND_LAST)
4434     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 3 >= UPSTREAMCOMMAND_LAST");
4435   else
4436   {
4437     ct = val_to_str_ext_const (tvb_get_guint8 (tvb, 3), &r3_upstreamcommandnames_ext, "[Unknown Command Type]");
4438
4439     proto_tree_add_item (tree, hf_r3_responsetype, tvb, 2, 1, TRUE);
4440
4441     upstreamcommand_item = proto_tree_add_text (tree, tvb, 3, -1, "Upstream Command: %s (%u)", ct, tvb_get_guint8 (tvb, 3));
4442     upstreamcommand_tree = proto_item_add_subtree (upstreamcommand_item, ett_r3upstreamcommand);
4443
4444     proto_tree_add_item (upstreamcommand_tree, hf_r3_upstreamcommand, tvb, 3, 1, TRUE);
4445
4446     tvb_ensure_bytes_exist (tvb, start_offset, commandPacketLen - 4);
4447
4448     if (r3upstreamcommand_dissect [tvb_get_guint8 (tvb, 3)].dissector)
4449       (*r3upstreamcommand_dissect [tvb_get_guint8 (tvb, 3)].dissector) (upstreamcommand_tvb, 0, commandPacketLen - 4, pinfo, upstreamcommand_tree);
4450   }
4451 }
4452
4453 /*
4454  * ***************************************************************************
4455  *
4456  *  These are passed a tvb that starts with [length] [CMD_RESPONSE] ...
4457  */
4458 static void dissect_r3_cmd_response (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *tree)
4459 {
4460   guint8 responseLen = tvb_get_guint8 (tvb, start_offset + 0);
4461   responseType_e responseType = tvb_get_guint8 (tvb, start_offset + 2);
4462   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset, responseLen, responseLen);
4463   const gchar *rt = NULL;
4464
4465   rt = val_to_str_ext_const (responseType, &r3_responsetypenames_ext, "[Unknown Response Type]");
4466
4467   proto_item_set_text (proto_tree_get_parent (tree), "Response Packet: %s (%u)", rt, responseType);
4468   proto_tree_add_item (tree, hf_r3_responselength, tvb, start_offset + 0, 1, TRUE);
4469   proto_tree_add_item (tree, hf_r3_responsecommand, tvb, start_offset + 1, 1, TRUE);
4470
4471   if (tvb_get_guint8 (tvb, start_offset + 2) >= RESPONSETYPE_LAST)
4472     expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Octet 3 >= UPSTREAMCOMMAND_LAST");
4473   else if (r3response_dissect [responseType].dissector)
4474     (*r3response_dissect [responseType].dissector) (payload_tvb, 0, length, pinfo, tree);
4475 }
4476
4477 /*
4478  *  These are passed a tvb that contains [length] [cmdCommand_e] [[data]]
4479  */
4480 static void dissect_r3_cmd_handshake (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4481 {
4482   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4483   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4484 }
4485
4486 static void dissect_r3_cmd_killsession (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4487 {
4488   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4489   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4490 }
4491
4492 static void dissect_r3_cmd_queryserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4493 {
4494   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4495   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4496 }
4497
4498 static void dissect_r3_cmd_queryversion (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4499 {
4500   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4501   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4502 }
4503
4504 static void dissect_r3_cmd_setdatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4505 {
4506   proto_tree *dt_tree = NULL;
4507   proto_item *dt_item = NULL;
4508   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4509   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4510
4511   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4512   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4513
4514   dt_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Set Date/Time (%02u/%02u/%02u-%u %02u:%02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4), tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6));
4515   dt_tree = proto_item_add_subtree (dt_item, ett_r3setdatetime);
4516
4517   proto_tree_add_item (dt_tree, hf_r3_setdate_year, payload_tvb, 0, 1, TRUE);
4518   proto_tree_add_item (dt_tree, hf_r3_setdate_month, payload_tvb, 1, 1, TRUE);
4519   proto_tree_add_item (dt_tree, hf_r3_setdate_day, payload_tvb, 2, 1, TRUE);
4520   proto_tree_add_item (dt_tree, hf_r3_setdate_dow, payload_tvb, 3, 1, TRUE);
4521   proto_tree_add_item (dt_tree, hf_r3_setdate_hours, payload_tvb, 4, 1, TRUE);
4522   proto_tree_add_item (dt_tree, hf_r3_setdate_minutes, payload_tvb, 5, 1, TRUE);
4523   proto_tree_add_item (dt_tree, hf_r3_setdate_seconds, payload_tvb, 6, 1, TRUE);
4524 }
4525
4526 static void dissect_r3_cmd_querydatetime (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4527 {
4528   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4529   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4530 }
4531
4532 static void dissect_r3_cmd_setconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4533 {
4534   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4535   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4536   guint32 offset = 0;
4537
4538   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4539   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4540
4541   while (offset < tvb_reported_length (payload_tvb))
4542   {
4543     proto_item *sc_item = NULL;
4544     proto_tree *sc_tree = NULL;
4545     const gchar *ci = NULL;
4546
4547     ci = val_to_str_ext_const (tvb_get_guint8 (payload_tvb, offset + 1), &r3_configitemnames_ext,  "[Unknown Configuration Item]");
4548
4549     sc_item = proto_tree_add_text (tree, payload_tvb, offset + 0, tvb_get_guint8 (payload_tvb, offset + 0), "Config Field: %s (%u)", ci, tvb_get_guint8 (payload_tvb, offset + 1));
4550     sc_tree = proto_item_add_subtree (sc_item, ett_r3upstreamfield);
4551
4552     proto_tree_add_item (sc_tree, hf_r3_configitemlength, payload_tvb, offset + 0, 1, TRUE);
4553     proto_tree_add_item (sc_tree, hf_r3_configitem, payload_tvb, offset + 1, 1, TRUE);
4554
4555     if (tvb_get_guint8 (payload_tvb, offset + 1) < array_length (configMap))
4556     {
4557       switch (configMap [tvb_get_guint8 (payload_tvb, offset + 1)].configType)
4558       {
4559         case CONFIGTYPE_NONE :
4560           proto_tree_add_item (sc_tree, hf_r3_configitemdata, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 3, TRUE);
4561           break;
4562
4563         case CONFIGTYPE_BOOL :
4564           proto_tree_add_item (sc_tree, hf_r3_configitemdata_bool, payload_tvb, offset + 2, 1, TRUE);
4565           break;
4566
4567         case CONFIGTYPE_8 :
4568           proto_tree_add_item (sc_tree, hf_r3_configitemdata_8, payload_tvb, offset + 2, 1, TRUE);
4569           break;
4570
4571         case CONFIGTYPE_16 :
4572           proto_tree_add_item (sc_tree, hf_r3_configitemdata_16, payload_tvb, offset + 2, 2, TRUE);
4573           break;
4574
4575         case CONFIGTYPE_32 :
4576           proto_tree_add_item (sc_tree, hf_r3_configitemdata_32, payload_tvb, offset + 2, 4, TRUE);
4577           break;
4578
4579         case CONFIGTYPE_STRING :
4580           proto_tree_add_item (sc_tree, hf_r3_configitemdata_string, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, TRUE);
4581           break;
4582
4583         default :
4584           proto_tree_add_none_format (sc_tree, hf_r3_upstreamfielderror, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, "Unknown Field Type");
4585           break;
4586       }
4587     }
4588     else
4589       proto_tree_add_text (sc_tree, payload_tvb, offset + 2, tvb_get_guint8 (payload_tvb, offset + 0) - 2, "[Unknown Field Type]");
4590
4591     offset += tvb_get_guint8 (payload_tvb, offset + 0);
4592   }
4593 }
4594
4595 static void dissect_r3_cmd_getconfig (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4596 {
4597   proto_item *config_item = NULL;
4598   proto_tree *config_tree = NULL;
4599   guint32 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4600   guint32 i;
4601
4602   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4603   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4604
4605   config_item = proto_tree_add_item (tree, hf_r3_configitems, tvb, start_offset + 2, cmdLen - 2, TRUE);
4606   config_tree = proto_item_add_subtree (config_item, ett_r3configitem);
4607
4608   for (i = 2; i < cmdLen; i++)
4609     proto_tree_add_item (config_tree, hf_r3_configitem, tvb, start_offset + i, 1, TRUE);
4610 }
4611
4612 static void dissect_r3_cmd_manageuser (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo, proto_tree *tree)
4613 {
4614   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4615   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4616   guint32 offset = 0;
4617
4618   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4619   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4620
4621   while (offset < tvb_reported_length (payload_tvb))
4622   {
4623     guint32 paramLength = tvb_get_guint8 (payload_tvb, offset + 0);
4624     guint32 paramType = tvb_get_guint8 (payload_tvb, offset + 1);
4625     guint32 dataLength = paramLength - 2;
4626     proto_tree *mu_tree = NULL;
4627     const gchar *auptn = NULL;
4628
4629     auptn = val_to_str_ext_const (paramType, &r3_adduserparamtypenames_ext, "[Unknown Field]");
4630
4631     mu_tree = proto_item_add_subtree (proto_tree_add_none_format (tree, hf_r3_adduserparamtype, payload_tvb, offset + 0, paramLength, "Manage User Field: %s (%u)", auptn, paramType), ett_r3manageuser);
4632
4633     proto_tree_add_item (mu_tree, hf_r3_adduserparamtypelength, payload_tvb, offset + 0, 1, TRUE);
4634     proto_tree_add_item (mu_tree, hf_r3_adduserparamtypetype, payload_tvb, offset + 1, 1, TRUE);
4635
4636     offset += 2;
4637
4638     switch (paramType)
4639     {
4640       case ADDUSERPARAMTYPE_DISPOSITION :
4641       case ADDUSERPARAMTYPE_ACCESSALWAYS :
4642       case ADDUSERPARAMTYPE_ACCESSMODE :
4643       case ADDUSERPARAMTYPE_CACHED :
4644       case ADDUSERPARAMTYPE_USERTYPE :
4645       case ADDUSERPARAMTYPE_PRIMARYFIELDTYPE :
4646       case ADDUSERPARAMTYPE_AUXFIELDTYPE :
4647       case ADDUSERPARAMTYPE_USECOUNT :
4648       case ADDUSERPARAMTYPE_EXCEPTIONGROUP :
4649         if (dataLength != 1)
4650           expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed field -- expected 1 octet");
4651         else
4652           proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
4653         break;
4654
4655       case ADDUSERPARAMTYPE_USERNO :
4656         if (dataLength != 2)
4657           expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed field -- expected 2 octets");
4658         else
4659           proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
4660         break;
4661
4662       case ADDUSERPARAMTYPE_PRIMARYFIELD :
4663       case ADDUSERPARAMTYPE_AUXFIELD :
4664         proto_tree_add_item (mu_tree, hf_r3_adduserparamtypearray [paramType], payload_tvb, offset, dataLength, TRUE);
4665         break;
4666
4667       case ADDUSERPARAMTYPE_EXPIREON :
4668         {
4669           proto_item *expireon_item = NULL;
4670           proto_tree *expireon_tree = NULL;
4671
4672           if (dataLength != 3)
4673             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed expiration field -- expected 3 octets");
4674           else
4675           {
4676             expireon_item = proto_tree_add_text (mu_tree, payload_tvb, offset, 3, "Expire YY/MM/DD: %02u/%02u/%02u",
4677                 tvb_get_guint8 (payload_tvb, offset + 2), tvb_get_guint8 (payload_tvb, offset + 0), tvb_get_guint8 (payload_tvb, offset + 1));
4678             expireon_tree = proto_item_add_subtree (expireon_item, ett_r3expireon);
4679
4680             proto_tree_add_item (expireon_tree, hf_r3_expireon_month, payload_tvb, offset + 0, 1, TRUE);
4681             proto_tree_add_item (expireon_tree, hf_r3_expireon_day, payload_tvb, offset + 1, 1, TRUE);
4682             proto_tree_add_item (expireon_tree, hf_r3_expireon_year, payload_tvb, offset + 2, 1, TRUE);
4683           }
4684         }
4685         break;
4686
4687       case ADDUSERPARAMTYPE_TIMEZONE :
4688         {
4689           guint32 i;
4690           guint32 tz;
4691           proto_item *timezone_item = NULL;
4692           proto_tree *timezone_tree = NULL;
4693
4694           if (dataLength != 4)
4695             expert_add_info_format (pinfo, tree, PI_UNDECODED, PI_WARN, "Malformed timezone field -- expected 4 octets");
4696           else
4697           {
4698             tz = tvb_get_letohl (payload_tvb, offset);
4699             timezone_item = proto_tree_add_item (mu_tree, hf_r3_upstreamfieldarray [paramType], payload_tvb, offset, 4, TRUE);
4700             timezone_tree = proto_item_add_subtree (timezone_item, ett_r3timezone);
4701
4702             for (i = 0; i < 32; i++)
4703               proto_tree_add_boolean (timezone_tree, hf_r3_timezonearray [i], payload_tvb, offset, 4, tz);
4704           }
4705         }
4706         break;
4707
4708       default :
4709         proto_tree_add_string (mu_tree, hf_r3_upstreamfielderror, payload_tvb, offset, dataLength, "Unknown Field Type");
4710         break;
4711     }
4712
4713     offset += dataLength;
4714   }
4715 }
4716
4717 static void dissect_r3_cmd_deleteusers (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4718 {
4719   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4720   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4721
4722   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4723   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4724   proto_tree_add_item (tree, hf_r3_deleteusers, payload_tvb, 0, 1, TRUE);
4725 }
4726
4727 static void dissect_r3_cmd_defineexception (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4728 {
4729   proto_item *startdate_item = NULL;
4730   proto_tree *startdate_tree = NULL;
4731   proto_item *enddate_item = NULL;
4732   proto_tree *enddate_tree = NULL;
4733   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4734   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4735
4736   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4737   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4738   proto_tree_add_item (tree, hf_r3_defineexception_number, payload_tvb, 0, 1, TRUE);
4739
4740   startdate_item = proto_tree_add_text (tree, payload_tvb, 1, 4, "Start MM/DD HH:MM (%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
4741   startdate_tree = proto_item_add_subtree (startdate_item, ett_r3defineexceptionstartdate);
4742   proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_month, payload_tvb, 1, 1, TRUE);
4743   proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_day, payload_tvb, 2, 1, TRUE);
4744   proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_hours, payload_tvb, 3, 1, TRUE);
4745   proto_tree_add_item (startdate_tree, hf_r3_defineexception_startdate_minutes, payload_tvb, 4, 1, TRUE);
4746
4747   enddate_item = proto_tree_add_text (tree, payload_tvb, 5, 4, "End MM/DD HH:MM (%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8));
4748   enddate_tree = proto_item_add_subtree (enddate_item, ett_r3defineexceptionenddate);
4749   proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_month, payload_tvb, 5, 1, TRUE);
4750   proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_day, payload_tvb, 6, 1, TRUE);
4751   proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_hours, payload_tvb, 7, 1, TRUE);
4752   proto_tree_add_item (enddate_tree, hf_r3_defineexception_enddate_minutes, payload_tvb, 8, 1, TRUE);
4753 }
4754
4755 static void dissect_r3_cmd_defineexceptiongroup (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4756 {
4757   proto_item *bits_item = NULL;
4758   proto_tree *bits_tree = NULL;
4759   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4760   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4761   guint32 i = 0;
4762   guint32 bit = 0;
4763
4764   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4765   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4766   proto_tree_add_item (tree, hf_r3_defineexceptiongroup_number, payload_tvb, 0, 1, TRUE);
4767
4768   bits_item = proto_tree_add_text (tree, payload_tvb, 1, -1, "Exception Group Bit Field");
4769   bits_tree = proto_item_add_subtree (bits_item, ett_r3defineexceptiongroupbits);
4770
4771   for (i = 1; i < tvb_reported_length (payload_tvb); i++)
4772   {
4773     guint32 j;
4774     guint8 byte = tvb_get_guint8 (payload_tvb, i);
4775
4776     for (j = 0; j < 8; j++)
4777       proto_tree_add_none_format (bits_tree, hf_r3_defineexceptiongroup_bits, payload_tvb, i, 1, "Exception Group %2d: %s", bit++, (byte & (1 << j)) ? "Enabled" : "Disabled");
4778   }
4779 }
4780
4781 static void dissect_r3_cmd_definecalendar (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4782 {
4783   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4784   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4785   const gchar *mn;
4786   guint32 i;
4787
4788   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4789   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4790   proto_tree_add_item (tree, hf_r3_definecalendar_number, payload_tvb, 0, 1, TRUE);
4791
4792   for (i = 0; i < 12; i++)
4793   {
4794     guint32 daymap = tvb_get_letohl (payload_tvb, (i * 4) + 1);
4795     proto_item *calendar_item = proto_tree_add_text (tree, payload_tvb, (i * 4) + 1, 4, "Calendar Bit Field - %s (0x%08x)", (mn = val_to_str_ext_const (i + 1, &r3_monthnames_ext, "[Unknown Month]")), daymap);
4796     proto_tree *calendar_tree = proto_item_add_subtree (calendar_item, ett_r3definecalendarmonth [i + 1]);
4797     guint32 j;
4798
4799     for (j = 0; j < 31; j++)
4800       proto_tree_add_none_format (calendar_tree, hf_r3_definecalendar_bits, payload_tvb, (i * 4) + 1, 4, "%s Of %s: %s", val_to_str_ext_const (j + 1, &r3_monthdaynames_ext, "[Unknown Day]"), mn, (daymap & (1 << j)) ? "Enabled" : "Disabled");
4801   }
4802 }
4803
4804 static void dissect_r3_cmd_definetimezone (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4805 {
4806   proto_item *starttime_item = NULL;
4807   proto_tree *starttime_tree = NULL;
4808   proto_item *endtime_item = NULL;
4809   proto_tree *endtime_tree = NULL;
4810   proto_item *daymap_item = NULL;
4811   proto_tree *daymap_tree = NULL;
4812   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4813   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4814   guint32 i;
4815   guint8 tzmode;
4816
4817   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4818   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4819   proto_tree_add_item (tree, hf_r3_definetimezone_number, payload_tvb, 0, 1, TRUE);
4820
4821   starttime_item = proto_tree_add_text (tree, payload_tvb, 1, 2, "Start HH:MM (%02u:%02u)", tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2));
4822   starttime_tree = proto_item_add_subtree (starttime_item, ett_r3definetimezonestarttime);
4823   proto_tree_add_item (starttime_tree, hf_r3_definetimezone_starttime_hours, payload_tvb, 1, 1, TRUE);
4824   proto_tree_add_item (starttime_tree, hf_r3_definetimezone_starttime_minutes, payload_tvb, 2, 1, TRUE);
4825
4826   endtime_item = proto_tree_add_text (tree, payload_tvb, 3, 2, "End HH:MM (%02u:%02u)", tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
4827   endtime_tree = proto_item_add_subtree (endtime_item, ett_r3definetimezoneendtime);
4828   proto_tree_add_item (endtime_tree, hf_r3_definetimezone_endtime_hours, payload_tvb, 3, 1, TRUE);
4829   proto_tree_add_item (endtime_tree, hf_r3_definetimezone_endtime_minutes, payload_tvb, 4, 1, TRUE);
4830
4831   daymap_item = proto_tree_add_text (tree, payload_tvb, 5, 1, "Day Map (0x%02x)", tvb_get_guint8 (payload_tvb, 5));
4832   daymap_tree = proto_item_add_subtree (daymap_item, ett_r3definetimezonedaymap);
4833
4834   for (i = 0; i < 7; i++)
4835     proto_tree_add_boolean (daymap_tree, hf_r3_definetimezone_daymap [i], payload_tvb, 5, 1, tvb_get_guint8 (payload_tvb, 5));
4836
4837   proto_tree_add_item (tree, hf_r3_definetimezone_exceptiongroup, payload_tvb, 6, 1, TRUE);
4838   proto_tree_add_uint (tree, hf_r3_definetimezone_mode, payload_tvb, 7, 1, (tzmode = tvb_get_guint8 (payload_tvb, 7)) & 0x0f);
4839   proto_tree_add_none_format (tree, hf_r3_definetimezone_calendar, payload_tvb, 7, 1, "Access Always: %s", (tzmode & 0x10) ? "True" : "False");
4840 }
4841
4842 static void dissect_r3_cmd_rmtauthretry (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4843 {
4844   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4845   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4846
4847   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4848   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4849   proto_tree_add_item (tree, hf_r3_rmtauthretry_sequence, payload_tvb, 0, 2, TRUE);
4850   proto_tree_add_item (tree, hf_r3_rmtauthretry_retry, payload_tvb, 2, 1, TRUE);
4851 }
4852
4853 static void dissect_r3_cmd_filters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4854 {
4855   proto_item *filter_item = NULL;
4856   proto_tree *filter_tree = NULL;
4857   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4858   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4859   guint32 i;
4860
4861   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4862   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4863   proto_tree_add_item (tree, hf_r3_filter_type, payload_tvb, 1, 1, TRUE);
4864
4865   filter_item = proto_tree_add_text (tree, payload_tvb, 2, -1, "Filters (%u specified)", tvb_get_guint8 (payload_tvb, 0));
4866   filter_tree = proto_item_add_subtree (filter_item, ett_r3filters);
4867
4868   for (i = 0; i < tvb_get_guint8 (payload_tvb, 0); i++)
4869     proto_tree_add_item (filter_tree, hf_r3_filter_list, payload_tvb, i + 2, 1, TRUE);
4870 }
4871
4872 static void dissect_r3_cmd_alarmconfigure (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4873 {
4874   proto_item *alarm_item = NULL;
4875   proto_tree *alarm_tree = NULL;
4876   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4877   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4878   guint32 offset = 0;
4879   guint32 alarms = 0;
4880
4881   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4882   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4883
4884   alarm_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Alarm List (0 items)");
4885   alarm_tree = proto_item_add_subtree (alarm_item, ett_r3alarmlist);
4886
4887   while (offset < tvb_reported_length (payload_tvb))
4888   {
4889     proto_item *alarmcfg_item = NULL;
4890     proto_tree *alarmcfg_tree = NULL;
4891     const gchar *ai;
4892     const gchar *as;
4893
4894     if (!(ai = match_strval_ext (tvb_get_guint8 (payload_tvb, offset + 1), &r3_alarmidnames_ext)))
4895     {
4896       ai = "[Unknown Alarm ID]";
4897       as = "N/A";
4898     }
4899     else
4900       as = (tvb_get_guint8 (payload_tvb, offset + 2) & 0xfe) ? "Error" : (tvb_get_guint8 (payload_tvb, offset + 2) & 0x01) ? "Enabled" : "Disabled";
4901
4902     alarmcfg_item = proto_tree_add_text (alarm_tree, payload_tvb, offset, tvb_get_guint8 (payload_tvb, offset), "Alarm Item (%s, %s)", ai, as);
4903     alarmcfg_tree = proto_item_add_subtree (alarmcfg_item, ett_r3alarmcfg);
4904
4905     proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_length, payload_tvb, offset + 0, 1, TRUE);
4906     proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_id, payload_tvb, offset + 1, 1, TRUE);
4907     proto_tree_add_item (alarmcfg_tree, hf_r3_alarm_state, payload_tvb, offset + 2, 1, TRUE);
4908
4909     alarms++;
4910     offset += tvb_get_guint8 (payload_tvb, offset);
4911   }
4912
4913   if (alarms)
4914     proto_item_set_text (alarm_item, "Alarm List (%d items)", alarms);
4915 }
4916
4917 static void dissect_r3_cmd_eventlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4918 {
4919   proto_item *starttime_item = NULL;
4920   proto_tree *starttime_tree = NULL;
4921   proto_item *endtime_item = NULL;
4922   proto_tree *endtime_tree = NULL;
4923   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4924   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4925
4926   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4927   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4928
4929   starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
4930   starttime_tree = proto_item_add_subtree (starttime_item, ett_r3eventlogdumpstarttime);
4931   proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
4932   proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
4933   proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
4934   proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
4935   proto_tree_add_item (starttime_tree, hf_r3_eventlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);
4936
4937   endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
4938   endtime_tree = proto_item_add_subtree (endtime_item, ett_r3eventlogdumpendtime);
4939   proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
4940   proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
4941   proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
4942   proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
4943   proto_tree_add_item (endtime_tree, hf_r3_eventlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);
4944
4945   proto_tree_add_item (tree, hf_r3_eventlogdump_user, payload_tvb, 10, 2, TRUE);
4946 }
4947
4948 static void dissect_r3_cmd_declinedlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4949 {
4950   proto_item *starttime_item = NULL;
4951   proto_tree *starttime_tree = NULL;
4952   proto_item *endtime_item = NULL;
4953   proto_tree *endtime_tree = NULL;
4954   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4955   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4956
4957   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4958   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4959
4960   starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
4961   starttime_tree = proto_item_add_subtree (starttime_item, ett_r3declinedlogdumpstarttime);
4962   proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
4963   proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
4964   proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
4965   proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
4966   proto_tree_add_item (starttime_tree, hf_r3_declinedlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);
4967
4968   endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
4969   endtime_tree = proto_item_add_subtree (endtime_item, ett_r3declinedlogdumpendtime);
4970   proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
4971   proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
4972   proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
4973   proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
4974   proto_tree_add_item (endtime_tree, hf_r3_declinedlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);
4975 }
4976
4977 static void dissect_r3_cmd_alarmlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
4978 {
4979   proto_item *starttime_item = NULL;
4980   proto_tree *starttime_tree = NULL;
4981   proto_item *endtime_item = NULL;
4982   proto_tree *endtime_tree = NULL;
4983   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
4984   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
4985
4986   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
4987   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
4988
4989   starttime_item = proto_tree_add_text (tree, payload_tvb, 0, 5, "Start YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 0), tvb_get_guint8 (payload_tvb, 1), tvb_get_guint8 (payload_tvb, 2), tvb_get_guint8 (payload_tvb, 3), tvb_get_guint8 (payload_tvb, 4));
4990   starttime_tree = proto_item_add_subtree (starttime_item, ett_r3alarmlogdumpstarttime);
4991   proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_year, payload_tvb, 0, 1, TRUE);
4992   proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_month, payload_tvb, 1, 1, TRUE);
4993   proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_day, payload_tvb, 2, 1, TRUE);
4994   proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_hours, payload_tvb, 3, 1, TRUE);
4995   proto_tree_add_item (starttime_tree, hf_r3_alarmlogdump_starttime_minutes, payload_tvb, 4, 1, TRUE);
4996
4997   endtime_item = proto_tree_add_text (tree, payload_tvb, 5, 5, "End YY/MM/DD HH:MM (%02u/%02u/%02u %02u:%02u)", tvb_get_guint8 (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 6), tvb_get_guint8 (payload_tvb, 7), tvb_get_guint8 (payload_tvb, 8), tvb_get_guint8 (payload_tvb, 9));
4998   endtime_tree = proto_item_add_subtree (endtime_item, ett_r3alarmlogdumpendtime);
4999   proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_year, payload_tvb, 5, 1, TRUE);
5000   proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_month, payload_tvb, 6, 1, TRUE);
5001   proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_day, payload_tvb, 7, 1, TRUE);
5002   proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_hours, payload_tvb, 8, 1, TRUE);
5003   proto_tree_add_item (endtime_tree, hf_r3_alarmlogdump_endtime_minutes, payload_tvb, 9, 1, TRUE);
5004 }
5005
5006 static void dissect_r3_cmd_downloadfirmware (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5007 {
5008   proto_item *dlfw_item = NULL;
5009   proto_tree *dlfw_tree = NULL;
5010   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5011   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5012   guint32 packetCRC = 0;
5013   guint32 calculatedCRC = 0;
5014
5015   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5016   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5017
5018   dlfw_item = proto_tree_add_text (tree, payload_tvb, 0, -1, "Download Record (Record #%u, ", tvb_get_letohs (payload_tvb, 2));
5019   dlfw_tree = proto_item_add_subtree (dlfw_item, ett_r3downloadfirmware);
5020
5021   proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_length, payload_tvb, 0, 2, TRUE);
5022   proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_record, payload_tvb, 2, 2, TRUE);
5023   proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_action, payload_tvb, 4, 1, TRUE);
5024
5025   switch (tvb_get_guint8 (payload_tvb, 4))
5026   {
5027     case DOWNLOADFIRMWARE_START :
5028       proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_START)");
5029       proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_timeout, payload_tvb, 5, 1, TRUE);
5030       proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_nvram, payload_tvb, 6, 1, TRUE);
5031       break;
5032
5033     case DOWNLOADFIRMWARE_DATA :
5034       proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_DATA, Address 0x%08x, %u Bytes)", tvb_get_letohl (payload_tvb, 5), tvb_get_guint8 (payload_tvb, 9));
5035       proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_address, payload_tvb, 5, 4, TRUE);
5036       proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_bytes, payload_tvb, 9, 1, TRUE);
5037       proto_tree_add_item (dlfw_tree, hf_r3_firmwaredownload_data, payload_tvb, 10, tvb_get_guint8 (payload_tvb, 9), TRUE);
5038       break;
5039
5040     case DOWNLOADFIRMWARE_COMPLETE :
5041       proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_COMPLETE)");
5042       break;
5043
5044     case DOWNLOADFIRMWARE_ABORT :
5045       proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_ABORT)");
5046       break;
5047
5048     case DOWNLOADFIRMWARE_RESET :
5049       proto_item_append_text (dlfw_item, "DOWNLOADFIRMWARE_RESET)");
5050       break;
5051
5052     default :
5053       DISSECTOR_ASSERT (0);
5054   }
5055
5056   packetCRC = tvb_get_letohs (payload_tvb, tvb_reported_length (payload_tvb) - 2);
5057
5058   if ((calculatedCRC = utilCrcCalculate (tvb_get_ptr (payload_tvb, 0, tvb_reported_length (payload_tvb) - 2), tvb_reported_length (payload_tvb) - 2, 0x0000)) == packetCRC)
5059     proto_tree_add_uint_format (dlfw_tree, hf_r3_firmwaredownload_crc, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, packetCRC, "CRC: 0x%04x (correct)", packetCRC);
5060   else
5061   {
5062     proto_item *tmp_item;
5063
5064     proto_tree_add_uint_format (dlfw_tree, hf_r3_firmwaredownload_crc, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, packetCRC, "CRC: 0x%04x (incorrect, should be 0x%04x)", calculatedCRC, packetCRC);
5065     tmp_item = proto_tree_add_boolean (dlfw_tree, hf_r3_firmwaredownload_crc_bad, payload_tvb, tvb_reported_length (payload_tvb) - 2, 2, TRUE);
5066     PROTO_ITEM_SET_GENERATED (tmp_item);
5067   }
5068 }
5069
5070 static void dissect_r3_cmd_downloadfirmwaretimeout (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5071 {
5072   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5073   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5074
5075   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5076   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5077   proto_tree_add_item (tree, hf_r3_commanddata, payload_tvb, 0, -1, TRUE);
5078   DISSECTOR_ASSERT (0); /* ### Need nice warning here */
5079 }
5080
5081 static void dissect_r3_cmd_powertableselection (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5082 {
5083   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5084   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5085
5086   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5087   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5088   proto_tree_add_item (tree, hf_r3_powertableselection, payload_tvb, 0, 1, TRUE);
5089 }
5090
5091 static void dissect_r3_cmd_clearnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5092 {
5093   proto_item *nvram_item = NULL;
5094   proto_tree *nvram_tree = NULL;
5095   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5096   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5097   guint32 nvramclearoptions = tvb_get_letohs (payload_tvb, 0);
5098   guint32 i;
5099
5100   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5101   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5102
5103   nvram_item = proto_tree_add_text (tree, payload_tvb, 0, 2, "NVRAM Clean Options (0x%04x)", nvramclearoptions);
5104   nvram_tree = proto_item_add_subtree (nvram_item, ett_r3clearnvram);
5105
5106   for (i = 0; i < 16; i++)
5107     proto_tree_add_boolean (nvram_tree, hf_r3_nvramclearoptions [i], payload_tvb, 0, 2, nvramclearoptions);
5108 }
5109
5110 static void dissect_r3_cmd_dpac (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5111 {
5112   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5113   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5114
5115   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5116   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5117   proto_tree_add_item (tree, hf_r3_dpac_action, payload_tvb, 0, 1, TRUE);
5118   proto_tree_add_item (tree, hf_r3_dpac_waittime, payload_tvb, 1, 2, TRUE);
5119   proto_tree_add_item (tree, hf_r3_dpac_command, payload_tvb, 3, -1, TRUE);
5120 }
5121
5122 static void dissect_r3_cmd_selftest (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5123 {
5124   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5125   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5126 }
5127
5128 static void dissect_r3_cmd_reset (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5129 {
5130   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5131   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5132 }
5133
5134 static void dissect_r3_cmd_logwrite (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5135 {
5136   guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5137   tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 2, cmdLen - 2, cmdLen - 2);
5138
5139   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5140   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5141   proto_tree_add_item (tree, hf_r3_writeeventlog_user, payload_tvb, 0, 2, TRUE);
5142   proto_tree_add_item (tree, hf_r3_writeeventlog_event, payload_tvb, 2, 1, TRUE);
5143 }
5144
5145 static void dissect_r3_cmd_mfgcommand (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5146 {
5147   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5148   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5149   mfgCommandFlag = TRUE;
5150 }
5151
5152 static void dissect_r3_cmd_nvrambackup (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5153 {
5154   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5155   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5156 }
5157
5158 static void dissect_r3_cmd_extendedresponse (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5159 {
5160   proto_tree_add_item (tree, hf_r3_commandlength, tvb, start_offset + 0, 1, TRUE);
5161   proto_tree_add_item (tree, hf_r3_command, tvb, start_offset + 1, 1, TRUE);
5162 }
5163
5164 /*
5165  * ***************************************************************************
5166  */
5167 static void dissect_r3_cmdmfg_setserialnumber (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5168 {
5169   tvbuff_t *sn_tvb = tvb_new_subset (tvb, start_offset + 2, 16, 16);
5170
5171   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5172   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5173   dissect_serialnumber (sn_tvb, 0, length, pinfo, tree, hf_r3_mfgsetserialnumber);
5174 }
5175
5176 static void dissect_r3_cmdmfg_setcryptkey (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5177 {
5178   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5179   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5180   proto_tree_add_item (tree, hf_r3_mfgsetcryptkey, tvb, start_offset + 2, -1, TRUE);
5181 }
5182
5183 static void dissect_r3_cmdmfg_dumpnvram (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5184 {
5185   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5186   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5187   proto_tree_add_item (tree, hf_r3_mfgdumpnvram, tvb, start_offset + 2, 1, TRUE);
5188 }
5189
5190 static void dissect_r3_cmdmfg_terminal (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5191 {
5192   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5193   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5194 }
5195
5196 static void dissect_r3_cmdmfg_remoteunlock (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5197 {
5198   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5199   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5200   proto_tree_add_item (tree, hf_r3_mfgremoteunlock, tvb, start_offset + 2, 1, TRUE);
5201 }
5202
5203 static void dissect_r3_cmdmfg_auxctlrversion (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5204 {
5205   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5206   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5207 }
5208
5209 static void dissect_r3_cmdmfg_iopins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5210 {
5211   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5212   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5213 }
5214
5215 static void dissect_r3_cmdmfg_adcs (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5216 {
5217   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5218   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5219 }
5220
5221 static void dissect_r3_cmdmfg_hardwareid (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5222 {
5223   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5224   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5225 }
5226
5227 static void dissect_r3_cmdmfg_checkpointlogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5228 {
5229   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5230   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5231 }
5232
5233 static void dissect_r3_cmdmfg_checkpointlogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5234 {
5235   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5236   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5237 }
5238
5239 static void dissect_r3_cmdmfg_readregisters (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5240 {
5241   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5242   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5243 }
5244
5245 static void dissect_r3_cmdmfg_forceoptions (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5246 {
5247   guint i = 0;
5248   guint l = 0;
5249
5250   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5251   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5252
5253   start_offset += 2;
5254   l = tvb_length_remaining (tvb, start_offset);
5255
5256   for (i = 0; i < l; i += tvb_get_guint8 (tvb, start_offset + i))
5257   {
5258     proto_item *force_item = proto_tree_add_text (tree, tvb, start_offset + i, tvb_get_guint8 (tvb, start_offset + i), "Force Option %s (%u)", val_to_str_ext_const (tvb_get_guint8 (tvb, start_offset + i + 1), &r3_forceitemnames_ext, "[Unknown]"), tvb_get_guint8 (tvb, start_offset + i + 1));
5259     proto_tree *force_tree = proto_item_add_subtree (force_item, ett_r3forceoptions);
5260
5261     proto_tree_add_item (force_tree, hf_r3_forceoptions_length, tvb, start_offset + i + 0, 1, TRUE);
5262     proto_tree_add_item (force_tree, hf_r3_forceoptions_item, tvb, start_offset + i + 1, 1, TRUE);
5263
5264     switch (tvb_get_guint8 (tvb, start_offset + i) - 2)
5265     {
5266       case 1  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_8,  tvb, start_offset + i + 2, 1, TRUE); break;
5267       case 2  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_16, tvb, start_offset + i + 2, 2, TRUE); break;
5268       case 3  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_24, tvb, start_offset + i + 2, 3, TRUE); break;
5269       case 4  : proto_tree_add_item (force_tree, hf_r3_forceoptions_state_32, tvb, start_offset + i + 2, 4, TRUE); break;
5270       default : DISSECTOR_ASSERT (0);
5271     }
5272   }
5273 }
5274
5275 static void dissect_r3_cmdmfg_commuser (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5276 {
5277   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5278   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5279 }
5280
5281 static void dissect_r3_cmdmfg_dumpkeypad (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5282 {
5283   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5284   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5285 }
5286
5287 static void dissect_r3_cmdmfg_batterycheck (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5288 {
5289   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5290   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5291 }
5292
5293 static void dissect_r3_cmdmfg_ramrefresh (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5294 {
5295   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5296   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5297 }
5298
5299 static void dissect_r3_cmdmfg_taskflags (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5300 {
5301   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5302   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5303 }
5304
5305 static void dissect_r3_cmdmfg_timerchain (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5306 {
5307   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5308   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5309 }
5310
5311 static void dissect_r3_cmdmfg_peekpoke (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5312 {
5313   guint i = 0;
5314   guint l = 0;
5315
5316   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5317   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5318
5319   start_offset += 2;
5320   l = tvb_length_remaining (tvb, start_offset);
5321
5322   for (i = 0; i < l; i += 3)
5323   {
5324     proto_item *peekpoke_item = proto_tree_add_text (tree, tvb, start_offset + i, 3, "%s", "");
5325     proto_tree *peekpoke_tree = proto_item_add_subtree (peekpoke_item, ett_r3peekpoke);
5326
5327     proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_operation, tvb, start_offset + i + 0, 1, TRUE);
5328     proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_address, tvb, start_offset + i + 1, 2, TRUE);
5329
5330     switch (tvb_get_guint8 (tvb, start_offset + i + 0))
5331     {
5332       case PEEKPOKE_READU8 :
5333         proto_item_append_text (peekpoke_item, "Read (8 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
5334         break;
5335
5336       case PEEKPOKE_READU16 :
5337         proto_item_append_text (peekpoke_item, "Read (16 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
5338         break;
5339
5340       case PEEKPOKE_READU24 :
5341         proto_item_append_text (peekpoke_item, "Read (24 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
5342         break;
5343
5344       case PEEKPOKE_READU32 :
5345         proto_item_append_text (peekpoke_item, "Read (32 Bits @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 1));
5346         break;
5347
5348       case PEEKPOKE_READSTRING :
5349         proto_item_append_text (peekpoke_item, "Read (%d Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5350         proto_item_set_len (peekpoke_item, 4);
5351         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE);
5352         i += 1;
5353         break;
5354
5355       case PEEKPOKE_WRITEU8 :
5356         proto_item_append_text (peekpoke_item, "Write (8 Bits: 0x%02x @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5357         proto_item_set_len (peekpoke_item, 4);
5358         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke8, tvb, start_offset + i + 3, 1, TRUE);
5359         i += 1;
5360         break;
5361
5362       case PEEKPOKE_WRITEU16 :
5363         proto_item_append_text (peekpoke_item, "Write (16 Bits: 0x%04x @ 0x%04x)", tvb_get_letohs (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5364         proto_item_set_len (peekpoke_item, 5);
5365         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke16, tvb, start_offset + i + 3, 2, TRUE);
5366         i += 2;
5367         break;
5368
5369       case PEEKPOKE_WRITEU24 :
5370         proto_item_append_text (peekpoke_item, "Write (24 Bits: 0x%06x @ 0x%04x)", tvb_get_letoh24 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5371         proto_item_set_len (peekpoke_item, 6);
5372         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke24, tvb, start_offset + i + 3, 3, TRUE);
5373         i += 3;
5374         break;
5375
5376       case PEEKPOKE_WRITEU32 :
5377         proto_item_append_text (peekpoke_item, "Write (32 Bits: 0x%08x @ 0x%04x)", tvb_get_letohl (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5378         proto_item_set_len (peekpoke_item, 7);
5379         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_poke32, tvb, start_offset + i + 3, 4, TRUE);
5380         i += 4;
5381         break;
5382
5383       case PEEKPOKE_WRITESTRING :
5384         proto_item_append_text (peekpoke_item, "Write (%d Bytes @ 0x%04x)", tvb_get_guint8 (tvb, start_offset + i + 3), tvb_get_letohs (tvb, start_offset + i + 1));
5385         proto_item_set_len (peekpoke_item, 3 + 1 + tvb_get_guint8 (tvb, start_offset + i + 3));
5386         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_length, tvb, start_offset + i + 3, 1, TRUE);
5387         proto_tree_add_item (peekpoke_tree, hf_r3_peekpoke_pokestring, tvb, start_offset + i + 4, tvb_get_guint8 (tvb, start_offset + i + 3), TRUE);
5388         i += tvb_get_guint8 (tvb, start_offset + i + 3) + 1;
5389         break;
5390
5391       default :
5392         DISSECTOR_ASSERT (0);
5393     }
5394   }
5395 }
5396
5397 static void dissect_r3_cmdmfg_lockstate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5398 {
5399   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5400   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5401 }
5402
5403 static void dissect_r3_cmdmfg_capabilities (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5404 {
5405   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5406   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5407 }
5408
5409 static void dissect_r3_cmdmfg_dumpm41t81 (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5410 {
5411   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5412   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5413 }
5414
5415 static void dissect_r3_cmdmfg_debuglogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5416 {
5417   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5418   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5419 }
5420
5421 static void dissect_r3_cmdmfg_debuglogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5422 {
5423   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5424   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5425 }
5426
5427 static void dissect_r3_cmdmfg_testwdt (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5428 {
5429   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5430   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5431 }
5432
5433 static void dissect_r3_cmdmfg_querycksum (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5434 {
5435   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5436   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5437 }
5438
5439 static void dissect_r3_cmdmfg_validatechecksums (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5440 {
5441   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5442   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5443 }
5444
5445 static void dissect_r3_cmdmfg_rebuildlrucache (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5446 {
5447   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5448   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5449 }
5450
5451 static void dissect_r3_cmdmfg_tzupdate (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5452 {
5453   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5454   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5455 }
5456
5457 static void dissect_r3_cmdmfg_testpreserve (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5458 {
5459   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5460   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5461   proto_tree_add_item (tree, hf_r3_mfgtestpreserve, tvb, start_offset + 2, 1, TRUE);
5462 }
5463
5464 static void dissect_r3_cmdmfg_mortisestatelogdump (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5465 {
5466   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5467   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5468 }
5469
5470 static void dissect_r3_cmdmfg_mortisestatelogclear (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5471 {
5472   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5473   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5474 }
5475
5476 static void dissect_r3_cmdmfg_mortisepins (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5477 {
5478   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5479   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5480 }
5481
5482 static void dissect_r3_cmdmfg_haltandcatchfire (tvbuff_t *tvb, guint32 start_offset, guint32 length _U_, packet_info *pinfo _U_, proto_tree *tree)
5483 {
5484   proto_tree_add_item (tree, hf_r3_commandmfglength, tvb, start_offset + 0, 1, TRUE);
5485   proto_tree_add_item (tree, hf_r3_commandmfg, tvb, start_offset + 1, 1, TRUE);
5486 }
5487
5488 /*
5489  * ***************************************************************************
5490  *
5491  *  If no tree, don't bother parsing anything else since it doesn't affect return results
5492  */
5493 static gint dissect_r3_command (tvbuff_t *tvb, guint32 start_offset, guint32 length, packet_info *pinfo, proto_tree *r3_tree)
5494 {
5495   if (r3_tree)
5496   {
5497     proto_item *cmd_item = NULL;
5498     proto_tree *cmd_tree = NULL;
5499     const gchar *cn = NULL;
5500     guint8 cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5501     guint8 cmd = tvb_get_guint8 (tvb, start_offset + 1);
5502
5503     tvb_ensure_bytes_exist (tvb, start_offset, 2);
5504
5505     cmdLen = tvb_get_guint8 (tvb, start_offset + 0);
5506     cmd = tvb_get_guint8 (tvb, start_offset + 1);
5507
5508     if (!mfgCommandFlag)
5509       cn = val_to_str_ext_const (cmd, &r3_cmdnames_ext, "[Unknown Command]");
5510     else
5511       cn = val_to_str_ext_const (cmd, &r3_cmdmfgnames_ext, "[Unknown Mfg Command]");
5512
5513     cmd_item = proto_tree_add_text (r3_tree, tvb, start_offset, cmdLen, "Command Packet: %s (%d)", cn, cmd);
5514     cmd_tree = proto_item_add_subtree (cmd_item, ett_r3cmd);
5515
5516     if (cmd_tree)
5517     {
5518       if (!mfgCommandFlag)
5519       {
5520         if (cmd >= CMD_LAST)
5521           expert_add_info_format (pinfo, cmd_tree, PI_UNDECODED, PI_WARN, "Unknown command value");
5522         else if (r3command_dissect [cmd].dissector)
5523           (*r3command_dissect [cmd].dissector) (tvb, start_offset, length, pinfo, cmd_tree);
5524       }
5525       else
5526       {
5527         mfgCommandFlag = FALSE;
5528
5529         if (cmd >= CMDMFG_LAST)
5530           expert_add_info_format (pinfo, cmd_tree, PI_UNDECODED, PI_WARN, "Unknown manufacturing command value");
5531         else if (r3commandmfg_dissect [cmd].dissector)
5532           (*r3commandmfg_dissect [cmd].dissector) (tvb, start_offset, length, pinfo, cmd_tree);
5533       }
5534     }
5535   }
5536
5537   return tvb_get_guint8 (tvb, start_offset);
5538 }
5539
5540 /*
5541  * ***************************************************************************
5542  *
5543  *  Dissect a single packet, return bytes consumed
5544  *
5545  *  Return either:
5546  *    >0 = number of bytes consumed
5547  *     0 = packet is just the right length
5548  *    <0 = need more bytes
5549  */
5550 static gint dissect_r3_packet (tvbuff_t *tvb, guint start_offset, packet_info *pinfo, proto_tree *r3_tree)
5551 {
5552   guint offset = 0;
5553   guint octConsumed;
5554   gint available = tvb_length_remaining (tvb, start_offset);
5555
5556   if (!(tvb_strneql (tvb, start_offset, "~~~ds", 5)))
5557   {
5558     if (r3_tree)
5559       proto_tree_add_item (r3_tree, hf_r3_tildex3ds, tvb, start_offset + 0, -1, TRUE);
5560
5561     offset = start_offset + 5;
5562   }
5563   else
5564   {
5565     gint packetLen = 0;
5566
5567     if (available < 4)
5568       return available - 4;
5569     else
5570     {
5571       packetLen = tvb_get_guint8 (tvb, start_offset + 3) + 1;
5572
5573       if (packetLen > available)
5574         return available - packetLen;
5575     }
5576
5577     --packetLen;
5578
5579     /*
5580      *  Show basic header stuff
5581      */
5582     if (r3_tree)
5583     {
5584       proto_item *header_item = proto_tree_add_item (r3_tree, hf_r3_header, tvb, start_offset + 0, 5, TRUE);
5585       proto_tree *header_tree = proto_item_add_subtree (header_item, ett_r3header);
5586
5587       proto_tree_add_item (header_tree, hf_r3_sigil, tvb, start_offset + 0, 1, TRUE);
5588       proto_tree_add_item (header_tree, hf_r3_address, tvb, start_offset + 1, 1, TRUE);
5589       proto_tree_add_item (header_tree, hf_r3_packetnumber, tvb, start_offset + 2, 1, TRUE);
5590       proto_tree_add_item (header_tree, hf_r3_packetlength, tvb, start_offset + 3, 1, TRUE);
5591       proto_tree_add_item (header_tree, hf_r3_encryption, tvb, start_offset + 4, 1, TRUE);
5592     }
5593
5594     /*
5595      *  If the packet has enough data, try to decode it
5596      */
5597     if (available > 8)
5598     {
5599       proto_item *payload_item = NULL;
5600       proto_tree *payload_tree = NULL;
5601       tvbuff_t *payload_tvb = tvb_new_subset (tvb, start_offset + 5, packetLen - 7, packetLen - 7);
5602
5603       if (r3_tree)
5604       {
5605         payload_item = proto_tree_add_item (r3_tree, hf_r3_payload, payload_tvb, 0, -1, TRUE);
5606         payload_tree = proto_item_add_subtree (payload_item, ett_r3payload);
5607       }
5608
5609       while (offset < tvb_reported_length (payload_tvb))
5610       {
5611         octConsumed = dissect_r3_command (payload_tvb, offset, 0, pinfo, payload_tree);
5612         if(!octConsumed)
5613         {
5614               expert_add_info_format (pinfo, payload_tree, PI_MALFORMED, PI_WARN, "Command length equal to 0; payload could be partially decoded");
5615               offset = tvb_reported_length (payload_tvb);
5616               break;
5617         }
5618         offset += octConsumed;
5619       }
5620     }
5621
5622     offset += start_offset;
5623
5624     /*
5625      *  Show the CRC and XOR status
5626      */
5627     if (r3_tree)
5628     {
5629       proto_item *tail_item = proto_tree_add_item (r3_tree, hf_r3_tail, tvb, offset + 5, 3, TRUE);
5630       proto_tree *tail_tree = proto_item_add_subtree (tail_item, ett_r3tail);
5631       guint32 packetCRC = tvb_get_letohs (tvb, offset + 5);
5632       guint32 packetXor = tvb_get_guint8 (tvb, offset + 7);
5633       guint32 calculatedCRC = 0;
5634       guint32 calculatedXor = 0;
5635
5636       if ((calculatedCRC = utilCrcCalculate (tvb_get_ptr (tvb, start_offset + 1, packetLen - 3), packetLen - 3, 0x0000)) == packetCRC)
5637         proto_tree_add_uint_format (tail_tree, hf_r3_crc, tvb, offset + 5, 2, packetCRC, "CRC: 0x%04x (correct)", packetCRC);
5638       else
5639       {
5640         proto_item *tmp_item;
5641
5642         proto_tree_add_uint_format (tail_tree, hf_r3_crc, tvb, offset + 5, 2, packetCRC, "CRC: 0x%04x (incorrect, should be 0x%04x)", calculatedCRC, packetCRC);
5643         tmp_item = proto_tree_add_boolean (tail_tree, hf_r3_crc_bad, tvb, offset + 5, 2, TRUE);
5644         PROTO_ITEM_SET_GENERATED (tmp_item);
5645       }
5646
5647       if ((calculatedXor = (packetLen ^ 0xff)) == packetXor)
5648         proto_tree_add_uint_format (tail_tree, hf_r3_xor, tvb, offset + 7, 1, packetXor, "XOR: 0x%02x (correct)", packetXor);
5649       else
5650       {
5651         proto_item *tmp_item;
5652
5653         proto_tree_add_uint_format (tail_tree, hf_r3_xor, tvb, offset + 7, 1, packetXor, "XOR: 0x%02x (incorrect, should be 0x%02x)", packetXor, packetLen ^ 0xff);
5654         tmp_item = proto_tree_add_boolean (tail_tree, hf_r3_xor_bad, tvb, offset + 7, 1, TRUE);
5655         PROTO_ITEM_SET_GENERATED (tmp_item);
5656       }
5657     }
5658
5659     offset += 8;
5660   }
5661
5662   return offset - start_offset;
5663 }
5664
5665 /*
5666  * ***************************************************************************
5667  *
5668  *  Main dissector entry points
5669  */
5670 static void dissect_r3_message (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5671 {
5672   proto_item *r3_item = NULL;
5673   proto_tree *r3_tree = NULL;
5674   guint offset = 0;
5675
5676   col_set_str (pinfo->cinfo, COL_PROTOCOL, "R3");
5677   col_clear (pinfo->cinfo, COL_INFO);
5678
5679   if (tree)
5680   {
5681     r3_item = proto_tree_add_item (tree, proto_r3, tvb, 0, -1, TRUE);
5682     r3_tree = proto_item_add_subtree (r3_item, ett_r3);
5683   }
5684
5685   while (offset < tvb_reported_length (tvb))
5686   {
5687     gint res = dissect_r3_packet (tvb, offset, pinfo, r3_tree);
5688
5689     if (res <= 0)
5690     {
5691       if (r3_item)
5692         proto_item_set_len (r3_item, offset);
5693
5694       return;
5695     }
5696
5697     offset += res;
5698   }
5699
5700   return;
5701 }
5702
5703 static guint get_r3_message_len (packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
5704 {
5705   return (guint) tvb_get_guint8 (tvb, offset + 3) + 1;
5706 }
5707
5708 static void dissect_r3 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
5709 {
5710   tcp_dissect_pdus (tvb, pinfo, tree, TRUE, 4, get_r3_message_len, dissect_r3_message);
5711 }
5712
5713 /*
5714  * ***************************************************************************
5715  */
5716 void proto_register_r3 (void)
5717 {
5718   proto_r3 = proto_register_protocol ("Assa Abloy R3", "R3", "r3");
5719   register_dissector ("r3", dissect_r3, proto_r3);
5720   proto_register_field_array (proto_r3, hf, array_length (hf));
5721   proto_register_subtree_array (ett, array_length (ett));
5722 }
5723
5724 void proto_reg_handoff_r3 (void)
5725 {
5726   dissector_handle_t r3_handle = find_dissector ("r3");
5727   dissector_add_uint ("tcp.port", 2571, r3_handle);
5728   dissector_add_uint ("tcp.port", 8023, r3_handle);
5729 }
5730
5731
5732 /*
5733  * Editor modelines
5734  *
5735  * Local variables:
5736  * c-basic-offset: 2
5737  * tab-width: 8
5738  * indent-tabs-mode: nil
5739  * End:
5740  *
5741  * vim: set tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
5742  */