~ubuntu-branches/ubuntu/intrepid/openipmi/intrepid

« back to all changes in this revision

Viewing changes to lanserv/priv_table.c

  • Committer: Bazaar Package Importer
  • Author(s): Noèl Köthe
  • Date: 2005-07-04 21:29:17 UTC
  • Revision ID: james.westby@ubuntu.com-20050704212917-igddk5jawjmhrlay
Tags: upstream-2.0.1
Import upstream version 2.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * priv_table.h
 
3
 *
 
4
 * MontaVista IPMI interface, table and associated code for figuring
 
5
 * out priviledge levels for messages.
 
6
 *
 
7
 * Author: MontaVista Software, Inc.
 
8
 *         Corey Minyard <minyard@mvista.com>
 
9
 *         source@mvista.com
 
10
 *
 
11
 * Copyright 2003 MontaVista Software Inc.
 
12
 *
 
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.
 
17
 *
 
18
 *
 
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.
 
29
 *
 
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.
 
33
 */
 
34
 
 
35
#include <OpenIPMI/ipmi_auth.h>
 
36
#include <OpenIPMI/ipmi_msgbits.h>
 
37
 
 
38
#define PRIV_ENTRY(c,u,o,a) ((c) | ((u)<<4) | ((o)<<8) | ((a)<<12))
 
39
 
 
40
typedef unsigned short priv_val;
 
41
 
 
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. */
 
52
 
 
53
/* An entry marked with a comment at the beginning has special
 
54
   handling. */
 
55
 
 
56
/* Chassis netfn (0x00) */
 
57
static priv_val chassis_privs[] =
 
58
{
 
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 */
 
75
};
 
76
 
 
77
/* Bridge netfn (0x02) */
 
78
static priv_val bridge_privs[] =
 
79
{
 
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 */
 
134
#if 0
 
135
/* Handled as administrator by virtue of not being there. */
 
136
/**/PRIV_ENTRY(n,n,n,X), /* IPMI_ERROR_REPORT_CMD                       0xff */
 
137
#endif
 
138
};
 
139
 
 
140
/* Sensor/Event netfn (0x04) */
 
141
static priv_val sensor_privs[] =
 
142
{
 
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
 
176
       that's wrong. */
 
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 */
 
193
};
 
194
 
 
195
/* App netfn (0x06) */
 
196
static priv_val app_privs[] =
 
197
{
 
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 */
 
286
};
 
287
 
 
288
/* Firmware netfn (0x08) */
 
289
static priv_val firmware_privs[] =
 
290
{
 
291
    PRIV_ENTRY(n,n,n,X), /*                                             0x00 */
 
292
};
 
293
 
 
294
/* Storage netfn (0x0a) */
 
295
static priv_val storage_privs[] =
 
296
{
 
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 */
 
373
};
 
374
 
 
375
/* Transport netfn (0x0c) */
 
376
static priv_val transport_privs[] =
 
377
{
 
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 */
 
413
};
 
414
 
 
415
static struct
 
416
{
 
417
    int      size;
 
418
    priv_val *vals;
 
419
} priv_table[7] =
 
420
{
 
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 },
 
428
};
 
429
 
 
430
int
 
431
ipmi_cmd_permitted(unsigned char priv,
 
432
                   unsigned char netfn,
 
433
                   unsigned char cmd)
 
434
{
 
435
    int      perm;
 
436
 
 
437
    /* Priviledges */
 
438
    if ((priv < IPMI_PRIVILEGE_CALLBACK) || (priv > IPMI_PRIVILEGE_ADMIN))
 
439
        return IPMI_PRIV_INVALID;
 
440
 
 
441
    if ((netfn > IPMI_TRANSPORT_NETFN)
 
442
        || (cmd >= priv_table[netfn>>1].size))
 
443
    {
 
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;
 
448
        else
 
449
            return IPMI_PRIV_DENIED;
 
450
    }
 
451
 
 
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);
 
457
    perm &= 0xf;
 
458
 
 
459
    switch (perm)
 
460
    {
 
461
        case n:
 
462
        case s:
 
463
        case b:
 
464
        case b2:
 
465
            return 0;
 
466
 
 
467
        case p:
 
468
        case X:
 
469
            return IPMI_PRIV_PERMITTED;
 
470
 
 
471
        case h:
 
472
            return IPMI_PRIV_SEND;
 
473
 
 
474
        case i:
 
475
            return IPMI_PRIV_BOOT;
 
476
    }
 
477
 
 
478
    return IPMI_PRIV_DENIED;
 
479
}