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