blob: 08b58a981f0c33f71c15c0e25e13bebb8c7696b0 [file] [log] [blame]
AppaRao Puli071f3f22018-05-24 16:45:30 +05301/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#include "channelcommands.hpp"
18
19#include "apphandler.hpp"
20#include "channel_layer.hpp"
21
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000022#include <ipmid/api.hpp>
AppaRao Puli071f3f22018-05-24 16:45:30 +053023#include <phosphor-logging/log.hpp>
24#include <regex>
25
26using namespace phosphor::logging;
27
28namespace ipmi
29{
30
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +053031/** @struct GetChannelInfoReq
Richard Marian Thomaiyar6e1ba9e2018-11-29 06:29:21 +053032 *
33 * Structure for get channel info request command (refer spec sec 22.24)
34 */
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +053035struct GetChannelInfoReq
AppaRao Puli071f3f22018-05-24 16:45:30 +053036{
37#if BYTE_ORDER == LITTLE_ENDIAN
38 uint8_t chNum : 4;
39 uint8_t reserved_1 : 4;
40#endif
41#if BYTE_ORDER == BIG_ENDIAN
42 uint8_t reserved_1 : 4;
43 uint8_t chNum : 4;
44#endif
45} __attribute__((packed));
46
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +053047/** @struct GetChannelInfoResp
Richard Marian Thomaiyar6e1ba9e2018-11-29 06:29:21 +053048 *
49 * Structure for get channel info response command (refer spec sec 22.24)
50 */
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +053051struct GetChannelInfoResp
AppaRao Puli071f3f22018-05-24 16:45:30 +053052{
53#if BYTE_ORDER == LITTLE_ENDIAN
54 uint8_t chNum : 4;
55 uint8_t reserved_1 : 4;
56 uint8_t mediumType : 7;
57 uint8_t reserved_2 : 1;
58 uint8_t msgProtType : 5;
59 uint8_t reserved_3 : 3;
60 uint8_t actSessCount : 6;
61 uint8_t sessType : 2;
62#endif
63#if BYTE_ORDER == BIG_ENDIAN
64 uint8_t reserved_1 : 4;
65 uint8_t chNum : 4;
66 uint8_t reserved_2 : 1;
67 uint8_t mediumType : 7;
68 uint8_t reserved_3 : 3;
69 uint8_t msgProtType : 5;
70 uint8_t sessType : 2;
71 uint8_t actSessCount : 6;
72#endif
73 uint8_t vendorId[3];
74 uint8_t auxChInfo[2];
75} __attribute__((packed));
76
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +053077/** @struct GetChannelPayloadSupportReq
78 *
79 * Structure for get channel payload support command request (refer spec
80 * sec 24.8)
81 */
82struct GetChannelPayloadSupportReq
83{
84#if BYTE_ORDER == LITTLE_ENDIAN
85 uint8_t chNum : 4;
86 uint8_t reserved : 4;
87#endif
88#if BYTE_ORDER == BIG_ENDIAN
89 uint8_t reserved : 4;
90 uint8_t chNum : 4;
91#endif
92} __attribute__((packed));
93
94/** @struct GetChannelPayloadSupportResp
95 *
96 * Structure for get channel payload support command response (refer spec
97 * sec 24.8)
98 */
99struct GetChannelPayloadSupportResp
100{
101 uint8_t stdPayloadType[2];
102 uint8_t sessSetupPayloadType[2];
103 uint8_t OEMPayloadType[2];
104 uint8_t reserved[2];
105} __attribute__((packed));
106
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000107/** @brief implements the set channel access command
108 * @ param ctx - context pointer
109 * @ param channel - channel number
110 * @ param reserved - skip 4 bits
111 * @ param accessMode - access mode for IPMI messaging
112 * @ param usrAuth - user level authentication (enable/disable)
113 * @ param msgAuth - per message authentication (enable/disable)
114 * @ param alertDisabled - PEF alerting (enable/disable)
115 * @ param chanAccess - channel access
116 * @ param channelPrivLimit - channel privilege limit
117 * @ param reserved - skip 3 bits
118 * @ param channelPrivMode - channel priviledge mode
119 *
120 * @ returns IPMI completion code
121 **/
122RspType<> ipmiSetChannelAccess(Context::ptr ctx, uint4_t channel,
123 uint4_t reserved1, uint3_t accessMode,
124 bool usrAuth, bool msgAuth, bool alertDisabled,
125 uint2_t chanAccess, uint4_t channelPrivLimit,
126 uint2_t reserved2, uint2_t channelPrivMode)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530127{
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000128 const uint8_t chNum =
129 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530130
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000131 if (!isValidChannel(chNum) || reserved1 != 0 || reserved2 != 0)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530132 {
Richard Marian Thomaiyaref024012019-01-29 11:06:39 +0530133 log<level::DEBUG>("Set channel access - Invalid field in request");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000134 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530135 }
136
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000137 if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530138 {
139 log<level::DEBUG>("Set channel access - No support on channel");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000140 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530141 }
142
143 ChannelAccess chActData;
144 ChannelAccess chNVData;
145 uint8_t setActFlag = 0;
146 uint8_t setNVFlag = 0;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000147 Cc compCode;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530148
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000149 // cannot static cast directly from uint2_t to enum; must go via int
150 uint8_t channelAccessAction = static_cast<uint8_t>(chanAccess);
151 switch (static_cast<EChannelActionType>(channelAccessAction))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530152 {
153 case doNotSet:
AppaRao Puli071f3f22018-05-24 16:45:30 +0530154 break;
155 case nvData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000156 chNVData.accessMode = static_cast<uint8_t>(accessMode);
157 chNVData.userAuthDisabled = usrAuth;
158 chNVData.perMsgAuthDisabled = msgAuth;
159 chNVData.alertingDisabled = alertDisabled;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530160 setNVFlag |= (setAccessMode | setUserAuthEnabled |
161 setMsgAuthEnabled | setAlertingEnabled);
162 break;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000163
AppaRao Puli071f3f22018-05-24 16:45:30 +0530164 case activeData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000165 chActData.accessMode = static_cast<uint8_t>(accessMode);
166 chActData.userAuthDisabled = usrAuth;
167 chActData.perMsgAuthDisabled = msgAuth;
168 chActData.alertingDisabled = alertDisabled;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530169 setActFlag |= (setAccessMode | setUserAuthEnabled |
170 setMsgAuthEnabled | setAlertingEnabled);
171 break;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000172
AppaRao Puli071f3f22018-05-24 16:45:30 +0530173 case reserved:
174 default:
175 log<level::DEBUG>("Set channel access - Invalid access set mode");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000176 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530177 }
178
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000179 // cannot static cast directly from uint2_t to enum; must go via int
180 uint8_t channelPrivAction = static_cast<uint8_t>(channelPrivMode);
181 switch (static_cast<EChannelActionType>(channelPrivAction))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530182 {
183 case doNotSet:
AppaRao Puli071f3f22018-05-24 16:45:30 +0530184 break;
185 case nvData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000186 chNVData.privLimit = static_cast<uint8_t>(channelPrivLimit);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530187 setNVFlag |= setPrivLimit;
188 break;
189 case activeData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000190 chActData.privLimit = static_cast<uint8_t>(channelPrivLimit);
191
AppaRao Puli071f3f22018-05-24 16:45:30 +0530192 setActFlag |= setPrivLimit;
193 break;
194 case reserved:
195 default:
196 log<level::DEBUG>("Set channel access - Invalid access priv mode");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000197 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530198 }
199
200 if (setNVFlag != 0)
201 {
202 compCode = setChannelAccessPersistData(chNum, chNVData, setNVFlag);
203 if (compCode != IPMI_CC_OK)
204 {
205 log<level::DEBUG>("Set channel access - Failed to set access data");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000206 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530207 }
208 }
209
210 if (setActFlag != 0)
211 {
212 compCode = setChannelAccessData(chNum, chActData, setActFlag);
213 if (compCode != IPMI_CC_OK)
214 {
215 log<level::DEBUG>("Set channel access - Failed to set access data");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000216 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530217 }
218 }
219
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000220 return responseSuccess();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530221}
222
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530223/** @brief implements the get channel access command
224 * @ param ctx - context pointer
225 * @ param channel - channel number
226 * @ param reserved1 - skip 4 bits
227 * @ param reserved2 - skip 6 bits
228 * @ param accessMode - get access mode
229 *
230 * @returns ipmi completion code plus response data
231 * - accessMode - get access mode
232 * - usrAuthDisabled - user level authentication status
233 * - msgAuthDisabled - message level authentication status
234 * - alertDisabled - alerting status
235 * - reserved - skip 2 bits
236 * - privLimit - channel privilege limit
237 * - reserved - skip 4 bits
238 * */
239ipmi ::RspType<uint3_t, // access mode,
240 bool, // user authentication status,
241 bool, // message authentication status,
242 bool, // alerting status,
243 uint2_t, // reserved,
244
245 uint4_t, // channel privilege,
246 uint4_t // reserved
247 >
248 ipmiGetChannelAccess(Context::ptr ctx, uint4_t channel, uint4_t reserved1,
249 uint6_t reserved2, uint2_t accessSetMode)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530250{
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530251 const uint8_t chNum =
252 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530253
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530254 if (!isValidChannel(chNum) || reserved1 != 0 || reserved2 != 0)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530255 {
Richard Marian Thomaiyaref024012019-01-29 11:06:39 +0530256 log<level::DEBUG>("Get channel access - Invalid field in request");
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530257 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530258 }
259
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530260 if ((accessSetMode == doNotSet) || (accessSetMode == reserved))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530261 {
262 log<level::DEBUG>("Get channel access - Invalid Access mode");
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530263 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530264 }
265
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530266 if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530267 {
268 log<level::DEBUG>("Get channel access - No support on channel");
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530269 return response(IPMI_CC_ACTION_NOT_SUPPORTED_FOR_CHANNEL);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530270 }
271
AppaRao Puli071f3f22018-05-24 16:45:30 +0530272 ChannelAccess chAccess;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530273
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530274 Cc compCode;
275
276 if (accessSetMode == nvData)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530277 {
278 compCode = getChannelAccessPersistData(chNum, chAccess);
279 }
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530280 else if (accessSetMode == activeData)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530281 {
282 compCode = getChannelAccessData(chNum, chAccess);
283 }
284
285 if (compCode != IPMI_CC_OK)
286 {
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530287 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530288 }
289
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530290 constexpr uint2_t reservedOut1 = 0;
291 constexpr uint4_t reservedOut2 = 0;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530292
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530293 return responseSuccess(
294 static_cast<uint3_t>(chAccess.accessMode), chAccess.userAuthDisabled,
295 chAccess.perMsgAuthDisabled, chAccess.alertingDisabled, reservedOut1,
296 static_cast<uint4_t>(chAccess.privLimit), reservedOut2);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530297}
298
299ipmi_ret_t ipmiGetChannelInfo(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
300 ipmi_request_t request, ipmi_response_t response,
301 ipmi_data_len_t data_len, ipmi_context_t context)
302{
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +0530303 const GetChannelInfoReq* req = static_cast<GetChannelInfoReq*>(request);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530304 size_t reqLength = *data_len;
305
306 *data_len = 0;
307
308 if (reqLength != sizeof(*req))
309 {
310 log<level::DEBUG>("Get channel info - Invalid Length");
311 return IPMI_CC_REQ_DATA_LEN_INVALID;
312 }
313
Richard Marian Thomaiyarf1d0e232018-12-08 17:36:20 +0530314 uint8_t chNum = convertCurrentChannelNum(req->chNum);
Richard Marian Thomaiyaref024012019-01-29 11:06:39 +0530315 if (!isValidChannel(chNum) || req->reserved_1 != 0)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530316 {
Richard Marian Thomaiyaref024012019-01-29 11:06:39 +0530317 log<level::DEBUG>("Get channel info - Invalid field in request");
AppaRao Puli071f3f22018-05-24 16:45:30 +0530318 return IPMI_CC_INVALID_FIELD_REQUEST;
319 }
320
321 // Check the existance of device for session-less channels.
322 if ((EChannelSessSupported::none != getChannelSessionSupport(chNum)) &&
323 (!(doesDeviceExist(chNum))))
324 {
325 log<level::DEBUG>("Get channel info - Device not exist");
326 return IPMI_CC_PARM_OUT_OF_RANGE;
327 }
328
Richard Marian Thomaiyar48e55582018-12-20 15:58:04 +0530329 GetChannelInfoResp* resp = static_cast<GetChannelInfoResp*>(response);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530330
331 std::fill(reinterpret_cast<uint8_t*>(resp),
332 reinterpret_cast<uint8_t*>(resp) + sizeof(*resp), 0);
333
334 ChannelInfo chInfo;
335 ipmi_ret_t compCode = getChannelInfo(chNum, chInfo);
336 if (compCode != IPMI_CC_OK)
337 {
338 return compCode;
339 }
340
341 resp->chNum = chNum;
342 resp->mediumType = chInfo.mediumType;
343 resp->msgProtType = chInfo.protocolType;
344 resp->actSessCount = getChannelActiveSessions(chNum);
345 resp->sessType = chInfo.sessionSupported;
346
347 // IPMI Spec: The IPMI Enterprise Number is: 7154 (decimal)
348 resp->vendorId[0] = 0xF2;
349 resp->vendorId[1] = 0x1B;
350 resp->vendorId[2] = 0x00;
351
352 // Auxiliary Channel info - byte 1:2
353 // TODO: For System Interface(0xF) and OEM channel types, this needs
354 // to be changed acoordingly.
355 // All other channel types, its reverved
356 resp->auxChInfo[0] = 0x00;
357 resp->auxChInfo[1] = 0x00;
358
359 *data_len = sizeof(*resp);
360
361 return IPMI_CC_OK;
362}
363
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530364ipmi_ret_t ipmiGetChannelPayloadSupport(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
365 ipmi_request_t request,
366 ipmi_response_t response,
367 ipmi_data_len_t data_len,
368 ipmi_context_t context)
369{
370 const auto req = static_cast<GetChannelPayloadSupportReq*>(request);
371 size_t reqLength = *data_len;
372
373 *data_len = 0;
374
375 if (reqLength != sizeof(*req))
376 {
377 log<level::DEBUG>("Get channel payload - Invalid Length");
378 return IPMI_CC_REQ_DATA_LEN_INVALID;
379 }
380
381 uint8_t chNum = convertCurrentChannelNum(req->chNum);
382 if (!isValidChannel(chNum) || req->reserved != 0)
383 {
384 log<level::DEBUG>("Get channel payload - Invalid field in request");
385 return IPMI_CC_INVALID_FIELD_REQUEST;
386 }
387
388 // Not supported on sessionless channels.
389 if (EChannelSessSupported::none == getChannelSessionSupport(chNum))
390 {
391 log<level::DEBUG>("Get channel payload - Sessionless Channel");
392 return IPMI_CC_INVALID_FIELD_REQUEST;
393 }
394
395 // Session support is available in active LAN channels.
396 if ((EChannelSessSupported::none != getChannelSessionSupport(chNum)) &&
397 (!(doesDeviceExist(chNum))))
398 {
399 log<level::DEBUG>("Get channel payload - Device not exist");
400 return IPMI_CC_INVALID_FIELD_REQUEST;
401 }
402
403 auto resp = static_cast<GetChannelPayloadSupportResp*>(response);
404
405 std::fill(reinterpret_cast<uint8_t*>(resp),
406 reinterpret_cast<uint8_t*>(resp) + sizeof(*resp), 0);
407
408 // TODO: Hard coding for now.
409 // Mapping PayloadTypes to 'GetChannelPayloadSupportResp' fields:
410 // --------------------------------------------------------------
411 // Mask all except least 3 significant bits to get a value in the range of
412 // 0-7. This value maps to the bit position of given payload type in 'resp'
413 // fields.
414
415 static constexpr uint8_t payloadByteMask = 0x07;
416 static constexpr uint8_t stdPayloadTypeIPMI =
417 1 << (static_cast<uint8_t>(PayloadType::IPMI) & payloadByteMask);
418 static constexpr uint8_t stdPayloadTypeSOL =
419 1 << (static_cast<uint8_t>(PayloadType::SOL) & payloadByteMask);
420
421 static constexpr uint8_t sessPayloadTypeOpenReq =
422 1 << (static_cast<uint8_t>(PayloadType::OPEN_SESSION_REQUEST) &
423 payloadByteMask);
424 static constexpr uint8_t sessPayloadTypeRAKP1 =
425 1 << (static_cast<uint8_t>(PayloadType::RAKP1) & payloadByteMask);
426 static constexpr uint8_t sessPayloadTypeRAKP3 =
427 1 << (static_cast<uint8_t>(PayloadType::RAKP3) & payloadByteMask);
428
429 resp->stdPayloadType[0] = stdPayloadTypeIPMI | stdPayloadTypeSOL;
430 // RMCP+ Open Session request, RAKP Message1 and RAKP Message3.
431 resp->sessSetupPayloadType[0] =
432 sessPayloadTypeOpenReq | sessPayloadTypeRAKP1 | sessPayloadTypeRAKP3;
433
434 *data_len = sizeof(*resp);
435
436 return IPMI_CC_OK;
437}
438
William A. Kennington III343d0612018-12-10 15:56:24 -0800439void registerChannelFunctions() __attribute__((constructor));
AppaRao Puli071f3f22018-05-24 16:45:30 +0530440void registerChannelFunctions()
441{
442 ipmiChannelInit();
443
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000444 registerHandler(prioOpenBmcBase, netFnApp, app::cmdSetChannelAccess,
445 Privilege::Admin, ipmiSetChannelAccess);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530446
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530447 registerHandler(prioOpenBmcBase, netFnApp, app::cmdGetChannelAccess,
448 Privilege::User, ipmiGetChannelAccess);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530449
450 ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CHANNEL_INFO, NULL,
451 ipmiGetChannelInfo, PRIVILEGE_USER);
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530452
453 ipmi_register_callback(NETFUN_APP, IPMI_CMD_GET_CHANNEL_PAYLOAD_SUPPORT,
454 NULL, ipmiGetChannelPayloadSupport, PRIVILEGE_USER);
455
AppaRao Puli071f3f22018-05-24 16:45:30 +0530456 return;
457}
458
459} // namespace ipmi