GSM A DTAP: add UMTS EVS to supported codecs list IE
[metze/wireshark/wip.git] / epan / dissectors / packet-ipmi-picmg.c
1 /* packet-ipmi-picmg.c
2  * Sub-dissectors for IPMI messages (netFn=Group, defining body = PICMG)
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 #include <epan/packet.h>
15
16 #include "packet-ipmi.h"
17
18 void proto_register_ipmi_picmg(void);
19
20 static gint ett_ipmi_picmg_led_color = -1;
21 static gint ett_ipmi_picmg_05_byte1 = -1;
22 static gint ett_ipmi_picmg_06_byte1 = -1;
23 static gint ett_ipmi_picmg_06_byte2 = -1;
24 static gint ett_ipmi_picmg_06_byte3 = -1;
25 static gint ett_ipmi_picmg_link_info = -1;
26 static gint ett_ipmi_picmg_08_byte1 = -1;
27 static gint ett_ipmi_picmg_09_ipmba = -1;
28 static gint ett_ipmi_picmg_09_ipmbb = -1;
29 static gint ett_ipmi_picmg_0a_byte2 = -1;
30 static gint ett_ipmi_picmg_0a_byte3 = -1;
31 static gint ett_ipmi_picmg_0b_byte1 = -1;
32 static gint ett_ipmi_picmg_0f_chan = -1;
33 static gint ett_ipmi_picmg_12_byte1 = -1;
34 static gint ett_ipmi_picmg_14_prop = -1;
35 static gint ett_ipmi_picmg_1e_byte1 = -1;
36 static gint ett_ipmi_picmg_21_byte9 = -1;
37 static gint ett_ipmi_picmg_XX_compbits = -1;
38 static gint ett_ipmi_picmg_2e_byte2 = -1;
39 static gint ett_ipmi_picmg_prop00_byte1 = -1;
40 static gint ett_ipmi_picmg_prop01_byte1 = -1;
41 static gint ett_ipmi_picmg_34_byte3 = -1;
42 static gint ett_ipmi_picmg_36_byte2 = -1;
43 static gint ett_ipmi_picmg_37_byte2 = -1;
44 static gint ett_ipmi_picmg_link_state = -1;
45 static gint ett_ipmi_picmg_link_dev = -1;
46
47 static gint ett_ipmi_picmg_clock_setting = -1;
48 static gint ett_ipmi_picmg_clock_res = -1;
49
50 static gint ett_ipmi_picmg_hpm_caps = -1;
51
52 static gint ett_ipmi_picmg_47_byte1 = -1;
53
54 static gint ett_ipmi_picmg_23_rq_byte2 = -1;
55 static gint ett_ipmi_picmg_23_rs_byte5 = -1;
56 static gint ett_ipmi_picmg_25_rs_byte4 = -1;
57 static gint ett_ipmi_picmg_25_rs_byte5 = -1;
58 static gint ett_ipmi_picmg_27_rs_byte3 = -1;
59 static gint ett_ipmi_picmg_28_rq_byte3 = -1;
60 static gint ett_ipmi_picmg_29_rs_byte3 = -1;
61
62 static gint hf_ipmi_picmg_led_function = -1;
63 static gint hf_ipmi_picmg_led_on_duration = -1;
64 static gint hf_ipmi_picmg_led_color = -1;
65
66 static gint hf_ipmi_picmg_linkinfo_grpid = -1;
67 static gint hf_ipmi_picmg_linkinfo_type_ext = -1;
68 static gint hf_ipmi_picmg_linkinfo_type = -1;
69 static gint hf_ipmi_picmg_linkinfo_ports = -1;
70 static gint hf_ipmi_picmg_linkinfo_iface = -1;
71 static gint hf_ipmi_picmg_linkinfo_chan = -1;
72 static gint hf_ipmi_picmg_linkinfo_state = -1;
73 static gint hf_ipmi_picmg_linkinfo = -1;
74 static gint hf_ipmi_picmg_linkinfo_amc_chan = -1;
75 static gint hf_ipmi_picmg_linkinfo_amc_ports = -1;
76 static gint hf_ipmi_picmg_linkinfo_amc_type = -1;
77 static gint hf_ipmi_picmg_linkinfo_amc_type_ext = -1;
78 static gint hf_ipmi_picmg_linkinfo_amc_grpid = -1;
79 static gint hf_ipmi_picmg_linkinfo_state_0 = -1;
80 static gint hf_ipmi_picmg_linkinfo_state_1 = -1;
81 static gint hf_ipmi_picmg_linkinfo_dev = -1;
82 static gint hf_ipmi_picmg_linkinfo_dev_type = -1;
83 static gint hf_ipmi_picmg_linkinfo_dev_id = -1;
84
85 static gint hf_ipmi_picmg_clock_id = -1;
86 static gint hf_ipmi_picmg_clock_cfg = -1;
87 static gint hf_ipmi_picmg_clock_setting = -1;
88 static gint hf_ipmi_picmg_clock_state = -1;
89 static gint hf_ipmi_picmg_clock_dir = -1;
90 static gint hf_ipmi_picmg_clock_pll = -1;
91 static gint hf_ipmi_picmg_clock_family = -1;
92 static gint hf_ipmi_picmg_clock_accuracy = -1;
93 static gint hf_ipmi_picmg_clock_frequency = -1;
94 static gint hf_ipmi_picmg_clock_resource = -1;
95 static gint hf_ipmi_picmg_clock_resource_type = -1;
96 static gint hf_ipmi_picmg_clock_resource_dev = -1;
97
98 static gint hf_ipmi_picmg_00_version = -1;
99 static gint hf_ipmi_picmg_00_max_fruid = -1;
100 static gint hf_ipmi_picmg_00_ipmc_fruid = -1;
101
102 static gint hf_ipmi_picmg_01_rq_fruid = -1;
103 static gint hf_ipmi_picmg_01_rq_addr_key_type = -1;
104 static gint hf_ipmi_picmg_01_rq_addr_key = -1;
105 static gint hf_ipmi_picmg_01_rq_site_type = -1;
106 static gint hf_ipmi_picmg_01_rs_hwaddr = -1;
107 static gint hf_ipmi_picmg_01_rs_ipmbaddr = -1;
108 static gint hf_ipmi_picmg_01_rs_rsrv = -1;
109 static gint hf_ipmi_picmg_01_rs_fruid = -1;
110 static gint hf_ipmi_picmg_01_rs_site_num = -1;
111 static gint hf_ipmi_picmg_01_rs_site_type = -1;
112
113 static gint hf_ipmi_picmg_02_shelf_address = -1;
114 static gint hf_ipmi_picmg_02_shelf_type = -1;
115 static gint hf_ipmi_picmg_02_shelf_length = -1;
116
117 static gint hf_ipmi_picmg_03_shelf_address = -1;
118 static gint hf_ipmi_picmg_03_shelf_type = -1;
119 static gint hf_ipmi_picmg_03_shelf_length = -1;
120
121 static gint hf_ipmi_picmg_04_fruid = -1;
122 static gint hf_ipmi_picmg_04_cmd = -1;
123
124 static gint hf_ipmi_picmg_05_fruid = -1;
125 static gint hf_ipmi_picmg_05_led3 = -1;
126 static gint hf_ipmi_picmg_05_led2 = -1;
127 static gint hf_ipmi_picmg_05_led1 = -1;
128 static gint hf_ipmi_picmg_05_blue_led = -1;
129 static gint hf_ipmi_picmg_05_app_leds = -1;
130
131 static gint hf_ipmi_picmg_06_fruid = -1;
132 static gint hf_ipmi_picmg_06_ledid = -1;
133 static gint hf_ipmi_picmg_06_cap_white = -1;
134 static gint hf_ipmi_picmg_06_cap_orange = -1;
135 static gint hf_ipmi_picmg_06_cap_amber = -1;
136 static gint hf_ipmi_picmg_06_cap_green = -1;
137 static gint hf_ipmi_picmg_06_cap_red = -1;
138 static gint hf_ipmi_picmg_06_cap_blue = -1;
139 static gint hf_ipmi_picmg_06_default_local_color = -1;
140 static gint hf_ipmi_picmg_06_default_override_color = -1;
141
142 static gint hf_ipmi_picmg_07_fruid = -1;
143 static gint hf_ipmi_picmg_07_ledid = -1;
144
145 static gint hf_ipmi_picmg_08_fruid = -1;
146 static gint hf_ipmi_picmg_08_ledid = -1;
147 static gint hf_ipmi_picmg_08_state_lamptest = -1;
148 static gint hf_ipmi_picmg_08_state_override = -1;
149 static gint hf_ipmi_picmg_08_state_local = -1;
150 static gint hf_ipmi_picmg_08_lamptest_duration = -1;
151
152 static gint hf_ipmi_picmg_09_ipmba = -1;
153 static gint hf_ipmi_picmg_09_ipmba_link = -1;
154 static gint hf_ipmi_picmg_09_ipmba_state = -1;
155 static gint hf_ipmi_picmg_09_ipmbb = -1;
156 static gint hf_ipmi_picmg_09_ipmbb_link = -1;
157 static gint hf_ipmi_picmg_09_ipmbb_state = -1;
158
159 static gint hf_ipmi_picmg_0a_fruid = -1;
160 static gint hf_ipmi_picmg_0a_msk_d_locked = -1;
161 static gint hf_ipmi_picmg_0a_msk_locked = -1;
162 static gint hf_ipmi_picmg_0a_d_locked = -1;
163 static gint hf_ipmi_picmg_0a_locked = -1;
164
165 static gint hf_ipmi_picmg_0b_fruid = -1;
166 static gint hf_ipmi_picmg_0b_d_locked = -1;
167 static gint hf_ipmi_picmg_0b_locked = -1;
168
169 static gint hf_ipmi_picmg_0c_fruid = -1;
170 static gint hf_ipmi_picmg_0c_cmd = -1;
171
172 static gint hf_ipmi_picmg_0d_fruid = -1;
173 static gint hf_ipmi_picmg_0d_start = -1;
174 static gint hf_ipmi_picmg_0d_recordid = -1;
175
176 static gint hf_ipmi_picmg_0f_iface = -1;
177 static gint hf_ipmi_picmg_0f_chan = -1;
178
179 static gint hf_ipmi_picmg_10_fruid = -1;
180 static gint hf_ipmi_picmg_10_nslots = -1;
181 static gint hf_ipmi_picmg_10_ipmc_loc = -1;
182
183 static gint hf_ipmi_picmg_11_fruid = -1;
184 static gint hf_ipmi_picmg_11_power_level = -1;
185 static gint hf_ipmi_picmg_11_set_to_desired = -1;
186
187 static gint hf_ipmi_picmg_12_fruid = -1;
188 static gint hf_ipmi_picmg_12_pwr_type = -1;
189 static gint hf_ipmi_picmg_12_dynamic = -1;
190 static gint hf_ipmi_picmg_12_pwr_lvl = -1;
191 static gint hf_ipmi_picmg_12_delay = -1;
192 static gint hf_ipmi_picmg_12_pwr_mult = -1;
193 static gint hf_ipmi_picmg_12_pwr_draw = -1;
194
195 static gint hf_ipmi_picmg_13_fruid = -1;
196
197 static gint hf_ipmi_picmg_14_fruid = -1;
198 static gint hf_ipmi_picmg_14_speed_min = -1;
199 static gint hf_ipmi_picmg_14_speed_max = -1;
200 static gint hf_ipmi_picmg_14_speed_norm = -1;
201 static gint hf_ipmi_picmg_14_local_control = -1;
202
203 static gint hf_ipmi_picmg_15_fruid = -1;
204 static gint hf_ipmi_picmg_15_fan_level = -1;
205 static gint hf_ipmi_picmg_15_local_enable = -1;
206
207 static gint hf_ipmi_picmg_16_fruid = -1;
208 static gint hf_ipmi_picmg_16_override_level = -1;
209 static gint hf_ipmi_picmg_16_local_level = -1;
210 static gint hf_ipmi_picmg_16_local_enable = -1;
211
212 static gint hf_ipmi_picmg_17_cmd = -1;
213 static gint hf_ipmi_picmg_17_resid = -1;
214 static gint hf_ipmi_picmg_17_status = -1;
215
216 static gint hf_ipmi_picmg_18_li_key_type = -1;
217 static gint hf_ipmi_picmg_18_li_key = -1;
218 static gint hf_ipmi_picmg_18_link_num = -1;
219 static gint hf_ipmi_picmg_18_sensor_num = -1;
220
221 static gint hf_ipmi_picmg_1a_flags = -1;
222
223 static gint hf_ipmi_picmg_1b_addr_active = -1;
224 static gint hf_ipmi_picmg_1b_addr_backup = -1;
225
226 static gint hf_ipmi_picmg_1c_fan_site_number = -1;
227 static gint hf_ipmi_picmg_1c_fan_enable_state = -1;
228 static gint hf_ipmi_picmg_1c_fan_policy_timeout = -1;
229 static gint hf_ipmi_picmg_1c_site_number = -1;
230 static gint hf_ipmi_picmg_1c_site_type = -1;
231
232 static gint hf_ipmi_picmg_1d_fan_site_number = -1;
233 static gint hf_ipmi_picmg_1d_site_number = -1;
234 static gint hf_ipmi_picmg_1d_site_type = -1;
235 static gint hf_ipmi_picmg_1d_policy = -1;
236 static gint hf_ipmi_picmg_1d_coverage = -1;
237
238 static gint hf_ipmi_picmg_1e_fruid = -1;
239 static gint hf_ipmi_picmg_1e_cap_diagintr = -1;
240 static gint hf_ipmi_picmg_1e_cap_graceful_reboot = -1;
241 static gint hf_ipmi_picmg_1e_cap_warm_reset = -1;
242
243 static gint hf_ipmi_picmg_1f_rq_fruid = -1;
244 static gint hf_ipmi_picmg_1f_rq_op = -1;
245 static gint hf_ipmi_picmg_1f_rq_lockid = -1;
246 static gint hf_ipmi_picmg_1f_rs_lockid = -1;
247 static gint hf_ipmi_picmg_1f_rs_tstamp = -1;
248
249 static gint hf_ipmi_picmg_20_fruid = -1;
250 static gint hf_ipmi_picmg_20_lockid = -1;
251 static gint hf_ipmi_picmg_20_offset = -1;
252 static gint hf_ipmi_picmg_20_data = -1;
253 static gint hf_ipmi_picmg_20_count = -1;
254
255 static gint hf_ipmi_picmg_21_addr_num = -1;
256 static gint hf_ipmi_picmg_21_tstamp = -1;
257 static gint hf_ipmi_picmg_21_addr_count = -1;
258 static gint hf_ipmi_picmg_21_site_type = -1;
259 static gint hf_ipmi_picmg_21_site_num = -1;
260 static gint hf_ipmi_picmg_21_max_unavail = -1;
261 static gint hf_ipmi_picmg_21_is_shm = -1;
262 static gint hf_ipmi_picmg_21_addr_type = -1;
263 static gint hf_ipmi_picmg_21_ipaddr = -1;
264 static gint hf_ipmi_picmg_21_rmcpport = -1;
265
266 static gint hf_ipmi_picmg_22_feed_idx = -1;
267 static gint hf_ipmi_picmg_22_update_cnt = -1;
268 static gint hf_ipmi_picmg_22_pwr_alloc = -1;
269
270 static gint hf_ipmi_picmg_XX_comp7 = -1;
271 static gint hf_ipmi_picmg_XX_comp6 = -1;
272 static gint hf_ipmi_picmg_XX_comp5 = -1;
273 static gint hf_ipmi_picmg_XX_comp4 = -1;
274 static gint hf_ipmi_picmg_XX_comp3 = -1;
275 static gint hf_ipmi_picmg_XX_comp2 = -1;
276 static gint hf_ipmi_picmg_XX_comp1 = -1;
277 static gint hf_ipmi_picmg_XX_comp0 = -1;
278
279 static gint hf_ipmi_picmg_2e_version = -1;
280 static gint hf_ipmi_picmg_2e_upgrade_undesirable = -1;
281 static gint hf_ipmi_picmg_2e_auto_rollback_override = -1;
282 static gint hf_ipmi_picmg_2e_ipmc_degraded = -1;
283 static gint hf_ipmi_picmg_2e_deferred_activate = -1;
284 static gint hf_ipmi_picmg_2e_services_affected = -1;
285 static gint hf_ipmi_picmg_2e_manual_rollback = -1;
286 static gint hf_ipmi_picmg_2e_auto_rollback = -1;
287 static gint hf_ipmi_picmg_2e_self_test = -1;
288 static gint hf_ipmi_picmg_2e_upgrade_tout = -1;
289 static gint hf_ipmi_picmg_2e_selftest_tout = -1;
290 static gint hf_ipmi_picmg_2e_rollback_tout = -1;
291 static gint hf_ipmi_picmg_2e_inaccessibility_tout = -1;
292
293 static gint hf_ipmi_picmg_prop00_cold_reset = -1;
294 static gint hf_ipmi_picmg_prop00_deferred_activation = -1;
295 static gint hf_ipmi_picmg_prop00_comparison = -1;
296 static gint hf_ipmi_picmg_prop00_preparation = -1;
297 static gint hf_ipmi_picmg_prop00_rollback = -1;
298 static gint hf_ipmi_picmg_prop01_fw_major = -1;
299 static gint hf_ipmi_picmg_prop01_fw_minor = -1;
300 static gint hf_ipmi_picmg_prop01_fw_aux = -1;
301 static gint hf_ipmi_picmg_prop02_desc = -1;
302
303 static gint hf_ipmi_picmg_2f_comp_id = -1;
304 static gint hf_ipmi_picmg_2f_comp_prop = -1;
305 static gint hf_ipmi_picmg_2f_prop_data = -1;
306
307 static gint hf_ipmi_picmg_31_action = -1;
308
309 static gint hf_ipmi_picmg_32_block = -1;
310 static gint hf_ipmi_picmg_32_data = -1;
311 static gint hf_ipmi_picmg_32_sec_offs = -1;
312 static gint hf_ipmi_picmg_32_sec_len = -1;
313
314 static gint hf_ipmi_picmg_33_comp_id = -1;
315 static gint hf_ipmi_picmg_33_img_len = -1;
316
317 static gint hf_ipmi_picmg_34_cmd = -1;
318 static gint hf_ipmi_picmg_34_ccode = -1;
319 static gint hf_ipmi_picmg_34_percentage = -1;
320
321 static gint hf_ipmi_picmg_35_rollback_override = -1;
322
323 static gint hf_ipmi_picmg_36_result = -1;
324 static gint hf_ipmi_picmg_36_fail = -1;
325 static gint hf_ipmi_picmg_36_fail_sel = -1;
326 static gint hf_ipmi_picmg_36_fail_sdr = -1;
327 static gint hf_ipmi_picmg_36_fail_bmc_fru = -1;
328 static gint hf_ipmi_picmg_36_fail_ipmb_sig = -1;
329 static gint hf_ipmi_picmg_36_fail_sdr_empty = -1;
330 static gint hf_ipmi_picmg_36_fail_iua = -1;
331 static gint hf_ipmi_picmg_36_fail_bb_fw = -1;
332 static gint hf_ipmi_picmg_36_fail_oper_fw = -1;
333
334 static gint hf_ipmi_picmg_37_percent = -1;
335
336 static gint hf_ipmi_picmg_hpm_id = -1;
337 static gint hf_ipmi_picmg_hpm_rev = -1;
338 static gint hf_ipmi_picmg_hpm2_mask = -1;
339 static gint hf_ipmi_picmg_hpm2_caps = -1;
340 static gint hf_ipmi_picmg_hpm2_dyn_ssn = -1;
341 static gint hf_ipmi_picmg_hpm2_ver_chg = -1;
342 static gint hf_ipmi_picmg_hpm2_ext_mgt = -1;
343 static gint hf_ipmi_picmg_hpm2_pkt_trc = -1;
344 static gint hf_ipmi_picmg_hpm2_sol_ext = -1;
345 static gint hf_ipmi_picmg_hpm_oem_start = -1;
346 static gint hf_ipmi_picmg_hpm_oem_rev = -1;
347 static gint hf_ipmi_picmg_hpm2_sol_oem_start = -1;
348 static gint hf_ipmi_picmg_hpm2_sol_oem_rev = -1;
349 static gint hf_ipmi_picmg_hpm_cred_hnd = -1;
350 static gint hf_ipmi_picmg_hpm_func_sel = -1;
351 static gint hf_ipmi_picmg_hpm_ipmi_rev = -1;
352 static gint hf_ipmi_picmg_hpm_cipher_id = -1;
353 static gint hf_ipmi_picmg_hpm_auth_type = -1;
354 static gint hf_ipmi_picmg_hpm_priv_level = -1;
355 static gint hf_ipmi_picmg_hpm_chn_num = -1;
356 static gint hf_ipmi_picmg_hpm_avail_time = -1;
357 static gint hf_ipmi_picmg_hpm_user_name = -1;
358 static gint hf_ipmi_picmg_hpm_user_pwd = -1;
359 static gint hf_ipmi_picmg_hpm_bmc_key = -1;
360 static gint hf_ipmi_picmg_hpm_operation = -1;
361 static gint hf_ipmi_picmg_hpm_ssn_hnd = -1;
362
363 static gint hf_ipmi_picmg_hpm_power_draw = -1;
364 static gint hf_ipmi_picmg_hpm_base_channels = -1;
365 static gint hf_ipmi_picmg_hpm_fabric_channels = -1;
366 static gint hf_ipmi_picmg_hpm_update_channels = -1;
367 static gint hf_ipmi_picmg_hpm_cross_channels = -1;
368 static gint hf_ipmi_picmg_hpm_num_chn_desc = -1;
369 static gint hf_ipmi_picmg_hpm_chn_mask = -1;
370
371 static gint hf_ipmi_picmg_hpm_ext_mgmt_state = -1;
372 static gint hf_ipmi_picmg_hpm_polling_period = -1;
373 static gint hf_ipmi_picmg_hpm_auth_pwr_state = -1;
374 static gint hf_ipmi_picmg_hpm_amc_pwr_state = -1;
375
376 static gint hf_ipmi_picmg47_port = -1;
377 static gint hf_ipmi_picmg47_flags = -1;
378 static gint hf_ipmi_picmg47_assignment = -1;
379 static gint hf_ipmi_picmg47_state = -1;
380 static gint hf_ipmi_picmg47_instance = -1;
381
382 static gint hf_ipmi_picmg48_sub_fru_type = -1;
383 static gint hf_ipmi_picmg48_sub_fru_id = -1;
384 static gint hf_ipmi_picmg48_ip_source = -1;
385
386 static gint hf_ipmi_picmg_23_rq_byte2 = -1;
387 static gint hf_ipmi_picmg_23_slot_sel = -1;
388 static gint hf_ipmi_picmg_23_carrier_num = -1;
389 static gint hf_ipmi_picmg_23_slot_num = -1;
390 static gint hf_ipmi_picmg_23_tier_num = -1;
391 static gint hf_ipmi_picmg_23_rs_byte5 = -1;
392 static gint hf_ipmi_picmg_23_slot_base = -1;
393 static gint hf_ipmi_picmg_23_tier_base = -1;
394 static gint hf_ipmi_picmg_23_orientation = -1;
395 static gint hf_ipmi_picmg_23_origin_x = -1;
396 static gint hf_ipmi_picmg_23_origin_y = -1;
397
398 static gint hf_ipmi_picmg_24_channel = -1;
399 static gint hf_ipmi_picmg_24_control = -1;
400 static gint hf_ipmi_picmg_24_current = -1;
401 static gint hf_ipmi_picmg_24_primary_pm = -1;
402 static gint hf_ipmi_picmg_24_backup_pm = -1;
403
404 static gint hf_ipmi_picmg_25_start = -1;
405 static gint hf_ipmi_picmg_25_count = -1;
406 static gint hf_ipmi_picmg_25_max = -1;
407 static gint hf_ipmi_picmg_25_gstatus = -1;
408 static gint hf_ipmi_picmg_25_fault = -1;
409 static gint hf_ipmi_picmg_25_pwr_good = -1;
410 static gint hf_ipmi_picmg_25_mp_good = -1;
411 static gint hf_ipmi_picmg_25_role = -1;
412 static gint hf_ipmi_picmg_25_cstatus = -1;
413 static gint hf_ipmi_picmg_25_pwr_on = -1;
414 static gint hf_ipmi_picmg_25_pwr_ovr = -1;
415 static gint hf_ipmi_picmg_25_pwr = -1;
416 static gint hf_ipmi_picmg_25_enable = -1;
417 static gint hf_ipmi_picmg_25_mp_ovr = -1;
418 static gint hf_ipmi_picmg_25_mp = -1;
419 static gint hf_ipmi_picmg_25_ps1 = -1;
420
421 static gint hf_ipmi_picmg_26_pm_site = -1;
422 static gint hf_ipmi_picmg_27_rs_byte3 = -1;
423 static gint hf_ipmi_picmg_27_pm_healthy = -1;
424 static gint hf_ipmi_picmg_28_timeout = -1;
425 static gint hf_ipmi_picmg_28_rq_byte3 = -1;
426 static gint hf_ipmi_picmg_28_mch2 = -1;
427 static gint hf_ipmi_picmg_28_mch1 = -1;
428
429 static gint hf_ipmi_picmg_29_rs_byte3 = -1;
430 static gint hf_ipmi_picmg_29_maj_rst = -1;
431 static gint hf_ipmi_picmg_29_min_rst = -1;
432 static gint hf_ipmi_picmg_29_alarm_cut = -1;
433 static gint hf_ipmi_picmg_29_test_mode = -1;
434 static gint hf_ipmi_picmg_29_pwr_alarm = -1;
435 static gint hf_ipmi_picmg_29_minor_alarm = -1;
436 static gint hf_ipmi_picmg_29_major_alarm = -1;
437 static gint hf_ipmi_picmg_29_crit_alarm = -1;
438
439 static gint hf_ipmi_picmg_2a_alarm_id = -1;
440 static gint hf_ipmi_picmg_2a_alarm_ctrl = -1;
441
442 static gint hf_ipmi_picmg_2b_alarm_state = -1;
443
444 static const value_string site_type_vals[] = {
445         { 0x00, "PICMG board" },
446         { 0x01, "Power Entry" },
447         { 0x02, "Shelf FRU Information" },
448         { 0x03, "Dedicated ShMC" },
449         { 0x04, "Fan Tray / Cooling Unit" },
450         { 0x05, "Fan Filter Tray" },
451         { 0x06, "Alarm" },
452         { 0x07, "AdvancedMC module" },
453         { 0x08, "PMC" },
454         { 0x09, "Rear Transition Module" },
455         { 0x0A, "MicroTCA Carrier Hub" },
456         { 0x0B, "Power Module" },
457         { 0xC0, "OEM" },
458         { 0xC1, "OEM" },
459         { 0xC2, "OEM" },
460         { 0xC3, "OEM" },
461         { 0xC4, "OEM" },
462         { 0xC5, "OEM" },
463         { 0xC6, "OEM" },
464         { 0xC7, "OEM" },
465         { 0xC8, "OEM" },
466         { 0xC9, "OEM" },
467         { 0xCA, "OEM" },
468         { 0xCB, "OEM" },
469         { 0xCC, "OEM" },
470         { 0xCD, "OEM" },
471         { 0xCE, "OEM" },
472         { 0xCF, "OEM" },
473         { 0, NULL }
474 };
475
476 static const value_string addr_key_type_vals[] = {
477         { 0x00, "Hardware Address" },
478         { 0x01, "IPMB-0 Address" },
479         { 0x03, "Physical Address" },
480         { 0, NULL }
481 };
482
483 static const struct true_false_string set_clear_tfs = {
484         "Set", "Clear"
485 };
486
487 static const value_string led_color_vals[] = {
488         { 0x00, "Reserved (Control not supported)" },
489         { 0x01, "Blue" },
490         { 0x02, "Red" },
491         { 0x03, "Green" },
492         { 0x04, "Amber" },
493         { 0x05, "Orange" },
494         { 0x06, "White" },
495         { 0x0E, "Do not change" },
496         { 0x0F, "Use default" },
497         { 0, NULL }
498 };
499
500 static const value_string linkinfo_type_vals[] = {
501         { 0x01, "PICMG3.0 Base Interface 10/100/1000 BASE-T" },
502         { 0x02, "PICMG3.1 Ethernet Fabric Interface" },
503         { 0x03, "PICMG3.2 Infiniband Fabric Interface" },
504         { 0x04, "PICMG3.3 StarFabric Fabric Interface" },
505         { 0x05, "PICMG3.4 PCI Express Fabric Interface" },
506         { 0xf0, "OEM" }, { 0xf1, "OEM" }, { 0xf2, "OEM" }, { 0xf3, "OEM" },
507         { 0xf4, "OEM" }, { 0xf5, "OEM" }, { 0xf6, "OEM" }, { 0xf7, "OEM" },
508         { 0xf8, "OEM" }, { 0xf9, "OEM" }, { 0xfa, "OEM" }, { 0xfb, "OEM" },
509         { 0xfc, "OEM" }, { 0xfd, "OEM" }, { 0xfe, "OEM" },
510
511         { 0, NULL }
512 };
513
514 static const value_string linkinfo_amc_type_vals[] = {
515         { 0x02, "AMC.1 PCI Express" },
516         { 0x03, "AMC.1 PCI Express Advanced Switching" },
517         { 0x04, "AMC.1 PCI Express Advanced Switching" },
518         { 0x05, "AMC.2 Ethernet" },
519         { 0x06, "AMC.3 Serial RapidIO" },
520         { 0x07, "AMC.3 Storage" },
521         { 0xf0, "OEM" }, { 0xf1, "OEM" }, { 0xf2, "OEM" }, { 0xf3, "OEM" },
522         { 0xf4, "OEM" }, { 0xf5, "OEM" }, { 0xf6, "OEM" }, { 0xf7, "OEM" },
523         { 0xf8, "OEM" }, { 0xf9, "OEM" }, { 0xfa, "OEM" }, { 0xfb, "OEM" },
524         { 0xfc, "OEM" }, { 0xfd, "OEM" }, { 0xfe, "OEM" },
525
526         { 0, NULL }
527 };
528
529 static const value_string linkinfo_ports_vals[] = {
530         { 0x00, "None" },
531         { 0x01, "0" },
532         { 0x02, "1" },
533         { 0x03, "0,1" },
534         { 0x04, "2" },
535         { 0x05, "0,2" },
536         { 0x06, "1,2" },
537         { 0x07, "0,1,2" },
538         { 0x08, "3" },
539         { 0x09, "0,3" },
540         { 0x0a, "1,3" },
541         { 0x0b, "0,1,3" },
542         { 0x0c, "2,3" },
543         { 0x0d, "0,2,3" },
544         { 0x0e, "1,2,3" },
545         { 0x0f, "0,1,2,3" },
546
547         { 0, NULL }
548 };
549
550 static const value_string linkinfo_iface_vals[] = {
551         { 0x00, "Base Interface" },
552         { 0x01, "Fabric Interface" },
553         { 0x02, "Update Channel Interface" },
554
555         { 0, NULL }
556 };
557
558 static const value_string busresid_vals[] = {
559         { 0x00, "Metallic Test Bus #1" },
560         { 0x01, "Metallic Test Bus #2" },
561         { 0x02, "Synch clock group #1" },
562         { 0x03, "Synch clock group #2" },
563         { 0x04, "Synch clock group #3" },
564         { 0, NULL }
565 };
566
567 static const value_string fan_level_vals[] = {
568         { 0xFE, "Shut down" },
569         { 0xFF, "Local control" },
570         { 0, NULL }
571 };
572
573 static const value_string enable_vals[] = {
574         { 0x00, "Disable" },
575         { 0x01, "Enable" },
576         { 0, NULL }
577 };
578
579 static const value_string enabled_vals[] = {
580         { 0x00, "Disabled" },
581         { 0x01, "Enabled" },
582         { 0, NULL }
583 };
584
585 static const value_string vals_04_cmd[] = {
586         { 0x00, "Cold Reset" },
587         { 0x01, "Warm Reset" },
588         { 0x02, "Graceful Reboot" },
589         { 0x03, "Issue Diagnostic Interrupt" },
590         { 0x04, "Quiesce" },
591         { 0, NULL }
592 };
593
594 static const value_string vals_0c_cmd[] = {
595         { 0x00, "Deactivate FRU" },
596         { 0x01, "Activate FRU" },
597         { 0, NULL }
598 };
599
600 static const value_string vals_11_set[] = {
601         { 0x00, "Do not change present levels" },
602         { 0x01, "Copy desired levels to present levels" },
603         { 0, NULL }
604 };
605
606 static const value_string vals_12_pwr_type[] = {
607         { 0x00, "Steady state power draw levels" },
608         { 0x01, "Desired steady state draw levels" },
609         { 0x02, "Early power draw levels" },
610         { 0x03, "Desired early levels" },
611         { 0, NULL }
612 };
613
614 static const value_string vals_18_keytype[] = {
615         { 0x00, "Link Info Key contains Link Number" },
616         { 0x01, "Link Info Key contains Sensor Number" },
617         { 0, NULL }
618 };
619
620 static const value_string vals_1d_policy[] = {
621         { 0x00, "Disabled" },
622         { 0x01, "Enabled" },
623         { 0xFF, "Indeterminate" },
624         { 0, NULL }
625 };
626
627 static const value_string vals_1d_coverage[] = {
628         { 0x00, "Not Covered" },
629         { 0x01, "Covered" },
630         { 0, NULL }
631 };
632
633 static const value_string vals_1f_op[] = {
634         { 0x00, "Get Last Commit Timestamp" },
635         { 0x01, "Lock" },
636         { 0x02, "Unlock and Discard" },
637         { 0x03, "Unlock and Commit" },
638         { 0, NULL }
639 };
640
641 #if 0
642 static const value_string vals_21_addr_type[] = {
643         { 0x01, "IPv4" },
644         { 0x60, "OEM" }, { 0x61, "OEM" }, { 0x62, "OEM" }, { 0x63, "OEM" },
645         { 0x64, "OEM" }, { 0x65, "OEM" }, { 0x66, "OEM" }, { 0x67, "OEM" },
646         { 0x68, "OEM" }, { 0x69, "OEM" }, { 0x6a, "OEM" }, { 0x6b, "OEM" },
647         { 0x6c, "OEM" }, { 0x6d, "OEM" }, { 0x6e, "OEM" }, { 0x6f, "OEM" },
648         { 0x70, "OEM" }, { 0x71, "OEM" }, { 0x72, "OEM" }, { 0x73, "OEM" },
649         { 0x74, "OEM" }, { 0x75, "OEM" }, { 0x76, "OEM" }, { 0x77, "OEM" },
650         { 0x78, "OEM" }, { 0x79, "OEM" }, { 0x7a, "OEM" }, { 0x7b, "OEM" },
651         { 0x7c, "OEM" }, { 0x7d, "OEM" }, { 0x7e, "OEM" }, { 0x7f, "OEM" },
652         { 0, NULL }
653 };
654 #endif
655
656 static const value_string vals_prop00_rollback[] = {
657         { 0x00, "Not supported" },
658         { 0x01, "Rollback supported, Backup required" },
659         { 0x02, "Rollback supported, Backup not required" },
660         { 0, NULL }
661 };
662
663 static const value_string vals_31_action[] = {
664         { 0x00, "Backup components" },
665         { 0x01, "Prepare components" },
666         { 0x02, "Upload for upgrade" },
667         { 0x03, "Upload for compare" },
668         { 0, NULL }
669 };
670
671 static const value_string vals_35_override[] = {
672         { 0x00, "Automatic Rollback allowed" },
673         { 0x01, "Automatic Rollback override" },
674         { 0, NULL }
675 };
676
677 static const value_string vals_36_result[] = {
678         { 0x55, "No error. All Self Tests Passed" },
679         { 0x56, "Reserved, cannot be used" },
680         { 0x57, "Corrupted or inaccessible data or devices" },
681         { 0x58, "Fatal hardware error" },
682         { 0x60, "Component failure" },
683         { 0xff, "Reserved" },
684         { 0, NULL }
685 };
686
687 static const struct true_false_string tfs_36_fail_unknown = {
688         "Test failed",
689         "Unknown"
690 };
691
692 /* Get PICMG Properties.
693  */
694 static void
695 rs00(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
696 {
697         proto_tree_add_item(tree, hf_ipmi_picmg_00_version, tvb, 0, 1, ENC_LITTLE_ENDIAN);
698         proto_tree_add_item(tree, hf_ipmi_picmg_00_max_fruid, tvb, 1, 1, ENC_LITTLE_ENDIAN);
699         proto_tree_add_item(tree, hf_ipmi_picmg_00_ipmc_fruid, tvb, 2, 1, ENC_LITTLE_ENDIAN);
700 }
701
702 /* Get Address Info Command.
703  */
704 static void
705 rq01(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
706 {
707         if (tvb_captured_length(tvb) > 0) {
708                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rq_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
709         }
710         if (tvb_captured_length(tvb) > 1) {
711                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rq_addr_key_type, tvb, 1, 1, ENC_LITTLE_ENDIAN);
712         }
713         if (tvb_captured_length(tvb) > 2) {
714                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rq_addr_key, tvb, 2, 1, ENC_LITTLE_ENDIAN);
715         }
716         if (tvb_captured_length(tvb) > 3) {
717                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rq_site_type, tvb, 3, 1, ENC_LITTLE_ENDIAN);
718         }
719 }
720
721 static void
722 rs01(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
723 {
724         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_hwaddr, tvb, 0, 1, ENC_LITTLE_ENDIAN);
725         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_ipmbaddr, tvb, 1, 1, ENC_LITTLE_ENDIAN);
726         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_rsrv, tvb, 2, 1, ENC_LITTLE_ENDIAN);
727         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_fruid, tvb, 3, 1, ENC_LITTLE_ENDIAN);
728         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_site_num, tvb, 4, 1, ENC_LITTLE_ENDIAN);
729         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_site_type, tvb, 5, 1, ENC_LITTLE_ENDIAN);
730         /* TBD Next byte is carrier number in MTCA */
731 }
732
733 /* Get Shelf Address Info
734  */
735 static void
736 rs02(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
737 {
738         ipmi_add_typelen(tree, hf_ipmi_picmg_02_shelf_address, hf_ipmi_picmg_02_shelf_type, hf_ipmi_picmg_02_shelf_length, tvb, 0, TRUE);
739 }
740
741 /* Set Shelf Address Info
742  */
743 static void
744 rq03(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
745 {
746         ipmi_add_typelen(tree, hf_ipmi_picmg_03_shelf_address, hf_ipmi_picmg_03_shelf_type, hf_ipmi_picmg_03_shelf_length, tvb, 0, TRUE);
747 }
748
749 /* FRU Control.
750  */
751 static void
752 rq04(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
753 {
754         proto_tree_add_item(tree, hf_ipmi_picmg_04_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
755         proto_tree_add_item(tree, hf_ipmi_picmg_04_cmd, tvb, 1, 1, ENC_LITTLE_ENDIAN);
756 }
757
758 /* Get FRU LED Properties
759  */
760 static void
761 rq05(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
762 {
763         proto_tree_add_item(tree, hf_ipmi_picmg_05_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
764 }
765
766 static void
767 rs05(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
768 {
769         static const int *byte1[] = { &hf_ipmi_picmg_05_led3, &hf_ipmi_picmg_05_led2,
770                 &hf_ipmi_picmg_05_led1, &hf_ipmi_picmg_05_blue_led, NULL };
771
772         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "General Status LEDs: ", "None",
773                         ett_ipmi_picmg_05_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
774         proto_tree_add_item(tree, hf_ipmi_picmg_05_app_leds, tvb, 1, 1, ENC_LITTLE_ENDIAN);
775 }
776
777 /* Get LED Color Capabilities
778  */
779 static void
780 rq06(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
781 {
782         proto_tree_add_item(tree, hf_ipmi_picmg_06_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
783         proto_tree_add_item(tree, hf_ipmi_picmg_06_ledid, tvb, 1, 1, ENC_LITTLE_ENDIAN);
784 }
785
786 static void
787 rs06(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
788 {
789         static const int *byte1[] = { &hf_ipmi_picmg_06_cap_white, &hf_ipmi_picmg_06_cap_orange,
790                 &hf_ipmi_picmg_06_cap_amber, &hf_ipmi_picmg_06_cap_green, &hf_ipmi_picmg_06_cap_red,
791                 &hf_ipmi_picmg_06_cap_blue, NULL };
792         static const int *byte2[] = { &hf_ipmi_picmg_06_default_local_color, NULL };
793         static const int *byte3[] = { &hf_ipmi_picmg_06_default_override_color, NULL };
794
795         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Color capabilities: ", "None",
796                         ett_ipmi_picmg_06_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
797         proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL,
798                         ett_ipmi_picmg_06_byte2, byte2, ENC_LITTLE_ENDIAN, 0);
799         proto_tree_add_bitmask_text(tree, tvb, 2, 1, NULL, NULL,
800                         ett_ipmi_picmg_06_byte3, byte3, ENC_LITTLE_ENDIAN, 0);
801 }
802
803 static void
804 parse_led_state(proto_tree *tree, tvbuff_t *tvb, guint offs, const char *desc)
805 {
806         static const int *color[] = { &hf_ipmi_picmg_led_color, NULL };
807         static const value_string funcs[] = {
808                 { 0x00, "LED Off override" },
809                 { 0xfb, "Lamp Test state" },
810                 { 0xfc, "Restore Local Control" },
811                 { 0xfd, "Reserved" },
812                 { 0xfe, "Reserved" },
813                 { 0xff, "LED On override" },
814                 { 0, NULL }
815         };
816         proto_item *ti;
817         guint8 v;
818
819         v = tvb_get_guint8(tvb, offs);
820         proto_tree_add_uint_format(tree, hf_ipmi_picmg_led_function, tvb, offs, 1,
821                         v, "%sFunction: %s (0x%02x)", desc,
822                         val_to_str(v, funcs, "LED Blinking override, off-duration %d0ms"),
823                         v);
824         v = tvb_get_guint8(tvb, offs + 1);
825         proto_tree_add_uint_format(tree, hf_ipmi_picmg_led_on_duration, tvb, offs + 1, 1,
826                         v, "%sOn-duration: %d0ms", desc, v);
827         v = tvb_get_guint8(tvb, offs + 2) & 0x0f;
828         ti = proto_tree_add_bitmask_text(tree, tvb, offs + 2, 1,
829                         NULL, NULL, ett_ipmi_picmg_led_color, color, ENC_LITTLE_ENDIAN, 0);
830         proto_item_set_text(ti, "%sColor: %s", desc, val_to_str_const(v, led_color_vals, "Reserved"));
831 }
832
833 /* Set FRU LED State
834  */
835 static void
836 rq07(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
837 {
838         proto_tree_add_item(tree, hf_ipmi_picmg_07_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
839         proto_tree_add_item(tree, hf_ipmi_picmg_07_ledid, tvb, 1, 1, ENC_LITTLE_ENDIAN);
840         parse_led_state(tree, tvb, 2, "");
841 }
842
843 /* Get FRU LED State
844  */
845 static void
846 rq08(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
847 {
848         proto_tree_add_item(tree, hf_ipmi_picmg_08_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
849         proto_tree_add_item(tree, hf_ipmi_picmg_08_ledid, tvb, 1, 1, ENC_LITTLE_ENDIAN);
850 }
851
852 static void
853 rs08(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
854 {
855         static const int *byte1[] = { &hf_ipmi_picmg_08_state_lamptest, &hf_ipmi_picmg_08_state_override,
856                 &hf_ipmi_picmg_08_state_local, NULL };
857
858         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "LED States: ", "None",
859                         ett_ipmi_picmg_08_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
860         parse_led_state(tree, tvb, 1, "Local Control ");
861         if (tvb_captured_length(tvb) > 4) {
862                 parse_led_state(tree, tvb, 4, "Override ");
863         }
864         if (tvb_captured_length(tvb) > 7) {
865                 proto_tree_add_item(tree, hf_ipmi_picmg_08_lamptest_duration, tvb, 7, 1, ENC_LITTLE_ENDIAN);
866         }
867 }
868
869 /* Set IPMB State
870  */
871 static const true_false_string tfs_local_control_override = { "Local Control State", "Override State (Isolate)" };
872
873 static void
874 parse_ipmb_state(proto_tree *tree, tvbuff_t *tvb, guint offs, int hf, int hf_link, int hf_state, int ett)
875 {
876         char buf[32];
877         const char *desc;
878         proto_tree *s_tree;
879         proto_item *ti;
880         guint8 v, num;
881
882         v = tvb_get_guint8(tvb, offs);
883         if (v == 0xff) {
884                 proto_tree_add_uint_format_value(tree, hf, tvb, 0, 1,
885                                 v, "Don't change (0xff)");
886         } else {
887                 num = v >> 1;
888                 if (!num) {
889                         desc = "All Links";
890                 } else if (num < 0x60) {
891                         g_snprintf(buf, sizeof(buf), "Link #%d", num);
892                         desc = buf;
893                 } else {
894                         desc = "Reserved";
895                 }
896                 ti = proto_tree_add_uint_format_value(tree, hf, tvb, 0, 1,
897                                 v, "%s, %s", desc, (v & 1) ? "Local Control" : "Override");
898                 s_tree = proto_item_add_subtree(ti, ett);
899                 proto_tree_add_uint_format_value(s_tree, hf_link, tvb, 0, 1, v, "%s (0x%02x)",
900                                 desc, num);
901                 proto_tree_add_item(s_tree, hf_state, tvb, 0, 1, ENC_NA);
902         }
903 }
904
905 static void
906 rq09(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
907 {
908         parse_ipmb_state(tree, tvb, 0, hf_ipmi_picmg_09_ipmba, hf_ipmi_picmg_09_ipmba_link, hf_ipmi_picmg_09_ipmba_state, ett_ipmi_picmg_09_ipmba);
909         parse_ipmb_state(tree, tvb, 1, hf_ipmi_picmg_09_ipmbb, hf_ipmi_picmg_09_ipmbb_link, hf_ipmi_picmg_09_ipmbb_state, ett_ipmi_picmg_09_ipmbb);
910 }
911
912 /* Set FRU Activation Policy
913  */
914 static void
915 rq0a(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
916 {
917         static const int *byte2[] = { &hf_ipmi_picmg_0a_msk_d_locked, &hf_ipmi_picmg_0a_msk_locked, NULL };
918         static const int *byte3[] = { &hf_ipmi_picmg_0a_d_locked, &hf_ipmi_picmg_0a_locked, NULL };
919
920         proto_tree_add_item(tree, hf_ipmi_picmg_0a_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
921         proto_tree_add_bitmask_text(tree, tvb, 1, 1, "Will affect bits: ", "None",
922                         ett_ipmi_picmg_0a_byte2, byte2, ENC_LITTLE_ENDIAN, BMT_NO_TFS);
923         proto_tree_add_bitmask_text(tree, tvb, 2, 1, "Activation Policy Set Bits: ", NULL,
924                         ett_ipmi_picmg_0a_byte3, byte3, ENC_LITTLE_ENDIAN, 0);
925 }
926
927 /* Get FRU Activation Policy
928  */
929 static void
930 rq0b(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
931 {
932         proto_tree_add_item(tree, hf_ipmi_picmg_0b_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
933 }
934
935 static void
936 rs0b(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
937 {
938         static const int *byte1[] = { &hf_ipmi_picmg_0b_d_locked, &hf_ipmi_picmg_0b_locked, NULL };
939
940         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "Activation Policy Bits: ", NULL,
941                         ett_ipmi_picmg_0b_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
942 }
943
944
945 /* Set FRU Activation
946  */
947 static void
948 rq0c(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
949 {
950         proto_tree_add_item(tree, hf_ipmi_picmg_0c_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
951         proto_tree_add_item(tree, hf_ipmi_picmg_0c_cmd, tvb, 1, 1, ENC_LITTLE_ENDIAN);
952 }
953
954 /* Get Device Locator Record ID
955  */
956 static void
957 rq0d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
958 {
959         proto_tree_add_item(tree, hf_ipmi_picmg_0d_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
960         if (tvb_captured_length(tvb) > 1) {
961                 proto_tree_add_item(tree, hf_ipmi_picmg_0d_start, tvb, 1, 2, ENC_LITTLE_ENDIAN);
962         }
963 }
964
965 static void
966 rs0d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
967 {
968         proto_tree_add_item(tree, hf_ipmi_picmg_0d_recordid, tvb, 0, 2, ENC_LITTLE_ENDIAN);
969 }
970
971 static void
972 parse_link_info_state(proto_tree *tree, tvbuff_t *tvb, guint offs, const char *num, const value_string *vs)
973 {
974         static const int *link_info[] = { &hf_ipmi_picmg_linkinfo_grpid, &hf_ipmi_picmg_linkinfo_type_ext,
975                 &hf_ipmi_picmg_linkinfo_type, &hf_ipmi_picmg_linkinfo_ports, &hf_ipmi_picmg_linkinfo_iface,
976                 &hf_ipmi_picmg_linkinfo_chan, NULL };
977         guint8 v = tvb_get_guint8(tvb, offs + 4);
978         char buf[32];
979
980         g_snprintf(buf, sizeof(buf), "Link info%s: ", num);
981         proto_tree_add_bitmask_text(tree, tvb, offs, 4, buf, NULL,
982                         ett_ipmi_picmg_link_info, link_info, ENC_LITTLE_ENDIAN, 0);
983         proto_tree_add_uint_format(tree, hf_ipmi_picmg_linkinfo_state, tvb, offs + 4, 1,
984                         v, "State%s: %s (0x%02x)", num, val_to_str_const(v, vs, "Reserved"), v);
985 }
986
987 /* Set Port State
988  */
989 static void
990 rq0e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
991 {
992         static const value_string state_vals[] = {
993                 { 0x00, "Disable" },
994                 { 0x01, "Enable" },
995                 { 0, NULL }
996         };
997
998         parse_link_info_state(tree, tvb, 0, "", state_vals);
999 }
1000
1001 /* Get Port State
1002  */
1003 static void
1004 rq0f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1005 {
1006         static const int *chan[] = { &hf_ipmi_picmg_0f_iface, &hf_ipmi_picmg_0f_chan, NULL };
1007
1008         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_picmg_0f_chan, chan, ENC_LITTLE_ENDIAN, 0);
1009         if (tvb_captured_length(tvb) > 1) {
1010                 proto_tree_add_item(tree, hf_ipmi_picmg_1a_flags, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1011         }
1012 }
1013
1014 static void
1015 rs0f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1016 {
1017         static const value_string state_vals[] = {
1018                 { 0x00, "Disabled" },
1019                 { 0x01, "Enabled" },
1020                 { 0x02, "Disabled, Extended Inactive State Link" },
1021                 { 0x03, "Enabled, Extended Inactive State Link" },
1022                 { 0, NULL }
1023         };
1024
1025         if (tvb_captured_length(tvb) > 0) {
1026                 parse_link_info_state(tree, tvb, 0, " 1", state_vals);
1027         }
1028         if (tvb_captured_length(tvb) > 5) {
1029                 parse_link_info_state(tree, tvb, 5, " 2", state_vals);
1030         }
1031         if (tvb_captured_length(tvb) > 10) {
1032                 parse_link_info_state(tree, tvb, 10, " 3", state_vals);
1033         }
1034         if (tvb_captured_length(tvb) > 15) {
1035                 parse_link_info_state(tree, tvb, 15, " 4", state_vals);
1036         }
1037 }
1038
1039 /* Compute Power Properties
1040  */
1041 static void
1042 rq10(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1043 {
1044         proto_tree_add_item(tree, hf_ipmi_picmg_10_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1045 }
1046
1047 static void
1048 rs10(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1049 {
1050         proto_tree_add_item(tree, hf_ipmi_picmg_10_nslots, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1051         proto_tree_add_item(tree, hf_ipmi_picmg_10_ipmc_loc, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1052 }
1053
1054 /* Set Power Level
1055  */
1056 static void
1057 rq11(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1058 {
1059         static const value_string plvl_vals[] = {
1060                 { 0x00, "Power Off" },
1061                 { 0xff, "Do not change" },
1062                 { 0, NULL }
1063         };
1064         guint8 v = tvb_get_guint8(tvb, 1);
1065
1066         proto_tree_add_item(tree, hf_ipmi_picmg_11_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1067         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_11_power_level, tvb, 1, 1,
1068                         v, "%s", val_to_str(v, plvl_vals, "Power Level %d"));
1069         proto_tree_add_item(tree, hf_ipmi_picmg_11_set_to_desired, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1070 }
1071
1072 /* Get Power Level
1073  */
1074 static void
1075 rq12(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1076 {
1077         proto_tree_add_item(tree, hf_ipmi_picmg_12_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1078         proto_tree_add_item(tree, hf_ipmi_picmg_12_pwr_type, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1079 }
1080
1081 static void
1082 rs12(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1083 {
1084         static const int *byte1[] = { &hf_ipmi_picmg_12_dynamic, &hf_ipmi_picmg_12_pwr_lvl, NULL };
1085         guint8 v, v2, i;
1086         guint32 tmp, max;
1087
1088         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL, ett_ipmi_picmg_12_byte1, byte1, ENC_LITTLE_ENDIAN, BMT_NO_FALSE);
1089         proto_tree_add_item(tree, hf_ipmi_picmg_12_delay, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1090         v = tvb_get_guint8(tvb, 2);
1091         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_12_pwr_mult, tvb, 2, 1,
1092                         v, "%d.%dW", v / 10, v % 10);
1093         max = tvb_captured_length(tvb) - 3;
1094         if (max == 0) {
1095                 max = 1; /* One byte is mandatory */
1096         } else if (max > 20) {
1097                 max = 20; /* 20 levels at most */
1098         }
1099         for (i = 1; i <= max; i++) {
1100                 v2 = tvb_get_guint8(tvb, 2 + i);
1101                 tmp = (guint)v2 * v;
1102                 proto_tree_add_uint_format(tree, hf_ipmi_picmg_12_pwr_draw, tvb, 2 + i, 1,
1103                                 v2, "Power Draw [%d]: %d.%dW (0x%02x)", i,
1104                                 tmp / 10, tmp % 10, v2);
1105
1106         }
1107 }
1108
1109 /* Renegotiate Power
1110  */
1111 static void
1112 rq13(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1113 {
1114         if (tvb_captured_length(tvb) > 0) {
1115                 proto_tree_add_item(tree, hf_ipmi_picmg_13_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1116         }
1117 }
1118
1119 /* Get Fan Speed Properties
1120  */
1121 static void
1122 rq14(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1123 {
1124         proto_tree_add_item(tree, hf_ipmi_picmg_14_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1125 }
1126
1127 static void
1128 rs14(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1129 {
1130         static const int *prop[] = { &hf_ipmi_picmg_14_local_control, NULL };
1131
1132         proto_tree_add_item(tree, hf_ipmi_picmg_14_speed_min, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1133         proto_tree_add_item(tree, hf_ipmi_picmg_14_speed_max, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1134         proto_tree_add_item(tree, hf_ipmi_picmg_14_speed_norm, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1135         proto_tree_add_bitmask_text(tree, tvb, 3, 1, "Fan Tray Properties: ", "None",
1136                         ett_ipmi_picmg_14_prop, prop, ENC_LITTLE_ENDIAN, 0);
1137 }
1138
1139 /* Set Fan Level
1140  */
1141 static void
1142 rq15(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1143 {
1144         guint8 v = tvb_get_guint8(tvb, 1);
1145
1146         proto_tree_add_item(tree, hf_ipmi_picmg_15_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1147         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_15_fan_level, tvb, 1, 1,
1148                         v, "%s", val_to_str(v, fan_level_vals, "%d"));
1149         if (tvb_captured_length(tvb) > 2) {
1150                 proto_tree_add_item(tree, hf_ipmi_picmg_15_local_enable, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1151         }
1152 }
1153
1154 /* Get Fan Level
1155  */
1156 static void
1157 rq16(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1158 {
1159         proto_tree_add_item(tree, hf_ipmi_picmg_16_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1160 }
1161
1162 static void
1163 rs16(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1164 {
1165         guint8 v;
1166
1167         v = tvb_get_guint8(tvb, 0);
1168         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_16_override_level, tvb, 0, 1,
1169                         v, "%s", val_to_str(v, fan_level_vals, "%d"));
1170         if (tvb_captured_length(tvb) > 1) {
1171                 proto_tree_add_item(tree, hf_ipmi_picmg_16_local_level, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1172         }
1173         if (tvb_captured_length(tvb) > 2) {
1174                 proto_tree_add_item(tree, hf_ipmi_picmg_16_local_enable, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1175         }
1176 }
1177
1178 /* Bused Resource Control
1179  */
1180 static void
1181 rq17(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1182 {
1183         static const value_string vals_17_cmd_fromshmm[] = {
1184                 { 0x00, "Query" },
1185                 { 0x01, "Release" },
1186                 { 0x02, "Force" },
1187                 { 0x03, "Bus Free" },
1188                 { 0, NULL }
1189         };
1190         static const value_string vals_17_cmd_toshmm[] = {
1191                 { 0x00, "Request" },
1192                 { 0x01, "Relinquish" },
1193                 { 0x02, "Notify" },
1194                 { 0, NULL }
1195         };
1196         guint cmd = tvb_get_guint8(tvb, 0);
1197         const ipmi_header_t *header = ipmi_get_hdr(pinfo);
1198         if (header == NULL)
1199                 return;
1200
1201         guint to_shmm = header->rs_sa == 0x20;
1202
1203         ipmi_set_data(pinfo, 0, (to_shmm << 8) | cmd);
1204
1205         if (!tree) {
1206                 return;
1207         }
1208
1209         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_17_cmd, tvb, 0, 1,
1210                                 cmd, "%s (0x%02x)",
1211                                 val_to_str_const(cmd,
1212                                                  to_shmm ? vals_17_cmd_toshmm : vals_17_cmd_fromshmm,
1213                                                  "Reserved"),
1214                                 cmd);
1215         proto_tree_add_item(tree, hf_ipmi_picmg_17_resid, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1216 }
1217
1218 static void
1219 rs17(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1220 {
1221         /* Key is 3 bytes: direction, command, status */
1222         static const value_string response_vals[] = {
1223                 { 0x000000, "In Control" },
1224                 { 0x000001, "No Control" },
1225                 { 0x000100, "Ack" },
1226                 { 0x000101, "Refused" },
1227                 { 0x000102, "No Control" },
1228                 { 0x000200, "Ack" },
1229                 { 0x000201, "No Control" },
1230                 { 0x000300, "Accept" },
1231                 { 0x000301, "Not Needed" },
1232                 { 0x010000, "Grant" },
1233                 { 0x010001, "Busy" },
1234                 { 0x010002, "Defer" },
1235                 { 0x010003, "Deny" },
1236                 { 0x010100, "Ack" },
1237                 { 0x010101, "Error" },
1238                 { 0x010200, "Ack" },
1239                 { 0x010201, "Error" },
1240                 { 0x010202, "Deny" },
1241                 { 0, NULL }
1242         };
1243         guint32 val;
1244         guint8 status;
1245
1246         if (!ipmi_get_data(pinfo, 0, &val)) {
1247                 /* Without knowing the command, we cannot decipher the response */
1248                 proto_tree_add_item(tree, hf_ipmi_picmg_17_status, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1249                 return;
1250         }
1251
1252         status = tvb_get_guint8(tvb, 0);
1253         val = (val << 8) | status;
1254         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_17_status, tvb, 0, 1,
1255                         status, "%s (0x%02x)", val_to_str_const(val, response_vals, "Reserved"), status);
1256 }
1257
1258 /* Get IPMB Link Info
1259  */
1260 static void
1261 rq18(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1262 {
1263         proto_tree_add_item(tree, hf_ipmi_picmg_18_li_key_type, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1264         proto_tree_add_item(tree, hf_ipmi_picmg_18_li_key, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1265 }
1266
1267 static void
1268 rs18(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1269 {
1270         proto_tree_add_item(tree, hf_ipmi_picmg_18_link_num, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1271         proto_tree_add_item(tree, hf_ipmi_picmg_18_sensor_num, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1272 }
1273
1274 static void
1275 parse_amc_link_info_state(proto_tree *tree, tvbuff_t *tvb, guint offs)
1276 {
1277         static const int *amc_link_info[] = {
1278                         &hf_ipmi_picmg_linkinfo_amc_ports,
1279                         &hf_ipmi_picmg_linkinfo_amc_type,
1280                         &hf_ipmi_picmg_linkinfo_amc_type_ext,
1281                         &hf_ipmi_picmg_linkinfo_amc_grpid,
1282                         NULL };
1283         static const int *amc_link_state[] = {
1284                         &hf_ipmi_picmg_linkinfo_state_0,
1285                         &hf_ipmi_picmg_linkinfo_state_1,
1286                         NULL };
1287
1288         proto_tree_add_bitmask(tree, tvb, offs, hf_ipmi_picmg_linkinfo,
1289                         ett_ipmi_picmg_link_info, amc_link_info, ENC_LITTLE_ENDIAN);
1290         proto_tree_add_bitmask(tree, tvb, offs + 3, hf_ipmi_picmg_linkinfo_state,
1291                         ett_ipmi_picmg_link_state, amc_link_state, ENC_LITTLE_ENDIAN);
1292 }
1293
1294 static const int *amc_link_dev[] = {
1295                 &hf_ipmi_picmg_linkinfo_dev_id,
1296                 NULL };
1297
1298 /* Set AMC Port State
1299  */
1300 static void
1301 rq19(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1302 {
1303         proto_tree_add_item(tree, hf_ipmi_picmg_linkinfo_amc_chan, tvb, 0, 1,
1304                         ENC_LITTLE_ENDIAN);
1305         parse_amc_link_info_state(tree, tvb, 1);
1306         if (tvb_captured_length(tvb) > 5) {
1307                 proto_tree_add_bitmask(tree, tvb, 5, hf_ipmi_picmg_linkinfo_dev,
1308                                 ett_ipmi_picmg_link_dev, amc_link_dev, ENC_LITTLE_ENDIAN);
1309         }
1310 }
1311
1312 /* Get AMC Port State
1313  */
1314 static void
1315 rq1a(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1316 {
1317         proto_tree_add_item(tree, hf_ipmi_picmg_linkinfo_amc_chan, tvb, 0, 1,
1318                         ENC_LITTLE_ENDIAN);
1319         if (tvb_captured_length(tvb) > 1) {
1320                 proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_picmg_linkinfo_dev,
1321                                 ett_ipmi_picmg_link_state, amc_link_dev, ENC_LITTLE_ENDIAN);
1322         }
1323         if (tvb_captured_length(tvb) > 2) {
1324                 proto_tree_add_item(tree, hf_ipmi_picmg_1a_flags, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1325         }
1326 }
1327
1328 static void
1329 rs1a(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1330 {
1331         guint len = tvb_captured_length(tvb);
1332         if (len > 0) {
1333                 parse_amc_link_info_state(tree, tvb, 0);
1334         }
1335         if (len > 4) {
1336                 parse_amc_link_info_state(tree, tvb, 4);
1337         }
1338         if (len > 8) {
1339                 parse_amc_link_info_state(tree, tvb, 8);
1340         }
1341         if (len > 12) {
1342                 parse_amc_link_info_state(tree, tvb, 12);
1343         }
1344 }
1345
1346 /* Get Shelf Manager IPMB Address
1347  */
1348 static void
1349 rs1b(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1350 {
1351         proto_tree_add_item(tree, hf_ipmi_picmg_1b_addr_active, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1352         proto_tree_add_item(tree, hf_ipmi_picmg_1b_addr_backup, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1353 }
1354
1355 /* Set Fan Policy
1356  */
1357 static void
1358 rq1c(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1359 {
1360         proto_tree_add_item(tree, hf_ipmi_picmg_1c_fan_site_number, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1361         proto_tree_add_item(tree, hf_ipmi_picmg_1c_fan_enable_state, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1362         proto_tree_add_item(tree, hf_ipmi_picmg_1c_fan_policy_timeout, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1363         if (tvb_captured_length(tvb) > 3) {
1364                 proto_tree_add_item(tree, hf_ipmi_picmg_1c_site_number, tvb, 3, 1, ENC_LITTLE_ENDIAN);
1365                 proto_tree_add_item(tree, hf_ipmi_picmg_1c_site_type, tvb, 4, 1, ENC_LITTLE_ENDIAN);
1366         }
1367 }
1368
1369 /* Get Fan Policy
1370  */
1371 static void
1372 rq1d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1373 {
1374         proto_tree_add_item(tree, hf_ipmi_picmg_1d_fan_site_number, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1375         if (tvb_captured_length(tvb) > 1) {
1376                 proto_tree_add_item(tree, hf_ipmi_picmg_1d_site_number, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1377                 proto_tree_add_item(tree, hf_ipmi_picmg_1d_site_type, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1378         }
1379 }
1380
1381 static void
1382 rs1d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1383 {
1384         proto_tree_add_item(tree, hf_ipmi_picmg_1d_policy, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1385         if (tvb_captured_length(tvb) > 1) {
1386                 proto_tree_add_item(tree, hf_ipmi_picmg_1d_coverage, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1387         }
1388 }
1389
1390 /* FRU Control Capabilities
1391  */
1392 static void
1393 rq1e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1394 {
1395         proto_tree_add_item(tree, hf_ipmi_picmg_1e_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1396 }
1397
1398 static void
1399 rs1e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1400 {
1401         static const int *byte1[] = { &hf_ipmi_picmg_1e_cap_diagintr,
1402                 &hf_ipmi_picmg_1e_cap_graceful_reboot, &hf_ipmi_picmg_1e_cap_warm_reset, NULL };
1403
1404         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "FRU Control Capabilities: ", "None",
1405                         ett_ipmi_picmg_1e_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
1406 }
1407
1408 /* FRU Inventory Device Lock Control
1409  */
1410 static void
1411 rq1f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1412 {
1413         proto_tree_add_item(tree, hf_ipmi_picmg_1f_rq_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1414         proto_tree_add_item(tree, hf_ipmi_picmg_1f_rq_op, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1415         proto_tree_add_item(tree, hf_ipmi_picmg_1f_rq_lockid, tvb, 2, 2, ENC_LITTLE_ENDIAN);
1416 }
1417
1418 static void
1419 rs1f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1420 {
1421         proto_tree_add_item(tree, hf_ipmi_picmg_1f_rs_lockid, tvb, 0, 2, ENC_LITTLE_ENDIAN);
1422         ipmi_add_timestamp(tree, hf_ipmi_picmg_1f_rs_tstamp, tvb, 2);
1423 }
1424
1425 static const value_string cc1f[] = {
1426         { 0x80, "Invalid FRU Information" },
1427         { 0x81, "Lock Failed" },
1428         { 0, NULL }
1429 };
1430
1431 /* FRU Inventory Device Write
1432  */
1433 static void
1434 rq20(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1435 {
1436         proto_tree_add_item(tree, hf_ipmi_picmg_20_fruid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1437         proto_tree_add_item(tree, hf_ipmi_picmg_20_lockid, tvb, 1, 2, ENC_LITTLE_ENDIAN);
1438         proto_tree_add_item(tree, hf_ipmi_picmg_20_offset, tvb, 3, 2, ENC_LITTLE_ENDIAN);
1439         proto_tree_add_item(tree, hf_ipmi_picmg_20_data, tvb, 5, -1, ENC_NA);
1440 }
1441
1442 static void
1443 rs20(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1444 {
1445         proto_tree_add_item(tree, hf_ipmi_picmg_20_count, tvb, 0, 1, ENC_NA);
1446 }
1447
1448 static const value_string cc20[] = {
1449         { 0x80, "Invalid Lock ID" },
1450         { 0, NULL }
1451 };
1452
1453 /* Get Shelf Manager IP Address
1454  */
1455 static void
1456 rq21(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1457 {
1458         proto_tree_add_item(tree, hf_ipmi_picmg_21_addr_num, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1459 }
1460
1461 static void
1462 rs21(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1463 {
1464         static const int *byte9[] = { &hf_ipmi_picmg_21_is_shm, &hf_ipmi_picmg_21_addr_type, NULL };
1465         guint8 addrtype;
1466
1467         ipmi_add_timestamp(tree, hf_ipmi_picmg_21_tstamp, tvb, 0);
1468         proto_tree_add_item(tree, hf_ipmi_picmg_21_addr_count, tvb, 4, 1, ENC_LITTLE_ENDIAN);
1469         proto_tree_add_item(tree, hf_ipmi_picmg_21_site_type, tvb, 5, 1, ENC_LITTLE_ENDIAN);
1470         proto_tree_add_item(tree, hf_ipmi_picmg_21_site_num, tvb, 6, 1, ENC_LITTLE_ENDIAN);
1471         proto_tree_add_item(tree, hf_ipmi_picmg_21_max_unavail, tvb, 7, 1, ENC_LITTLE_ENDIAN);
1472         proto_tree_add_bitmask_text(tree, tvb, 8, 1, NULL, NULL, ett_ipmi_picmg_21_byte9, byte9, ENC_LITTLE_ENDIAN, 0);
1473
1474         addrtype = tvb_get_guint8(tvb, 8) & 0x7f;
1475         if (addrtype == 0x01) {
1476                 /* IP address and RMCP port are in network byte order! */
1477                 proto_tree_add_item(tree, hf_ipmi_picmg_21_ipaddr, tvb, 9, 4, ENC_BIG_ENDIAN);
1478                 proto_tree_add_item(tree, hf_ipmi_picmg_21_rmcpport, tvb, 13, 2, ENC_BIG_ENDIAN);
1479         };
1480 }
1481
1482 /* Get Shelf Power Allocation
1483  */
1484 static void
1485 rq22(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1486 {
1487         ipmi_set_data(pinfo, 0, tvb_get_guint8(tvb, 0));
1488         if (!tree) {
1489                 return;
1490         }
1491         proto_tree_add_item(tree, hf_ipmi_picmg_22_feed_idx, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1492 }
1493
1494 static void
1495 rs22(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1496 {
1497         guint32 offs = 0;
1498         guint16 v;
1499         guint i, max;
1500
1501         proto_tree_add_item(tree, hf_ipmi_picmg_22_update_cnt, tvb, 0, 2, ENC_LITTLE_ENDIAN);
1502
1503         max = tvb_captured_length(tvb) / 2 - 1;
1504         if (!max) {
1505                 /* At least one shall be present */
1506                 max = 1;
1507         }
1508         ipmi_get_data(pinfo, 0, &offs);
1509         for (i = 0; i < max; i++) {
1510                 v = tvb_get_letohs(tvb, 2 + 2 * i);
1511                 proto_tree_add_uint_format(tree, hf_ipmi_picmg_22_pwr_alloc, tvb, 2 + 2 * i, 2,
1512                                 v, "Power Feed [%d] Allocation: %d Watts", offs + i, v);
1513         }
1514 }
1515
1516 static const value_string picmg_23_slot_selectors[] = {
1517         { 0, "MicroTCA Shelf within a Frame" },
1518         { 1, "MicroTCA Carrier within a Shelf" },
1519         { 2, "Slot within a MicroTCA Carrier" },
1520         { 0, NULL }
1521 };
1522
1523 static const value_string picmg_23_num_bases[] = {
1524         { 0, "Zero-based" },
1525         { 1, "One-based" },
1526         { 0, NULL }
1527 };
1528
1529 static const value_string picmg_23_orientations[] = {
1530         { 0, "Vertical" },
1531         { 1, "Horizontal" },
1532         { 0, NULL }
1533 };
1534
1535 /* Get Location Info
1536  */
1537 static void
1538 rq23(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1539 {
1540         static const int * picmg_23_rq_byte2[] = {
1541                 &hf_ipmi_picmg_23_slot_sel,
1542                 &hf_ipmi_picmg_23_carrier_num,
1543                 NULL
1544         };
1545
1546         proto_tree_add_bitmask(tree, tvb, 0, hf_ipmi_picmg_23_rq_byte2,
1547                         ett_ipmi_picmg_23_rq_byte2, picmg_23_rq_byte2,
1548                         ENC_LITTLE_ENDIAN);
1549         if ((tvb_get_guint8(tvb, 0) & 0xC0) == 0x80) {
1550                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_site_num,
1551                                 tvb, 1, 1, ENC_LITTLE_ENDIAN);
1552                 proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_site_type,
1553                                 tvb, 2, 1, ENC_LITTLE_ENDIAN);
1554         }
1555 }
1556
1557 static void
1558 rs23(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1559 {
1560         static const int * picmg_23_rs_byte5[] = {
1561                 &hf_ipmi_picmg_23_slot_base,
1562                 &hf_ipmi_picmg_23_tier_base,
1563                 &hf_ipmi_picmg_23_orientation,
1564                 NULL
1565         };
1566
1567         proto_tree_add_item(tree, hf_ipmi_picmg_23_slot_num,
1568                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1569         proto_tree_add_item(tree, hf_ipmi_picmg_23_tier_num,
1570                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
1571         proto_tree_add_bitmask(tree, tvb, 2, hf_ipmi_picmg_23_rs_byte5,
1572                         ett_ipmi_picmg_23_rs_byte5, picmg_23_rs_byte5,
1573                         ENC_LITTLE_ENDIAN);
1574         proto_tree_add_item(tree, hf_ipmi_picmg_23_origin_x,
1575                         tvb, 3, 2, ENC_LITTLE_ENDIAN);
1576         proto_tree_add_item(tree, hf_ipmi_picmg_23_origin_y,
1577                         tvb, 5, 2, ENC_LITTLE_ENDIAN);
1578 }
1579
1580 static const value_string picmg_24_controls[] = {
1581         { 0, "Disable MP" },
1582         { 1, "Enable MP" },
1583         { 2, "De-assert ENABLE#" },
1584         { 3, "Assert ENABLE#" },
1585         { 4, "Disable PWR" },
1586         { 5, "Enable PWR" },
1587         { 0, NULL }
1588 };
1589
1590 static void
1591 fmt_power_amps(gchar *s, guint32 v)
1592 {
1593         g_snprintf(s, ITEM_LABEL_LENGTH, "%d.%dA", v / 10, v % 10);
1594 }
1595
1596 /* Power Channel Control
1597  */
1598 static void
1599 rq24(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1600 {
1601         proto_tree_add_item(tree, hf_ipmi_picmg_24_channel,
1602                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1603         proto_tree_add_item(tree, hf_ipmi_picmg_24_control,
1604                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
1605         proto_tree_add_item(tree, hf_ipmi_picmg_24_current,
1606                         tvb, 2, 1, ENC_LITTLE_ENDIAN);
1607         proto_tree_add_item(tree, hf_ipmi_picmg_24_primary_pm,
1608                         tvb, 3, 1, ENC_LITTLE_ENDIAN);
1609         proto_tree_add_item(tree, hf_ipmi_picmg_24_backup_pm,
1610                         tvb, 4, 1, ENC_LITTLE_ENDIAN);
1611 }
1612
1613 static const value_string picmg_25_fault_vals[] = {
1614         { 0, "Redundant PM is not providing Payload Power current" },
1615         { 1, "Redundant PM is providing Payload Power current" },
1616         { 0, NULL }
1617 };
1618
1619 static const true_false_string picmg_25_roles = {
1620         "Primary",  "Redundant"
1621 };
1622
1623 /* Get Power Channel Status
1624  */
1625 static void
1626 rq25(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1627 {
1628         proto_tree_add_item(tree, hf_ipmi_picmg_25_start,
1629                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1630         proto_tree_add_item(tree, hf_ipmi_picmg_25_count,
1631                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
1632 }
1633
1634 static void
1635 rs25(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1636 {
1637         static const gint * picmg_25_gstatus[] = {
1638                 &hf_ipmi_picmg_25_fault,
1639                 &hf_ipmi_picmg_25_pwr_good,
1640                 &hf_ipmi_picmg_25_mp_good,
1641                 &hf_ipmi_picmg_25_role,
1642                 NULL
1643         };
1644         static const gint * picmg_25_cstatus[] = {
1645                 &hf_ipmi_picmg_25_pwr_on,
1646                 &hf_ipmi_picmg_25_pwr_ovr,
1647                 &hf_ipmi_picmg_25_pwr,
1648                 &hf_ipmi_picmg_25_enable,
1649                 &hf_ipmi_picmg_25_mp_ovr,
1650                 &hf_ipmi_picmg_25_mp,
1651                 &hf_ipmi_picmg_25_ps1,
1652                 NULL
1653         };
1654
1655         guint i, len = tvb_captured_length(tvb);
1656
1657         proto_tree_add_item(tree, hf_ipmi_picmg_25_max,
1658                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1659         proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_picmg_25_gstatus,
1660                         ett_ipmi_picmg_25_rs_byte4, picmg_25_gstatus,
1661                         ENC_LITTLE_ENDIAN);
1662
1663         for (i = 2; i < len; i++) {
1664                 proto_tree_add_bitmask(tree, tvb, i, hf_ipmi_picmg_25_cstatus,
1665                                 ett_ipmi_picmg_25_rs_byte5, picmg_25_cstatus,
1666                                 ENC_LITTLE_ENDIAN);
1667         }
1668 }
1669
1670 /* PM Reset
1671  */
1672 static void
1673 rq26(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1674 {
1675         proto_tree_add_item(tree, hf_ipmi_picmg_26_pm_site,
1676                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1677 }
1678
1679 /* Get PM Status
1680  */
1681 static void
1682 rs27(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1683 {
1684         static const gint * picmg_27_status[] = {
1685                 &hf_ipmi_picmg_27_pm_healthy,
1686                 NULL
1687         };
1688         proto_tree_add_bitmask(tree, tvb, 0, hf_ipmi_picmg_27_rs_byte3,
1689                         ett_ipmi_picmg_27_rs_byte3, picmg_27_status,
1690                         ENC_LITTLE_ENDIAN);
1691 }
1692
1693 static const value_string cc28[] = {
1694         { 0x80, "Returned from autonomous mode" },
1695         { 0, NULL }
1696 };
1697
1698 static void
1699 fmt_100ms(gchar *s, guint32 v)
1700 {
1701         g_snprintf(s, ITEM_LABEL_LENGTH, "%d.%dS", v / 10, v % 10);
1702 }
1703
1704 /* PM Heart-Beat
1705  */
1706 static void
1707 rq28(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1708 {
1709         static const gint * picmg_28_flags[] = {
1710                 &hf_ipmi_picmg_28_mch2,
1711                 &hf_ipmi_picmg_28_mch1,
1712                 NULL
1713         };
1714         proto_tree_add_item(tree, hf_ipmi_picmg_28_timeout,
1715                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1716         proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_picmg_28_rq_byte3,
1717                         ett_ipmi_picmg_28_rq_byte3, picmg_28_flags,
1718                         ENC_LITTLE_ENDIAN);
1719 }
1720
1721 static const true_false_string picmg_29_alarm_actions = {
1722         "Produces(results in) an implementation-defined action",
1723         "Not implemented"
1724 };
1725
1726 static const true_false_string picmg_29_alarm_modes = {
1727         "Can be controlled/enabled by the Set Telco Alarm State command",
1728         "Can not be controlled/enabled"
1729 };
1730
1731 /* Get Telco Alarm Capabilities
1732  */
1733 static void
1734 rs29(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1735 {
1736         static const gint * picmg_29_caps[] = {
1737                 &hf_ipmi_picmg_29_maj_rst,
1738                 &hf_ipmi_picmg_29_min_rst,
1739                 &hf_ipmi_picmg_29_alarm_cut,
1740                 &hf_ipmi_picmg_29_test_mode,
1741                 &hf_ipmi_picmg_29_pwr_alarm,
1742                 &hf_ipmi_picmg_29_minor_alarm,
1743                 &hf_ipmi_picmg_29_major_alarm,
1744                 &hf_ipmi_picmg_29_crit_alarm,
1745                 NULL
1746         };
1747         proto_tree_add_bitmask(tree, tvb, 0, hf_ipmi_picmg_29_rs_byte3,
1748                         ett_ipmi_picmg_29_rs_byte3, picmg_29_caps,
1749                         ENC_LITTLE_ENDIAN);
1750 }
1751
1752 static const value_string picmg_2a_alarm_ids[] = {
1753         { 0, "Critical Alarm" },
1754         { 1, "Major Alarm" },
1755         { 2, "Minor Alarm" },
1756         { 3, "Power Alarm" },
1757         { 4, "Alarm Cutoff" },
1758         { 0, NULL }
1759 };
1760
1761 static const value_string picmg_2a_alarm_ctrls[] = {
1762         { 0, "off / cutoff disabled" },
1763         { 1, "on / cutoff enabled" },
1764         { 0xFF, "test mode" },
1765         { 0, NULL }
1766 };
1767
1768 /* Set Telco Alarm State
1769  */
1770 static void
1771 rq2a(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1772 {
1773         proto_tree_add_item(tree, hf_ipmi_picmg_05_fruid,
1774                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1775         proto_tree_add_item(tree, hf_ipmi_picmg_2a_alarm_id,
1776                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
1777         proto_tree_add_item(tree, hf_ipmi_picmg_2a_alarm_ctrl,
1778                         tvb, 2, 1, ENC_LITTLE_ENDIAN);
1779 }
1780
1781 /* Get Telco Alarm State
1782  */
1783 static void
1784 rq2b(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1785 {
1786         proto_tree_add_item(tree, hf_ipmi_picmg_05_fruid,
1787                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1788         proto_tree_add_item(tree, hf_ipmi_picmg_2a_alarm_id,
1789                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
1790 }
1791
1792 static void
1793 rs2b(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1794 {
1795         proto_tree_add_item(tree, hf_ipmi_picmg_2b_alarm_state,
1796                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
1797 }
1798
1799 static const value_string amc_clock_ids[] = {
1800         { 1, "TCLKA(CLK1A)" },
1801         { 2, "TCLKB(CLK1B)" },
1802         { 3, "TCLKC(CLK1)" },
1803         { 4, "TCLKD(CLK2A)" },
1804         { 5, "FCLKA(CLK2B)" },
1805         { 6, "CLK2" },
1806         { 7, "CLK3A" },
1807         { 8, "CLK3B" },
1808         { 9, "CLK3" },
1809         { 0, NULL }
1810 };
1811
1812 static const value_string amc_clock_dirs[] = {
1813         { 0, "Clock receiver" },
1814         { 1, "Clock source" },
1815         { 0, NULL }
1816 };
1817
1818 static const value_string amc_clock_plls[] = {
1819         { 0, "Default state" },
1820         { 1, "Connect through PLL" },
1821         { 2, "Bypass PLL" },
1822         { 0, NULL }
1823 };
1824
1825 static const range_string amc_clock_families[] = {
1826         { 0, 0, "Unspecified" },
1827         { 1, 1, "SONET/SDH/PDH" },
1828         { 2, 2, "Reserved for PCI Express" },
1829         { 3, 0xC8, "Reserved" },
1830         { 0xC9, 0xFF, "Vendor defined" },
1831         { 0, 0, NULL }
1832 };
1833
1834 static const value_string amc_clock_resource_types[] = {
1835         { 0, "On-Carrier device" },
1836         { 1, "AMC module" },
1837         { 2, "Backplane" },
1838         { 3, "Reserved" },
1839         { 0, NULL }
1840 };
1841
1842 static const int * amc_clock_setting[] = {
1843         &hf_ipmi_picmg_clock_pll,
1844         &hf_ipmi_picmg_clock_dir,
1845         &hf_ipmi_picmg_clock_state,
1846         NULL
1847 };
1848
1849 static const int * amc_clock_resource[] = {
1850         &hf_ipmi_picmg_clock_resource_type,
1851         &hf_ipmi_picmg_clock_resource_dev,
1852         NULL
1853 };
1854
1855 /* Set Clock State
1856  */
1857 static void
1858 rq2c(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1859 {
1860         proto_tree_add_item(tree, hf_ipmi_picmg_clock_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1861         proto_tree_add_item(tree, hf_ipmi_picmg_clock_cfg, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1862         proto_tree_add_bitmask(tree, tvb, 2, hf_ipmi_picmg_clock_setting,
1863                         ett_ipmi_picmg_clock_setting, amc_clock_setting, ENC_LITTLE_ENDIAN);
1864         if (tvb_captured_length(tvb) > 3) {
1865                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_family, tvb, 3, 1, ENC_LITTLE_ENDIAN);
1866                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_accuracy, tvb, 4, 1, ENC_LITTLE_ENDIAN);
1867                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_frequency, tvb, 5, 4, ENC_LITTLE_ENDIAN);
1868         }
1869         if (tvb_captured_length(tvb) > 9) {
1870                 proto_tree_add_bitmask(tree, tvb, 9, hf_ipmi_picmg_clock_resource,
1871                                 ett_ipmi_picmg_clock_res, amc_clock_resource, ENC_LITTLE_ENDIAN);
1872         }
1873 }
1874
1875 /* Get Clock State (request)
1876  */
1877 static void
1878 rq2d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1879 {
1880         proto_tree_add_item(tree, hf_ipmi_picmg_clock_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1881         if (tvb_captured_length(tvb) > 1) {
1882                 proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_picmg_clock_resource,
1883                                 ett_ipmi_picmg_clock_res, amc_clock_resource, ENC_LITTLE_ENDIAN);
1884         }
1885 }
1886
1887 /* Get Clock State (response)
1888  */
1889 static void
1890 rs2d(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1891 {
1892         proto_tree_add_bitmask(tree, tvb, 0, hf_ipmi_picmg_clock_setting,
1893                         ett_ipmi_picmg_clock_setting, amc_clock_setting, ENC_LITTLE_ENDIAN);
1894         if (tvb_captured_length(tvb) > 1) {
1895                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_cfg, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1896                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_family, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1897                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_accuracy, tvb, 3, 1, ENC_LITTLE_ENDIAN);
1898                 proto_tree_add_item(tree, hf_ipmi_picmg_clock_frequency, tvb, 4, 4, ENC_LITTLE_ENDIAN);
1899         }
1900 }
1901
1902 static void
1903 add_component_bits(proto_tree *tree, tvbuff_t *tvb, guint offs, const char *desc)
1904 {
1905         static const gint *compbits[] = { &hf_ipmi_picmg_XX_comp7, &hf_ipmi_picmg_XX_comp6, &hf_ipmi_picmg_XX_comp5,
1906                 &hf_ipmi_picmg_XX_comp4, &hf_ipmi_picmg_XX_comp3, &hf_ipmi_picmg_XX_comp2, &hf_ipmi_picmg_XX_comp1, &hf_ipmi_picmg_XX_comp0, NULL };
1907
1908         proto_tree_add_bitmask_text(tree, tvb, offs, 1, desc, "None",
1909                         ett_ipmi_picmg_XX_compbits, compbits, ENC_LITTLE_ENDIAN, 0);
1910 }
1911
1912 /* Get Target Upgrade Capabilities
1913  */
1914 static void
1915 rs2e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1916 {
1917         static const gint *byte2[] = { &hf_ipmi_picmg_2e_upgrade_undesirable, &hf_ipmi_picmg_2e_auto_rollback_override,
1918                 &hf_ipmi_picmg_2e_ipmc_degraded, &hf_ipmi_picmg_2e_deferred_activate, &hf_ipmi_picmg_2e_services_affected,
1919                 &hf_ipmi_picmg_2e_manual_rollback, &hf_ipmi_picmg_2e_auto_rollback, &hf_ipmi_picmg_2e_self_test, NULL };
1920
1921         proto_tree_add_item(tree, hf_ipmi_picmg_2e_version, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1922         proto_tree_add_bitmask_text(tree, tvb, 1, 1, "Capabilities: ", "None",
1923                         ett_ipmi_picmg_2e_byte2, byte2, ENC_LITTLE_ENDIAN, 0);
1924         proto_tree_add_item(tree, hf_ipmi_picmg_2e_upgrade_tout, tvb, 2, 1, ENC_LITTLE_ENDIAN);
1925         proto_tree_add_item(tree, hf_ipmi_picmg_2e_selftest_tout, tvb, 3, 1, ENC_LITTLE_ENDIAN);
1926         proto_tree_add_item(tree, hf_ipmi_picmg_2e_rollback_tout, tvb, 4, 1, ENC_LITTLE_ENDIAN);
1927         proto_tree_add_item(tree, hf_ipmi_picmg_2e_inaccessibility_tout, tvb, 5, 1, ENC_LITTLE_ENDIAN);
1928         add_component_bits(tree, tvb, 6, "Components present: ");
1929 }
1930
1931 static const value_string cc2e[] = {
1932         { 0x81, "Firmware Upgrade is not supported over this interface" },
1933         { 0, NULL }
1934 };
1935
1936 /* Get Component Properties
1937  */
1938 static void
1939 prop_00(tvbuff_t *tvb, proto_tree *tree)
1940 {
1941         static const gint *byte1[] = { &hf_ipmi_picmg_prop00_cold_reset, &hf_ipmi_picmg_prop00_deferred_activation,
1942                 &hf_ipmi_picmg_prop00_comparison, &hf_ipmi_picmg_prop00_preparation, &hf_ipmi_picmg_prop00_rollback, NULL };
1943
1944         proto_tree_add_bitmask_text(tree, tvb, 0, 1, "General Component Properties: ", "None",
1945                         ett_ipmi_picmg_prop00_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
1946 }
1947
1948 static void
1949 parse_version(tvbuff_t *tvb, proto_tree *tree)
1950 {
1951         static const gint *byte1[] = { &hf_ipmi_picmg_prop01_fw_major, NULL };
1952
1953         proto_tree_add_bitmask_text(tree, tvb, 0, 1, NULL, NULL,
1954                         ett_ipmi_picmg_prop01_byte1, byte1, ENC_LITTLE_ENDIAN, 0);
1955         proto_tree_add_item(tree, hf_ipmi_picmg_prop01_fw_minor, tvb, 1, 1, ENC_LITTLE_ENDIAN);
1956         proto_tree_add_item(tree, hf_ipmi_picmg_prop01_fw_aux, tvb, 2, 4, ENC_NA);
1957 }
1958
1959 static void
1960 prop_02(tvbuff_t *tvb, proto_tree *tree)
1961 {
1962         guint len = tvb_captured_length(tvb);
1963
1964         if (len > 12) {
1965                 len = 12;
1966         }
1967         proto_tree_add_item(tree, hf_ipmi_picmg_prop02_desc, tvb, 0, len, ENC_ASCII|ENC_NA);
1968 }
1969
1970 static const struct {
1971         void (*intrp)(tvbuff_t *tvb, proto_tree *tree);
1972         const char *name;
1973 } compprops[] = {
1974         { prop_00, "General Component Properties" },
1975         { parse_version, "Current Version" },
1976         { prop_02, "Description String" },
1977         { parse_version, "Rollback firmware version" },
1978         { parse_version, "Deferred upgrade firmware version" }
1979 };
1980
1981 static void
1982 rq2f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
1983 {
1984         guint8 pno = tvb_get_guint8(tvb, 1);
1985         const char *desc;
1986
1987         ipmi_set_data(pinfo, 0, pno);
1988         if (!tree) {
1989                 return;
1990         }
1991
1992         if (pno < array_length(compprops)) {
1993                 desc = compprops[pno].name;
1994         } else if (pno >= 0xC0) {
1995                 desc = "OEM";
1996         } else {
1997                 desc = "Reserved";
1998         }
1999
2000         proto_tree_add_item(tree, hf_ipmi_picmg_2f_comp_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2001         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_2f_comp_prop, tvb, 1, 1, pno,
2002                         "%s (0x%02x)", desc, pno);
2003 }
2004
2005 static void
2006 rs2f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2007 {
2008         guint32 pno;
2009         const char *desc;
2010         proto_item *ti;
2011
2012         if (!ipmi_get_data(pinfo, 0, &pno)) {
2013                 /* Can't parse further if property selector is not known */
2014                 proto_tree_add_item(tree, hf_ipmi_picmg_2f_prop_data, tvb, 0, -1, ENC_NA);
2015                 return;
2016         }
2017
2018         if (pno < array_length(compprops)) {
2019                 desc = compprops[pno].name;
2020         } else if (pno >= 0xC0) {
2021                 desc = "OEM";
2022         } else {
2023                 desc = "Reserved";
2024         }
2025
2026         ti = proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_2f_comp_prop, tvb, 0, 0, pno, "%s (0x%02x)", desc, pno);
2027         PROTO_ITEM_SET_GENERATED(ti);
2028         if (pno < array_length(compprops)) {
2029                 compprops[pno].intrp(tvb, tree);
2030         } else {
2031                 proto_tree_add_item(tree, hf_ipmi_picmg_2f_prop_data, tvb, 0, -1, ENC_NA);
2032         }
2033 }
2034
2035 static const value_string cc2f[] = {
2036         { 0x81, "Firmware Upgrade is not supported over this interface" },
2037         { 0x82, "Invalid Component ID" },
2038         { 0x83, "Invalid Component property selector" },
2039         { 0, NULL }
2040 };
2041
2042 /* Abort Firmware Upgrade
2043  */
2044 static const value_string cc30[] = {
2045         { 0x80, "Firmware Upgrade cannot be aborted at this moment" },
2046         { 0x81, "Firmware Upgrade aborted, IPMC cannot resume normal operation" },
2047         { 0, NULL }
2048 };
2049
2050 /* Initiate upgrade action
2051  */
2052 static void
2053 rq31(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2054 {
2055         add_component_bits(tree, tvb, 0, "Components: ");
2056         proto_tree_add_item(tree, hf_ipmi_picmg_31_action, tvb, 1, 1, ENC_LITTLE_ENDIAN);
2057 }
2058
2059 static const value_string cc31[] = {
2060         { 0x80, "Command in progress" },
2061         { 0x81, "Invalid component" },
2062         { 0, NULL }
2063 };
2064
2065 /* Upload Firmware Block
2066  */
2067 static void
2068 rq32(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2069 {
2070         proto_tree_add_item(tree, hf_ipmi_picmg_32_block, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2071         proto_tree_add_item(tree, hf_ipmi_picmg_32_data, tvb, 1, -1, ENC_NA);
2072 }
2073
2074 static void
2075 rs32(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2076 {
2077         if (tvb_captured_length(tvb) > 0) {
2078                 proto_tree_add_item(tree, hf_ipmi_picmg_32_sec_offs, tvb, 0, 4, ENC_LITTLE_ENDIAN);
2079                 proto_tree_add_item(tree, hf_ipmi_picmg_32_sec_len, tvb, 4, 4, ENC_LITTLE_ENDIAN);
2080         }
2081 }
2082
2083 static const value_string cc32[] = {
2084         { 0x80, "Command in progress" },
2085         { 0x81, "Invalid component" },
2086         { 0x82, "Internal checksum error detected in the received blocks" },
2087         { 0, NULL }
2088 };
2089
2090 /* Finish Firmware Upgrade
2091  */
2092 static void
2093 rq33(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2094 {
2095         proto_tree_add_item(tree, hf_ipmi_picmg_33_comp_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2096         proto_tree_add_item(tree, hf_ipmi_picmg_33_img_len, tvb, 1, 4, ENC_LITTLE_ENDIAN);
2097 }
2098
2099 static const value_string cc33[] = {
2100         { 0x80, "Command in progress" },
2101         { 0x81, "Number of bytes received does not match size in the request" },
2102         { 0x82, "Internal checksum error detected in the received image" },
2103         { 0x83, "Uploaded firmware does not match current" },
2104         { 0, NULL }
2105 };
2106
2107 /* Get Upgrade Status
2108  */
2109 static void
2110 rs34(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2111 {
2112         static const guint8 sig = 0;
2113         static const gint *byte3[] = { &hf_ipmi_picmg_34_percentage, NULL };
2114         guint8 v;
2115         ipmi_cmd_t *c;
2116
2117         v = tvb_get_guint8(tvb, 0);
2118         c = ipmi_getcmd(ipmi_getnetfn(IPMI_GROUP_REQ, &sig), v);
2119         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_34_cmd, tvb, 0, 1, v,
2120                         "%s (0x%02x)", c->desc, v);
2121         v = tvb_get_guint8(tvb, 1);
2122         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_34_ccode, tvb, 1, 1, v,
2123                         "%s (0x%02x)", ipmi_get_completion_code(v, c), v);
2124         if (tvb_captured_length(tvb) > 2) {
2125                 proto_tree_add_bitmask_text(tree, tvb, 2, 1, NULL, NULL,
2126                                 ett_ipmi_picmg_34_byte3, byte3, ENC_LITTLE_ENDIAN, 0);
2127         }
2128 }
2129
2130 static const value_string cc34[] = {
2131         { 0x80, "Command in progress" },
2132         { 0, NULL }
2133 };
2134
2135 /* Activate Firmware
2136  */
2137 static void
2138 rq35(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2139 {
2140         if (tvb_captured_length(tvb) > 0) {
2141                 proto_tree_add_item(tree, hf_ipmi_picmg_35_rollback_override, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2142         }
2143 }
2144
2145 static const value_string cc35[] = {
2146         { 0x80, "Command in progress" },
2147         { 0, NULL }
2148 };
2149
2150 /* Query Self-test Results
2151  */
2152 static void
2153 rs36(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2154 {
2155         static const gint *byte2[] = { &hf_ipmi_picmg_36_fail_sel, &hf_ipmi_picmg_36_fail_sdr,
2156                 &hf_ipmi_picmg_36_fail_bmc_fru, &hf_ipmi_picmg_36_fail_ipmb_sig, &hf_ipmi_picmg_36_fail_sdr_empty,
2157                 &hf_ipmi_picmg_36_fail_iua, &hf_ipmi_picmg_36_fail_bb_fw, &hf_ipmi_picmg_36_fail_oper_fw, NULL };
2158         int res, fail;
2159
2160         res = tvb_get_guint8(tvb, 0);
2161         fail = tvb_get_guint8(tvb, 1);
2162
2163         proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_36_result, tvb, 0, 1,
2164                         res, "%s (0x%02x)",
2165                         val_to_str_const(res, vals_36_result, "Device-specific internal failure"),
2166                         res);
2167
2168         if (res == 0x55 || res == 0xff) {
2169                 proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_36_fail, tvb, 1, 1,
2170                                 fail, "0x%02x (must be 0x00)",
2171                                 fail);
2172         } else if (res == 0x57) {
2173                 proto_tree_add_bitmask(tree, tvb, 1, hf_ipmi_picmg_36_fail, ett_ipmi_picmg_36_byte2, byte2, ENC_LITTLE_ENDIAN);
2174         } else if (res == 0x60) {
2175                 add_component_bits(tree, tvb, 1, "Failed components: ");
2176         } else {
2177                 proto_tree_add_uint_format_value(tree, hf_ipmi_picmg_36_fail, tvb, 1, 1,
2178                                 fail, "0x%02x (device-specific)", fail);
2179         }
2180 }
2181
2182 static const value_string cc36[] = {
2183         { 0x80, "Self-test in progress" },
2184         { 0x81, "Firmware upgrade not supported over this interface" },
2185         { 0, NULL }
2186 };
2187
2188 /* Query Rollback Results
2189  */
2190 static void
2191 rs37(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2192 {
2193         static const gint *byte2[] = { &hf_ipmi_picmg_37_percent, NULL };
2194         const char *desc;
2195
2196         switch (ipmi_get_ccode(pinfo)) {
2197         case 0x00: desc = "Components completed rollback: "; break;
2198         case 0x80: desc = "Components (should be None): "; break;
2199         case 0x81: desc = "Components failed to rollback: "; break;
2200         default: desc = "Components (ignored): "; break;
2201         }
2202
2203         add_component_bits(tree, tvb, 0, desc);
2204         if (tvb_captured_length(tvb) > 1) {
2205                 proto_tree_add_bitmask_text(tree, tvb, 1, 1, NULL, NULL,
2206                                 ett_ipmi_picmg_37_byte2, byte2, ENC_LITTLE_ENDIAN, 0);
2207         }
2208 }
2209
2210 /* Get HPM.x Capabilities
2211  */
2212 static void
2213 rq3e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2214 {
2215         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2216 }
2217
2218 static void
2219 rs3e(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2220 {
2221         static const gint *hpm2_caps[] = {
2222                         &hf_ipmi_picmg_hpm2_dyn_ssn,
2223                         &hf_ipmi_picmg_hpm2_ver_chg,
2224                         &hf_ipmi_picmg_hpm2_ext_mgt,
2225                         &hf_ipmi_picmg_hpm2_pkt_trc,
2226                         &hf_ipmi_picmg_hpm2_sol_ext,
2227                         NULL };
2228         guint8 hpm_x;
2229
2230         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_id, tvb, 0, 1, ENC_LITTLE_ENDIAN);
2231         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_rev, tvb, 1, 1, ENC_LITTLE_ENDIAN);
2232
2233         hpm_x = tvb_get_guint8(tvb, 0);
2234
2235         if (hpm_x == 2) {
2236                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm2_mask, tvb, 2, 2, ENC_LITTLE_ENDIAN);
2237                 if (tvb_captured_length(tvb) > 4) {
2238                         proto_tree_add_bitmask(tree, tvb, 4, hf_ipmi_picmg_hpm2_caps,
2239                                         ett_ipmi_picmg_hpm_caps, hpm2_caps, ENC_LITTLE_ENDIAN);
2240                 }
2241                 if (tvb_captured_length(tvb) > 5) {
2242                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_oem_start,
2243                                         tvb, 5, 1, ENC_LITTLE_ENDIAN);
2244                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_oem_rev,
2245                                         tvb, 6, 1, ENC_LITTLE_ENDIAN);
2246                 }
2247                 if (tvb_captured_length(tvb) > 7) {
2248                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm2_sol_oem_start,
2249                                         tvb, 7, 1, ENC_LITTLE_ENDIAN);
2250                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm2_sol_oem_rev,
2251                                         tvb, 8, 1, ENC_LITTLE_ENDIAN);
2252                 }
2253         } else if (hpm_x == 3) {
2254                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_oem_start,
2255                                 tvb, 2, 1, ENC_LITTLE_ENDIAN);
2256                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_oem_rev,
2257                                 tvb, 3, 1, ENC_LITTLE_ENDIAN);
2258         }
2259 }
2260
2261 static const value_string hpm2_func_selectors[] = {
2262         { 0x0, "Create Credentials" },
2263         { 0x1, "Get Session Info" },
2264         { 0x2, "Get User Name, least significant bytes" },
2265         { 0x3, "Get User Name, most significant bytes" },
2266         { 0x4, "Get Password, least significant bytes" },
2267         { 0x5, "Get Password, most significant bytes" },
2268         { 0x6, "Get BMC Key, least significant bytes" },
2269         { 0x7, "Get BMC Key, most significant bytes" },
2270         { 0, NULL }
2271 };
2272
2273 static const value_string hpm2_ipmi_revs[] = {
2274         { 0x0, "IPMI 1.5 session" },
2275         { 0x1, "IPMI 2.0 session" },
2276         { 0, NULL }
2277 };
2278
2279 static const value_string hpm2_auth_types[] = {
2280         { 0x0, "None" },
2281         { 0x1, "MD2" },
2282         { 0x2, "MD5" },
2283         { 0x4, "Straight password" },
2284         { 0x5, "OEM" },
2285         { 0, NULL }
2286 };
2287
2288 /* Get Dynamic Credentials
2289  */
2290 static void
2291 rq3f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2292 {
2293         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_cred_hnd,
2294                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2295         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_func_sel,
2296                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2297         if (!tvb_get_guint8(tvb, 1)) {
2298                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ipmi_rev,
2299                                 tvb, 2, 1, ENC_LITTLE_ENDIAN);
2300                 if (tvb_get_guint8(tvb, 2)) {
2301                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_cipher_id,
2302                                         tvb, 3, 1, ENC_LITTLE_ENDIAN);
2303                 } else {
2304                         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_auth_type,
2305                                         tvb, 3, 1, ENC_LITTLE_ENDIAN);
2306                 }
2307                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_priv_level,
2308                                 tvb, 4, 1, ENC_LITTLE_ENDIAN);
2309                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_chn_num,
2310                                 tvb, 5, 1, ENC_LITTLE_ENDIAN);
2311                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_avail_time,
2312                                 tvb, 6, 4, ENC_LITTLE_ENDIAN);
2313                 proto_tree_add_item(tree, hf_ipmi_picmg_21_ipaddr,
2314                                 tvb, 10, 4, ENC_BIG_ENDIAN);
2315         }
2316 }
2317
2318 static void
2319 rs3f(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2320 {
2321         guint8 func;
2322
2323         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_cred_hnd,
2324                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2325         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_func_sel,
2326                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2327
2328         func = tvb_get_guint8(tvb, 1);
2329
2330         switch (func) {
2331         case 0:
2332         case 1:
2333                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_avail_time,
2334                                 tvb, 2, 4, ENC_LITTLE_ENDIAN);
2335                 break;
2336         case 2:
2337         case 3:
2338                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_user_name,
2339                                 tvb, 2, 8, ENC_NA);
2340                 break;
2341         case 4:
2342         case 5:
2343                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_user_pwd,
2344                                 tvb, 2, 10, ENC_NA);
2345                 break;
2346         case 6:
2347         case 7:
2348                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_bmc_key,
2349                                 tvb, 2, 10, ENC_NA);
2350                 break;
2351         }
2352 }
2353
2354 static const value_string picmg40_operations[] = {
2355         { 0x0, "Initiate new operation" },
2356         { 0x1, "Poll for completion status" },
2357         { 0, NULL }
2358 };
2359
2360 static const value_string cc40[] = {
2361         { 0x80, "In progress" },
2362         { 0x81, "No previous establishment request" },
2363         { 0x82, "LAN sessions are not supported" },
2364         { 0x83, "Error trying to establish a session" },
2365         { 0, NULL }
2366 };
2367
2368 /* Get Session Handle for Explicit LAN Bridging
2369  */
2370 static void
2371 rq40(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2372 {
2373         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_ipmbaddr,
2374                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2375         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_fruid,
2376                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2377         if (tvb_captured_length(tvb) > 2) {
2378                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_operation,
2379                                 tvb, 2, 1, ENC_LITTLE_ENDIAN);
2380         }
2381 }
2382
2383 static void
2384 rs40(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2385 {
2386         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_chn_num,
2387                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2388         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ssn_hnd,
2389                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2390         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ssn_hnd,
2391                         tvb, 2, 1, ENC_LITTLE_ENDIAN);
2392         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ssn_hnd,
2393                         tvb, 3, 1, ENC_LITTLE_ENDIAN);
2394 }
2395
2396 static const value_string cc37[] = {
2397         { 0x80, "Rollback in progress" },
2398         { 0x81, "Rollback failure" },
2399         { 0x82, "Rollback overridden" },
2400         { 0x83, "Rollback denied for integrity reasons" },
2401         { 0, NULL }
2402 };
2403
2404 /* Initiate Manual Rollback
2405  */
2406 static const value_string cc38[] = {
2407         { 0x80, "Rollback in progress" },
2408         { 0, NULL }
2409 };
2410
2411 static const value_string hpm_x_ids[] = {
2412         { 0x02, "HPM.2" },
2413         { 0x03, "HPM.3" },
2414         { 0, NULL }
2415 };
2416
2417 /* Get ATCA Extended Management Resources
2418  */
2419 static void
2420 rs41(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2421 {
2422         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_power_draw,
2423                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2424         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_base_channels,
2425                         tvb, 1, 2, ENC_LITTLE_ENDIAN);
2426         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_fabric_channels,
2427                         tvb, 3, 2, ENC_LITTLE_ENDIAN);
2428         if (tvb_captured_length(tvb) > 5) {
2429                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_update_channels,
2430                                 tvb, 5, 1, ENC_LITTLE_ENDIAN);
2431         }
2432         if (tvb_captured_length(tvb) > 6) {
2433                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_cross_channels,
2434                                 tvb, 6, 1, ENC_LITTLE_ENDIAN);
2435         }
2436 }
2437
2438
2439 static const value_string amc_resource_types[] = {
2440         { 0, "On-Carrier device (IRTM, MCH)" },
2441         { 1, "AMC module" },
2442         { 0, NULL }
2443 };
2444
2445 /* Get AMC Extended Management Resources
2446  */
2447 static void
2448 rs42(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2449 {
2450         static const gint *amc_resource_type[] = {
2451                         &hf_ipmi_picmg_linkinfo_dev_type,
2452                         &hf_ipmi_picmg_linkinfo_dev_id,
2453                         NULL };
2454         guint8 num, i;
2455
2456         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_power_draw,
2457                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2458         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_num_chn_desc,
2459                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2460
2461         num = tvb_get_guint8(tvb, 1);
2462
2463         for (i = 0; i < num; i++) {
2464                 proto_tree_add_bitmask(tree, tvb, 2 + i * 5,
2465                                 hf_ipmi_picmg_linkinfo_dev, ett_ipmi_picmg_link_dev,
2466                                 amc_resource_type, ENC_LITTLE_ENDIAN);
2467                 proto_tree_add_item(tree, hf_ipmi_picmg_hpm_chn_mask,
2468                                 tvb, 3 + i * 5, 4, ENC_LITTLE_ENDIAN);
2469         }
2470 }
2471
2472 /* Set ATCA Extended Management State
2473  */
2474 static void
2475 rq43(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2476 {
2477         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ext_mgmt_state,
2478                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2479         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_polling_period,
2480                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2481 }
2482
2483 /* Get ATCA Extended Management State
2484  */
2485 static void
2486 rs44(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2487 {
2488         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_ext_mgmt_state,
2489                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2490 }
2491
2492 static const value_string auth_pwr_states[] = {
2493         { 0, "Normal. Full Payload Power." },
2494         { 1, "Extended Management Power" },
2495         { 0, NULL }
2496 };
2497
2498 static const value_string amc_pwr_states[] = {
2499         { 0, "Standard Management Power" },
2500         { 1, "Extended Management Power" },
2501         { 2, "Full Payload Power." },
2502         { 0, NULL }
2503 };
2504
2505 /* Set AMC Power State
2506  */
2507 static void
2508 rq45(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2509 {
2510         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_auth_pwr_state,
2511                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2512 }
2513
2514 /* Get AMC Power State
2515  */
2516 static void
2517 rs46(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2518 {
2519         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_auth_pwr_state,
2520                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2521         proto_tree_add_item(tree, hf_ipmi_picmg_hpm_amc_pwr_state,
2522                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2523 }
2524
2525 static const value_string picmg47_flags[] = {
2526         { 0, "Assign Payload Instance." },
2527         { 1, "Return Assigned Instance" },
2528         { 0, NULL }
2529 };
2530
2531 static const value_string picmg47_states[] = {
2532         { 0, "No session currently opened on this System Serial Port." },
2533         { 1, "A session already opened on this System Serial Port." },
2534         { 0, NULL }
2535 };
2536
2537 static const value_string cc47[] = {
2538         { 0x80, "Payload Instance can not be assigned at this time." },
2539         { 0, NULL }
2540 };
2541
2542 /* Assign SOL Payload Instance
2543  */
2544 static void
2545 rq47(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2546 {
2547         proto_tree_add_item(tree, hf_ipmi_picmg47_port,
2548                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2549         proto_tree_add_item(tree, hf_ipmi_picmg47_flags,
2550                         tvb, 1, 1, ENC_LITTLE_ENDIAN);
2551
2552 }
2553
2554 static void
2555 rs47(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2556 {
2557         static const gint *byte1[] = {
2558                         &hf_ipmi_picmg47_state,
2559                         &hf_ipmi_picmg47_instance,
2560                         NULL };
2561
2562         proto_tree_add_bitmask(tree, tvb, 0, hf_ipmi_picmg47_assignment,
2563                         ett_ipmi_picmg_47_byte1, byte1, ENC_LITTLE_ENDIAN);
2564 }
2565
2566 static const value_string picmg48_fru_types[] = {
2567         { 0, "None" },
2568         { 1, "IPMB-L address of subsidiary MMC" },
2569         { 2, "IPMB-0 address of subsidiary EMMC" },
2570         { 3, "FRU Device ID of subsidiary FRU" },
2571         { 0, NULL }
2572 };
2573
2574 static const value_string picmg48_ip_sources[] = {
2575         { 0, "Not configured for HPM.3" },
2576         { 2, "DHCP assigned" },
2577         { 4, "DHCP Proxy assigned" },
2578         { 0, NULL }
2579 };
2580
2581 /* Get IP Address Source
2582  */
2583 static void
2584 rq48(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2585 {
2586         proto_tree_add_item(tree, hf_ipmi_picmg_01_rs_ipmbaddr,
2587                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2588         if (tvb_captured_length(tvb) > 1) {
2589                 proto_tree_add_item(tree, hf_ipmi_picmg48_sub_fru_type,
2590                                 tvb, 1, 1, ENC_LITTLE_ENDIAN);
2591         }
2592         if (tvb_captured_length(tvb) > 2) {
2593                 proto_tree_add_item(tree, hf_ipmi_picmg48_sub_fru_id,
2594                                 tvb, 2, 1, ENC_LITTLE_ENDIAN);
2595         }
2596 }
2597
2598 static void
2599 rs48(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
2600 {
2601         proto_tree_add_item(tree, hf_ipmi_picmg48_ip_source,
2602                         tvb, 0, 1, ENC_LITTLE_ENDIAN);
2603 }
2604
2605 static ipmi_cmd_t cmd_picmg[] = {
2606         /* AdvancedTCA Commands */
2607         { 0x00, NULL, rs00, NULL, NULL, "[ATCA] Get PICMG Properties", 0 },
2608         { 0x01, rq01, rs01, NULL, NULL, "[ATCA] Get Address Info", 0 },
2609         { 0x02, NULL, rs02, NULL, NULL, "[ATCA] Get Shelf Address Info", 0 },
2610         { 0x03, rq03, NULL, NULL, NULL, "[ATCA] Set Shelf Address Info", 0 },
2611         { 0x04, rq04, NULL, NULL, NULL, "[ATCA] FRU Control", 0 },
2612         { 0x05, rq05, rs05, NULL, NULL, "[ATCA] Get FRU LED Properties", 0 },
2613         { 0x06, rq06, rs06, NULL, NULL, "[ATCA] Get LED Color Capabilities", 0 },
2614         { 0x07, rq07, NULL, NULL, NULL, "[ATCA] Set FRU LED State", 0 },
2615         { 0x08, rq08, rs08, NULL, NULL, "[ATCA] Get FRU LED State", 0 },
2616         { 0x09, rq09, NULL, NULL, NULL, "[ATCA] Set IPMB State", 0 },
2617         { 0x0a, rq0a, NULL, NULL, NULL, "[ATCA] Set FRU Activation Policy", 0 },
2618         { 0x0b, rq0b, rs0b, NULL, NULL, "[ATCA] Get FRU Activation Policy", 0 },
2619         { 0x0c, rq0c, NULL, NULL, NULL, "[ATCA] Set FRU Activation", 0 },
2620         { 0x0d, rq0d, rs0d, NULL, NULL, "[ATCA] Get Device Locator Record ID", 0 },
2621         { 0x0e, rq0e, NULL, NULL, NULL, "[ATCA] Set Port State", 0 },
2622         { 0x0f, rq0f, rs0f, NULL, NULL, "[ATCA] Get Port State", 0 },
2623         { 0x10, rq10, rs10, NULL, NULL, "[ATCA] Compute Power Properties", 0 },
2624         { 0x11, rq11, NULL, NULL, NULL, "[ATCA] Set Power Level", 0 },
2625         { 0x12, rq12, rs12, NULL, NULL, "[ATCA] Get Power Level", 0 },
2626         { 0x13, rq13, NULL, NULL, NULL, "[ATCA] Renegotiate Power", 0 },
2627         { 0x14, rq14, rs14, NULL, NULL, "[ATCA] Get Fan Speed Properties", 0 },
2628         { 0x15, rq15, NULL, NULL, NULL, "[ATCA] Set Fan Level", 0 },
2629         { 0x16, rq16, rs16, NULL, NULL, "[ATCA] Get Fan Level", 0 },
2630         { 0x17, rq17, rs17, NULL, NULL, "[ATCA] Bused Resource Control", CMD_CALLRQ },
2631         { 0x18, rq18, rs18, NULL, NULL, "[ATCA] Get IPMB Link Info", 0 },
2632         { 0x19, rq19, NULL, NULL, NULL, "[AMC.0] Set AMC Port State", 0 },
2633         { 0x1a, rq1a, rs1a, NULL, NULL, "[AMC.0] Get AMC Port State", 0 },
2634         { 0x1b, NULL, rs1b, NULL, NULL, "[ATCA] Get Shelf Manager IPMB Address", 0 },
2635         { 0x1c, rq1c, NULL, NULL, NULL, "[ATCA] Set Fan Policy", 0 },
2636         { 0x1d, rq1d, rs1d, NULL, NULL, "[ATCA] Get Fan Policy", 0 },
2637         { 0x1e, rq1e, rs1e, NULL, NULL, "[ATCA] FRU Control Capabilities", 0 },
2638         { 0x1f, rq1f, rs1f, cc1f, NULL, "[ATCA] FRU Inventory Device Lock Control", 0 },
2639         { 0x20, rq20, rs20, cc20, NULL, "[ATCA] FRU Inventory Device Write", 0 },
2640         { 0x21, rq21, rs21, NULL, NULL, "[ATCA] Get Shelf Manager IP Addresses", 0 },
2641         { 0x22, rq22, rs22, NULL, NULL, "[ATCA] Get Shelf Power Allocation", CMD_CALLRQ },
2642         { 0x23, rq23, rs23, NULL, NULL, "[uTCA] Get Location Information", 0 },
2643         { 0x24, rq24, NULL, NULL, NULL, "[uTCA] Power Channel Control", 0 },
2644         { 0x25, rq25, rs25, NULL, NULL, "[uTCA] Get Power Channel Status", 0 },
2645         { 0x26, rq26, NULL, NULL, NULL, "[uTCA] PM Reset", 0 },
2646         { 0x27, rq26, rs27, NULL, NULL, "[uTCA] Get PM Status", 0 },
2647         { 0x28, rq28, NULL, cc28, NULL, "[uTCA] PM Heartbeat", 0 },
2648         { 0x29, rq05, rs29, NULL, NULL, "[uTCA] Get Telco Alarm Capability", 0 },
2649         { 0x2a, rq2a, NULL, NULL, NULL, "[uTCA] Set Telco Alarm State", 0 },
2650         { 0x2b, rq2b, rs2b, NULL, NULL, "[uTCA] Get Telco Alarm State", 0 },
2651         { 0x2c, rq2c, NULL, NULL, NULL, "[AMC.0] Set Clock State", 0 },
2652         { 0x2d, rq2d, rs2d, NULL, NULL, "[AMC.0] Get Clock State", 0 },
2653         { 0x2e, NULL, rs2e, cc2e, NULL, "[HPM.1] Get Target Upgrade Capabilities", 0 },
2654         { 0x2f, rq2f, rs2f, cc2f, NULL, "[HPM.1] Get Component Properties", CMD_CALLRQ },
2655         { 0x30, NULL, NULL, cc30, NULL, "[HPM.1] Abort Firmware Upgrade", 0 },
2656         { 0x31, rq31, NULL, cc31, NULL, "[HPM.1] Initiate Upgrade Action", 0 },
2657         { 0x32, rq32, rs32, cc32, NULL, "[HPM.1] Upload Firmware Block", 0 },
2658         { 0x33, rq33, NULL, cc33, NULL, "[HPM.1] Finish Firmware Upload", 0 },
2659         { 0x34, NULL, rs34, cc34, NULL, "[HPM.1] Get Upgrade Status", 0 },
2660         { 0x35, rq35, NULL, cc35, NULL, "[HPM.1] Activate Firmware", 0 },
2661         { 0x36, NULL, rs36, cc36, NULL, "[HPM.1] Query Self-test Results", 0 },
2662         { 0x37, NULL, rs37, cc37, NULL, "[HPM.1] Query Rollback Status", 0 },
2663         { 0x38, NULL, NULL, cc38, NULL, "[HPM.1] Initiate Manual Rollback", 0 },
2664         { 0x3e, rq3e, rs3e, NULL, NULL, "[HPM.2] Get HPM.x Capabilities", 0 },
2665         { 0x3f, rq3f, rs3f, NULL, NULL, "[HPM.2] Get Dynamic Credentials", 0 },
2666         { 0x40, rq40, rs40, cc40, NULL, "[HPM.2] Get Session Handle for Explicit LAN Bridging", 0 },
2667         { 0x41, NULL, rs41, NULL, NULL, "[HPM.2] Get ATCA Extended Management Resources", 0 },
2668         { 0x42, NULL, rs42, NULL, NULL, "[HPM.2] Get AMC Extended Management Resources", 0 },
2669         { 0x43, rq43, NULL, NULL, NULL, "[HPM.2] Set ATCA Extended Management State", 0 },
2670         { 0x44, NULL, rs44, NULL, NULL, "[HPM.2] Get ATCA Extended Management State", 0 },
2671         { 0x45, rq45, NULL, NULL, NULL, "[HPM.2] Set AMC Power State", 0 },
2672         { 0x46, NULL, rs46, NULL, NULL, "[HPM.2] Get AMC Power State", 0 },
2673         { 0x47, rq47, rs47, cc47, NULL, "[HPM.2] Assign SOL Payload Instance", 0 },
2674         { 0x48, rq48, rs48, NULL, NULL, "[HPM.3] Get IP Address Source", 0 }
2675 };
2676
2677 void
2678 proto_register_ipmi_picmg(void)
2679 {
2680         static hf_register_info hf[] = {
2681                 { &hf_ipmi_picmg_led_function,
2682                         { "LED Function",
2683                                 "ipmi.led.function", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2684                 { &hf_ipmi_picmg_led_on_duration,
2685                         { "On-duration",
2686                                 "ipmi.led.on_duration", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2687                 { &hf_ipmi_picmg_led_color,
2688                         { "Color",
2689                                 "ipmi.led.color", FT_UINT8, BASE_HEX, VALS(led_color_vals), 0x0f, NULL, HFILL }},
2690
2691                 { &hf_ipmi_picmg_linkinfo_grpid,
2692                         { "Grouping ID",
2693                                 "ipmi.linkinfo.grpid", FT_UINT32, BASE_DEC, NULL, 0xff000000, NULL, HFILL }},
2694                 { &hf_ipmi_picmg_linkinfo_type_ext,
2695                         { "Type extension",
2696                                 "ipmi.linkinfo.type_ext", FT_UINT32, BASE_HEX, NULL, 0x00f00000, NULL, HFILL }},
2697                 { &hf_ipmi_picmg_linkinfo_type,
2698                         { "Type",
2699                                 "ipmi.linkinfo.type", FT_UINT32, BASE_HEX, VALS(linkinfo_type_vals), 0x000ff000, NULL, HFILL }},
2700                 { &hf_ipmi_picmg_linkinfo_ports,
2701                         { "Ports",
2702                                 "ipmi.linkinfo.ports", FT_UINT32, BASE_HEX, VALS(linkinfo_ports_vals), 0x00000f00, NULL, HFILL }},
2703                 { &hf_ipmi_picmg_linkinfo_iface,
2704                         { "Interface",
2705                                 "ipmi.linkinfo.iface", FT_UINT32, BASE_HEX, VALS(linkinfo_iface_vals), 0x000000c0, NULL, HFILL }},
2706                 { &hf_ipmi_picmg_linkinfo_chan,
2707                         { "Channel",
2708                                 "ipmi.linkinfo.chan", FT_UINT32, BASE_DEC, NULL, 0x0000003f, NULL, HFILL }},
2709                 { &hf_ipmi_picmg_linkinfo_state,
2710                         { "State",
2711                                 "ipmi.linkinfo.state", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2712                 { &hf_ipmi_picmg_linkinfo,
2713                         { "Link Info",
2714                                 "ipmi.linkinfo", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
2715                 { &hf_ipmi_picmg_linkinfo_amc_chan,
2716                         { "Channel",
2717                                 "ipmi.linkinfo.chan", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2718                 { &hf_ipmi_picmg_linkinfo_amc_ports,
2719                         { "Ports",
2720                                 "ipmi.linkinfo.ports", FT_UINT24, BASE_HEX, VALS(linkinfo_ports_vals), 0x00000f, NULL, HFILL }},
2721                 { &hf_ipmi_picmg_linkinfo_amc_type,
2722                         { "Type",
2723                                 "ipmi.linkinfo.type", FT_UINT24, BASE_HEX, VALS(linkinfo_amc_type_vals), 0x000ff0, NULL, HFILL }},
2724                 { &hf_ipmi_picmg_linkinfo_amc_type_ext,
2725                         { "Type extension",
2726                                 "ipmi.linkinfo.type_ext", FT_UINT24, BASE_HEX, NULL, 0x00f000, NULL, HFILL }},
2727                 { &hf_ipmi_picmg_linkinfo_amc_grpid,
2728                         { "Grouping ID",
2729                                 "ipmi.linkinfo.grpid", FT_UINT24, BASE_DEC, NULL, 0xff0000, NULL, HFILL }},
2730                 { &hf_ipmi_picmg_linkinfo_state_0,
2731                         { "Enabled",
2732                                 "ipmi.linkinfo.state0", FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL }},
2733                 { &hf_ipmi_picmg_linkinfo_state_1,
2734                         { "Extended Management Link",
2735                                 "ipmi.linkinfo.state1", FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL }},
2736                 { &hf_ipmi_picmg_linkinfo_dev,
2737                         { "On-Carrier Device",
2738                                 "ipmi.linkinfo.dev", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2739                 { &hf_ipmi_picmg_linkinfo_dev_type,
2740                         { "Device Type",
2741                                 "ipmi.linkinfo.dev.type", FT_UINT8, BASE_DEC, VALS(amc_resource_types), 0x80, NULL, HFILL }},
2742                 { &hf_ipmi_picmg_linkinfo_dev_id,
2743                         { "Device ID",
2744                                 "ipmi.linkinfo.dev.id", FT_UINT8, BASE_DEC_HEX, NULL, 0xF, NULL, HFILL }},
2745
2746                 { &hf_ipmi_picmg_clock_id,
2747                         { "Clock ID",
2748                                 "ipmi.clock.id", FT_UINT8, BASE_HEX, VALS(amc_clock_ids), 0, NULL, HFILL }},
2749                 { &hf_ipmi_picmg_clock_cfg,
2750                         { "Clock Configuration Descriptor Index",
2751                                 "ipmi.clock.cfg", FT_UINT8, BASE_DEC_HEX, NULL, 0, NULL, HFILL }},
2752                 { &hf_ipmi_picmg_clock_setting,
2753                         { "Clock Setting",
2754                                 "ipmi.clock.setting", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2755                 { &hf_ipmi_picmg_clock_state,
2756                         { "Clock State",
2757                                 "ipmi.clock.state", FT_UINT8, BASE_DEC, VALS(enable_vals), 0x8, NULL, HFILL }},
2758                 { &hf_ipmi_picmg_clock_dir,
2759                         { "Clock Direction",
2760                                 "ipmi.clock.dir", FT_UINT8, BASE_DEC, VALS(amc_clock_dirs), 0x4, NULL, HFILL }},
2761                 { &hf_ipmi_picmg_clock_pll,
2762                         { "PLL Control",
2763                                 "ipmi.clock.pll", FT_UINT8, BASE_DEC, VALS(amc_clock_plls), 0x3, NULL, HFILL }},
2764                 { &hf_ipmi_picmg_clock_family,
2765                         { "Clock Family",
2766                                 "ipmi.clock.family", FT_UINT8, BASE_HEX|BASE_RANGE_STRING, RVALS(amc_clock_families), 0, NULL, HFILL }},
2767                 { &hf_ipmi_picmg_clock_accuracy,
2768                         { "Clock Accuracy",
2769                                 "ipmi.clock.accu", FT_UINT8, BASE_HEX_DEC, NULL, 0, NULL, HFILL }},
2770                 { &hf_ipmi_picmg_clock_frequency,
2771                         { "Clock Frequency",
2772                                 "ipmi.clock.freq", FT_UINT32, BASE_DEC_HEX, NULL, 0, NULL, HFILL }},
2773                 { &hf_ipmi_picmg_clock_resource,
2774                         { "Clock Resource ID",
2775                                 "ipmi.clock.res", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2776                 { &hf_ipmi_picmg_clock_resource_type,
2777                         { "Resource Type",
2778                                 "ipmi.clock.res.type", FT_UINT8, BASE_HEX, VALS(amc_clock_resource_types), 0xC0, NULL, HFILL }},
2779                 { &hf_ipmi_picmg_clock_resource_dev,
2780                         { "Device ID",
2781                                 "ipmi.clock.res.id", FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
2782
2783                 { &hf_ipmi_picmg_00_version,
2784                         { "PICMG Extension Version",
2785                                 "ipmi.picmg00.version", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_version), 0, NULL, HFILL }},
2786                 { &hf_ipmi_picmg_00_max_fruid,
2787                         { "Max FRU Device ID",
2788                                 "ipmi.picmg00.max_fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2789                 { &hf_ipmi_picmg_00_ipmc_fruid,
2790                         { "FRU Device ID for IPMC",
2791                                 "ipmi.picmg00.ipmc_fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2792
2793                 { &hf_ipmi_picmg_01_rq_fruid,
2794                         { "FRU ID",
2795                                 "ipmi.picmg01.rq_fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2796                 { &hf_ipmi_picmg_01_rq_addr_key_type,
2797                         { "Address Key Type",
2798                                 "ipmi.picmg01.rq_addr_key_type", FT_UINT8, BASE_HEX, VALS(addr_key_type_vals), 0, NULL, HFILL }},
2799                 { &hf_ipmi_picmg_01_rq_addr_key,
2800                         { "Address Key",
2801                                 "ipmi.picmg01.rq_addr_key", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2802                 { &hf_ipmi_picmg_01_rq_site_type,
2803                         { "Site Type",
2804                                 "ipmi.picmg01.rq_site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
2805                 { &hf_ipmi_picmg_01_rs_hwaddr,
2806                         { "Hardware Address",
2807                                 "ipmi.picmg01.rs_hwaddr", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2808                 { &hf_ipmi_picmg_01_rs_ipmbaddr,
2809                         { "IPMB Address",
2810                                 "ipmi.picmg01.rs_ipmbaddr", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2811                 { &hf_ipmi_picmg_01_rs_rsrv,
2812                         { "Reserved (shall be 0xFF)",
2813                                 "ipmi.picmg01.rs_rsrv", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2814                 { &hf_ipmi_picmg_01_rs_fruid,
2815                         { "FRU ID",
2816                                 "ipmi.picmg01.rs_fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2817                 { &hf_ipmi_picmg_01_rs_site_num,
2818                         { "Site Number",
2819                                 "ipmi.picmg01.rs_site_num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2820                 { &hf_ipmi_picmg_01_rs_site_type,
2821                         { "Site Type",
2822                                 "ipmi.picmg01.rs_site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
2823
2824                 { &hf_ipmi_picmg_02_shelf_address,
2825                         { "Shelf Address",
2826                                 "ipmi.picmg02.shelf_address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2827                 { &hf_ipmi_picmg_02_shelf_type,
2828                         { "Type",
2829                                 "ipmi.picmg02.shelf_type", FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL }},
2830                 { &hf_ipmi_picmg_02_shelf_length,
2831                         { "Length",
2832                                 "ipmi.picmg02.shelf_length", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL }},
2833
2834                 { &hf_ipmi_picmg_03_shelf_address,
2835                         { "Shelf Address",
2836                                 "ipmi.picmg03.shelf_address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
2837                 { &hf_ipmi_picmg_03_shelf_type,
2838                         { "Type",
2839                                 "ipmi.picmg03.shelf_type", FT_UINT8, BASE_DEC, NULL, 0xc0, NULL, HFILL }},
2840                 { &hf_ipmi_picmg_03_shelf_length,
2841                         { "Length",
2842                                 "ipmi.picmg03.shelf_length", FT_UINT8, BASE_DEC, NULL, 0x3f, NULL, HFILL }},
2843
2844                 { &hf_ipmi_picmg_04_fruid,
2845                         { "FRU ID",
2846                                 "ipmi.picmg04.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2847                 { &hf_ipmi_picmg_04_cmd,
2848                         { "Command",
2849                                 "ipmi.picmg04.cmd", FT_UINT8, BASE_HEX, VALS(vals_04_cmd), 0, NULL, HFILL }},
2850
2851                 { &hf_ipmi_picmg_05_fruid,
2852                         { "FRU ID",
2853                                 "ipmi.picmg05.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2854                 { &hf_ipmi_picmg_05_led3,
2855                         { "LED 3",
2856                                 "ipmi.picmg05.led3", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2857                 { &hf_ipmi_picmg_05_led2,
2858                         { "LED 2",
2859                                 "ipmi.picmg05.led2", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2860                 { &hf_ipmi_picmg_05_led1,
2861                         { "LED 1",
2862                                 "ipmi.picmg05.led1", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2863                 { &hf_ipmi_picmg_05_blue_led,
2864                         { "BLUE LED",
2865                                 "ipmi.picmg05.blue_led", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2866                 { &hf_ipmi_picmg_05_app_leds,
2867                         { "Application-specific LED Count",
2868                                 "ipmi.picmg05.app_leds", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2869
2870                 { &hf_ipmi_picmg_06_fruid,
2871                         { "FRU ID",
2872                                 "ipmi.picmg06.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2873                 { &hf_ipmi_picmg_06_ledid,
2874                         { "LED ID",
2875                                 "ipmi.picmg06.ledid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2876                 { &hf_ipmi_picmg_06_cap_white,
2877                         { "White",
2878                                 "ipmi.picmg06.cap_white", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
2879                 { &hf_ipmi_picmg_06_cap_orange,
2880                         { "Orange",
2881                                 "ipmi.picmg06.cap_orange", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
2882                 { &hf_ipmi_picmg_06_cap_amber,
2883                         { "Amber",
2884                                 "ipmi.picmg06.cap_amber", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
2885                 { &hf_ipmi_picmg_06_cap_green,
2886                         { "Green",
2887                                 "ipmi.picmg06.cap_green", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
2888                 { &hf_ipmi_picmg_06_cap_red,
2889                         { "Red",
2890                                 "ipmi.picmg06.cap_red", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2891                 { &hf_ipmi_picmg_06_cap_blue,
2892                         { "Blue",
2893                                 "ipmi.picmg06.cap_blue", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2894                 { &hf_ipmi_picmg_06_default_local_color,
2895                         { "Default LED Color in Local Control state",
2896                                 "ipmi.picmg06.def_local", FT_UINT8, BASE_HEX, VALS(led_color_vals), 0x0f, NULL, HFILL }},
2897                 { &hf_ipmi_picmg_06_default_override_color,
2898                         { "Default LED Color in Override state",
2899                                 "ipmi.picmg06.def_override", FT_UINT8, BASE_HEX, VALS(led_color_vals), 0x0f, NULL, HFILL }},
2900
2901                 { &hf_ipmi_picmg_07_fruid,
2902                         { "FRU ID",
2903                                 "ipmi.picmg07.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2904                 { &hf_ipmi_picmg_07_ledid,
2905                         { "LED ID",
2906                                 "ipmi.picmg07.ledid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2907
2908                 { &hf_ipmi_picmg_08_fruid,
2909                         { "FRU ID",
2910                                 "ipmi.picmg08.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2911                 { &hf_ipmi_picmg_08_ledid,
2912                         { "LED ID",
2913                                 "ipmi.picmg08.ledid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2914                 { &hf_ipmi_picmg_08_state_lamptest,
2915                         { "Lamp Test",
2916                                 "ipmi.picmg08.state_lamptest", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
2917                 { &hf_ipmi_picmg_08_state_override,
2918                         { "Override",
2919                                 "ipmi.picmg08.state_override", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2920                 { &hf_ipmi_picmg_08_state_local,
2921                         { "Local Control",
2922                                 "ipmi.picmg08.state_local", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2923                 { &hf_ipmi_picmg_08_lamptest_duration,
2924                         { "Lamp test duration",
2925                                 "ipmi.picmg08.lamptest_duration", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2926
2927                 { &hf_ipmi_picmg_09_ipmba,
2928                         { "IPMB-A State",
2929                                 "ipmi.picmg09.ipmba", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2930                 { &hf_ipmi_picmg_09_ipmba_link,
2931                         { "Link",
2932                                 "ipmi.picmg09.ipmba_link", FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
2933                 { &hf_ipmi_picmg_09_ipmba_state,
2934                         { "State",
2935                                 "ipmi.picmg09.ipmba_state", FT_BOOLEAN, 8, TFS(&tfs_local_control_override), 0x01, NULL, HFILL }},
2936                 { &hf_ipmi_picmg_09_ipmbb,
2937                         { "IPMB-B State",
2938                                 "ipmi.picmg09.ipmbb", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
2939                 { &hf_ipmi_picmg_09_ipmbb_link,
2940                         { "Link",
2941                                 "ipmi.picmg09.ipmbb_link", FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
2942                 { &hf_ipmi_picmg_09_ipmbb_state,
2943                         { "State",
2944                                 "ipmi.picmg09.ipmbb_state", FT_BOOLEAN, 8, TFS(&tfs_local_control_override), 0x01, NULL, HFILL }},
2945
2946                 { &hf_ipmi_picmg_0a_fruid,
2947                         { "FRU ID",
2948                                 "ipmi.picmg0a.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2949                 { &hf_ipmi_picmg_0a_msk_d_locked,
2950                         { "Deactivation-Locked bit",
2951                                 "ipmi.picmg0a.msk_deactivation", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
2952                 { &hf_ipmi_picmg_0a_msk_locked,
2953                         { "Locked bit",
2954                                 "ipmi.picmg0a.msk_locked", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
2955                 { &hf_ipmi_picmg_0a_d_locked,
2956                         { "Deactivation-Locked bit",
2957                                 "ipmi.picmg0a.deactivation", FT_BOOLEAN, 8, TFS(&set_clear_tfs), 0x02, NULL, HFILL }},
2958                 { &hf_ipmi_picmg_0a_locked,
2959                         { "Locked bit",
2960                                 "ipmi.picmg0a.locked", FT_BOOLEAN, 8, TFS(&set_clear_tfs), 0x01, NULL, HFILL }},
2961
2962                 { &hf_ipmi_picmg_0b_fruid,
2963                         { "FRU ID",
2964                                 "ipmi.picmg0b.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2965                 { &hf_ipmi_picmg_0b_d_locked,
2966                         { "Deactivation-Locked bit",
2967                                 "ipmi.picmg0b.deactivation", FT_BOOLEAN, 8, TFS(&set_clear_tfs), 0x02, NULL, HFILL }},
2968                 { &hf_ipmi_picmg_0b_locked,
2969                         { "Locked bit",
2970                                 "ipmi.picmg0b.locked", FT_BOOLEAN, 8, TFS(&set_clear_tfs), 0x01, NULL, HFILL }},
2971
2972                 { &hf_ipmi_picmg_0c_fruid,
2973                         { "FRU ID",
2974                                 "ipmi.picmg0c.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2975                 { &hf_ipmi_picmg_0c_cmd,
2976                         { "Command",
2977                                 "ipmi.picmg0c.cmd", FT_UINT8, BASE_HEX, VALS(vals_0c_cmd), 0, NULL, HFILL }},
2978
2979                 { &hf_ipmi_picmg_0d_fruid,
2980                         { "FRU ID",
2981                                 "ipmi.picmg0d.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2982                 { &hf_ipmi_picmg_0d_start,
2983                         { "Search after record ID",
2984                                 "ipmi.picmg0d.start", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
2985                 { &hf_ipmi_picmg_0d_recordid,
2986                         { "Record ID",
2987                                 "ipmi.picmg0d.recordid", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
2988
2989                 { &hf_ipmi_picmg_0f_iface,
2990                         { "Interface",
2991                                 "ipmi.linkinfo.iface", FT_UINT8, BASE_HEX, VALS(linkinfo_iface_vals), 0x000000c0, NULL, HFILL }},
2992                 { &hf_ipmi_picmg_0f_chan,
2993                         { "Channel",
2994                                 "ipmi.linkinfo.chan", FT_UINT8, BASE_DEC, NULL, 0x0000003f, NULL, HFILL }},
2995
2996                 { &hf_ipmi_picmg_10_fruid,
2997                         { "FRU ID",
2998                                 "ipmi.picmg10.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
2999                 { &hf_ipmi_picmg_10_nslots,
3000                         { "Number of spanned slots",
3001                                 "ipmi.picmg10.nslots", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3002                 { &hf_ipmi_picmg_10_ipmc_loc,
3003                         { "IPMC Location",
3004                                 "ipmi.picmg10.ipmc_loc", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3005
3006                 { &hf_ipmi_picmg_11_fruid,
3007                         { "FRU ID",
3008                                 "ipmi.picmg11.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3009                 { &hf_ipmi_picmg_11_power_level,
3010                         { "Power Level",
3011                                 "ipmi.picmg11.power_level", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3012                 { &hf_ipmi_picmg_11_set_to_desired,
3013                         { "Set Present Levels to Desired",
3014                                 "ipmi.picmg11.set_to_desired", FT_UINT8, BASE_HEX, VALS(vals_11_set), 0, NULL, HFILL }},
3015
3016                 { &hf_ipmi_picmg_12_fruid,
3017                         { "FRU ID",
3018                                 "ipmi.picmg12.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3019                 { &hf_ipmi_picmg_12_pwr_type,
3020                         { "Power Type",
3021                                 "ipmi.picmg12.pwr_type", FT_UINT8, BASE_HEX, VALS(vals_12_pwr_type), 0, NULL, HFILL }},
3022                 { &hf_ipmi_picmg_12_dynamic,
3023                         { "Dynamic Power Configuration",
3024                                 "ipmi.picmg12.dynamic", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
3025                 { &hf_ipmi_picmg_12_pwr_lvl,
3026                         { "Power Level",
3027                                 "ipmi.picmg12.pwd_lvl", FT_UINT8, BASE_DEC, NULL, 0x0f, NULL, HFILL }},
3028                 { &hf_ipmi_picmg_12_delay,
3029                         { "Delay to stable power",
3030                                 "ipmi.picmg12.delay", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3031                 { &hf_ipmi_picmg_12_pwr_mult,
3032                         { "Power multiplier",
3033                                 "ipmi.picmg12.pwr_mult", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3034                 { &hf_ipmi_picmg_12_pwr_draw,
3035                         { "Power draw",
3036                                 "ipmi.picmg12.pwr_draw", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3037
3038                 { &hf_ipmi_picmg_13_fruid,
3039                         { "FRU ID",
3040                                 "ipmi.picmg13.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3041
3042                 { &hf_ipmi_picmg_14_fruid,
3043                         { "FRU ID",
3044                                 "ipmi.picmg14.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3045                 { &hf_ipmi_picmg_14_speed_min,
3046                         { "Minimum Speed Level",
3047                                 "ipmi.picmg14.speed_min", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3048                 { &hf_ipmi_picmg_14_speed_max,
3049                         { "Maximum Speed Level",
3050                                 "ipmi.picmg14.speed_max", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3051                 { &hf_ipmi_picmg_14_speed_norm,
3052                         { "Normal Operating Level",
3053                                 "ipmi.picmg14.speed_norm", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3054                 { &hf_ipmi_picmg_14_local_control,
3055                         { "Local Control Mode Supported",
3056                                 "ipmi.picmg14.local_control", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
3057
3058                 { &hf_ipmi_picmg_15_fruid,
3059                         { "FRU ID",
3060                                 "ipmi.picmg15.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3061                 { &hf_ipmi_picmg_15_fan_level,
3062                         { "Fan Level",
3063                                 "ipmi.picmg15.fan_level", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3064                 { &hf_ipmi_picmg_15_local_enable,
3065                         { "Local Control Enable State",
3066                                 "ipmi.picmg15.local_enable", FT_UINT8, BASE_HEX, VALS(enable_vals), 0, NULL, HFILL }},
3067
3068                 { &hf_ipmi_picmg_16_fruid,
3069                         { "FRU ID",
3070                                 "ipmi.picmg16.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3071                 { &hf_ipmi_picmg_16_override_level,
3072                         { "Override Fan Level",
3073                                 "ipmi.picmg16.override_level", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3074                 { &hf_ipmi_picmg_16_local_level,
3075                         { "Local Control Fan Level",
3076                                 "ipmi.picmg16.local_level", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3077                 { &hf_ipmi_picmg_16_local_enable,
3078                         { "Local Control Enable State",
3079                                 "ipmi.picmg16.local_enable", FT_UINT8, BASE_HEX, VALS(enabled_vals), 0, NULL, HFILL }},
3080
3081                 { &hf_ipmi_picmg_17_cmd,
3082                         { "Command",
3083                                 "ipmi.picmg17.cmd", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3084                 { &hf_ipmi_picmg_17_resid,
3085                         { "Bused Resource ID",
3086                                 "ipmi.picmg17.resid", FT_UINT8, BASE_HEX, VALS(busresid_vals), 0, NULL, HFILL }},
3087                 { &hf_ipmi_picmg_17_status,
3088                         { "Status",
3089                                 "ipmi.picmg17.status", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3090
3091                 { &hf_ipmi_picmg_18_li_key_type,
3092                         { "Link Info Key Type",
3093                                 "ipmi.picmg18.li_key_type", FT_UINT8, BASE_HEX, VALS(vals_18_keytype), 0, NULL, HFILL }},
3094                 { &hf_ipmi_picmg_18_li_key,
3095                         { "Link Info Key",
3096                                 "ipmi.picmg18.li_key", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3097                 { &hf_ipmi_picmg_18_link_num,
3098                         { "Link Number",
3099                                 "ipmi.picmg18.link_num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3100                 { &hf_ipmi_picmg_18_sensor_num,
3101                         { "Sensor Number",
3102                                 "ipmi.picmg18.sensor_num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3103
3104                 { &hf_ipmi_picmg_1a_flags,
3105                         { "Extended Request Flags",
3106                                 "ipmi.picmg1a.flags", FT_UINT8, BASE_DEC_HEX, NULL, 0, NULL, HFILL }},
3107
3108                 { &hf_ipmi_picmg_1b_addr_active,
3109                         { "Active Shelf Manager IPMB Address",
3110                                 "ipmi.picmg1b.addr_active", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3111                 { &hf_ipmi_picmg_1b_addr_backup,
3112                         { "Backup Shelf Manager IPMB Address",
3113                                 "ipmi.picmg1b.addr_backup", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3114
3115                 { &hf_ipmi_picmg_1c_fan_site_number,
3116                         { "Fan Tray Site Number",
3117                                 "ipmi.picmg1c.fan_site_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3118                 { &hf_ipmi_picmg_1c_fan_enable_state,
3119                         { "Fan Enable state",
3120                                 "ipmi.picmg1c.fan_enable_state", FT_UINT8, BASE_HEX, VALS(enable_vals), 0, NULL, HFILL }},
3121                 { &hf_ipmi_picmg_1c_fan_policy_timeout,
3122                         { "Fan Policy Timeout",
3123                                 "ipmi.picmg1c.fan_policy_timeout", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_5s_1based), 0, NULL, HFILL }},
3124                 { &hf_ipmi_picmg_1c_site_number,
3125                         { "Site Number",
3126                                 "ipmi.picmg1c.site_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3127                 { &hf_ipmi_picmg_1c_site_type,
3128                         { "Site Type",
3129                                 "ipmi.picmg1c.site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
3130
3131                 { &hf_ipmi_picmg_1d_fan_site_number,
3132                         { "Fan Tray Site Number",
3133                                 "ipmi.picmg1d.fan_site_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3134                 { &hf_ipmi_picmg_1d_site_number,
3135                         { "Site Number",
3136                                 "ipmi.picmg1d.site_number", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3137                 { &hf_ipmi_picmg_1d_site_type,
3138                         { "Site Type",
3139                                 "ipmi.picmg1d.site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
3140                 { &hf_ipmi_picmg_1d_policy,
3141                         { "Policy",
3142                                 "ipmi.picmg1d.fan_enable_state", FT_UINT8, BASE_HEX, VALS(vals_1d_policy), 0, NULL, HFILL }},
3143                 { &hf_ipmi_picmg_1d_coverage,
3144                         { "Coverage",
3145                                 "ipmi.picmg1d.coverage", FT_UINT8, BASE_HEX, VALS(vals_1d_coverage), 0, NULL, HFILL }},
3146
3147                 { &hf_ipmi_picmg_1e_fruid,
3148                         { "FRU ID",
3149                                 "ipmi.picmg1e.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3150                 { &hf_ipmi_picmg_1e_cap_diagintr,
3151                         { "Diagnostic interrupt",
3152                                 "ipmi.picmg1e.cap_diagintr", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3153                 { &hf_ipmi_picmg_1e_cap_graceful_reboot,
3154                         { "Graceful reboot",
3155                                 "ipmi.picmg1e.cap_reboot", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3156                 { &hf_ipmi_picmg_1e_cap_warm_reset,
3157                         { "Warm Reset",
3158                                 "ipmi.picmg1e.cap_warmreset", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3159
3160                 { &hf_ipmi_picmg_1f_rq_fruid,
3161                         { "FRU ID",
3162                                 "ipmi.picmg1f.rq_fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3163                 { &hf_ipmi_picmg_1f_rq_op,
3164                         { "Operation",
3165                                 "ipmi.picmg1f.rq_op", FT_UINT8, BASE_HEX, VALS(vals_1f_op), 0, NULL, HFILL }},
3166                 { &hf_ipmi_picmg_1f_rq_lockid,
3167                         { "Lock ID",
3168                                 "ipmi.picmg1f.rq_lockid", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3169                 { &hf_ipmi_picmg_1f_rs_lockid,
3170                         { "Lock ID",
3171                                 "ipmi.picmg1f.rs_lockid", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3172                 { &hf_ipmi_picmg_1f_rs_tstamp,
3173                         { "Last Commit Timestamp",
3174                                 "ipmi.picmg1f.rs_tstamp", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
3175
3176                 { &hf_ipmi_picmg_20_fruid,
3177                         { "FRU ID",
3178                                 "ipmi.picmg20.fruid", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3179                 { &hf_ipmi_picmg_20_lockid,
3180                         { "Lock ID",
3181                                 "ipmi.picmg20.lockid", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3182                 { &hf_ipmi_picmg_20_offset,
3183                         { "Offset to write",
3184                                 "ipmi.picmg20.offset", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3185                 { &hf_ipmi_picmg_20_data,
3186                         { "Data to write",
3187                                 "ipmi.picmg20.data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3188                 { &hf_ipmi_picmg_20_count,
3189                         { "Count written",
3190                                 "ipmi.picmg20.count", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3191
3192                 { &hf_ipmi_picmg_21_addr_num,
3193                         { "Address Number",
3194                                 "ipmi.picmg21.addr_num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3195                 { &hf_ipmi_picmg_21_tstamp,
3196                         { "Shelf IP Address Last Change Timestamp",
3197                                 "ipmi.picmg21.tstamp", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
3198                 { &hf_ipmi_picmg_21_addr_count,
3199                         { "Address Count",
3200                                 "ipmi.picmg21.addr_count", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3201                 { &hf_ipmi_picmg_21_site_type,
3202                         { "Site Type",
3203                                 "ipmi.picmg21.site_type", FT_UINT8, BASE_HEX, VALS(site_type_vals), 0, NULL, HFILL }},
3204                 { &hf_ipmi_picmg_21_site_num,
3205                         { "Site Number",
3206                                 "ipmi.picmg21.site_num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3207                 { &hf_ipmi_picmg_21_max_unavail,
3208                         { "Maximum Unavailable Time",
3209                                 "ipmi.picmg21.max_unavail", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_1s_1based), 0, NULL, HFILL }},
3210                 { &hf_ipmi_picmg_21_is_shm,
3211                         { "Shelf Manager IP Address",
3212                                 "ipmi.picmg21.is_shm", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
3213                 { &hf_ipmi_picmg_21_addr_type,
3214                         { "Address Type",
3215                                 "ipmi.picmg21.addr_type", FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL }},
3216                 { &hf_ipmi_picmg_21_ipaddr,
3217                         { "IP Address",
3218                                 "ipmi.picmg21.ip_addr", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL }},
3219                 { &hf_ipmi_picmg_21_rmcpport,
3220                         { "RMCP Port",
3221                                 "ipmi.picmg21.rmcp_port", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3222
3223                 { &hf_ipmi_picmg_22_feed_idx,
3224                         { "Power Feed Index",
3225                                 "ipmi.picmg22.feed_idx", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3226                 { &hf_ipmi_picmg_22_update_cnt,
3227                         { "Update Counter",
3228                                 "ipmi.picmg22.update_cnt", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3229                 { &hf_ipmi_picmg_22_pwr_alloc,
3230                         { "Power Feed Allocation",
3231                                 "ipmi.picmg22.pwr_alloc", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3232
3233                 { &hf_ipmi_picmg_XX_comp7,
3234                         { "Component 7",
3235                                 "ipmi.hpm1.comp7", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
3236                 { &hf_ipmi_picmg_XX_comp6,
3237                         { "Component 6",
3238                                 "ipmi.hpm1.comp6", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
3239                 { &hf_ipmi_picmg_XX_comp5,
3240                         { "Component 5",
3241                                 "ipmi.hpm1.comp5", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
3242                 { &hf_ipmi_picmg_XX_comp4,
3243                         { "Component 4",
3244                                 "ipmi.hpm1.comp4", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
3245                 { &hf_ipmi_picmg_XX_comp3,
3246                         { "Component 3",
3247                                 "ipmi.hpm1.comp3", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3248                 { &hf_ipmi_picmg_XX_comp2,
3249                         { "Component 2",
3250                                 "ipmi.hpm1.comp2", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3251                 { &hf_ipmi_picmg_XX_comp1,
3252                         { "Component 1",
3253                                 "ipmi.hpm1.comp1", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3254                 { &hf_ipmi_picmg_XX_comp0,
3255                         { "Component 0",
3256                                 "ipmi.hpm1.comp0", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3257
3258                 { &hf_ipmi_picmg_2e_version,
3259                         { "HPM.1 version",
3260                                 "ipmi.picmg2e.hpm1_version", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3261                 { &hf_ipmi_picmg_2e_upgrade_undesirable,
3262                         { "Firmware Upgrade Undesirable",
3263                                 "ipmi.picmg2e.upgrade_undesirable", FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
3264                 { &hf_ipmi_picmg_2e_auto_rollback_override,
3265                         { "Automatic Rollback Overridden",
3266                                 "ipmi.picmg2e.auto_rollback_override", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
3267                 { &hf_ipmi_picmg_2e_ipmc_degraded,
3268                         { "IPMC degraded during upgrade",
3269                                 "ipmi.picmg2e.ipmc_degraded", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
3270                 { &hf_ipmi_picmg_2e_deferred_activate,
3271                         { "Deferred Activation supported",
3272                                 "ipmi.picmg2e.deferred_activate", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
3273                 { &hf_ipmi_picmg_2e_services_affected,
3274                         { "Services affected by upgrade",
3275                                 "ipmi.picmg2e.services_affected", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3276                 { &hf_ipmi_picmg_2e_manual_rollback,
3277                         { "Manual Rollback supported",
3278                                 "ipmi.picmg2e.manual_rollback", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3279                 { &hf_ipmi_picmg_2e_auto_rollback,
3280                         { "Automatic Rollback supported",
3281                                 "ipmi.picmg2e.auto_rollback", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3282                 { &hf_ipmi_picmg_2e_self_test,
3283                         { "Self-Test supported",
3284                                 "ipmi.picmg2e.self_test", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3285                 { &hf_ipmi_picmg_2e_upgrade_tout,
3286                         { "Upgrade timeout",
3287                                 "ipmi.picmg2e.upgrade_tout", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_5s_1based), 0, NULL, HFILL }},
3288                 { &hf_ipmi_picmg_2e_selftest_tout,
3289                         { "Self-test timeout",
3290                                 "ipmi.picmg2e.selftest_tout", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_5s_1based), 0, NULL, HFILL }},
3291                 { &hf_ipmi_picmg_2e_rollback_tout,
3292                         { "Rollback timeout",
3293                                 "ipmi.picmg2e.rollback_tout", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_5s_1based), 0, NULL, HFILL }},
3294                 { &hf_ipmi_picmg_2e_inaccessibility_tout,
3295                         { "Inaccessibility timeout",
3296                                 "ipmi.picmg2e.inaccessibility_tout", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_5s_1based), 0, NULL, HFILL }},
3297
3298                 { &hf_ipmi_picmg_prop00_cold_reset,
3299                         { "Payload cold reset required",
3300                                 "ipmi.prop00.cold_reset", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
3301                 { &hf_ipmi_picmg_prop00_deferred_activation,
3302                         { "Deferred firmware activation supported",
3303                                 "ipmi.prop00.deferred_activation", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
3304                 { &hf_ipmi_picmg_prop00_comparison,
3305                         { "Firmware comparison supported",
3306                                 "ipmi.prop00.firmware_comparison", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3307                 { &hf_ipmi_picmg_prop00_preparation,
3308                         { "Prepare Components action required",
3309                                 "ipmi.prop00.preparation", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3310                 { &hf_ipmi_picmg_prop00_rollback,
3311                         { "Rollback/Backup support",
3312                                 "ipmi.prop00.rollback", FT_UINT8, BASE_HEX, VALS(vals_prop00_rollback), 0x03, NULL, HFILL }},
3313                 { &hf_ipmi_picmg_prop01_fw_major,
3314                         { "Major Firmware Revision (binary encoded)",
3315                                 "ipmi.prop01.fw_major", FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL }},
3316                 { &hf_ipmi_picmg_prop01_fw_minor,
3317                         { "Minor Firmware Revision (BCD encoded)",
3318                                 "ipmi.prop01.fw_minor", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3319                 { &hf_ipmi_picmg_prop01_fw_aux,
3320                         { "Auxiliary Firmware Revision Information",
3321                                 "ipmi.prop01.fw_aux", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3322                 { &hf_ipmi_picmg_prop02_desc,
3323                         { "Description string",
3324                                 "ipmi.prop02.desc", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
3325
3326                 { &hf_ipmi_picmg_2f_comp_id,
3327                         { "Component ID",
3328                                 "ipmi.picmg2f.comp_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3329                 { &hf_ipmi_picmg_2f_comp_prop,
3330                         { "Component property selector",
3331                                 "ipmi.picmg2f.comp_prop", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3332                 { &hf_ipmi_picmg_2f_prop_data,
3333                         { "Unknown property data",
3334                                 "ipmi.picmg2f.prop_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3335
3336                 { &hf_ipmi_picmg_31_action,
3337                         { "Upgrade action",
3338                                 "ipmi.picmg31.action", FT_UINT8, BASE_HEX, VALS(vals_31_action), 0, NULL, HFILL }},
3339
3340                 { &hf_ipmi_picmg_32_block,
3341                         { "Block Number",
3342                                 "ipmi.picmg32.block", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3343                 { &hf_ipmi_picmg_32_data,
3344                         { "Data",
3345                                 "ipmi.picmg32.data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3346                 { &hf_ipmi_picmg_32_sec_offs,
3347                         { "Section Offset",
3348                                 "ipmi.picmg32.sec_offs", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
3349                 { &hf_ipmi_picmg_32_sec_len,
3350                         { "Section Length",
3351                                 "ipmi.picmg32.sec_len", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
3352
3353                 { &hf_ipmi_picmg_33_comp_id,
3354                         { "Component ID",
3355                                 "ipmi.picmg33.comp_id", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3356                 { &hf_ipmi_picmg_33_img_len,
3357                         { "Image Length",
3358                                 "ipmi.picmg33.img_len", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
3359
3360                 { &hf_ipmi_picmg_34_cmd,
3361                         { "Command in progress",
3362                                 "ipmi.picmg34.cmd", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3363                 { &hf_ipmi_picmg_34_ccode,
3364                         { "Last command completion code",
3365                                 "ipmi.picmg34.ccode", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3366                 { &hf_ipmi_picmg_34_percentage,
3367                         { "Completion estimate",
3368                                 "ipmi.picmg34.percent", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_percent), 0x7f, NULL, HFILL }},
3369
3370                 { &hf_ipmi_picmg_35_rollback_override,
3371                         { "Rollback Override Policy",
3372                                 "ipmi.picmg35.rollback_override", FT_UINT8, BASE_HEX, VALS(vals_35_override), 0, NULL, HFILL }},
3373
3374                 { &hf_ipmi_picmg_36_result,
3375                         { "Self test result",
3376                                 "ipmi.picmg36.self_test_result", FT_UINT8, BASE_HEX, VALS(vals_36_result), 0, NULL, HFILL }},
3377                 { &hf_ipmi_picmg_36_fail,
3378                         { "Self-test error bitfield",
3379                                 "ipmi.picmg36.fail", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3380                 { &hf_ipmi_picmg_36_fail_sel,
3381                         { "Cannot access SEL device",
3382                                 "ipmi.picmg36.fail.sel", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x80, NULL, HFILL }},
3383                 { &hf_ipmi_picmg_36_fail_sdr,
3384                         { "Cannot access SDR Repository",
3385                                 "ipmi.picmg36.fail.sdr", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x40, NULL, HFILL }},
3386                 { &hf_ipmi_picmg_36_fail_bmc_fru,
3387                         { "Cannot access BMC FRU device",
3388                                 "ipmi.picmg36.fail.bmc_fru", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x20, NULL, HFILL }},
3389                 { &hf_ipmi_picmg_36_fail_ipmb_sig,
3390                         { "IPMB signal lines do not respond",
3391                                 "ipmi.picmg36.fail.ipmb_sig", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x10, NULL, HFILL }},
3392                 { &hf_ipmi_picmg_36_fail_sdr_empty,
3393                         { "SDR Repository is empty",
3394                                 "ipmi.picmg36.fail.sdr_empty", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x08, NULL, HFILL }},
3395                 { &hf_ipmi_picmg_36_fail_iua,
3396                         { "Internal Use Area of BMC FRU corrupted",
3397                                 "ipmi.picmg36.fail.iua", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x04, NULL, HFILL }},
3398                 { &hf_ipmi_picmg_36_fail_bb_fw,
3399                         { "Controller update boot block firmware corrupted",
3400                                 "ipmi.picmg36.fail.bb_fw", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x02, NULL, HFILL }},
3401                 { &hf_ipmi_picmg_36_fail_oper_fw,
3402                         { "Controller operational firmware corrupted",
3403                                 "ipmi.picmg36.fail.oper_fw", FT_BOOLEAN, 8, TFS(&tfs_36_fail_unknown), 0x01, NULL, HFILL }},
3404
3405                 { &hf_ipmi_picmg_37_percent,
3406                         { "Estimated percentage complete",
3407                                 "ipmi.picmg37.percent", FT_UINT8, BASE_CUSTOM, CF_FUNC(ipmi_fmt_percent), 0x7f, NULL, HFILL }},
3408
3409                 { &hf_ipmi_picmg_hpm_id,
3410                         { "HPM.x Identifier",
3411                                 "ipmi.picmg.hpm.id", FT_UINT8, BASE_HEX, VALS(hpm_x_ids), 0, NULL, HFILL }},
3412                 { &hf_ipmi_picmg_hpm_rev,
3413                         { "HPM.x Revision Identifier",
3414                                 "ipmi.picmg.hpm.rev", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3415                 { &hf_ipmi_picmg_hpm2_mask,
3416                         { "IPMI LAN Channel Mask",
3417                                 "ipmi.picmg.hpm2.mask", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3418                 { &hf_ipmi_picmg_hpm2_caps,
3419                         { "HPM.2 Capabilities",
3420                                 "ipmi.picmg.hpm2.caps", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3421                 { &hf_ipmi_picmg_hpm2_dyn_ssn,
3422                         { "Dynamic Sessions",
3423                                 "ipmi.picmg.hpm2.dynssn", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
3424                 { &hf_ipmi_picmg_hpm2_ver_chg,
3425                         { "Version Change Sensor for LAN Configuration",
3426                                 "ipmi.picmg.hpm2.verchg", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3427                 { &hf_ipmi_picmg_hpm2_ext_mgt,
3428                         { "Extended Inactive State Management",
3429                                 "ipmi.picmg.hpm2.extmgt", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3430                 { &hf_ipmi_picmg_hpm2_pkt_trc,
3431                         { "IPMI Channel Packet Trace",
3432                                 "ipmi.picmg.hpm2.pkttrc", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3433                 { &hf_ipmi_picmg_hpm2_sol_ext,
3434                         { "SOL Extensions",
3435                                 "ipmi.picmg.hpm2.solext", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3436                 { &hf_ipmi_picmg_hpm_oem_start,
3437                         { "OEM LAN Parameters Start Location",
3438                                 "ipmi.picmg.hpm.oem.start", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3439                 { &hf_ipmi_picmg_hpm_oem_rev,
3440                         { "OEM LAN Parameters Blocks Revision Number",
3441                                 "ipmi.picmg.hpm.oem.rev", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3442                 { &hf_ipmi_picmg_hpm2_sol_oem_start,
3443                         { "OEM SOL Parameters Start Location",
3444                                 "ipmi.picmg.hpm2.sol.oem.start", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3445                 { &hf_ipmi_picmg_hpm2_sol_oem_rev,
3446                         { "OEM SOL Parameters Blocks Revision Number",
3447                                 "ipmi.picmg.hpm2.sol.oem.rev", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3448                 { &hf_ipmi_picmg_hpm_cred_hnd,
3449                         { "Credentials Handle",
3450                                 "ipmi.picmg.hpm.cred.hnd", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3451                 { &hf_ipmi_picmg_hpm_func_sel,
3452                         { "Function Selector",
3453                                 "ipmi.picmg.hpm.func.sel", FT_UINT8, BASE_DEC, VALS(hpm2_func_selectors), 0, NULL, HFILL }},
3454                 { &hf_ipmi_picmg_hpm_ipmi_rev,
3455                         { "IPMI Revision",
3456                                 "ipmi.picmg.hpm.ipmi.rev", FT_UINT8, BASE_HEX, VALS(hpm2_ipmi_revs), 0, NULL, HFILL }},
3457                 { &hf_ipmi_picmg_hpm_auth_type,
3458                         { "Authentication Type",
3459                                 "ipmi.picmg.hpm.auth.type", FT_UINT8, BASE_HEX, VALS(hpm2_auth_types), 0, NULL, HFILL }},
3460                 { &hf_ipmi_picmg_hpm_cipher_id,
3461                         { "Cipher Suite ID",
3462                                 "ipmi.picmg.hpm.cipher", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3463                 { &hf_ipmi_picmg_hpm_priv_level,
3464                         { "Maximum Privilege Level",
3465                                 "ipmi.picmg.hpm.priv", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3466                 { &hf_ipmi_picmg_hpm_chn_num,
3467                         { "IPMI Lan Channel Number",
3468                                 "ipmi.picmg.hpm.chn.num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3469                 { &hf_ipmi_picmg_hpm_avail_time,
3470                         { "Availability Time",
3471                                 "ipmi.picmg.hpm.avail", FT_UINT32, BASE_DEC_HEX, NULL, 0, NULL, HFILL }},
3472                 { &hf_ipmi_picmg_hpm_user_name,
3473                         { "User Name",
3474                                 "ipmi.picmg.hpm.user.name", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3475                 { &hf_ipmi_picmg_hpm_user_pwd,
3476                         { "User Password",
3477                                 "ipmi.picmg.hpm.user.pwd", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3478                 { &hf_ipmi_picmg_hpm_bmc_key,
3479                         { "BMC Key",
3480                                 "ipmi.picmg.hpm.bmc.key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
3481                 { &hf_ipmi_picmg_hpm_operation,
3482                         { "Command Operation Mode",
3483                                 "ipmi.picmg.hpm.operation", FT_UINT8, BASE_DEC, VALS(picmg40_operations), 0, NULL, HFILL }},
3484                 { &hf_ipmi_picmg_hpm_ssn_hnd,
3485                         { "Session Handle",
3486                                 "ipmi.picmg.hpm.ssn.hnd", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3487                 { &hf_ipmi_picmg_hpm_power_draw,
3488                         { "Extended Management Power Draw",
3489                                 "ipmi.picmg.hpm.pwr.draw", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3490                 { &hf_ipmi_picmg_hpm_base_channels,
3491                         { "Base Interface Channels",
3492                                 "ipmi.picmg.hpm.base.chn", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3493                 { &hf_ipmi_picmg_hpm_fabric_channels,
3494                         { "Fabric Interface Channels",
3495                                 "ipmi.picmg.hpm.base.chn", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
3496                 { &hf_ipmi_picmg_hpm_update_channels,
3497                         { "Update Channels",
3498                                 "ipmi.picmg.hpm.upd.chn", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3499                 { &hf_ipmi_picmg_hpm_cross_channels,
3500                         { "ShMC Cross-Connect Channels",
3501                                 "ipmi.picmg.hpm.cross.chn", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3502                 { &hf_ipmi_picmg_hpm_num_chn_desc,
3503                         { "Number of Channel Descriptors",
3504                                 "ipmi.picmg.hpm.num.chn.desc", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3505                 { &hf_ipmi_picmg_hpm_chn_mask,
3506                         { "Channel Bitmask",
3507                                 "ipmi.picmg.hpm.chn.mask", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
3508                 { &hf_ipmi_picmg_hpm_ext_mgmt_state,
3509                         { "Extended Management State",
3510                                 "ipmi.picmg.hpm.ext.mgmt.state", FT_UINT8, BASE_DEC, VALS(enable_vals), 0, NULL, HFILL }},
3511                 { &hf_ipmi_picmg_hpm_polling_period,
3512                         { "Polling Period",
3513                                 "ipmi.picmg.hpm.poll.period", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3514                 { &hf_ipmi_picmg_hpm_auth_pwr_state,
3515                         { "Authorized Power State",
3516                                 "ipmi.picmg.hpm.auth.pwr", FT_UINT8, BASE_DEC, VALS(auth_pwr_states), 0, NULL, HFILL }},
3517                 { &hf_ipmi_picmg_hpm_amc_pwr_state,
3518                         { "Actual Power State",
3519                                 "ipmi.picmg.hpm.amc.pwr", FT_UINT8, BASE_DEC, VALS(amc_pwr_states), 0, NULL, HFILL }},
3520
3521                 { &hf_ipmi_picmg47_port,
3522                         { "System Serial Port Number",
3523                                 "ipmi.picmg47.port", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3524                 { &hf_ipmi_picmg47_flags,
3525                         { "Flags",
3526                                 "ipmi.picmg47.flags", FT_UINT8, BASE_DEC, VALS(picmg47_flags), 0x01, NULL, HFILL }},
3527                 { &hf_ipmi_picmg47_assignment,
3528                         { "Assigned Instance",
3529                                 "ipmi.picmg47.assign", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3530                 { &hf_ipmi_picmg47_state,
3531                         { "Serial port assigned to instance state",
3532                                 "ipmi.picmg47.state", FT_UINT8, BASE_DEC, VALS(picmg47_states), 0x80, NULL, HFILL }},
3533                 { &hf_ipmi_picmg47_instance,
3534                         { "Payload instance number",
3535                                 "ipmi.picmg47.instance", FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL }},
3536
3537                 { &hf_ipmi_picmg48_sub_fru_type,
3538                         { "Subsidiary FRU Identifier Type",
3539                                 "ipmi.picmg48.fru.type", FT_UINT8, BASE_DEC, VALS(picmg48_fru_types), 0, NULL, HFILL }},
3540                 { &hf_ipmi_picmg48_sub_fru_id,
3541                         { "Subsidiary FRU Identifier",
3542                                 "ipmi.picmg48.fru.id", FT_UINT8, BASE_DEC_HEX, NULL, 0, NULL, HFILL }},
3543                 { &hf_ipmi_picmg48_ip_source,
3544                         { "IP Address Source",
3545                                 "ipmi.picmg48.ip.source", FT_UINT8, BASE_DEC, VALS(picmg48_ip_sources), 0, NULL, HFILL }},
3546
3547                 { &hf_ipmi_picmg_23_rq_byte2,
3548                         { "Request Flags",
3549                                 "ipmi.picmg23.rq.flags", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3550                 { &hf_ipmi_picmg_23_slot_sel,
3551                         { "MCS",
3552                                 "ipmi.picmg23.rq.mcs", FT_UINT8, BASE_HEX, VALS(picmg_23_slot_selectors), 0xC0, NULL, HFILL }},
3553                 { &hf_ipmi_picmg_23_carrier_num,
3554                         { "Carrier Number",
3555                                 "ipmi.picmg23.carrier.num", FT_UINT8, BASE_DEC, NULL, 0x1F, NULL, HFILL }},
3556                 { &hf_ipmi_picmg_23_slot_num,
3557                         { "Slot Number",
3558                                 "ipmi.picmg23.slot.num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3559                 { &hf_ipmi_picmg_23_tier_num,
3560                         { "Tier Number",
3561                                 "ipmi.picmg23.tier.num", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3562                 { &hf_ipmi_picmg_23_rs_byte5,
3563                         { "Orientation Flags",
3564                                 "ipmi.picmg23.rs.flags", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3565                 { &hf_ipmi_picmg_23_slot_base,
3566                         { "Slot Numbers",
3567                                 "ipmi.picmg23.slot.base", FT_UINT8, BASE_DEC, VALS(picmg_23_num_bases), 0x80, NULL, HFILL }},
3568                 { &hf_ipmi_picmg_23_tier_base,
3569                         { "Tier Numbers",
3570                                 "ipmi.picmg23.tier.base", FT_UINT8, BASE_DEC, VALS(picmg_23_num_bases), 0x40, NULL, HFILL }},
3571                 { &hf_ipmi_picmg_23_orientation,
3572                         { "Carrier Orientation",
3573                                 "ipmi.picmg23.orient", FT_UINT8, BASE_DEC, VALS(picmg_23_orientations), 0x20, NULL, HFILL }},
3574                 { &hf_ipmi_picmg_23_origin_x,
3575                         { "Origin X",
3576                                 "ipmi.picmg23.origin.x", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3577                 { &hf_ipmi_picmg_23_origin_y,
3578                         { "Origin Y",
3579                                 "ipmi.picmg23.origin.y", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
3580
3581                 { &hf_ipmi_picmg_24_channel,
3582                         { "Power Channel Number",
3583                                 "ipmi.picmg.pwr.channel", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3584                 { &hf_ipmi_picmg_24_control,
3585                         { "Power Channel Control",
3586                                 "ipmi.picmg.pwr.control", FT_UINT8, BASE_DEC, VALS(picmg_24_controls), 0, NULL, HFILL }},
3587                 { &hf_ipmi_picmg_24_current,
3588                         { "Power Channel Current Limit",
3589                                 "ipmi.picmg.pwr.limit", FT_UINT8, BASE_CUSTOM, CF_FUNC(fmt_power_amps), 0, NULL, HFILL }},
3590                 { &hf_ipmi_picmg_24_primary_pm,
3591                         { "Primary PM",
3592                                 "ipmi.picmg.primary.pm", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3593                 { &hf_ipmi_picmg_24_backup_pm,
3594                         { "Redundant PM",
3595                                 "ipmi.picmg.backup.pm", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3596
3597                 { &hf_ipmi_picmg_25_start,
3598                         { "Starting Power Channel Number",
3599                                 "ipmi.picmg25.start", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3600                 { &hf_ipmi_picmg_25_count,
3601                         { "Power Channel Count",
3602                                 "ipmi.picmg25.count", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3603                 { &hf_ipmi_picmg_25_max,
3604                         { "Max Power Channel Number",
3605                                 "ipmi.picmg25.max", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3606                 { &hf_ipmi_picmg_25_gstatus,
3607                         { "Global Status",
3608                                 "ipmi.picmg25.gstatus", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3609                 { &hf_ipmi_picmg_25_fault,
3610                         { "Unidentified Fault",
3611                                 "ipmi.picmg25.fault", FT_UINT8, BASE_DEC, VALS(picmg_25_fault_vals), 0x08, NULL, HFILL }},
3612                 { &hf_ipmi_picmg_25_pwr_good,
3613                         { "Payload Power is Good",
3614                                 "ipmi.picmg25.pwr.good", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3615                 { &hf_ipmi_picmg_25_mp_good,
3616                         { "Management Power is Good",
3617                                 "ipmi.picmg25.mp.good", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3618                 { &hf_ipmi_picmg_25_role,
3619                         { "Role",
3620                           "ipmi.picmg25.role", FT_BOOLEAN, 8, TFS(&picmg_25_roles), 0x01, NULL, HFILL }},
3621                 { &hf_ipmi_picmg_25_cstatus,
3622                         { "Power Channel Status",
3623                                 "ipmi.picmg25.cstatus", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3624                 { &hf_ipmi_picmg_25_pwr_on,
3625                         { "PWR_ON is asserted",
3626                                 "ipmi.picmg25.pwr.on", FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL }},
3627                 { &hf_ipmi_picmg_25_pwr_ovr,
3628                         { "Payload Power Overcurrent is detected",
3629                                 "ipmi.picmg25.pwr.ovr", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL }},
3630                 { &hf_ipmi_picmg_25_pwr,
3631                         { "Payload Power is enabled",
3632                                 "ipmi.picmg25.pwr", FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
3633                 { &hf_ipmi_picmg_25_enable,
3634                         { "ENABLE# is asserted",
3635                                 "ipmi.picmg25.enable", FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
3636                 { &hf_ipmi_picmg_25_mp_ovr,
3637                         { "Management Power Overcurrent is detected",
3638                                 "ipmi.picmg25.mp.ovr", FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
3639                 { &hf_ipmi_picmg_25_mp,
3640                         { "Management Power is enabled",
3641                                 "ipmi.picmg25.mp", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3642                 { &hf_ipmi_picmg_25_ps1,
3643                         { "PS1# is asserted",
3644                                 "ipmi.picmg25.ps1", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3645
3646                 { &hf_ipmi_picmg_26_pm_site,
3647                         { "PM Site Number",
3648                                 "ipmi.picmg26.pm.site", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
3649                 { &hf_ipmi_picmg_27_rs_byte3,
3650                         { "PM Status",
3651                                 "ipmi.picmg26.pm.status", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3652                 { &hf_ipmi_picmg_27_pm_healthy,
3653                         { "PM is present and healthy",
3654                                 "ipmi.picmg26.pm.hly", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3655                 { &hf_ipmi_picmg_28_timeout,
3656                         { "Time-out",
3657                                 "ipmi.picmg28.timeout", FT_UINT8, BASE_CUSTOM, CF_FUNC(fmt_100ms), 0, NULL, HFILL }},
3658                 { &hf_ipmi_picmg_28_rq_byte3,
3659                         { "Flags",
3660                                 "ipmi.picmg28.flags", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3661                 { &hf_ipmi_picmg_28_mch2,
3662                         { "Use MCH2 PS1# de-assertion to indicate Carrier Manager is extracted",
3663                                 "ipmi.picmg28.mch2", FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
3664                 { &hf_ipmi_picmg_28_mch1,
3665                         { "Use MCH1 PS1# de-assertion to indicate Carrier Manager is extracted",
3666                                 "ipmi.picmg28.mch1", FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
3667
3668                 { &hf_ipmi_picmg_29_rs_byte3,
3669                         { "Alarm Capabilities",
3670                                 "ipmi.picmg29.caps", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
3671                 { &hf_ipmi_picmg_29_maj_rst,
3672                         { "Autonomous Major Reset",
3673                                 "ipmi.picmg29.maj.rst", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_actions), 0x80, NULL, HFILL }},
3674                 { &hf_ipmi_picmg_29_min_rst,
3675                         { "Autonomous Minor Reset",
3676                           "ipmi.picmg29.min.rst", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_actions), 0x40, NULL, HFILL }},
3677                 { &hf_ipmi_picmg_29_alarm_cut,
3678                         { "Autonomous alarm cutoff",
3679                                 "ipmi.picmg29.alrm.cut", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_actions), 0x20, NULL, HFILL }},
3680                 { &hf_ipmi_picmg_29_test_mode,
3681                         { "Test Mode",
3682                           "ipmi.picmg29.test.mode", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_modes), 0x10, NULL, HFILL }},
3683                 { &hf_ipmi_picmg_29_pwr_alarm,
3684                         { "Power Alarm",
3685                                 "ipmi.picmg29.pwr.alrm", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_modes), 0x08, NULL, HFILL }},
3686                 { &hf_ipmi_picmg_29_minor_alarm,
3687                         { "Minor Alarm",
3688                                 "ipmi.picmg29.min.alrm", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_modes), 0x04, NULL, HFILL }},
3689                 { &hf_ipmi_picmg_29_major_alarm,
3690                         { "Minor Alarm",
3691                                 "ipmi.picmg29.maj.alrm", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_modes), 0x02, NULL, HFILL }},
3692                 { &hf_ipmi_picmg_29_crit_alarm,
3693                         { "Critical Alarm",
3694                                 "ipmi.picmg29.crit.alrm", FT_BOOLEAN, 8, TFS(&picmg_29_alarm_modes), 0x01, NULL, HFILL }},
3695
3696                 { &hf_ipmi_picmg_2a_alarm_id,
3697                         { "Alarm ID",
3698                                 "ipmi.picmg29.alrm.id", FT_UINT8, BASE_HEX, VALS(picmg_2a_alarm_ids), 0, NULL, HFILL }},
3699                 { &hf_ipmi_picmg_2a_alarm_ctrl,
3700                         { "Alarm Control",
3701                                 "ipmi.picmg29.alrm.ctrl", FT_UINT8, BASE_HEX, VALS(picmg_2a_alarm_ctrls), 0, NULL, HFILL }},
3702
3703                 { &hf_ipmi_picmg_2b_alarm_state,
3704                         { "Alarm State",
3705                                 "ipmi.picmg29.alrm.ctrl", FT_UINT8, BASE_HEX, VALS(picmg_2a_alarm_ctrls), 0, NULL, HFILL }},
3706
3707         };
3708         static gint *ett[] = {
3709                 &ett_ipmi_picmg_led_color,
3710                 &ett_ipmi_picmg_link_info,
3711                 &ett_ipmi_picmg_link_state,
3712                 &ett_ipmi_picmg_link_dev,
3713                 &ett_ipmi_picmg_clock_setting,
3714                 &ett_ipmi_picmg_clock_res,
3715                 &ett_ipmi_picmg_05_byte1,
3716                 &ett_ipmi_picmg_06_byte1,
3717                 &ett_ipmi_picmg_06_byte2,
3718                 &ett_ipmi_picmg_06_byte3,
3719                 &ett_ipmi_picmg_08_byte1,
3720                 &ett_ipmi_picmg_09_ipmba,
3721                 &ett_ipmi_picmg_09_ipmbb,
3722                 &ett_ipmi_picmg_0a_byte2,
3723                 &ett_ipmi_picmg_0a_byte3,
3724                 &ett_ipmi_picmg_0b_byte1,
3725                 &ett_ipmi_picmg_0f_chan,
3726                 &ett_ipmi_picmg_12_byte1,
3727                 &ett_ipmi_picmg_14_prop,
3728                 &ett_ipmi_picmg_1e_byte1,
3729                 &ett_ipmi_picmg_21_byte9,
3730                 &ett_ipmi_picmg_XX_compbits,
3731                 &ett_ipmi_picmg_2e_byte2,
3732                 &ett_ipmi_picmg_prop00_byte1,
3733                 &ett_ipmi_picmg_prop01_byte1,
3734                 &ett_ipmi_picmg_34_byte3,
3735                 &ett_ipmi_picmg_36_byte2,
3736                 &ett_ipmi_picmg_37_byte2,
3737                 &ett_ipmi_picmg_hpm_caps,
3738                 &ett_ipmi_picmg_47_byte1,
3739                 &ett_ipmi_picmg_23_rq_byte2,
3740                 &ett_ipmi_picmg_23_rs_byte5,
3741                 &ett_ipmi_picmg_25_rs_byte4,
3742                 &ett_ipmi_picmg_25_rs_byte5,
3743                 &ett_ipmi_picmg_27_rs_byte3,
3744                 &ett_ipmi_picmg_28_rq_byte3,
3745                 &ett_ipmi_picmg_29_rs_byte3
3746         };
3747         static guint8 sig_picmg[1] = { 0 };
3748
3749         proto_register_field_array(proto_ipmi, hf, array_length(hf));
3750         proto_register_subtree_array(ett, array_length(ett));
3751         ipmi_register_netfn_cmdtab(IPMI_GROUP_REQ, IPMI_OEM_NONE, sig_picmg, 1,
3752                         "PICMG", cmd_picmg, array_length(cmd_picmg));
3753 }
3754
3755
3756 /*
3757  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
3758  *
3759  * Local variables:
3760  * c-basic-offset: 8
3761  * tab-width: 8
3762  * indent-tabs-mode: t
3763  * End:
3764  *
3765  * vi: set shiftwidth=8 tabstop=8 noexpandtab:
3766  * :indentSize=8:tabSize=8:noTabs=false:
3767  */