4
* MontaVista IPMI interface, table and associated code for figuring
5
* out priviledge levels for messages.
7
* Author: MontaVista Software, Inc.
8
* Corey Minyard <minyard@mvista.com>
11
* Copyright 2003 MontaVista Software Inc.
13
* This program is free software; you can redistribute it and/or
14
* modify it under the terms of the GNU Lesser General Public License
15
* as published by the Free Software Foundation; either version 2 of
16
* the License, or (at your option) any later version.
19
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
20
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
25
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
28
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
* You should have received a copy of the GNU Lesser General Public
31
* License along with this program; if not, write to the Free
32
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35
#include <OpenIPMI/ipmi_auth.h>
36
#include <OpenIPMI/ipmi_msgbits.h>
38
#define PRIV_ENTRY(c,u,o,a) ((c) | ((u)<<4) | ((o)<<8) | ((a)<<12))
40
typedef unsigned short priv_val;
42
#define n 0 /* No priviledge (blank entry) */
43
#define s 1 /* System interface only. */
44
#define p 2 /* No authentication required. */
45
#define X 3 /* Permitted */
46
#define b 4 /* bmc-only */
47
#define h 5 /* special send-message handling is needed. */
48
#define i 6 /* Special set system boot options handling. */
49
#define b2 7 /* bmc-only, can be sent to a serial channel when serial
50
port sharing is used and actvating the SOL payload
51
causes the serial session to be terminated. */
53
/* An entry marked with a comment at the beginning has special
56
/* Chassis netfn (0x00) */
57
static priv_val chassis_privs[] =
59
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHASSIS_CAPABILITIES_CMD 0x00 */
60
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHASSIS_STATUS_CMD 0x01 */
61
PRIV_ENTRY(n,n,X,X), /* IPMI_CHASSIS_CONTROL_CMD 0x02 */
62
PRIV_ENTRY(n,n,X,X), /* IPMI_CHASSIS_RESET_CMD 0x03 */
63
PRIV_ENTRY(n,n,X,X), /* IPMI_CHASSIS_IDENTIFY_CMD 0x04 */
64
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_CHASSIS_CAPABILITIES_CMD 0x05 */
65
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_POWER_RESTORE_POLICY_CMD 0x06 */
66
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SYSTEM_RESTART_CAUSE_CMD 0x07 */
67
/**/PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SYSTEM_BOOT_OPTIONS_CMD 0x08 */
68
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_SYSTEM_BOOT_OPTIONS_CMD 0x09 */
69
PRIV_ENTRY(n,n,n,X), /* 0x0a */
70
PRIV_ENTRY(n,n,n,X), /* 0x0b */
71
PRIV_ENTRY(n,n,n,X), /* 0x0c */
72
PRIV_ENTRY(n,n,n,X), /* 0x0d */
73
PRIV_ENTRY(n,n,n,X), /* 0x0e */
74
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_POH_COUNTER_CMD 0x0f */
77
/* Bridge netfn (0x02) */
78
static priv_val bridge_privs[] =
80
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_BRIDGE_STATE_CMD 0x00 */
81
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_BRIDGE_STATE_CMD 0x01 */
82
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_ICMB_ADDRESS_CMD 0x02 */
83
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_ICMB_ADDRESS_CMD 0x03 */
84
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_BRIDGE_PROXY_ADDRESS_CMD 0x04 */
85
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_BRIDGE_STATISTICS_CMD 0x05 */
86
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_ICMB_CAPABILITIES_CMD 0x06 */
87
PRIV_ENTRY(n,n,n,X), /* 0x07 */
88
PRIV_ENTRY(n,n,X,X), /* IPMI_CLEAR_BRIDGE_STATISTICS_CMD 0x08 */
89
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_BRIDGE_PROXY_ADDRESS_CMD 0x09 */
90
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_ICMB_CONNECTOR_INFO_CMD 0x0a */
91
PRIV_ENTRY(n,X,X,X), /* IPMI_SET_ICMB_CONNECTOR_INFO_CMD 0x0b */
92
PRIV_ENTRY(n,X,X,X), /* IPMI_SEND_ICMB_CONNECTION_ID_CMD 0x0c */
93
PRIV_ENTRY(n,n,n,X), /* 0x0d */
94
PRIV_ENTRY(n,n,n,X), /* 0x0e */
95
PRIV_ENTRY(n,n,n,X), /* 0x0f */
96
PRIV_ENTRY(n,n,X,X), /* IPMI_PREPARE_FOR_DISCOVERY_CMD 0x10 */
97
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_ADDRESSES_CMD 0x11 */
98
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_DISCOVERED_CMD 0x12 */
99
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHASSIS_DEVICE_ID_CMD 0x13 */
100
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_CHASSIS_DEVICE_ID_CMD 0x14 */
101
PRIV_ENTRY(n,n,n,X), /* 0x15 */
102
PRIV_ENTRY(n,n,n,X), /* 0x16 */
103
PRIV_ENTRY(n,n,n,X), /* 0x17 */
104
PRIV_ENTRY(n,n,n,X), /* 0x18 */
105
PRIV_ENTRY(n,n,n,X), /* 0x19 */
106
PRIV_ENTRY(n,n,n,X), /* 0x1a */
107
PRIV_ENTRY(n,n,n,X), /* 0x1b */
108
PRIV_ENTRY(n,n,n,X), /* 0x1c */
109
PRIV_ENTRY(n,n,n,X), /* 0x1d */
110
PRIV_ENTRY(n,n,n,X), /* 0x1e */
111
PRIV_ENTRY(n,n,n,X), /* 0x1f */
112
PRIV_ENTRY(n,n,X,X), /* IPMI_BRIDGE_REQUEST_CMD 0x20 */
113
PRIV_ENTRY(n,n,X,X), /* IPMI_BRIDGE_MESSAGE_CMD 0x21 */
114
PRIV_ENTRY(n,n,n,X), /* 0x22 */
115
PRIV_ENTRY(n,n,n,X), /* 0x23 */
116
PRIV_ENTRY(n,n,n,X), /* 0x24 */
117
PRIV_ENTRY(n,n,n,X), /* 0x25 */
118
PRIV_ENTRY(n,n,n,X), /* 0x26 */
119
PRIV_ENTRY(n,n,n,X), /* 0x27 */
120
PRIV_ENTRY(n,n,n,X), /* 0x28 */
121
PRIV_ENTRY(n,n,n,X), /* 0x29 */
122
PRIV_ENTRY(n,n,n,X), /* 0x2a */
123
PRIV_ENTRY(n,n,n,X), /* 0x2b */
124
PRIV_ENTRY(n,n,n,X), /* 0x2c */
125
PRIV_ENTRY(n,n,n,X), /* 0x2d */
126
PRIV_ENTRY(n,n,n,X), /* 0x2e */
127
PRIV_ENTRY(n,n,n,X), /* 0x2f */
128
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_EVENT_COUNT_CMD 0x30 */
129
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_EVENT_DESTINATION_CMD 0x31 */
130
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_EVENT_RECEPTION_STATE_CMD 0x32 */
131
PRIV_ENTRY(n,n,X,X), /* IPMI_SEND_ICMB_EVENT_MESSAGE_CMD 0x33 */
132
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_EVENT_DESTIATION_CMD 0x34 */
133
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_EVENT_RECEPTION_STATE_CMD 0x35 */
135
/* Handled as administrator by virtue of not being there. */
136
/**/PRIV_ENTRY(n,n,n,X), /* IPMI_ERROR_REPORT_CMD 0xff */
140
/* Sensor/Event netfn (0x04) */
141
static priv_val sensor_privs[] =
143
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_EVENT_RECEIVER_CMD 0x00 */
144
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_EVENT_RECEIVER_CMD 0x01 */
145
PRIV_ENTRY(n,n,X,X), /* IPMI_PLATFORM_EVENT_CMD 0x02 */
146
PRIV_ENTRY(n,n,n,X), /* 0x03 */
147
PRIV_ENTRY(n,n,n,X), /* 0x04 */
148
PRIV_ENTRY(n,n,n,X), /* 0x05 */
149
PRIV_ENTRY(n,n,n,X), /* 0x06 */
150
PRIV_ENTRY(n,n,n,X), /* 0x07 */
151
PRIV_ENTRY(n,n,n,X), /* 0x08 */
152
PRIV_ENTRY(n,n,n,X), /* 0x09 */
153
PRIV_ENTRY(n,n,n,X), /* 0x0a */
154
PRIV_ENTRY(n,n,n,X), /* 0x0b */
155
PRIV_ENTRY(n,n,n,X), /* 0x0c */
156
PRIV_ENTRY(n,n,n,X), /* 0x0d */
157
PRIV_ENTRY(n,n,n,X), /* 0x0e */
158
PRIV_ENTRY(n,n,n,X), /* 0x0f */
159
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_PEF_CAPABILITIES_CMD 0x10 */
160
PRIV_ENTRY(n,n,n,X), /* IPMI_ARM_PEF_POSTPONE_TIMER_CMD 0x11 */
161
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_PEF_CONFIG_PARMS_CMD 0x12 */
162
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_PEF_CONFIG_PARMS_CMD 0x13 */
163
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_LAST_PROCESSED_EVENT_ID_CMD 0x14 */
164
PRIV_ENTRY(n,n,n,X), /* IPMI_GET_LAST_PROCESSED_EVENT_ID_CMD 0x15 */
165
PRIV_ENTRY(n,n,n,X), /* IPMI_ALERT_IMMEDIATE_CMD 0x16 */
166
PRIV_ENTRY(p,p,p,p), /* IPMI_PET_ACKNOWLEDGE_CMD 0x17 */
167
PRIV_ENTRY(n,n,n,X), /* 0x18 */
168
PRIV_ENTRY(n,n,n,X), /* 0x19 */
169
PRIV_ENTRY(n,n,n,X), /* 0x1a */
170
PRIV_ENTRY(n,n,n,X), /* 0x1b */
171
PRIV_ENTRY(n,n,n,X), /* 0x1c */
172
PRIV_ENTRY(n,n,n,X), /* 0x1d */
173
PRIV_ENTRY(n,n,n,X), /* 0x1e */
174
PRIV_ENTRY(n,n,n,X), /* 0x1f */
175
/* Note, the following are "I I I I" in the table, but I think
177
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_DEVICE_SDR_INFO_CMD 0x20 */
178
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_DEVICE_SDR_CMD 0x21 */
179
PRIV_ENTRY(n,X,X,X), /* IPMI_RESERVE_DEVICE_SDR_REPOSITORY_CMD 0x22 */
180
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_READING_FACTORS_CMD 0x23 */
181
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SENSOR_HYSTERESIS_CMD 0x24 */
182
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_HYSTERESIS_CMD 0x25 */
183
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SENSOR_THRESHOLD_CMD 0x26 */
184
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_THRESHOLD_CMD 0x27 */
185
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SENSOR_EVENT_ENABLE_CMD 0x28 */
186
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_EVENT_ENABLE_CMD 0x29 */
187
PRIV_ENTRY(n,n,X,X), /* IPMI_REARM_SENSOR_EVENTS_CMD 0x2a */
188
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_EVENT_STATUS_CMD 0x2b */
189
PRIV_ENTRY(n,n,n,X), /* 0x2c */
190
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_READING_CMD 0x2d */
191
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SENSOR_TYPE_CMD 0x2e */
192
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SENSOR_TYPE_CMD 0x2f */
195
/* App netfn (0x06) */
196
static priv_val app_privs[] =
198
PRIV_ENTRY(n,n,n,X), /* 0x00 */
199
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_DEVICE_ID_CMD 0x01 */
200
PRIV_ENTRY(n,n,n,X), /* IPMI_COLD_RESET_CMD 0x02 */
201
PRIV_ENTRY(n,n,n,X), /* IPMI_WARM_RESET_CMD 0x03 */
202
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SELF_TEST_RESULTS_CMD 0x04 */
203
PRIV_ENTRY(n,n,n,X), /* IPMI_MANUFACTURING_TEST_ON_CMD 0x05 */
204
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_ACPI_POWER_STATE_CMD 0x06 */
205
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_ACPI_POWER_STATE_CMD 0x07 */
206
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_DEVICE_GUID_CMD 0x08 */
207
PRIV_ENTRY(n,n,n,X), /* 0x09 */
208
PRIV_ENTRY(n,n,n,X), /* 0x0a */
209
PRIV_ENTRY(n,n,n,X), /* 0x0b */
210
PRIV_ENTRY(n,n,n,X), /* 0x0c */
211
PRIV_ENTRY(n,n,n,X), /* 0x0d */
212
PRIV_ENTRY(n,n,n,X), /* 0x0e */
213
PRIV_ENTRY(n,n,n,X), /* 0x0f */
214
PRIV_ENTRY(n,n,n,X), /* 0x10 */
215
PRIV_ENTRY(n,n,n,X), /* 0x11 */
216
PRIV_ENTRY(n,n,n,X), /* 0x12 */
217
PRIV_ENTRY(n,n,n,X), /* 0x13 */
218
PRIV_ENTRY(n,n,n,X), /* 0x14 */
219
PRIV_ENTRY(n,n,n,X), /* 0x15 */
220
PRIV_ENTRY(n,n,n,X), /* 0x16 */
221
PRIV_ENTRY(n,n,n,X), /* 0x17 */
222
PRIV_ENTRY(n,n,n,X), /* 0x18 */
223
PRIV_ENTRY(n,n,n,X), /* 0x19 */
224
PRIV_ENTRY(n,n,n,X), /* 0x1a */
225
PRIV_ENTRY(n,n,n,X), /* 0x1b */
226
PRIV_ENTRY(n,n,n,X), /* 0x1c */
227
PRIV_ENTRY(n,n,n,X), /* 0x1d */
228
PRIV_ENTRY(n,n,n,X), /* 0x1e */
229
PRIV_ENTRY(n,n,n,X), /* 0x1f */
230
PRIV_ENTRY(n,n,n,X), /* 0x20 */
231
PRIV_ENTRY(n,n,n,X), /* 0x21 */
232
PRIV_ENTRY(n,n,X,X), /* IPMI_RESET_WATCHDOG_TIMER_CMD 0x22 */
233
PRIV_ENTRY(n,n,n,X), /* 0x23 */
234
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_WATCHDOG_TIMER_CMD 0x24 */
235
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_WATCHDOG_TIMER_CMD 0x25 */
236
PRIV_ENTRY(n,n,n,X), /* 0x26 */
237
PRIV_ENTRY(n,n,n,X), /* 0x27 */
238
PRIV_ENTRY(n,n,n,X), /* 0x28 */
239
PRIV_ENTRY(n,n,n,X), /* 0x29 */
240
PRIV_ENTRY(n,n,n,X), /* 0x2a */
241
PRIV_ENTRY(n,n,n,X), /* 0x2b */
242
PRIV_ENTRY(n,n,n,X), /* 0x2c */
243
PRIV_ENTRY(n,n,n,X), /* 0x2d */
244
PRIV_ENTRY(s,s,s,s), /* IPMI_SET_BMC_GLOBAL_ENABLES_CMD 0x2e */
245
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_BMC_GLOBAL_ENABLES_CMD 0x2f */
246
PRIV_ENTRY(s,s,s,s), /* IPMI_CLEAR_MSG_FLAGS_CMD 0x30 */
247
PRIV_ENTRY(s,s,s,s), /* IPMI_GET_MSG_FLAGS_CMD 0x31 */
248
PRIV_ENTRY(s,s,s,s), /* IPMI_ENABLE_MESSAGE_CHANNEL_RCV_CMD 0x32 */
249
PRIV_ENTRY(s,s,s,s), /* IPMI_GET_MSG_CMD 0x33 */
250
/**/PRIV_ENTRY(n,h,X,X), /* IPMI_SEND_MSG_CMD 0x34 */
251
PRIV_ENTRY(s,s,s,s), /* IPMI_READ_EVENT_MSG_BUFFER_CMD 0x35 */
252
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_BT_INTERFACE_CAPABILITIES_CMD 0x36 */
253
PRIV_ENTRY(p,p,p,p), /* IPMI_GET_SYSTEM_GUID_CMD 0x37 */
254
PRIV_ENTRY(p,p,p,p), /* IPMI_GET_CHANNEL_AUTH_CAPABILITIES_CMD 0x38 */
255
PRIV_ENTRY(p,p,p,p), /* IPMI_GET_SESSION_CHALLENGE_CMD 0x39 */
256
PRIV_ENTRY(p,p,p,p), /* IPMI_ACTIVATE_SESSION_CMD 0x3a */
257
PRIV_ENTRY(n,X,X,X), /* IPMI_SET_SESSION_PRIVILEGE_CMD 0x3b */
258
PRIV_ENTRY(X,X,X,X), /* IPMI_CLOSE_SESSION_CMD 0x3c */
259
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SESSION_INFO_CMD 0x3d */
260
PRIV_ENTRY(n,n,n,X), /* 0x3e */
261
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_AUTHCODE_CMD 0x3f */
262
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_CHANNEL_ACCESS_CMD 0x40 */
263
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHANNEL_ACCESS_CMD 0x41 */
264
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHANNEL_INFO_CMD 0x42 */
265
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_USER_ACCESS_CMD 0x43 */
266
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_USER_ACCESS_CMD 0x44 */
267
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_USER_NAME_CMD 0x45 */
268
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_USER_NAME_CMD 0x46 */
269
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_USER_PASSWORD_CMD 0x47 */
270
PRIV_ENTRY(X,X,X,X), /* IPMI_ACTIVATE_PAYLOAD_CMD 0x48 */
271
PRIV_ENTRY(X,X,X,X), /* IPMI_DEACTIVATE_PAYLOAD_CMD 0x49 */
272
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_PAYLOAD_ACTIVATION_STATUS_CMD 0x4a */
273
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_PAYLOAD_INSTANCE_INFO_CMD 0x4b */
274
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_USER_PAYLOAD_ACCESS_CMD 0x4c */
275
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_USER_PAYLOAD_ACCESS_CMD 0x4d */
276
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHANNEL_PAYLOAD_SUPPORT_CMD 0x4e */
277
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHANNEL_PAYLOAD_VERSION_CMD 0x4f */
278
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_CHANNEL_OEM_PAYLOAD_INFO_CMD 0x50 */
279
PRIV_ENTRY(n,n,n,X), /* 0x51 */
280
PRIV_ENTRY(n,n,X,X), /* IPMI_MASTER_READ_WRITE_CMD 0x52 */
281
PRIV_ENTRY(n,n,n,X), /* 0x53 */
282
PRIV_ENTRY(p,p,p,p), /* IPMI_GET_CHANNEL_CIPHER_SUITES_CMD 0x54 */
283
PRIV_ENTRY(n,X,X,X), /* IPMI_SUSPEND_RESUME_PAYLOAD_ENCRYPTION_CMD 0x55 */
284
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_CHANNEL_SECURITY_KEY_CMD 0x56 */
285
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SYSTEM_INTERFACE_CAPABILITIES_CMD 0x57 */
288
/* Firmware netfn (0x08) */
289
static priv_val firmware_privs[] =
291
PRIV_ENTRY(n,n,n,X), /* 0x00 */
294
/* Storage netfn (0x0a) */
295
static priv_val storage_privs[] =
297
PRIV_ENTRY(n,n,n,X), /* 0x00 */
298
PRIV_ENTRY(n,n,n,X), /* 0x01 */
299
PRIV_ENTRY(n,n,n,X), /* 0x02 */
300
PRIV_ENTRY(n,n,n,X), /* 0x03 */
301
PRIV_ENTRY(n,n,n,X), /* 0x04 */
302
PRIV_ENTRY(n,n,n,X), /* 0x05 */
303
PRIV_ENTRY(n,n,n,X), /* 0x06 */
304
PRIV_ENTRY(n,n,n,X), /* 0x07 */
305
PRIV_ENTRY(n,n,n,X), /* 0x08 */
306
PRIV_ENTRY(n,n,n,X), /* 0x09 */
307
PRIV_ENTRY(n,n,n,X), /* 0x0a */
308
PRIV_ENTRY(n,n,n,X), /* 0x0b */
309
PRIV_ENTRY(n,n,n,X), /* 0x0c */
310
PRIV_ENTRY(n,n,n,X), /* 0x0d */
311
PRIV_ENTRY(n,n,n,X), /* 0x0e */
312
PRIV_ENTRY(n,n,n,X), /* 0x0f */
313
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_FRU_INVENTORY_AREA_INFO_CMD 0x10 */
314
PRIV_ENTRY(n,X,X,X), /* IPMI_READ_FRU_DATA_CMD 0x11 */
315
PRIV_ENTRY(n,n,X,X), /* IPMI_WRITE_FRU_DATA_CMD 0x12 */
316
PRIV_ENTRY(n,n,n,X), /* 0x13 */
317
PRIV_ENTRY(n,n,n,X), /* 0x14 */
318
PRIV_ENTRY(n,n,n,X), /* 0x15 */
319
PRIV_ENTRY(n,n,n,X), /* 0x16 */
320
PRIV_ENTRY(n,n,n,X), /* 0x17 */
321
PRIV_ENTRY(n,n,n,X), /* 0x18 */
322
PRIV_ENTRY(n,n,n,X), /* 0x19 */
323
PRIV_ENTRY(n,n,n,X), /* 0x1a */
324
PRIV_ENTRY(n,n,n,X), /* 0x1b */
325
PRIV_ENTRY(n,n,n,X), /* 0x1c */
326
PRIV_ENTRY(n,n,n,X), /* 0x1d */
327
PRIV_ENTRY(n,n,n,X), /* 0x1e */
328
PRIV_ENTRY(n,n,n,X), /* 0x1f */
329
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SDR_REPOSITORY_INFO_CMD 0x20 */
330
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SDR_REPOSITORY_ALLOC_INFO_CMD 0x21 */
331
PRIV_ENTRY(n,X,X,X), /* IPMI_RESERVE_SDR_REPOSITORY_CMD 0x22 */
332
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SDR_CMD 0x23 */
333
PRIV_ENTRY(n,n,X,X), /* IPMI_ADD_SDR_CMD 0x24 */
334
PRIV_ENTRY(n,n,X,X), /* IPMI_PARTIAL_ADD_SDR_CMD 0x25 */
335
PRIV_ENTRY(n,n,X,X), /* IPMI_DELETE_SDR_CMD 0x26 */
336
PRIV_ENTRY(n,n,X,X), /* IPMI_CLEAR_SDR_REPOSITORY_CMD 0x27 */
337
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SDR_REPOSITORY_TIME_CMD 0x28 */
338
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SDR_REPOSITORY_TIME_CMD 0x29 */
339
PRIV_ENTRY(n,n,X,X), /* IPMI_ENTER_SDR_REPOSITORY_UPDATE_CMD 0x2a */
340
PRIV_ENTRY(n,n,X,X), /* IPMI_EXIT_SDR_REPOSITORY_UPDATE_CMD 0x2b */
341
PRIV_ENTRY(n,n,X,X), /* IPMI_RUN_INITIALIZATION_AGENT_CMD 0x2c */
342
PRIV_ENTRY(n,n,n,X), /* 0x2d */
343
PRIV_ENTRY(n,n,n,X), /* 0x2e */
344
PRIV_ENTRY(n,n,n,X), /* 0x2f */
345
PRIV_ENTRY(n,n,n,X), /* 0x30 */
346
PRIV_ENTRY(n,n,n,X), /* 0x31 */
347
PRIV_ENTRY(n,n,n,X), /* 0x32 */
348
PRIV_ENTRY(n,n,n,X), /* 0x33 */
349
PRIV_ENTRY(n,n,n,X), /* 0x34 */
350
PRIV_ENTRY(n,n,n,X), /* 0x35 */
351
PRIV_ENTRY(n,n,n,X), /* 0x36 */
352
PRIV_ENTRY(n,n,n,X), /* 0x37 */
353
PRIV_ENTRY(n,n,n,X), /* 0x38 */
354
PRIV_ENTRY(n,n,n,X), /* 0x39 */
355
PRIV_ENTRY(n,n,n,X), /* 0x3a */
356
PRIV_ENTRY(n,n,n,X), /* 0x4b */
357
PRIV_ENTRY(n,n,n,X), /* 0x3c */
358
PRIV_ENTRY(n,n,n,X), /* 0x3d */
359
PRIV_ENTRY(n,n,n,X), /* 0x3e */
360
PRIV_ENTRY(n,n,n,X), /* 0x3f */
361
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SEL_INFO_CMD 0x40 */
362
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SEL_ALLOCATION_INFO_CMD 0x41 */
363
PRIV_ENTRY(n,X,X,X), /* IPMI_RESERVE_SEL_CMD 0x42 */
364
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SEL_ENTRY_CMD 0x43 */
365
PRIV_ENTRY(n,n,X,X), /* IPMI_ADD_SEL_ENTRY_CMD 0x44 */
366
PRIV_ENTRY(n,n,X,X), /* IPMI_PARTIAL_ADD_SEL_ENTRY_CMD 0x45 */
367
PRIV_ENTRY(n,n,X,X), /* IPMI_DELETE_SEL_ENTRY_CMD 0x46 */
368
PRIV_ENTRY(n,n,X,X), /* IPMI_CLEAR_SEL_CMD 0x47 */
369
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SEL_TIME_CMD 0x48 */
370
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_SEL_TIME_CMD 0x49 */
371
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_AUXILIARY_LOG_STATUS_CMD 0x5a */
372
PRIV_ENTRY(n,n,X,X), /* IPMI_SET_AUXILIARY_LOG_STATUS_CMD 0x5b */
375
/* Transport netfn (0x0c) */
376
static priv_val transport_privs[] =
378
PRIV_ENTRY(n,n,n,X), /* 0x00 */
379
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_LAN_CONFIG_PARMS_CMD 0x01 */
380
PRIV_ENTRY(n,n,X,X), /* IPMI_GET_LAN_CONFIG_PARMS_CMD 0x02 */
381
PRIV_ENTRY(n,n,X,X), /* IPMI_SUSPEND_BMC_ARPS_CMD 0x03 */
382
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_IP_UDP_RMCP_STATS_CMD 0x04 */
383
PRIV_ENTRY(n,n,n,X), /* 0x05 */
384
PRIV_ENTRY(n,n,n,X), /* 0x06 */
385
PRIV_ENTRY(n,n,n,X), /* 0x07 */
386
PRIV_ENTRY(n,n,n,X), /* 0x08 */
387
PRIV_ENTRY(n,n,n,X), /* 0x09 */
388
PRIV_ENTRY(n,n,n,X), /* 0x0a */
389
PRIV_ENTRY(n,n,n,X), /* 0x0b */
390
PRIV_ENTRY(n,n,n,X), /* 0x0c */
391
PRIV_ENTRY(n,n,n,X), /* 0x0d */
392
PRIV_ENTRY(n,n,n,X), /* 0x0e */
393
PRIV_ENTRY(n,n,n,X), /* 0x0f */
394
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_SERIAL_MODEM_CONFIG_CMD 0x10 */
395
PRIV_ENTRY(n,n,n,X), /* IPMI_GET_SERIAL_MODEM_CONFIG_CMD 0x11 */
396
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_SERIAL_MODEM_MUX_CMD 0x12 */
397
PRIV_ENTRY(n,n,n,X), /* IPMI_GET_TAP_RESPONSE_CODES_CMD 0x13 */
398
PRIV_ENTRY(s,s,s,s), /* IPMI_SET_PPP_UDP_PROXY_XMIT_DATA_CMD 0x14 */
399
PRIV_ENTRY(s,s,s,s), /* IPMI_GET_PPP_UDP_PROXY_XMIT_DATA_CMD 0x15 */
400
PRIV_ENTRY(s,s,s,s), /* IPMI_SEND_PPP_UDP_PROXY_PACKET_CMD 0x16 */
401
PRIV_ENTRY(s,s,s,s), /* IPMI_GET_PPP_UDP_PROXY_RECV_DATA_CMD 0x17 */
402
PRIV_ENTRY(b,b,b,b), /* IPMI_SERIAL_MODEM_CONN_ACTIVE_CMD 0x18 */
403
PRIV_ENTRY(X,n,X,X), /* IPMI_CALLBACK_CMD 0x19 */
404
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_USER_CALLBACK_OPTIONS_CMD 0x1a */
405
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_USER_CALLBACK_OPTIONS_CMD 0x1b */
406
PRIV_ENTRY(n,n,n,X), /* 0x1c */
407
PRIV_ENTRY(n,n,n,X), /* 0x1d */
408
PRIV_ENTRY(n,n,n,X), /* 0x1e */
409
PRIV_ENTRY(n,n,n,X), /* 0x1f */
410
PRIV_ENTRY(b2,b2,b2,b2), /* IPMI_SOL_ACTIVATING_CMD 0x20 */
411
PRIV_ENTRY(n,n,n,X), /* IPMI_SET_SOL_CONFIGURATION_PARAMETERS 0x21 */
412
PRIV_ENTRY(n,X,X,X), /* IPMI_GET_SOL_CONFIGURATION_PARAMETERS 0x22 */
421
{ sizeof(chassis_privs)/sizeof(priv_val), chassis_privs },
422
{ sizeof(bridge_privs)/sizeof(priv_val), bridge_privs },
423
{ sizeof(sensor_privs)/sizeof(priv_val), sensor_privs },
424
{ sizeof(app_privs)/sizeof(priv_val), app_privs },
425
{ sizeof(firmware_privs)/sizeof(priv_val), firmware_privs },
426
{ sizeof(storage_privs)/sizeof(priv_val), storage_privs },
427
{ sizeof(transport_privs)/sizeof(priv_val), transport_privs },
431
ipmi_cmd_permitted(unsigned char priv,
438
if ((priv < IPMI_PRIVILEGE_CALLBACK) || (priv > IPMI_PRIVILEGE_ADMIN))
439
return IPMI_PRIV_INVALID;
441
if ((netfn > IPMI_TRANSPORT_NETFN)
442
|| (cmd >= priv_table[netfn>>1].size))
444
/* All things not in the table are assumed to take
445
administrator priviledge. */
446
if (priv == IPMI_PRIVILEGE_ADMIN)
447
return IPMI_PRIV_PERMITTED;
449
return IPMI_PRIV_DENIED;
452
perm = priv_table[netfn>>1].vals[cmd];
453
/* Extract the permissions for the given privilege from the
454
permission word. The tables are 0-based, but the first valid
455
privilege is 1, thus the (priv - 1) here. */
456
perm >>= 4 * (priv - 1);
469
return IPMI_PRIV_PERMITTED;
472
return IPMI_PRIV_SEND;
475
return IPMI_PRIV_BOOT;
478
return IPMI_PRIV_DENIED;