589b36bb3259236890481f7a7e59da31304222a2
[obnox/wireshark/wip.git] / epan / dissectors / packet-ipmi-app.c
1 /* packet-ipmi-app.c
2  * Sub-dissectors for IPMI messages (netFn=Application)
3  * Copyright 2007-2008, Alexey Neyman, Pigeon Point Systems <avn@pigeonpoint.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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #ifdef HAVE_SYS_TYPES_H
31 #include <sys/types.h>
32 #endif
33 #include <string.h>
34
35 #include <epan/packet.h>
36
37 #include "packet-ipmi.h"
38
39 static gint ett_ipmi_app_01_byte2 = -1;
40 static gint ett_ipmi_app_01_byte3 = -1;
41 static gint ett_ipmi_app_01_byte6 = -1;
42
43 static gint ett_ipmi_app_04_byte2 = -1;
44
45 static gint ett_ipmi_app_06_syspwr = -1;
46 static gint ett_ipmi_app_06_devpwr = -1;
47
48 static gint ett_ipmi_app_07_syspwr = -1;
49 static gint ett_ipmi_app_07_devpwr = -1;
50
51 static gint ett_ipmi_app_24_timer_use = -1;
52 static gint ett_ipmi_app_24_timer_action = -1;
53 static gint ett_ipmi_app_24_expiration_flags = -1;
54
55 static gint ett_ipmi_app_25_timer_use = -1;
56 static gint ett_ipmi_app_25_timer_action = -1;
57 static gint ett_ipmi_app_25_expiration_flags = -1;
58
59 static gint ett_ipmi_app_2e_byte1 = -1;
60 static gint ett_ipmi_app_2f_byte1 = -1;
61 static gint ett_ipmi_app_30_byte1 = -1;
62 static gint ett_ipmi_app_31_byte1 = -1;
63 static gint ett_ipmi_app_32_rq_byte1 = -1;
64 static gint ett_ipmi_app_32_rq_byte2 = -1;
65 static gint ett_ipmi_app_32_rs_byte1 = -1;
66 static gint ett_ipmi_app_32_rs_byte2 = -1;
67 static gint ett_ipmi_app_34_byte1 = -1;
68 static gint ett_ipmi_app_34_msg = -1;
69
70 static gint ett_ipmi_app_38_rq_byte1 = -1;
71 static gint ett_ipmi_app_38_rq_byte2 = -1;
72 static gint ett_ipmi_app_38_rs_byte1 = -1;
73 static gint ett_ipmi_app_38_rs_byte2 = -1;
74 static gint ett_ipmi_app_38_rs_byte3 = -1;
75 static gint ett_ipmi_app_38_rs_byte4 = -1;
76
77 static gint ett_ipmi_app_39_byte1 = -1;
78
79 static gint ett_ipmi_app_3a_rq_byte1 = -1;
80 static gint ett_ipmi_app_3a_rq_byte2 = -1;
81 static gint ett_ipmi_app_3a_rs_byte1 = -1;
82 static gint ett_ipmi_app_3a_rs_byte10 = -1;
83
84 static gint ett_ipmi_app_3b_rq_byte1 = -1;
85 static gint ett_ipmi_app_3b_rs_byte1 = -1;
86
87 static gint hf_ipmi_app_01_dev_id = -1;
88 static gint hf_ipmi_app_01_dev_prov_sdr = -1;
89 static gint hf_ipmi_app_01_dev_rev = -1;
90 static gint hf_ipmi_app_01_dev_avail = -1;
91 static gint hf_ipmi_app_01_fw_rev_maj = -1;
92 static gint hf_ipmi_app_01_fw_rev_min = -1;
93 static gint hf_ipmi_app_01_ipmi_version = -1;
94 static gint hf_ipmi_app_01_ipmi_ads_chassis = -1;
95 static gint hf_ipmi_app_01_ipmi_ads_bridge = -1;
96 static gint hf_ipmi_app_01_ipmi_ads_ipmb_ev_gen = -1;
97 static gint hf_ipmi_app_01_ipmi_ads_ipmb_ev_recv = -1;
98 static gint hf_ipmi_app_01_ipmi_ads_fru = -1;
99 static gint hf_ipmi_app_01_ipmi_ads_sel = -1;
100 static gint hf_ipmi_app_01_ipmi_ads_sdr = -1;
101 static gint hf_ipmi_app_01_ipmi_ads_sensor = -1;
102 static gint hf_ipmi_app_01_manufacturer = -1;
103 static gint hf_ipmi_app_01_product = -1;
104 static gint hf_ipmi_app_01_fw_aux = -1;
105
106 static gint hf_ipmi_app_04_result = -1;
107 static gint hf_ipmi_app_04_fail = -1;
108 static gint hf_ipmi_app_04_fail_sel = -1;
109 static gint hf_ipmi_app_04_fail_sdr = -1;
110 static gint hf_ipmi_app_04_fail_bmc_fru = -1;
111 static gint hf_ipmi_app_04_fail_ipmb_sig = -1;
112 static gint hf_ipmi_app_04_fail_sdr_empty = -1;
113 static gint hf_ipmi_app_04_fail_iua = -1;
114 static gint hf_ipmi_app_04_fail_bb_fw = -1;
115 static gint hf_ipmi_app_04_fail_oper_fw = -1;
116
117 static gint hf_ipmi_app_05_devspec = -1;
118
119 static gint hf_ipmi_app_06_syspwr_set = -1;
120 static gint hf_ipmi_app_06_syspwr_enum = -1;
121 static gint hf_ipmi_app_06_devpwr_set = -1;
122 static gint hf_ipmi_app_06_devpwr_enum = -1;
123
124 static gint hf_ipmi_app_07_syspwr_enum = -1;
125 static gint hf_ipmi_app_07_devpwr_enum = -1;
126
127 static gint hf_ipmi_app_08_guid = -1;
128
129 static gint hf_ipmi_app_24_timer_use_dont_log = -1;
130 static gint hf_ipmi_app_24_timer_use_dont_stop = -1;
131 static gint hf_ipmi_app_24_timer_use_timer_use = -1;
132 static gint hf_ipmi_app_24_timer_action_interrupt = -1;
133 static gint hf_ipmi_app_24_timer_action_timeout_action = -1;
134 static gint hf_ipmi_app_24_pretimeout = -1;
135 static gint hf_ipmi_app_24_expiration_flags_oem = -1;
136 static gint hf_ipmi_app_24_expiration_flags_smsos = -1;
137 static gint hf_ipmi_app_24_expiration_flags_osload = -1;
138 static gint hf_ipmi_app_24_expiration_flags_biospost = -1;
139 static gint hf_ipmi_app_24_expiration_flags_biosfrb2 = -1;
140 static gint hf_ipmi_app_24_initial_countdown = -1;
141
142 static gint hf_ipmi_app_25_timer_use_dont_log = -1;
143 static gint hf_ipmi_app_25_timer_use_started = -1;
144 static gint hf_ipmi_app_25_timer_use_timer_use = -1;
145 static gint hf_ipmi_app_25_timer_action_interrupt = -1;
146 static gint hf_ipmi_app_25_timer_action_timeout_action = -1;
147 static gint hf_ipmi_app_25_pretimeout = -1;
148 static gint hf_ipmi_app_25_expiration_flags_oem = -1;
149 static gint hf_ipmi_app_25_expiration_flags_smsos = -1;
150 static gint hf_ipmi_app_25_expiration_flags_osload = -1;
151 static gint hf_ipmi_app_25_expiration_flags_biospost = -1;
152 static gint hf_ipmi_app_25_expiration_flags_biosfrb2 = -1;
153 static gint hf_ipmi_app_25_initial_countdown = -1;
154 static gint hf_ipmi_app_25_present_countdown = -1;
155
156 static gint hf_ipmi_app_2e_byte1_oem2 = -1;
157 static gint hf_ipmi_app_2e_byte1_oem1 = -1;
158 static gint hf_ipmi_app_2e_byte1_oem0 = -1;
159 static gint hf_ipmi_app_2e_byte1_sel = -1;
160 static gint hf_ipmi_app_2e_byte1_emb = -1;
161 static gint hf_ipmi_app_2e_byte1_emb_full_intr = -1;
162 static gint hf_ipmi_app_2e_byte1_rmq_intr = -1;
163
164 static gint hf_ipmi_app_2f_byte1_oem2 = -1;
165 static gint hf_ipmi_app_2f_byte1_oem1 = -1;
166 static gint hf_ipmi_app_2f_byte1_oem0 = -1;
167 static gint hf_ipmi_app_2f_byte1_sel = -1;
168 static gint hf_ipmi_app_2f_byte1_emb = -1;
169 static gint hf_ipmi_app_2f_byte1_emb_full_intr = -1;
170 static gint hf_ipmi_app_2f_byte1_rmq_intr = -1;
171
172 static gint hf_ipmi_app_30_byte1_oem2 = -1;
173 static gint hf_ipmi_app_30_byte1_oem1 = -1;
174 static gint hf_ipmi_app_30_byte1_oem0 = -1;
175 static gint hf_ipmi_app_30_byte1_wd_pretimeout = -1;
176 static gint hf_ipmi_app_30_byte1_emb = -1;
177 static gint hf_ipmi_app_30_byte1_rmq = -1;
178
179 static gint hf_ipmi_app_31_byte1_oem2 = -1;
180 static gint hf_ipmi_app_31_byte1_oem1 = -1;
181 static gint hf_ipmi_app_31_byte1_oem0 = -1;
182 static gint hf_ipmi_app_31_byte1_wd_pretimeout = -1;
183 static gint hf_ipmi_app_31_byte1_emb = -1;
184 static gint hf_ipmi_app_31_byte1_rmq = -1;
185
186 static gint hf_ipmi_app_32_rq_chno = -1;
187 static gint hf_ipmi_app_32_rq_state = -1;
188 static gint hf_ipmi_app_32_rs_chno = -1;
189 static gint hf_ipmi_app_32_rs_state = -1;
190
191 static gint hf_ipmi_app_34_track = -1;
192 static gint hf_ipmi_app_34_encrypt = -1;
193 static gint hf_ipmi_app_34_auth = -1;
194 static gint hf_ipmi_app_34_chan = -1;
195
196 static gint hf_ipmi_app_38_rq_ipmi20 = -1;
197 static gint hf_ipmi_app_38_rq_chan = -1;
198 static gint hf_ipmi_app_38_rq_priv = -1;
199 static gint hf_ipmi_app_38_rs_chan = -1;
200 static gint hf_ipmi_app_38_rs_ipmi20 = -1;
201 static gint hf_ipmi_app_38_rs_auth_oem = -1;
202 static gint hf_ipmi_app_38_rs_auth_straight = -1;
203 static gint hf_ipmi_app_38_rs_auth_md5 = -1;
204 static gint hf_ipmi_app_38_rs_auth_md2 = -1;
205 static gint hf_ipmi_app_38_rs_auth_none = -1;
206 static gint hf_ipmi_app_38_rs_kg = -1;
207 static gint hf_ipmi_app_38_rs_permsg = -1;
208 static gint hf_ipmi_app_38_rs_userauth = -1;
209 static gint hf_ipmi_app_38_rs_user_nonnull = -1;
210 static gint hf_ipmi_app_38_rs_user_null = -1;
211 static gint hf_ipmi_app_38_rs_user_anon = -1;
212 static gint hf_ipmi_app_38_rs_ipmi20_conn = -1;
213 static gint hf_ipmi_app_38_rs_ipmi15_conn = -1;
214 static gint hf_ipmi_app_38_rs_oem_iana = -1;
215 static gint hf_ipmi_app_38_rs_oem_aux = -1;
216
217 static gint hf_ipmi_app_39_authtype = -1;
218 static gint hf_ipmi_app_39_user = -1;
219 static gint hf_ipmi_app_39_temp_session = -1;
220 static gint hf_ipmi_app_39_challenge = -1;
221
222 static gint hf_ipmi_app_3a_authtype = -1;
223 static gint hf_ipmi_app_3a_privlevel = -1;
224 static gint hf_ipmi_app_3a_authcode = -1;
225 static gint hf_ipmi_app_3a_outbound_seq = -1;
226 static gint hf_ipmi_app_3a_authtype_session = -1;
227 static gint hf_ipmi_app_3a_session_id = -1;
228 static gint hf_ipmi_app_3a_inbound_seq = -1;
229 static gint hf_ipmi_app_3a_maxpriv_session = -1;
230
231 static gint hf_ipmi_app_3b_req_priv = -1;
232 static gint hf_ipmi_app_3b_new_priv = -1;
233
234 static gint hf_ipmi_app_3c_session_id = -1;
235 static gint hf_ipmi_app_3c_session_handle = -1;
236
237 static const struct true_false_string tfs_01_dev_avail = {
238         "Device firmware, SDR Repository update or self-initialization in progress",
239         "Normal operation"
240 };
241
242 static const value_string vals_04_result[] = {
243         { 0x55, "No error. All Self Tests Passed" },
244         { 0x56, "Self Test function not implemented in this controller" },
245         { 0x57, "Corrupted or inaccesible data or devices" },
246         { 0x58, "Fatal hardware error" },
247         { 0xff, "Reserved" },
248         { 0, NULL }
249 };
250
251 static const struct true_false_string tfs_04_fail_unknown = {
252         "Test failed",
253         "Unknown"
254 };
255
256 static const struct true_false_string tfs_06_pwr = {
257         "Set",
258         "Do not change"
259 };
260
261 static const value_string vals_06_syspwr[] = {
262         { 0x00, "Set S0 / G0" },
263         { 0x01, "Set S1" },
264         { 0x02, "Set S2" },
265         { 0x03, "Set S3" },
266         { 0x04, "Set S4" },
267         { 0x05, "Set S5 / G2" },
268         { 0x06, "Set S4/S5" },
269         { 0x07, "Set G3" },
270         { 0x08, "Sleeping" },
271         { 0x09, "G1 sleping" },
272         { 0x0a, "Set override" },
273         { 0x20, "Set Legacy On" },
274         { 0x21, "Set Legacy Off" },
275         { 0x2a, "Set unknown" },
276         { 0x7f, "No change" },
277         { 0, NULL }
278 };
279
280 static const value_string vals_06_devpwr[] = {
281         { 0x00, "Set D0" },
282         { 0x01, "Set D1" },
283         { 0x02, "Set D2" },
284         { 0x03, "Set D3" },
285         { 0x2a, "Set unknown" },
286         { 0x7f, "No change" },
287         { 0, NULL }
288 };
289
290 static const value_string vals_07_syspwr[] = {
291         { 0x00, "S0 / G0" },
292         { 0x01, "S1" },
293         { 0x02, "S2" },
294         { 0x03, "S3" },
295         { 0x04, "S4" },
296         { 0x05, "S5 / G2" },
297         { 0x06, "S4/S5" },
298         { 0x07, "G3" },
299         { 0x08, "Sleeping" },
300         { 0x09, "G1 sleping" },
301         { 0x0a, "Override" },
302         { 0x20, "Legacy On" },
303         { 0x21, "Legacy Off" },
304         { 0x2a, "unknown" },
305         { 0, NULL }
306 };
307
308 static const value_string vals_07_devpwr[] = {
309         { 0x00, "D0" },
310         { 0x01, "D1" },
311         { 0x02, "D2" },
312         { 0x03, "D3" },
313         { 0x2a, "unknown" },
314         { 0, NULL }
315 };
316
317 static const value_string vals_24_timer_use[] = {
318         { 0x00, "reserved" },
319         { 0x01, "BIOS FRB2" },
320         { 0x02, "BIOS/POST" },
321         { 0x03, "OS Load" },
322         { 0x04, "SMS/OS" },
323         { 0x05, "OEM" },
324         { 0x06, "reserved" },
325         { 0x07, "reserved" },
326
327         { 0, NULL }
328 };
329
330 static const value_string vals_24_timer_action_interrupt[] = {
331         { 0x00, "none" },
332         { 0x01, "SMI" },
333         { 0x02, "NMI / Diagnostic interrupt" },
334         { 0x03, "Messaging interrupt" },
335         { 0x04, "reserved" },
336         { 0x05, "reserved" },
337         { 0x06, "reserved" },
338         { 0x07, "reserved" },
339
340         { 0, NULL }
341 };
342
343 static const value_string vals_24_timer_action_timeout[] = {
344         { 0x00, "no action" },
345         { 0x01, "Hard Reset" },
346         { 0x02, "Power Down" },
347         { 0x03, "Power Cycle" },
348         { 0x04, "reserved" },
349         { 0x05, "reserved" },
350         { 0x06, "reserved" },
351         { 0x07, "reserved" },
352
353         { 0, NULL }
354 };
355
356 static const struct true_false_string tfs_24_exp_flags = {
357         "clear timer use expiration bit",
358         "leave alone"
359 };
360
361 static const struct true_false_string tfs_2e_enable = { "Enable", "Disable" };
362 static const struct true_false_string tfs_2f_enabled = { "Enabled", "Disabled" };
363
364 static const struct true_false_string tfs_30_clear = {
365         "clear",
366         "leave alone"
367 };
368
369 static const value_string vals_32_state[] = {
370         { 0x00, "Disable channel" },
371         { 0x01, "Enable channel" },
372         { 0x02, "Get channel enable/disable state" },
373         { 0x03, "Reserved" },
374
375         { 0, NULL }
376 };
377
378 static const struct true_false_string tfs_32_state = {
379         "Channel enabled",
380         "Channel disabled"
381 };
382
383 static const value_string vals_34_track[] = {
384         { 0x00, "No tracking" },
385         { 0x01, "Track Request" },
386         { 0x02, "Send Raw" },
387         { 0, NULL }
388 };
389
390 static const value_string vals_38_ipmi20[] = {
391         { 0x00, "Backward compatible with IPMI 1.5" },
392         { 0x01, "IPMI v2.0+ extended data" },
393         { 0, NULL }
394 };
395
396 static const value_string vals_XX_priv[] = {
397         { 0x00, "None / No change" },
398         { 0x01, "Callback" },
399         { 0x02, "User" },
400         { 0x03, "Operator" },
401         { 0x04, "Administrator" },
402         { 0x05, "OEM Proprietary" },
403         { 0, NULL }
404 };
405
406 static const struct true_false_string tfs_38_supp = { "Supported", "Not supported" };
407 static const struct true_false_string tfs_38_kg = { "Set to non-zero", "Set to default (0)" };
408
409 static const value_string vals_XX_auth[] = {
410         { 0x00, "None" },
411         { 0x01, "MD2" },
412         { 0x02, "MD5" },
413         { 0x04, "straight password" },
414         { 0x05, "OEM" },
415         { 0, NULL }
416 };
417
418
419 /* Get Device ID.
420  */
421 static void
422 rs01(tvbuff_t *tvb, proto_tree *tree)
423 {
424         static const gint *byte2[] = { &hf_ipmi_app_01_dev_prov_sdr, &hf_ipmi_app_01_dev_rev, NULL };
425         static const gint *byte3[] = { &hf_ipmi_app_01_dev_avail, &hf_ipmi_app_01_fw_rev_maj, NULL };
426         static const gint *byte6[] = { &hf_ipmi_app_01_ipmi_ads_chassis, &hf_ipmi_app_01_ipmi_ads_bridge,
427                 &hf_ipmi_app_01_ipmi_ads_ipmb_ev_gen, &hf_ipmi_app_01_ipmi_ads_ipmb_ev_recv,
428                 &hf_ipmi_app_01_ipmi_ads_fru, &hf_ipmi_app_01_ipmi_ads_sel, &hf_ipmi_app_01_ipmi_ads_sdr,
429                 &hf_ipmi_app_01_ipmi_ads_sensor, NULL };
430         size_t len;
431
432         len = tvb_length(tvb);
433
434         proto_tree_add_item(tree, hf_ipmi_app_01_dev_id, tvb, 0, 1, TRUE);
435         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_01_byte2, byte2, TRUE, 0);
436         proto_tree_add_bitmask_text(tree, tvb, 2, 1, NULL, NULL, ett_ipmi_app_01_byte3, byte3, TRUE, 0);
437         proto_tree_add_item(tree, hf_ipmi_app_01_fw_rev_min, tvb, 3, 1, TRUE);
438
439         proto_tree_add_item(tree, hf_ipmi_app_01_ipmi_version, tvb, 4, 1, TRUE);
440
441         proto_tree_add_bitmask_text(tree, tvb, 5, 1, "Additional device support: ", "None",
442                         ett_ipmi_app_01_byte6, byte6, TRUE, 0);
443         proto_tree_add_item(tree, hf_ipmi_app_01_manufacturer, tvb, 6, 3, TRUE);
444         proto_tree_add_item(tree, hf_ipmi_app_01_product, tvb, 9, 2, TRUE);
445         if (len > 11) {
446                 /* IPMI states that Aux Revision should be displayed in MSB order */
447                 proto_tree_add_item(tree, hf_ipmi_app_01_fw_aux, tvb, 11, 4, FALSE);
448         }
449 }
450
451 /* Get Self Test Results.
452  */
453 static void
454 rs04(tvbuff_t *tvb, proto_tree *tree)
455 {
456         static const gint *byte2[] = { &hf_ipmi_app_04_fail_sel, &hf_ipmi_app_04_fail_sdr,
457                 &hf_ipmi_app_04_fail_bmc_fru, &hf_ipmi_app_04_fail_ipmb_sig, &hf_ipmi_app_04_fail_sdr_empty,
458                 &hf_ipmi_app_04_fail_iua, &hf_ipmi_app_04_fail_bb_fw, &hf_ipmi_app_04_fail_oper_fw, NULL };
459         int res, fail;
460
461         res = tvb_get_guint8(tvb, 0);
462         fail = tvb_get_guint8(tvb, 1);
463
464         proto_tree_add_uint_format(tree, hf_ipmi_app_04_result, tvb, 0, 1,
465                         res, "Self test result: %s (0x%02x)",
466                         val_to_str(res, vals_04_result, "Device-specific internal failure"),
467                         res);
468
469         if (res == 0x55 || res == 0x56 || res == 0xff) {
470                 proto_tree_add_uint_format_value(tree, hf_ipmi_app_04_fail, tvb, 1, 1,
471                                 fail, "0x%02x (must be 0x00)",
472                                 fail);
473                 return;
474         }
475
476         if (res != 0x57) {
477                 proto_tree_add_uint_format_value(tree, hf_ipmi_app_04_fail, tvb, 1, 1,
478                                 fail, "0x%02x (device-specific)",
479                                 fail);
480                 return;
481         }
482
483         proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_app_04_fail, ett_ipmi_app_04_byte2, byte2, TRUE);
484 }
485
486 /* Manufacturing Test On.
487  */
488 static void
489 rq05(tvbuff_t *tvb, proto_tree *tree)
490 {
491         proto_tree_add_item(tree, hf_ipmi_app_05_devspec, tvb, 0, tvb_length(tvb), TRUE);
492 }
493
494 /* Set ACPI Power State.
495  */
496 static void
497 rq06(tvbuff_t *tvb, proto_tree *tree)
498 {
499         static const gint *byte1[] = { &hf_ipmi_app_06_syspwr_set, &hf_ipmi_app_06_syspwr_enum, NULL };
500         static const gint *byte2[] = { &hf_ipmi_app_06_devpwr_set, &hf_ipmi_app_06_devpwr_enum, NULL };
501
502         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "ACPI System Power State: ", NULL,
503                         ett_ipmi_app_06_syspwr, byte1, TRUE, 0);
504         proto_tree_add_bitmask_text(tree, tvb, 1, 1, "ACPI Device Power State: ", NULL,
505                         ett_ipmi_app_06_devpwr, byte2, TRUE, 0);
506 }
507
508 /* Get ACPI Power State.
509  */
510 static void
511 rs07(tvbuff_t *tvb, proto_tree *tree)
512 {
513         static const gint *byte1[] = { &hf_ipmi_app_07_syspwr_enum, NULL };
514         static const gint *byte2[] = { &hf_ipmi_app_07_devpwr_enum, NULL };
515
516         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "ACPI System Power State: ", NULL,
517                         ett_ipmi_app_07_syspwr, byte1, TRUE, 0);
518         proto_tree_add_bitmask_text(tree, tvb, 1, 1, "ACPI Device Power State: ", NULL,
519                         ett_ipmi_app_07_devpwr, byte2, TRUE, 0);
520 }
521
522 /* Get Device GUID.
523  */
524 static void
525 rs08(tvbuff_t *tvb, proto_tree *tree)
526 {
527         ipmi_add_guid(tree, hf_ipmi_app_08_guid, tvb, 0);
528 }
529
530 /* Reset Watchdog Timer.
531  */
532 static const value_string cc22[] = {
533         { 0x80, "Attempt to start un-initialized watchdog" },
534         { 0, NULL }
535 };
536
537 /* Set Watchdog Timer.
538  */
539 static void
540 rq24(tvbuff_t *tvb, proto_tree *tree)
541 {
542         static const gint *byte1[] = { &hf_ipmi_app_24_timer_use_dont_log,
543                 &hf_ipmi_app_24_timer_use_dont_stop, &hf_ipmi_app_24_timer_use_timer_use, NULL };
544         static const gint *byte2[] = { &hf_ipmi_app_24_timer_action_interrupt,
545                 &hf_ipmi_app_24_timer_action_timeout_action, NULL };
546         static const gint *byte4[] = { &hf_ipmi_app_24_expiration_flags_oem,
547                 &hf_ipmi_app_24_expiration_flags_smsos, &hf_ipmi_app_24_expiration_flags_osload,
548                 &hf_ipmi_app_24_expiration_flags_biospost, &hf_ipmi_app_24_expiration_flags_biosfrb2, NULL };
549
550         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Timer Use: ", NULL, ett_ipmi_app_24_timer_use,
551                         byte1, TRUE, 0);
552         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_24_timer_action,
553                         byte2, TRUE, 0);
554         proto_tree_add_item(tree, hf_ipmi_app_24_pretimeout, tvb, 2, 1, TRUE);
555         proto_tree_add_bitmask_text(tree, tvb, 3, 1, "Timer Use Expiration flags clear: ", "None",
556                         ett_ipmi_app_24_expiration_flags, byte4, TRUE, BMT_NO_TFS);
557         proto_tree_add_item(tree, hf_ipmi_app_24_initial_countdown, tvb, 4, 2, TRUE);
558 }
559
560 /* Get Watchdog Timer.
561  */
562 static void
563 rs25(tvbuff_t *tvb, proto_tree *tree)
564 {
565         static const gint *byte1[] = { &hf_ipmi_app_25_timer_use_dont_log, 
566                 &hf_ipmi_app_25_timer_use_started, &hf_ipmi_app_25_timer_use_timer_use, NULL };
567         static const gint *byte2[] = { &hf_ipmi_app_25_timer_action_interrupt,
568                 &hf_ipmi_app_25_timer_action_timeout_action, NULL };
569         static const gint *byte4[] = { &hf_ipmi_app_25_expiration_flags_oem, &hf_ipmi_app_25_expiration_flags_smsos,
570                 &hf_ipmi_app_25_expiration_flags_osload, &hf_ipmi_app_25_expiration_flags_biospost,
571                 &hf_ipmi_app_25_expiration_flags_biosfrb2, NULL };
572
573         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Timer Use: ", NULL, ett_ipmi_app_25_timer_use,
574                         byte1, TRUE, 0);
575         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_25_timer_action,
576                         byte2, TRUE, 0);
577         proto_tree_add_item(tree, hf_ipmi_app_25_pretimeout, tvb, 2, 1, TRUE);
578         proto_tree_add_bitmask_text(tree, tvb, 3, 1, "Timer Use Expiration flags: ", "None",
579                         ett_ipmi_app_25_expiration_flags, byte4, TRUE, BMT_NO_TFS);
580         proto_tree_add_item(tree, hf_ipmi_app_25_initial_countdown, tvb, 4, 2, TRUE);
581         proto_tree_add_item(tree, hf_ipmi_app_25_present_countdown, tvb, 6, 2, TRUE);
582 }
583
584 /* Set BMC Global Enables.
585  */
586 static void
587 rq2e(tvbuff_t *tvb, proto_tree *tree)
588 {
589         static const gint *byte1[] = { &hf_ipmi_app_2e_byte1_oem2, &hf_ipmi_app_2e_byte1_oem1,
590                 &hf_ipmi_app_2e_byte1_oem0, &hf_ipmi_app_2e_byte1_sel, &hf_ipmi_app_2e_byte1_emb,
591                 &hf_ipmi_app_2e_byte1_emb_full_intr, &hf_ipmi_app_2e_byte1_rmq_intr, NULL };
592
593         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Enables: ", "None", ett_ipmi_app_2e_byte1,
594                         byte1, TRUE, BMT_NO_TFS);
595 }
596
597 /* Get BMC Global Enables.
598  */
599 static void
600 rs2f(tvbuff_t *tvb, proto_tree *tree)
601 {
602         static const gint *byte1[] = { &hf_ipmi_app_2f_byte1_oem2, &hf_ipmi_app_2f_byte1_oem1,
603                 &hf_ipmi_app_2f_byte1_oem0, &hf_ipmi_app_2f_byte1_sel, &hf_ipmi_app_2f_byte1_emb,
604                 &hf_ipmi_app_2f_byte1_emb_full_intr, &hf_ipmi_app_2f_byte1_rmq_intr, NULL };
605
606         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Enables: ", "None", ett_ipmi_app_2f_byte1,
607                         byte1, TRUE, BMT_NO_TFS);
608 }
609
610 /* Clear Message Flags.
611  */
612 static void
613 rq30(tvbuff_t *tvb, proto_tree *tree)
614 {
615         static const gint *byte1[] = { &hf_ipmi_app_30_byte1_oem2, &hf_ipmi_app_30_byte1_oem1,
616                 &hf_ipmi_app_30_byte1_oem0, &hf_ipmi_app_30_byte1_wd_pretimeout,
617                 &hf_ipmi_app_30_byte1_emb, &hf_ipmi_app_30_byte1_rmq, NULL };
618
619         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Clear Message Flags: ", "None",
620                         ett_ipmi_app_30_byte1, byte1, TRUE, BMT_NO_TFS);
621 }
622
623 /* Get Message Flags.
624  */
625 static void
626 rs31(tvbuff_t *tvb, proto_tree *tree)
627 {
628         static const gint *byte1[] = { &hf_ipmi_app_31_byte1_oem2, &hf_ipmi_app_31_byte1_oem1,
629                 &hf_ipmi_app_31_byte1_oem0, &hf_ipmi_app_31_byte1_wd_pretimeout,
630                 &hf_ipmi_app_31_byte1_emb, &hf_ipmi_app_31_byte1_rmq, NULL };
631
632         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Flags: ", "None",
633                         ett_ipmi_app_31_byte1, byte1, TRUE, BMT_NO_TFS);
634 }
635
636 /* Enable Message Channel Receive.
637  */
638 static void
639 rq32(tvbuff_t *tvb, proto_tree *tree)
640 {
641         static const gint *byte1[] = { &hf_ipmi_app_32_rq_chno, NULL };
642         static const gint *byte2[] = { &hf_ipmi_app_32_rq_state, NULL };
643
644         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_app_32_rq_byte1,
645                         byte1, TRUE, 0);
646         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_32_rq_byte2,
647                         byte2, TRUE, 0);
648 }
649
650 static void
651 rs32(tvbuff_t *tvb, proto_tree *tree)
652 {
653         static const gint *byte1[] = { &hf_ipmi_app_32_rs_chno, NULL };
654         static const gint *byte2[] = { &hf_ipmi_app_32_rs_state, NULL };
655
656         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_app_32_rs_byte1,
657                         byte1, TRUE, 0);
658         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_32_rs_byte2,
659                         byte2, TRUE, 0);
660 }
661
662 /* Get Message
663  */
664 static const value_string cc33[] = {
665         { 0x80, "Data not available (queue/buffer empty)" },
666         { 0, NULL }
667 };
668
669 /* Send Message
670  */
671 static void
672 rq34(tvbuff_t *tvb, proto_tree *tree)
673 {
674         static const gint *byte1[] = { &hf_ipmi_app_34_track, &hf_ipmi_app_34_encrypt,
675                 &hf_ipmi_app_34_auth, &hf_ipmi_app_34_chan, NULL };
676         ipmi_dissect_format_t dfmt;
677         proto_tree *s_tree;
678         proto_item *ti;
679         tvbuff_t *next;
680
681         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
682                         ett_ipmi_app_34_byte1, byte1, TRUE, 0);
683
684         next = tvb_new_subset(tvb, 1, tvb_length(tvb) - 1, tvb_length(tvb) - 1);
685         ti = proto_tree_add_text(tree, next, 0, tvb_length(next), "Message");
686         s_tree = proto_item_add_subtree(ti, ett_ipmi_app_34_msg);
687
688         memset(&dfmt, 0, sizeof(dfmt));
689         dfmt.flags = ipmi_guess_dissect_flags(next);
690         dfmt.arg = ipmi_current_hdr;
691         dfmt.getmoreheaders = ipmi_sendmsg_getheaders;
692         dfmt.whichresponse = ipmi_sendmsg_whichresponse;
693         dfmt.otheridx = ipmi_sendmsg_otheridx;
694         ipmi_do_dissect(next, s_tree, &dfmt);
695         proto_item_set_text(ti, "%s", dfmt.info);
696 }
697
698 static void
699 rs34(tvbuff_t *tvb, proto_tree *tree)
700 {
701         ipmi_dissect_format_t dfmt;
702         proto_tree *s_tree;
703         proto_item *ti;
704
705         ti = proto_tree_add_text(tree, tvb, 0, tvb_length(tvb), "Message");
706         s_tree = proto_item_add_subtree(ti, ett_ipmi_app_34_msg);
707
708         if (tvb_length(tvb)) {
709                 memset(&dfmt, 0, sizeof(dfmt));
710                 dfmt.flags = ipmi_guess_dissect_flags(tvb);
711                 ipmi_do_dissect(tvb, s_tree, &dfmt);
712                 proto_item_set_text(ti, "%s", dfmt.info);
713         }
714 }
715
716 static const value_string cc34[] = {
717         { 0x80, "Invalid Session Handle" },
718         { 0x81, "Lost Arbitration" },
719         { 0x82, "Bus Error" },
720         { 0x83, "NAK on Write" },
721         { 0, NULL }
722 };
723
724 /* Read Event Message Buffer
725  */
726 static const value_string cc35[] = {
727         { 0x80, "Data not available (queue/buffer empty)" },
728         { 0, NULL }
729 };
730
731 /* Get Channel Authentication Capabilities
732  */
733 static void
734 rq38(tvbuff_t *tvb, proto_tree *tree)
735 {
736         static const gint *byte1[] = { &hf_ipmi_app_38_rq_ipmi20, &hf_ipmi_app_38_rq_chan, NULL };
737         static const gint *byte2[] = { &hf_ipmi_app_38_rq_priv, NULL };
738
739         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_app_38_rq_byte1, byte1, TRUE, 0);
740         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_38_rq_byte2, byte2, TRUE, 0);
741 }
742
743 static void
744 rs38(tvbuff_t *tvb, proto_tree *tree)
745 {
746         static const gint *byte1[] = { &hf_ipmi_app_38_rs_chan, NULL };
747         static const gint *byte2[] = { &hf_ipmi_app_38_rs_ipmi20, &hf_ipmi_app_38_rs_auth_oem,
748                 &hf_ipmi_app_38_rs_auth_straight, &hf_ipmi_app_38_rs_auth_md5, &hf_ipmi_app_38_rs_auth_md2,
749                 &hf_ipmi_app_38_rs_auth_none, NULL };
750         static const gint *byte3[] = { &hf_ipmi_app_38_rs_kg, &hf_ipmi_app_38_rs_permsg, &hf_ipmi_app_38_rs_userauth,
751                 &hf_ipmi_app_38_rs_user_nonnull, &hf_ipmi_app_38_rs_user_null, &hf_ipmi_app_38_rs_user_anon, NULL };
752         static const gint *byte4[] = { &hf_ipmi_app_38_rs_ipmi20_conn, &hf_ipmi_app_38_rs_ipmi15_conn, NULL };
753
754         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_app_38_rs_byte1, byte1, TRUE, 0);
755         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL, ett_ipmi_app_38_rs_byte2, byte2, TRUE, BMT_NO_FALSE);
756         proto_tree_add_bitmask_text(tree, tvb, 2, 1, NULL, NULL, ett_ipmi_app_38_rs_byte3, byte3, TRUE, BMT_NO_FALSE);
757         proto_tree_add_bitmask_text(tree, tvb, 3, 1, "Supported connections: ", "None",
758                         ett_ipmi_app_38_rs_byte4, byte4, TRUE, 0);
759         proto_tree_add_item(tree, hf_ipmi_app_38_rs_oem_iana, tvb, 4, 3, TRUE);
760         proto_tree_add_item(tree, hf_ipmi_app_38_rs_oem_aux, tvb, 7, 1, TRUE);
761 }
762
763 /* Get Session Challenge
764  */
765 static void
766 rq39(tvbuff_t *tvb, proto_tree *tree)
767 {
768         static const gint *byte1[] = { &hf_ipmi_app_39_authtype, NULL };
769
770         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
771                         ett_ipmi_app_39_byte1, byte1, TRUE, 0);
772         proto_tree_add_item(tree, hf_ipmi_app_39_user, tvb, 1, 16, TRUE);
773 }
774
775 static void
776 rs39(tvbuff_t *tvb, proto_tree *tree)
777 {
778         proto_tree_add_item(tree, hf_ipmi_app_39_temp_session, tvb, 0, 4, TRUE);
779         proto_tree_add_item(tree, hf_ipmi_app_39_challenge, tvb, 4, 16, TRUE);
780 }
781
782 static const value_string cc39[] = {
783         { 0x81, "Invalid user name" },
784         { 0x82, "Null user name (User 1) not enabled" },
785         { 0, NULL }
786 };
787
788 /* Activate Session
789  */
790 static void
791 rq3a(tvbuff_t *tvb, proto_tree *tree)
792 {
793         static const gint *byte1[] = { &hf_ipmi_app_3a_authtype, NULL };
794         static const gint *byte2[] = { &hf_ipmi_app_3a_privlevel, NULL };
795
796         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
797                         ett_ipmi_app_3a_rq_byte1, byte1, TRUE, 0);
798         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL,
799                         ett_ipmi_app_3a_rq_byte2, byte2, TRUE, 0);
800         proto_tree_add_item(tree, hf_ipmi_app_3a_authcode, tvb, 2, 16, TRUE);
801         proto_tree_add_item(tree, hf_ipmi_app_3a_outbound_seq, tvb, 18, 4, TRUE);
802 }
803
804 static void
805 rs3a(tvbuff_t *tvb, proto_tree *tree)
806 {
807         static const gint *byte1[] = { &hf_ipmi_app_3a_authtype_session, NULL };
808         static const gint *byte10[] = { &hf_ipmi_app_3a_maxpriv_session, NULL };
809
810         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
811                         ett_ipmi_app_3a_rs_byte1, byte1, TRUE, 0);
812         proto_tree_add_item(tree, hf_ipmi_app_3a_session_id, tvb, 1, 4, TRUE);
813         proto_tree_add_item(tree, hf_ipmi_app_3a_inbound_seq, tvb, 5, 4, TRUE);
814         proto_tree_add_bitmask_text(tree, tvb, 9, 1, NULL, NULL,
815                         ett_ipmi_app_3a_rs_byte10, byte10, TRUE, 0);
816 }
817
818 static const value_string cc3a[] = {
819         { 0x81, "No session slot available" },
820         { 0x82, "No slot available for given user" },
821         { 0x83, "No slot available to support user due to maximum privilege capability" },
822         { 0x84, "Session sequence number out-of-range" },
823         { 0x85, "Invalid session ID in request" },
824         { 0x86, "Requested maximum privilege level exceeds user and/or channel privilege limit" },
825         { 0, NULL }
826 };
827
828 /* Set Session Privilege Level
829  */
830 static void
831 rq3b(tvbuff_t *tvb, proto_tree *tree)
832 {
833         static const gint *byte1[] = { &hf_ipmi_app_3b_req_priv, NULL };
834
835         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
836                         ett_ipmi_app_3b_rq_byte1, byte1, TRUE, 0);
837 }
838
839 static void
840 rs3b(tvbuff_t *tvb, proto_tree *tree)
841 {
842         static const gint *byte1[] = { &hf_ipmi_app_3b_new_priv, NULL };
843
844         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
845                         ett_ipmi_app_3b_rs_byte1, byte1, TRUE, 0);
846 }
847
848 static const value_string cc3b[] = {
849         { 0x80, "Requested level not available for this user" },
850         { 0x81, "Requested level exceeds Channel and/or User Privilege Limit" },
851         { 0x82, "Cannot disable User Level authentication" },
852         { 0, NULL }
853 };
854
855 /* Close Session
856  */
857 static void
858 rq3c(tvbuff_t *tvb, proto_tree *tree)
859 {
860         proto_tree_add_item(tree, hf_ipmi_app_3c_session_id, tvb, 0, 4, TRUE);
861         if (tvb_length(tvb) > 4) {
862                 proto_tree_add_item(tree, hf_ipmi_app_3c_session_handle, tvb, 4, 1, TRUE);
863         }
864 }
865
866 static const value_string cc3c[] = {
867         { 0x87, "Invalid Session ID in request" },
868         { 0x88, "Invalid Session Handle in request" },
869         { 0, NULL }
870 };
871
872 static const value_string cc40[] = {
873         { 0x82, "Set not supported on selected channel" },
874         { 0x83, "Access mode not supported" },
875         { 0, NULL }
876 };
877
878 static const value_string cc41[] = {
879         { 0x82, "Command not supported for selected channel" },
880         { 0, NULL }
881 };
882
883 static const value_string cc47[] = {
884         { 0x80, "Password test failed: password data does not match stored value" },
885         { 0x81, "Password test failed: wrong password size was used" },
886         { 0, NULL }
887 };
888
889 static const value_string cc48[] = {
890         { 0x80, "Payload already active on another session" },
891         { 0x81, "Payload type is disabled" },
892         { 0x82, "Payload activation limit reached" },
893         { 0x83, "Cannot activate payload with encryption" },
894         { 0x84, "Cannot activate payload without encryption" },
895         { 0, NULL }
896 };
897
898 static const value_string cc49[] = {
899         { 0x80, "Payload already deactivated" },
900         { 0x81, "Payload type is disabled" },
901         { 0, NULL }
902 };
903
904 static const value_string cc4f[] = {
905         { 0x80, "Payload type not available on given channel" },
906         { 0, NULL }
907 };
908
909 static const value_string cc50[] = {
910         { 0x80, "OEM Payload IANA and/or Payload ID not supported" },
911         { 0, NULL }
912 };
913
914 static const value_string cc52[] = {
915         { 0x81, "Lost Arbitration" },
916         { 0x82, "Bus Error" },
917         { 0x83, "NAK on Write" },
918         { 0x84, "Truncated Read" },
919         { 0, NULL }
920 };
921
922 static const value_string cc55[] = {
923         { 0x80, "Operation not supported for given payload type" },
924         { 0x81, "Operation not allowed under present configuration" },
925         { 0x82, "Encryption not available for session that payload type is active under" },
926         { 0x83, "Payload instance is not presently active" },
927         { 0, NULL }
928 };
929
930 static const value_string cc56[] = {
931         { 0x80, "Cannot perform set/confirm, key is locked" },
932         { 0x81, "Insufficient key bytes" },
933         { 0x82, "Too many key bytes" },
934         { 0x83, "Key value does not meet criteria for specified type" },
935         { 0x84, "KR is not used" },
936         { 0, NULL }
937 };
938
939 static const value_string cc58[] = {
940         { 0x80, "Parameter not supported" },
941         { 0x81, "Attempt to set the set-in-progress when not in set-complete state" },
942         { 0x82, "Attempt to write read-only parameter" },
943         { 0, NULL }
944 };
945
946 static const value_string cc59[] = {
947         { 0x80, "Parameter not supported" },
948         { 0, NULL }
949 };
950
951 static const value_string cc60[] = {
952         { 0x80, "Attempt to enable unsupported/unconfigurable command" },
953         { 0, NULL }
954 };
955
956 static const value_string cc62[] = {
957         { 0x80, "Attempt to enable unsupported/unconfigurable sub-function" },
958         { 0, NULL }
959 };
960
961 static ipmi_cmd_t cmd_app[] = {
962   /* IPM Device Global Commands */
963   { 0x01, NULL, rs01, NULL, NULL, "Get Device ID", CMD_MAYBROADCAST },
964   { 0x02, NULL, NULL, NULL, NULL, "Cold Reset", 0 },
965   { 0x03, NULL, NULL, NULL, NULL, "Warm Reset", 0 },
966   { 0x04, NULL, rs04, NULL, NULL, "Get Self Test Results", 0 },
967   { 0x05, rq05, NULL, NULL, NULL, "Manufacturing Test On", 0 },
968   { 0x06, rq06, NULL, NULL, NULL, "Set ACPI Power State", 0 },
969   { 0x07, NULL, rs07, NULL, NULL, "Get ACPI Power State", 0 },
970   { 0x08, NULL, rs08, NULL, NULL, "Get Device GUID", 0 },
971   { 0x09, IPMI_TBD,   NULL, NULL, "Get NetFn Support", 0 },
972   { 0x0a, IPMI_TBD,   NULL, NULL, "Get Command Support", 0 },
973   { 0x0b, IPMI_TBD,   NULL, NULL, "Get Command Sub-function Support", 0 },
974   { 0x0c, IPMI_TBD,   NULL, NULL, "Get Configurable Commands", 0 },
975   { 0x0d, IPMI_TBD,   NULL, NULL, "Get Configurable Command Sub-functions", 0 },
976
977   /* BMC Watchdog Timer Commands */
978   { 0x22, NULL, NULL, cc22, NULL, "Reset Watchdog Timer", 0 },
979   { 0x24, rq24, NULL, NULL, NULL, "Set Watchdog Timer", 0 },
980   { 0x25, NULL, rs25, NULL, NULL, "Get Watchdog Timer", 0 },
981
982   /* BMC Device and Messaging Commands */
983   { 0x2e, rq2e, NULL, NULL, NULL, "Set BMC Global Enables", 0 },
984   { 0x2f, NULL, rs2f, NULL, NULL, "Get BMC Global Enables", 0 },
985   { 0x30, rq30, NULL, NULL, NULL, "Clear Message Flags", 0 },
986   { 0x31, NULL, rs31, NULL, NULL, "Get Message Flags", 0 },
987   { 0x32, rq32, rs32, NULL, NULL, "Enable Message Channel Receive", 0 },
988   { 0x33, IPMI_TBD,   cc33, NULL, "Get Message", 0 },
989   { 0x34, rq34, rs34, cc34, NULL, "Send Message", CMD_CALLRQ },
990   { 0x35, IPMI_TBD,   cc35, NULL, "Read Event Message Buffer", 0 },
991   { 0x36, IPMI_TBD,   NULL, NULL, "Get BT Interface Capabilities", 0 },
992   { 0x37, IPMI_TBD,   NULL, NULL, "Get System GUID", 0 },
993   { 0x38, rq38, rs38, NULL, NULL, "Get Channel Authentication Capabilities", 0 },
994   { 0x39, rq39, rs39, cc39, NULL, "Get Session Challenge", 0 },
995   { 0x3a, rq3a, rs3a, cc3a, NULL, "Activate Session", 0 },
996   { 0x3b, rq3b, rs3b, cc3b, NULL, "Set Session Privilege Level", 0 },
997   { 0x3c, rq3c, NULL, cc3c, NULL, "Close Session", 0 },
998   { 0x3d, IPMI_TBD,   NULL, NULL, "Get Session Info", 0 },
999   { 0x3f, IPMI_TBD,   NULL, NULL, "Get AuthCode", 0 },
1000   { 0x40, IPMI_TBD,   cc40, NULL, "Set Channel Access", 0 },
1001   { 0x41, IPMI_TBD,   cc41, NULL, "Get Channel Access", 0 },
1002   { 0x42, IPMI_TBD,   NULL, NULL, "Get Channel Info", 0 },
1003   { 0x43, IPMI_TBD,   NULL, NULL, "Set User Access", 0 },
1004   { 0x44, IPMI_TBD,   NULL, NULL, "Get User Access", 0 },
1005   { 0x45, IPMI_TBD,   NULL, NULL, "Set User Name", 0 },
1006   { 0x46, IPMI_TBD,   NULL, NULL, "Get User Name", 0 },
1007   { 0x47, IPMI_TBD,   cc47, NULL, "Set User Password", 0 },
1008   { 0x48, IPMI_TBD,   cc48, NULL, "Activate Payload", 0 },
1009   { 0x49, IPMI_TBD,   cc49, NULL, "Deactivate Payload", 0 },
1010   { 0x4a, IPMI_TBD,   NULL, NULL, "Get Payload Activation Status", 0 },
1011   { 0x4b, IPMI_TBD,   NULL, NULL, "Get Payload Instance Info", 0 },
1012   { 0x4c, IPMI_TBD,   NULL, NULL, "Set User Payload Access", 0 },
1013   { 0x4d, IPMI_TBD,   NULL, NULL, "Get User Payload Access", 0 },
1014   { 0x4e, IPMI_TBD,   NULL, NULL, "Get Channel Payload Support", 0 },
1015   { 0x4f, IPMI_TBD,   cc4f, NULL, "Get Channel Payload Version", 0 },
1016   { 0x50, IPMI_TBD,   cc50, NULL, "Get Channel OEM Payload Info", 0 },
1017   { 0x52, IPMI_TBD,   cc52, NULL, "Master Write-Read", 0 },
1018   { 0x54, IPMI_TBD,   NULL, NULL, "Get Channel Cipher Suites", 0 },
1019   { 0x55, IPMI_TBD,   cc55, NULL, "Suspend/Resume Payload Encryption", 0 },
1020   { 0x56, IPMI_TBD,   cc56, NULL, "Set Channel Security Keys", 0 },
1021   { 0x57, IPMI_TBD,   NULL, NULL, "Get System Interface Capabilities", 0 },
1022   { 0x58, IPMI_TBD,   cc58, NULL, "Set System Info Parameters", 0 },
1023   { 0x59, IPMI_TBD,   cc59, NULL, "Get System Info Parameters", 0 },
1024
1025   /* Device "Global" commands, continued */
1026   { 0x60, IPMI_TBD,   cc60, NULL, "Set Command Enables", 0 },
1027   { 0x61, IPMI_TBD,   NULL, NULL, "Get Command Enables", 0 },
1028   { 0x62, IPMI_TBD,   cc62, NULL, "Set Command Sub-function Enables", 0 },
1029   { 0x63, IPMI_TBD,   NULL, NULL, "Get Command Sub-function Enables", 0 },
1030   { 0x64, IPMI_TBD,   NULL, NULL, "Get OEM NetFn IANA Support", 0 },
1031 };
1032
1033 void
1034 ipmi_register_app(gint proto_ipmi)
1035 {
1036         static hf_register_info hf[] = {
1037                 { &hf_ipmi_app_01_dev_id,
1038                         { "Device ID",
1039                                 "ipmi.app00.dev.id", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL }},
1040                 { &hf_ipmi_app_01_dev_prov_sdr,
1041                         { "Device provides Device SDRs",
1042                                 "ipmi.app00.dev.provides_dev_sdr", FT_BOOLEAN, 8, NULL, 0x80, "", HFILL }},
1043                 { &hf_ipmi_app_01_dev_rev,
1044                         { "Device Revision (binary encoded)",
1045                                 "ipmi.app00.dev.rev", FT_UINT8, BASE_HEX, NULL, 0x0f, "", HFILL }},
1046                 { &hf_ipmi_app_01_dev_avail,
1047                         { "Device availability",
1048                                 "ipmi.app01.dev.avail", FT_BOOLEAN, 8, TFS(&tfs_01_dev_avail), 0x80, "", HFILL }},
1049                 { &hf_ipmi_app_01_fw_rev_maj,
1050                         { "Major Firmware Revision (binary encoded)",
1051                                 "ipmi.app01.fw.major", FT_UINT8, BASE_HEX, NULL, 0x7f, "", HFILL }},
1052                 { &hf_ipmi_app_01_fw_rev_min,
1053                         { "Minor Firmware Revision (BCD encoded)",
1054                                 "ipmi.app01.fw.minor", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL }},
1055                 { &hf_ipmi_app_01_ipmi_version,
1056                         { "IPMI version",
1057                                 "ipmi.app01.ipmi.version", FT_UINT8, BASE_CUSTOM, ipmi_fmt_version, 0, "", HFILL }},
1058                 { &hf_ipmi_app_01_ipmi_ads_chassis,
1059                         { "Chassis",
1060                                 "ipmi.app01.ads.chassis", FT_BOOLEAN, 8, NULL, 0x80, "", HFILL }},
1061                 { &hf_ipmi_app_01_ipmi_ads_bridge,
1062                         { "Bridge",
1063                                 "ipmi.app01.ads.bridge", FT_BOOLEAN, 8, NULL, 0x40, "", HFILL }},
1064                 { &hf_ipmi_app_01_ipmi_ads_ipmb_ev_gen,
1065                         { "Event Generator",
1066                                 "ipmi.app01.ads.ipmb_ev_gen", FT_BOOLEAN, 8, NULL, 0x20, "", HFILL }},
1067                 { &hf_ipmi_app_01_ipmi_ads_ipmb_ev_recv,
1068                         { "Event Receiver",
1069                                 "ipmi.app01.ads.ipmb_ev_recv", FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
1070                 { &hf_ipmi_app_01_ipmi_ads_fru,
1071                         { "FRU Inventory",
1072                                 "ipmi.app01.ads.fru", FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
1073                 { &hf_ipmi_app_01_ipmi_ads_sel,
1074                         { "SEL",
1075                                 "ipmi.app01.ads.sel", FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
1076                 { &hf_ipmi_app_01_ipmi_ads_sdr,
1077                         { "SDR Repository",
1078                                 "ipmi.app01.ads.sdr", FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
1079                 { &hf_ipmi_app_01_ipmi_ads_sensor,
1080                         { "Sensor",
1081                                 "ipmi.app01.ads.sensor", FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
1082                 { &hf_ipmi_app_01_manufacturer,
1083                         { "Manufacturer ID",
1084                                 "ipmi.app01.manufacturer", FT_UINT24, BASE_DEC, NULL, 0, "", HFILL }},
1085                 { &hf_ipmi_app_01_product,
1086                         { "Product ID",
1087                                 "ipmi.app01.product", FT_UINT16, BASE_HEX, NULL, 0, "", HFILL }},
1088                 { &hf_ipmi_app_01_fw_aux,
1089                         { "Auxillary Firmware Revision Information",
1090                                 "ipmi.app01.fw.aux", FT_BYTES, BASE_HEX, NULL, 0, "", HFILL }},
1091
1092                 { &hf_ipmi_app_04_result,
1093                         { "Self test result",
1094                                 "ipmi.app04.self_test_result", FT_UINT8, BASE_HEX, vals_04_result, 0, "", HFILL }},
1095                 { &hf_ipmi_app_04_fail,
1096                         { "Self-test error bitfield",
1097                                 "ipmi.app04.fail", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL }},
1098                 { &hf_ipmi_app_04_fail_sel,
1099                         { "Cannot access SEL device",
1100                                 "ipmi.app04.fail.sel", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x80, "", HFILL }},
1101                 { &hf_ipmi_app_04_fail_sdr,
1102                         { "Cannot access SDR Repository",
1103                                 "ipmi.app04.fail.sdr", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x40, "", HFILL }},
1104                 { &hf_ipmi_app_04_fail_bmc_fru,
1105                         { "Cannot access BMC FRU device",
1106                                 "ipmi.app04.fail.bmc_fru", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x20, "", HFILL }},
1107                 { &hf_ipmi_app_04_fail_ipmb_sig,
1108                         { "IPMB signal lines do not respond",
1109                                 "ipmi.app04.fail.ipmb_sig", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x10, "", HFILL }},
1110                 { &hf_ipmi_app_04_fail_sdr_empty,
1111                         { "SDR Repository is empty",
1112                                 "ipmi.app04.fail.sdr_empty", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x08, "", HFILL }},
1113                 { &hf_ipmi_app_04_fail_iua,
1114                         { "Internal Use Area of BMC FRU corrupted",
1115                                 "ipmi.app04.fail.iua", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x04, "", HFILL }},
1116                 { &hf_ipmi_app_04_fail_bb_fw,
1117                         { "Controller update boot block firmware corrupted",
1118                                 "ipmi.app04.fail.bb_fw", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x02, "", HFILL }},
1119                 { &hf_ipmi_app_04_fail_oper_fw,
1120                         { "Controller operational firmware corrupted",
1121                                 "ipmi.app04.fail.oper_fw", FT_BOOLEAN, 8, TFS(&tfs_04_fail_unknown), 0x01, "", HFILL }},
1122
1123                 { &hf_ipmi_app_05_devspec,
1124                         { "Device-specific parameters",
1125                                 "ipmi.app05.devspec", FT_BYTES, BASE_HEX, NULL, 0, "", HFILL }},
1126
1127                 { &hf_ipmi_app_06_syspwr_set,
1128                         { "System Power State",
1129                                 "ipmi.app06.syspwr.set", FT_BOOLEAN, 8, TFS(&tfs_06_pwr), 0x80, "", HFILL }},
1130                 { &hf_ipmi_app_06_syspwr_enum,
1131                         { "System Power State enumeration",
1132                                 "ipmi.app06.syspwr.enum", FT_UINT8, BASE_HEX, vals_06_syspwr, 0x7f, "", HFILL }},
1133                 { &hf_ipmi_app_06_devpwr_set,
1134                         { "Device Power State",
1135                                 "ipmi.app06.devpwr.set", FT_BOOLEAN, 8, TFS(&tfs_06_pwr), 0x80, "", HFILL }},
1136                 { &hf_ipmi_app_06_devpwr_enum,
1137                         { "Device Power State enumeration",
1138                                 "ipmi.app06.devpwr.enum", FT_UINT8, BASE_HEX, vals_06_devpwr, 0x7f, "", HFILL }},
1139
1140                 { &hf_ipmi_app_07_syspwr_enum,
1141                         { "ACPI System Power State",
1142                                 "ipmi.app07.syspwr", FT_UINT8, BASE_HEX, vals_07_syspwr, 0x7f, "", HFILL }},
1143                 { &hf_ipmi_app_07_devpwr_enum,
1144                         { "ACPI Device Power State",
1145                                 "ipmi.app07.devpwr", FT_UINT8, BASE_HEX, vals_07_devpwr, 0x7f, "", HFILL }},
1146
1147                 { &hf_ipmi_app_08_guid,
1148                         { "GUID",
1149                                 "ipmi.app08.guid", FT_GUID, BASE_HEX, NULL, 0, "", HFILL }},
1150
1151                 { &hf_ipmi_app_24_timer_use_dont_log,
1152                         { "Don't log",
1153                                 "ipmi.app24.timer_use.dont_log", FT_BOOLEAN, 8, NULL, 0x80, "", HFILL }},
1154                 { &hf_ipmi_app_24_timer_use_dont_stop,
1155                         { "Don't stop timer on Set Watchdog command",
1156                                 "ipmi.app24.timer_use.dont_stop", FT_BOOLEAN, 8, NULL, 0x40, "", HFILL }},
1157                 { &hf_ipmi_app_24_timer_use_timer_use,
1158                         { "Timer use",
1159                                 "ipmi.app24.timer_use.timer_use", FT_UINT8, BASE_HEX, vals_24_timer_use, 0x07, "", HFILL }},
1160                 { &hf_ipmi_app_24_timer_action_interrupt,
1161                         { "Pre-timeout interrupt",
1162                                 "ipmi.app24.timer_action.interrupt", FT_UINT8, BASE_HEX, vals_24_timer_action_interrupt, 0x70, "", HFILL }},
1163                 { &hf_ipmi_app_24_timer_action_timeout_action,
1164                         { "Timeout action",
1165                                 "ipmi.app24.timer_action.timeout", FT_UINT8, BASE_HEX, vals_24_timer_action_timeout, 0x07, "", HFILL }},
1166                 { &hf_ipmi_app_24_pretimeout,
1167                         { "Pre-timeout interval",
1168                                 "ipmi.app24.pretimeout", FT_UINT8, BASE_CUSTOM, ipmi_fmt_1s_1based, 0, "", HFILL }},
1169                 { &hf_ipmi_app_24_expiration_flags_oem,
1170                         { "OEM",
1171                                 "ipmi.app24.exp_flags.oem", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x20, "", HFILL }},
1172                 { &hf_ipmi_app_24_expiration_flags_smsos,
1173                         { "SMS/OS",
1174                                 "ipmi.app24.exp_flags.sms_os", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x10, "", HFILL }},
1175                 { &hf_ipmi_app_24_expiration_flags_osload,
1176                         { "OS Load",
1177                                 "ipmi.app24.exp_flags.osload", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x08, "", HFILL }},
1178                 { &hf_ipmi_app_24_expiration_flags_biospost,
1179                         { "BIOS/POST",
1180                                 "ipmi.app24.exp_flags.biospost", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x04, "", HFILL }},
1181                 { &hf_ipmi_app_24_expiration_flags_biosfrb2,
1182                         { "BIOS FRB2",
1183                                 "ipmi.app24.exp_flags.biosfrb2", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x02, "", HFILL }},
1184                 { &hf_ipmi_app_24_initial_countdown,
1185                         { "Initial countdown value (100ms/count)",
1186                                 "ipmi.app24.initial_countdown", FT_UINT16, BASE_DEC, NULL, 0, "", HFILL }},
1187
1188                 { &hf_ipmi_app_25_timer_use_dont_log,
1189                         { "Don't log",
1190                                 "ipmi.app25.timer_use.dont_log", FT_BOOLEAN, 8, NULL, 0x80, "", HFILL }},
1191                 { &hf_ipmi_app_25_timer_use_started,
1192                         { "Started",
1193                                 "ipmi.app25.timer_use.started", FT_BOOLEAN, 8, NULL, 0x40, "", HFILL }},
1194                 { &hf_ipmi_app_25_timer_use_timer_use,
1195                         { "Timer user",
1196                                 "ipmi.app25.timer_use.timer_use", FT_UINT8, BASE_HEX, vals_24_timer_use, 0x07, "", HFILL }},
1197                 { &hf_ipmi_app_25_timer_action_interrupt,
1198                         { "Pre-timeout interrupt",
1199                                 "ipmi.app25.timer_action.interrupt", FT_UINT8, BASE_HEX, vals_24_timer_action_interrupt, 0x70, "", HFILL }},
1200                 { &hf_ipmi_app_25_timer_action_timeout_action,
1201                         { "Timeout action",
1202                                 "ipmi.app25.timer_action.timeout", FT_UINT8, BASE_HEX, vals_24_timer_action_timeout, 0x07, "", HFILL }},
1203                 { &hf_ipmi_app_25_pretimeout,
1204                         { "Pre-timeout interval",
1205                                 "ipmi.app25.pretimeout", FT_UINT8, BASE_CUSTOM, ipmi_fmt_1s_1based, 0, "", HFILL }},
1206                 { &hf_ipmi_app_25_expiration_flags_oem,
1207                         { "OEM",
1208                                 "ipmi.app25.exp_flags.oem", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x20, "", HFILL }},
1209                 { &hf_ipmi_app_25_expiration_flags_smsos,
1210                         { "SMS/OS",
1211                                 "ipmi.app25.exp_flags.sms_os", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x10, "", HFILL }},
1212                 { &hf_ipmi_app_25_expiration_flags_osload,
1213                         { "OS Load",
1214                                 "ipmi.app25.exp_flags.osload", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x08, "", HFILL }},
1215                 { &hf_ipmi_app_25_expiration_flags_biospost,
1216                         { "BIOS/POST",
1217                                 "ipmi.app25.exp_flags.biospost", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x04, "", HFILL }},
1218                 { &hf_ipmi_app_25_expiration_flags_biosfrb2,
1219                         { "BIOS FRB2",
1220                                 "ipmi.app25.exp_flags.biosfrb2", FT_BOOLEAN, 8, TFS(&tfs_24_exp_flags), 0x02, "", HFILL }},
1221                 { &hf_ipmi_app_25_initial_countdown,
1222                         { "Initial countdown value (100ms/count)",
1223                                 "ipmi.app25.initial_countdown", FT_UINT16, BASE_DEC, NULL, 0, "", HFILL }},
1224                 { &hf_ipmi_app_25_present_countdown,
1225                         { "Present countdown value (100ms/count)",
1226                                 "ipmi.app25.initial_countdown", FT_UINT16, BASE_DEC, NULL, 0, "", HFILL }},
1227
1228                 { &hf_ipmi_app_2e_byte1_oem2,
1229                         { "OEM 2",
1230                                 "ipmi.app2e.bmc_global_enables.oem2", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x80, "", HFILL }},
1231                 { &hf_ipmi_app_2e_byte1_oem1,
1232                         { "OEM 1",
1233                                 "ipmi.app2e.bmc_global_enables.oem1", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x40, "", HFILL }},
1234                 { &hf_ipmi_app_2e_byte1_oem0,
1235                         { "OEM 0",
1236                                 "ipmi.app2e.bmc_global_enables.oem0", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x20, "", HFILL }},
1237                 { &hf_ipmi_app_2e_byte1_sel,
1238                         { "System Event Logging",
1239                                 "ipmi.app2e.bmc_global_enables.sel", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x08, "", HFILL }},
1240                 { &hf_ipmi_app_2e_byte1_emb,
1241                         { "Event Message Buffer",
1242                                 "ipmi.app2e.bmc_global_enables.emb", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x04, "", HFILL }},
1243                 { &hf_ipmi_app_2e_byte1_emb_full_intr,
1244                         { "Event Message Buffer Full Interrupt",
1245                                 "ipmi.app2e.bmc_global_enables.emb_full_intr", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x02, "", HFILL }},
1246                 { &hf_ipmi_app_2e_byte1_rmq_intr,
1247                         { "Receive Message Queue Interrupt",
1248                                 "ipmi.app2e.bmc_global_enables.rmq_intr", FT_BOOLEAN, 8, TFS(&tfs_2e_enable), 0x01, "", HFILL }},
1249
1250                 { &hf_ipmi_app_2f_byte1_oem2,
1251                         { "OEM 2",
1252                                 "ipmi.app2f.bmc_global_enables.oem2", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x80, "", HFILL }},
1253                 { &hf_ipmi_app_2f_byte1_oem1,
1254                         { "OEM 1",
1255                                 "ipmi.app2f.bmc_global_enables.oem1", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x40, "", HFILL }},
1256                 { &hf_ipmi_app_2f_byte1_oem0,
1257                         { "OEM 0",
1258                                 "ipmi.app2f.bmc_global_enables.oem0", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x20, "", HFILL }},
1259                 { &hf_ipmi_app_2f_byte1_sel,
1260                         { "System Event Logging",
1261                                 "ipmi.app2f.bmc_global_enables.sel", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x08, "", HFILL }},
1262                 { &hf_ipmi_app_2f_byte1_emb,
1263                         { "Event Message Buffer",
1264                                 "ipmi.app2f.bmc_global_enables.emb", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x04, "", HFILL }},
1265                 { &hf_ipmi_app_2f_byte1_emb_full_intr,
1266                         { "Event Message Buffer Full Interrupt",
1267                                 "ipmi.app2f.bmc_global_enables.emb_full_intr", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x02, "", HFILL }},
1268                 { &hf_ipmi_app_2f_byte1_rmq_intr,
1269                         { "Receive Message Queue Interrupt",
1270                                 "ipmi.app2f.bmc_global_enables.rmq_intr", FT_BOOLEAN, 8, TFS(&tfs_2f_enabled), 0x01, "", HFILL }},
1271
1272                 { &hf_ipmi_app_30_byte1_oem2,
1273                         { "OEM 2",
1274                                 "ipmi.app30.byte1.oem2", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x80, "", HFILL }},
1275                 { &hf_ipmi_app_30_byte1_oem1,
1276                         { "OEM 1",
1277                                 "ipmi.app30.byte1.oem1", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x40, "", HFILL }},
1278                 { &hf_ipmi_app_30_byte1_oem0,
1279                         { "OEM 0",
1280                                 "ipmi.app30.byte1.oem0", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x20, "", HFILL }},
1281                 { &hf_ipmi_app_30_byte1_wd_pretimeout,
1282                         { "Watchdog pre-timeout interrupt flag",
1283                                 "ipmi.app30.byte1.wd_pretimeout", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x08, "", HFILL }},
1284                 { &hf_ipmi_app_30_byte1_emb,
1285                         { "Event Message Buffer",
1286                                 "ipmi.app30.byte1.emb", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x02, "", HFILL }},
1287                 { &hf_ipmi_app_30_byte1_rmq,
1288                         { "Receive Message Queue",
1289                                 "ipmi.app30.byte1.rmq", FT_BOOLEAN, 8, TFS(&tfs_30_clear), 0x01, "", HFILL }},
1290
1291                 { &hf_ipmi_app_31_byte1_oem2,
1292                         { "OEM 2 data available",
1293                                 "ipmi.app31.byte1.oem2", FT_BOOLEAN, 8, NULL, 0x80, "", HFILL }},
1294                 { &hf_ipmi_app_31_byte1_oem1,
1295                         { "OEM 1 data available",
1296                                 "ipmi.app31.byte1.oem1", FT_BOOLEAN, 8, NULL, 0x40, "", HFILL }},
1297                 { &hf_ipmi_app_31_byte1_oem0,
1298                         { "OEM 0 data available",
1299                                 "ipmi.app31.byte1.oem0", FT_BOOLEAN, 8, NULL, 0x20, "", HFILL }},
1300                 { &hf_ipmi_app_31_byte1_wd_pretimeout,
1301                         { "Watchdog pre-timeout interrupt occurred",
1302                                 "ipmi.app31.byte1.wd_pretimeout", FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
1303                 { &hf_ipmi_app_31_byte1_emb,
1304                         { "Event Message Buffer Full",
1305                                 "ipmi.app31.byte1.emb", FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
1306                 { &hf_ipmi_app_31_byte1_rmq,
1307                         { "Receive Message Available",
1308                                 "ipmi.app31.byte1.rmq", FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
1309
1310                 { &hf_ipmi_app_32_rq_chno,
1311                         { "Channel",
1312                                 "ipmi.app32.rq_chno", FT_UINT8, BASE_CUSTOM, ipmi_fmt_channel, 0x0f, "", HFILL }},
1313                 { &hf_ipmi_app_32_rq_state,
1314                         { "Channel State",
1315                                 "ipmi.app32.rq_state", FT_UINT8, BASE_HEX, vals_32_state, 0x03, "", HFILL }},
1316                 { &hf_ipmi_app_32_rs_chno,
1317                         { "Channel",
1318                                 "ipmi.app32.rs_chno", FT_UINT8, BASE_CUSTOM, ipmi_fmt_channel, 0x0f, "", HFILL }},
1319                 { &hf_ipmi_app_32_rs_state,
1320                         { "Channel State",
1321                                 "ipmi.app32.rs_state", FT_BOOLEAN, 8, TFS(&tfs_32_state), 0x01, "", HFILL }},
1322
1323                 { &hf_ipmi_app_34_track,
1324                         { "Tracking",
1325                                 "ipmi.app34.track", FT_UINT8, BASE_HEX, vals_34_track, 0xc0, "", HFILL }},
1326                 { &hf_ipmi_app_34_encrypt,
1327                         { "Encryption required",
1328                                 "ipmi.app34.encrypt", FT_BOOLEAN, 8, NULL, 0x20, "", HFILL }},
1329                 { &hf_ipmi_app_34_auth,
1330                         { "Authentication required",
1331                                 "ipmi.app34.auth", FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
1332                 { &hf_ipmi_app_34_chan,
1333                         { "Channel",
1334                                 "ipmi.app34.chan", FT_UINT8, BASE_CUSTOM, ipmi_fmt_channel, 0x0f, "", HFILL }},
1335
1336                 { &hf_ipmi_app_38_rq_ipmi20,
1337                         { "Version compatibility",
1338                                 "ipmi.app38.rq_ipmi20", FT_UINT8, BASE_DEC, &vals_38_ipmi20, 0x80, "", HFILL }},
1339                 { &hf_ipmi_app_38_rq_chan,
1340                         { "Channel",
1341                                 "ipmi.app38.rq_chan", FT_UINT8, BASE_CUSTOM, ipmi_fmt_channel, 0x0f, "", HFILL }},
1342                 { &hf_ipmi_app_38_rq_priv,
1343                         { "Requested privilege level",
1344                                 "ipmi.app38.rq_priv", FT_UINT8, BASE_HEX, vals_XX_priv, 0x0f, "", HFILL }},
1345                 { &hf_ipmi_app_38_rs_chan,
1346                         { "Channel",
1347                                 "ipmi.app38.rs_chan", FT_UINT8, BASE_CUSTOM, ipmi_fmt_channel, 0x0f, "", HFILL }},
1348                 { &hf_ipmi_app_38_rs_ipmi20,
1349                         { "Version compatibility",
1350                                 "ipmi.app38.rs_ipmi20", FT_UINT8, BASE_DEC, vals_38_ipmi20, 0x80, "", HFILL }},
1351                 { &hf_ipmi_app_38_rs_auth_oem,
1352                         { "OEM Proprietary authentication",
1353                                 "ipmi.app38.rs_auth_oem", FT_BOOLEAN, 8, TFS(&tfs_38_supp), 0x20, "", HFILL }},
1354                 { &hf_ipmi_app_38_rs_auth_straight,
1355                         { "Straight password/key",
1356                                 "ipmi.app38.rs_auth_straight", FT_BOOLEAN, 8, TFS(&tfs_38_supp), 0x10, "", HFILL }},
1357                 { &hf_ipmi_app_38_rs_auth_md5,
1358                         { "MD5",
1359                                 "ipmi.app38.rs_auth_md5", FT_BOOLEAN, 8, TFS(&tfs_38_supp), 0x04, "", HFILL }},
1360                 { &hf_ipmi_app_38_rs_auth_md2,
1361                         { "MD2",
1362                                 "ipmi.app38.rs_auth_md2", FT_BOOLEAN, 8, TFS(&tfs_38_supp), 0x02, "", HFILL }},
1363                 { &hf_ipmi_app_38_rs_auth_none,
1364                         { "No auth",
1365                                 "ipmi.app38.rs_auth_none", FT_BOOLEAN, 8, TFS(&tfs_38_supp), 0x01, "", HFILL }},
1366                 { &hf_ipmi_app_38_rs_kg,
1367                         { "KG",
1368                                 "ipmi.app38.rs_kg_status", FT_BOOLEAN, 8, TFS(&tfs_38_kg), 0x20, "", HFILL }},
1369                 { &hf_ipmi_app_38_rs_permsg,
1370                         { "Per-message Authentication disabled",
1371                                 "ipmi.app38.rs_permsg", FT_BOOLEAN, 8, NULL, 0x10, "", HFILL }},
1372                 { &hf_ipmi_app_38_rs_userauth,
1373                         { "User-level Authentication disabled",
1374                                 "ipmi.app38.rs_userauth", FT_BOOLEAN, 8, NULL, 0x08, "", HFILL }},
1375                 { &hf_ipmi_app_38_rs_user_nonnull,
1376                         { "Non-null usernames enabled",
1377                                 "ipmi.app38.rs_user_nonnull", FT_BOOLEAN, 8, NULL, 0x04, "", HFILL }},
1378                 { &hf_ipmi_app_38_rs_user_null,
1379                         { "Null usernames enabled",
1380                                 "ipmi.app38.rs_user_null", FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
1381                 { &hf_ipmi_app_38_rs_user_anon,
1382                         { "Anonymous login enabled",
1383                                 "ipmi.app38.rs_user_anon", FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
1384                 { &hf_ipmi_app_38_rs_ipmi20_conn,
1385                         { "IPMI v2.0",
1386                                 "ipmi.app38.rs_ipmi20_conn", FT_BOOLEAN, 8, NULL, 0x02, "", HFILL }},
1387                 { &hf_ipmi_app_38_rs_ipmi15_conn,
1388                         { "IPMI v1.5",
1389                                 "ipmi.app38.rs_ipmi15_conn", FT_BOOLEAN, 8, NULL, 0x01, "", HFILL }},
1390                 { &hf_ipmi_app_38_rs_oem_iana,
1391                         { "OEM ID",
1392                                 "ipmi.app38.rs_oem_iana", FT_UINT24, BASE_DEC, NULL, 0, "", HFILL }},
1393                 { &hf_ipmi_app_38_rs_oem_aux,
1394                         { "OEM Auxillary data",
1395                                 "ipmi.app38.rs_oem_aux", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL }},
1396
1397                 { &hf_ipmi_app_39_authtype,
1398                         { "Authentication Type",
1399                                 "ipmi.app39.authtype", FT_UINT8, BASE_HEX, vals_XX_auth, 0x0f, "", HFILL }},
1400                 { &hf_ipmi_app_39_user,
1401                         { "User Name",
1402                                 "ipmi.app39.user", FT_STRING, BASE_NONE, NULL, 0, "", HFILL }},
1403                 { &hf_ipmi_app_39_temp_session,
1404                         { "Temporary Session ID",
1405                                 "ipmi.app39.temp_session", FT_UINT32, BASE_HEX, NULL, 0, "", HFILL }},
1406                 { &hf_ipmi_app_39_challenge,
1407                         { "Challenge",
1408                                 "ipmi.app39.challenge", FT_BYTES, BASE_NONE, NULL, 0, "", HFILL }},
1409
1410                 { &hf_ipmi_app_3a_authtype,
1411                         { "Authentication Type",
1412                                 "ipmi.app3a.authtype", FT_UINT8, BASE_HEX, vals_XX_auth, 0x0f, "", HFILL }},
1413                 { &hf_ipmi_app_3a_privlevel,
1414                         { "Requested Maximum Privilege Level",
1415                                 "ipmi.app3a.privlevel", FT_UINT8, BASE_HEX, vals_XX_priv, 0x0f, "", HFILL }},
1416                 { &hf_ipmi_app_3a_authcode,
1417                         { "Challenge string/Auth Code",
1418                                 "ipmi.app3a.authcode", FT_BYTES, BASE_HEX, NULL, 0, "", HFILL }},
1419                 { &hf_ipmi_app_3a_outbound_seq,
1420                         { "Initial Outbound Sequence Number",
1421                                 "ipmi.app3a.outbound_seq", FT_UINT32, BASE_HEX, NULL, 0, "", HFILL }},
1422                 { &hf_ipmi_app_3a_authtype_session,
1423                         { "Authentication Type for session",
1424                                 "ipmi.app3a.authtype_session", FT_UINT8, BASE_HEX, vals_XX_auth, 0x0f, "", HFILL }},
1425                 { &hf_ipmi_app_3a_session_id,
1426                         { "Session ID",
1427                                 "ipmi.app3a.session_id", FT_UINT32, BASE_HEX, NULL, 0, "", HFILL }},
1428                 { &hf_ipmi_app_3a_inbound_seq,
1429                         { "Initial Inbound Sequence Number",
1430                                 "ipmi.app3a.inbound_seq", FT_UINT32, BASE_HEX, NULL, 0, "", HFILL }},
1431                 { &hf_ipmi_app_3a_maxpriv_session,
1432                         { "Maximum Privilege Level for session",
1433                                 "ipmi.app3a.maxpriv_session", FT_UINT8, BASE_HEX, vals_XX_priv, 0x0f, "", HFILL }},
1434
1435                 { &hf_ipmi_app_3b_req_priv,
1436                         { "Requested Privilege Level",
1437                                 "ipmi.app3b.req_priv", FT_UINT8, BASE_HEX, vals_XX_priv, 0x0f, "", HFILL }},
1438                 { &hf_ipmi_app_3b_new_priv,
1439                         { "New Privilege Level",
1440                                 "ipmi.app3b.new_priv", FT_UINT8, BASE_HEX, vals_XX_priv, 0x0f, "", HFILL }},
1441
1442                 { &hf_ipmi_app_3c_session_id,
1443                         { "Session ID",
1444                                 "ipmi.app3c.session_id", FT_UINT32, BASE_HEX, NULL, 0, "", HFILL }},
1445                 { &hf_ipmi_app_3c_session_handle,
1446                         { "Session handle",
1447                                 "ipmi.app3c.session_handle", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL }},
1448         };
1449         static gint *ett[] = {
1450                 &ett_ipmi_app_01_byte2,
1451                 &ett_ipmi_app_01_byte3,
1452                 &ett_ipmi_app_01_byte6,
1453                 &ett_ipmi_app_04_byte2,
1454                 &ett_ipmi_app_06_syspwr,
1455                 &ett_ipmi_app_06_devpwr,
1456                 &ett_ipmi_app_07_syspwr,
1457                 &ett_ipmi_app_07_devpwr,
1458                 &ett_ipmi_app_24_timer_use,
1459                 &ett_ipmi_app_24_timer_action,
1460                 &ett_ipmi_app_24_expiration_flags,
1461                 &ett_ipmi_app_25_timer_use,
1462                 &ett_ipmi_app_25_timer_action,
1463                 &ett_ipmi_app_25_expiration_flags,
1464                 &ett_ipmi_app_2e_byte1,
1465                 &ett_ipmi_app_2f_byte1,
1466                 &ett_ipmi_app_30_byte1,
1467                 &ett_ipmi_app_31_byte1,
1468                 &ett_ipmi_app_32_rq_byte1,
1469                 &ett_ipmi_app_32_rq_byte2,
1470                 &ett_ipmi_app_32_rs_byte1,
1471                 &ett_ipmi_app_32_rs_byte2,
1472                 &ett_ipmi_app_34_byte1,
1473                 &ett_ipmi_app_34_msg,
1474                 &ett_ipmi_app_38_rq_byte1,
1475                 &ett_ipmi_app_38_rq_byte2,
1476                 &ett_ipmi_app_38_rs_byte1,
1477                 &ett_ipmi_app_38_rs_byte2,
1478                 &ett_ipmi_app_38_rs_byte3,
1479                 &ett_ipmi_app_38_rs_byte4,
1480                 &ett_ipmi_app_39_byte1,
1481                 &ett_ipmi_app_3a_rq_byte1,
1482                 &ett_ipmi_app_3a_rq_byte2,
1483                 &ett_ipmi_app_3a_rs_byte1,
1484                 &ett_ipmi_app_3a_rs_byte10,
1485                 &ett_ipmi_app_3b_rq_byte1,
1486                 &ett_ipmi_app_3b_rs_byte1,
1487         };
1488
1489         proto_register_field_array(proto_ipmi, hf, array_length(hf));
1490         proto_register_subtree_array(ett, array_length(ett));
1491         ipmi_register_netfn_cmdtab(IPMI_APP_REQ, IPMI_OEM_NONE, NULL, 0, NULL,
1492                         cmd_app, array_length(cmd_app));
1493 }