blob: f98a5e7b31583c5a765b232057c5ce96f458f8db [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
AppaRao Puli071f3f22018-05-24 16:45:30 +053017#include "apphandler.hpp"
18#include "channel_layer.hpp"
19
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000020#include <ipmid/api.hpp>
George Liu82844ef2024-07-17 17:03:56 +080021#include <phosphor-logging/lg2.hpp>
Patrick Williamsfbc6c9d2023-05-10 07:50:16 -050022
AppaRao Puli071f3f22018-05-24 16:45:30 +053023#include <regex>
24
AppaRao Puli071f3f22018-05-24 16:45:30 +053025namespace ipmi
26{
27
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000028/** @brief implements the set channel access command
29 * @ param ctx - context pointer
30 * @ param channel - channel number
31 * @ param reserved - skip 4 bits
32 * @ param accessMode - access mode for IPMI messaging
33 * @ param usrAuth - user level authentication (enable/disable)
34 * @ param msgAuth - per message authentication (enable/disable)
35 * @ param alertDisabled - PEF alerting (enable/disable)
36 * @ param chanAccess - channel access
37 * @ param channelPrivLimit - channel privilege limit
38 * @ param reserved - skip 3 bits
39 * @ param channelPrivMode - channel priviledge mode
40 *
41 * @ returns IPMI completion code
42 **/
Patrick Williams1318a5e2024-08-16 15:19:54 -040043RspType<> ipmiSetChannelAccess(
44 Context::ptr ctx, uint4_t channel, uint4_t reserved1, uint3_t accessMode,
45 bool usrAuth, bool msgAuth, bool alertDisabled, uint2_t chanAccess,
46 uint4_t channelPrivLimit, uint2_t reserved2, uint2_t channelPrivMode)
AppaRao Puli071f3f22018-05-24 16:45:30 +053047{
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +000048 if (reserved1 || reserved2 ||
49 !isValidPrivLimit(static_cast<uint8_t>(channelPrivLimit)))
AppaRao Puli071f3f22018-05-24 16:45:30 +053050 {
George Liu82844ef2024-07-17 17:03:56 +080051 lg2::debug("Set channel access - Invalid field in request");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000052 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +053053 }
54
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +000055 const uint8_t chNum =
56 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
57 if ((getChannelSessionSupport(chNum) == EChannelSessSupported::none) ||
58 (!isValidChannel(chNum)))
AppaRao Puli071f3f22018-05-24 16:45:30 +053059 {
George Liu82844ef2024-07-17 17:03:56 +080060 lg2::debug("Set channel access - No support on channel: {CHANNEL}",
61 "CHANNEL", chNum);
anil kumar appanaddb1f442019-07-04 18:07:27 +000062 return response(ccActionNotSupportedForChannel);
AppaRao Puli071f3f22018-05-24 16:45:30 +053063 }
64
65 ChannelAccess chActData;
66 ChannelAccess chNVData;
67 uint8_t setActFlag = 0;
68 uint8_t setNVFlag = 0;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000069 Cc compCode;
AppaRao Puli071f3f22018-05-24 16:45:30 +053070
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000071 // cannot static cast directly from uint2_t to enum; must go via int
72 uint8_t channelAccessAction = static_cast<uint8_t>(chanAccess);
73 switch (static_cast<EChannelActionType>(channelAccessAction))
AppaRao Puli071f3f22018-05-24 16:45:30 +053074 {
75 case doNotSet:
AppaRao Puli071f3f22018-05-24 16:45:30 +053076 break;
77 case nvData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000078 chNVData.accessMode = static_cast<uint8_t>(accessMode);
79 chNVData.userAuthDisabled = usrAuth;
80 chNVData.perMsgAuthDisabled = msgAuth;
81 chNVData.alertingDisabled = alertDisabled;
AppaRao Puli071f3f22018-05-24 16:45:30 +053082 setNVFlag |= (setAccessMode | setUserAuthEnabled |
83 setMsgAuthEnabled | setAlertingEnabled);
84 break;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000085
AppaRao Puli071f3f22018-05-24 16:45:30 +053086 case activeData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000087 chActData.accessMode = static_cast<uint8_t>(accessMode);
88 chActData.userAuthDisabled = usrAuth;
89 chActData.perMsgAuthDisabled = msgAuth;
90 chActData.alertingDisabled = alertDisabled;
AppaRao Puli071f3f22018-05-24 16:45:30 +053091 setActFlag |= (setAccessMode | setUserAuthEnabled |
92 setMsgAuthEnabled | setAlertingEnabled);
93 break;
NITIN SHARMA89e4bf22019-05-02 13:03:58 +000094
AppaRao Puli071f3f22018-05-24 16:45:30 +053095 case reserved:
96 default:
George Liu82844ef2024-07-17 17:03:56 +080097 lg2::debug("Set channel access - Invalid access set mode");
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +000098 return response(ccAccessModeNotSupportedForChannel);
AppaRao Puli071f3f22018-05-24 16:45:30 +053099 }
100
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000101 // cannot static cast directly from uint2_t to enum; must go via int
102 uint8_t channelPrivAction = static_cast<uint8_t>(channelPrivMode);
103 switch (static_cast<EChannelActionType>(channelPrivAction))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530104 {
105 case doNotSet:
AppaRao Puli071f3f22018-05-24 16:45:30 +0530106 break;
107 case nvData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000108 chNVData.privLimit = static_cast<uint8_t>(channelPrivLimit);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530109 setNVFlag |= setPrivLimit;
110 break;
111 case activeData:
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000112 chActData.privLimit = static_cast<uint8_t>(channelPrivLimit);
113
AppaRao Puli071f3f22018-05-24 16:45:30 +0530114 setActFlag |= setPrivLimit;
115 break;
116 case reserved:
117 default:
George Liu82844ef2024-07-17 17:03:56 +0800118 lg2::debug("Set channel access - Invalid access priv mode");
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000119 return response(ccAccessModeNotSupportedForChannel);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530120 }
121
122 if (setNVFlag != 0)
123 {
124 compCode = setChannelAccessPersistData(chNum, chNVData, setNVFlag);
NITIN SHARMAb541a5a2019-07-18 12:46:59 +0000125 if (compCode != ccSuccess)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530126 {
George Liu82844ef2024-07-17 17:03:56 +0800127 lg2::debug("Set channel access - Failed to set access data");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000128 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530129 }
130 }
131
132 if (setActFlag != 0)
133 {
134 compCode = setChannelAccessData(chNum, chActData, setActFlag);
NITIN SHARMAb541a5a2019-07-18 12:46:59 +0000135 if (compCode != ccSuccess)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530136 {
George Liu82844ef2024-07-17 17:03:56 +0800137 lg2::debug("Set channel access - Failed to set access data");
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000138 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530139 }
140 }
141
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000142 return responseSuccess();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530143}
144
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530145/** @brief implements the get channel access command
146 * @ param ctx - context pointer
147 * @ param channel - channel number
148 * @ param reserved1 - skip 4 bits
149 * @ param reserved2 - skip 6 bits
150 * @ param accessMode - get access mode
151 *
152 * @returns ipmi completion code plus response data
153 * - accessMode - get access mode
154 * - usrAuthDisabled - user level authentication status
155 * - msgAuthDisabled - message level authentication status
156 * - alertDisabled - alerting status
157 * - reserved - skip 2 bits
158 * - privLimit - channel privilege limit
159 * - reserved - skip 4 bits
160 * */
161ipmi ::RspType<uint3_t, // access mode,
162 bool, // user authentication status,
163 bool, // message authentication status,
164 bool, // alerting status,
165 uint2_t, // reserved,
166
167 uint4_t, // channel privilege,
168 uint4_t // reserved
169 >
170 ipmiGetChannelAccess(Context::ptr ctx, uint4_t channel, uint4_t reserved1,
171 uint6_t reserved2, uint2_t accessSetMode)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530172{
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000173 if (reserved1 || reserved2)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530174 {
George Liu82844ef2024-07-17 17:03:56 +0800175 lg2::debug("Get channel access - Invalid field in request");
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530176 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530177 }
178
William A. Kennington III7a0e5df2021-05-19 13:31:29 -0700179 if ((types::enum_cast<EChannelActionType>(accessSetMode) == doNotSet) ||
180 (types::enum_cast<EChannelActionType>(accessSetMode) == reserved))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530181 {
George Liu82844ef2024-07-17 17:03:56 +0800182 lg2::debug("Get channel access - Invalid Access mode");
AppaRao Pulic4f4f7a2020-07-13 16:43:59 +0530183 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530184 }
185
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000186 const uint8_t chNum =
187 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
188
189 if ((getChannelSessionSupport(chNum) == EChannelSessSupported::none) ||
190 (!isValidChannel(chNum)))
AppaRao Puli071f3f22018-05-24 16:45:30 +0530191 {
George Liu82844ef2024-07-17 17:03:56 +0800192 lg2::debug("Get channel access - No support on channel: {CHANNEL}",
193 "CHANNEL", chNum);
anil kumar appanaddb1f442019-07-04 18:07:27 +0000194 return response(ccActionNotSupportedForChannel);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530195 }
196
PavanKumarIntel3771f5f2023-11-02 06:26:42 +0000197 ChannelAccess chAccess = {};
AppaRao Puli071f3f22018-05-24 16:45:30 +0530198
William A. Kennington III4c521022023-07-28 13:07:30 -0700199 Cc compCode = ipmi::ccUnspecifiedError;
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530200
William A. Kennington III7a0e5df2021-05-19 13:31:29 -0700201 if (types::enum_cast<EChannelActionType>(accessSetMode) == nvData)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530202 {
203 compCode = getChannelAccessPersistData(chNum, chAccess);
204 }
William A. Kennington III7a0e5df2021-05-19 13:31:29 -0700205 else if (types::enum_cast<EChannelActionType>(accessSetMode) == activeData)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530206 {
207 compCode = getChannelAccessData(chNum, chAccess);
208 }
209
NITIN SHARMAb541a5a2019-07-18 12:46:59 +0000210 if (compCode != ccSuccess)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530211 {
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530212 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530213 }
214
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530215 constexpr uint2_t reservedOut1 = 0;
216 constexpr uint4_t reservedOut2 = 0;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530217
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530218 return responseSuccess(
William A. Kennington III7a0e5df2021-05-19 13:31:29 -0700219 types::enum_cast<uint3_t>(chAccess.accessMode),
220 chAccess.userAuthDisabled, chAccess.perMsgAuthDisabled,
221 chAccess.alertingDisabled, reservedOut1,
222 types::enum_cast<uint4_t>(chAccess.privLimit), reservedOut2);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530223}
224
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700225/** @brief implements the get channel info command
226 * @ param ctx - context pointer
227 * @ param channel - channel number
228 * @ param reserved - skip 4 bits
229 *
230 * @returns ipmi completion code plus response data
231 * - chNum - the channel number for this request
232 * - mediumType - see Table 6-3, Channel Medium Type Numbers
233 * - protocolType - Table 6-2, Channel Protocol Type Numbers
234 * - activeSessionCount - number of active sessions
235 * - sessionType - channel support for sessions
236 * - vendorId - vendor for this channel protocol (IPMI - 7154)
237 * - auxChInfo - auxiliary info for channel
238 * */
239RspType<uint4_t, // chNum
240 uint4_t, // reserved
241 uint7_t, // mediumType
242 bool, // reserved
243 uint5_t, // protocolType
244 uint3_t, // reserved
245 uint6_t, // activeSessionCount
246 uint2_t, // sessionType
247 uint24_t, // Vendor IANA
248 uint16_t // aux info
249 >
250 ipmiGetChannelInfo(Context::ptr ctx, uint4_t channel, uint4_t reserved)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530251{
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000252 if (reserved)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530253 {
George Liu82844ef2024-07-17 17:03:56 +0800254 lg2::debug("Get channel access - Invalid field in request");
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700255 return responseInvalidFieldRequest();
AppaRao Puli071f3f22018-05-24 16:45:30 +0530256 }
257
Patrick Williams1318a5e2024-08-16 15:19:54 -0400258 uint8_t chNum =
259 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000260 if (!isValidChannel(chNum))
261 {
George Liu82844ef2024-07-17 17:03:56 +0800262 lg2::debug("Get channel Info - No support on channel: {CHANNEL}",
263 "CHANNEL", chNum);
Jayaprakash Mutyalaafd12b42020-07-07 01:06:57 +0000264 return responseInvalidFieldRequest();
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000265 }
266
AppaRao Puli071f3f22018-05-24 16:45:30 +0530267 ChannelInfo chInfo;
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700268 Cc compCode = getChannelInfo(chNum, chInfo);
269 if (compCode != ccSuccess)
AppaRao Puli071f3f22018-05-24 16:45:30 +0530270 {
George Liu82844ef2024-07-17 17:03:56 +0800271 lg2::error("Failed to get channel info, channel: {CHANNEL}, "
272 "errno: {ERRNO}",
273 "CHANNEL", chNum, "ERRNO", compCode);
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700274 return response(compCode);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530275 }
276
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700277 constexpr uint4_t reserved1 = 0;
278 constexpr bool reserved2 = false;
279 constexpr uint3_t reserved3 = 0;
280 uint8_t mediumType = chInfo.mediumType;
281 uint8_t protocolType = chInfo.protocolType;
282 uint2_t sessionType = chInfo.sessionSupported;
283 uint6_t activeSessionCount = getChannelActiveSessions(chNum);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530284 // IPMI Spec: The IPMI Enterprise Number is: 7154 (decimal)
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700285 constexpr uint24_t vendorId = 7154;
286 constexpr uint16_t auxChInfo = 0;
AppaRao Puli071f3f22018-05-24 16:45:30 +0530287
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700288 return responseSuccess(chNum, reserved1, mediumType, reserved2,
289 protocolType, reserved3, activeSessionCount,
290 sessionType, vendorId, auxChInfo);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530291}
292
Vernon Maueryf6092892019-05-02 16:35:10 -0700293namespace
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530294{
Vernon Maueryf6092892019-05-02 16:35:10 -0700295constexpr uint16_t standardPayloadBit(PayloadType p)
296{
297 return (1 << static_cast<size_t>(p));
298}
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530299
Vernon Maueryf6092892019-05-02 16:35:10 -0700300constexpr uint16_t sessionPayloadBit(PayloadType p)
301{
302 constexpr size_t sessionShift =
303 static_cast<size_t>(PayloadType::OPEN_SESSION_REQUEST);
304 return ((1 << static_cast<size_t>(p)) >> sessionShift);
305}
306} // namespace
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530307
Vernon Maueryf6092892019-05-02 16:35:10 -0700308/** @brief implements get channel payload support command
309 * @ param ctx - ipmi context pointer
310 * @ param chNum - channel number
311 * @ param reserved - skip 4 bits
312 *
313 * @ returns IPMI completion code plus response data
314 * - stdPayloadType - bitmask of supported standard payload types
315 * - sessSetupPayloadType - bitmask of supported session setup payload types
316 * - OEMPayloadType - bitmask of supported OEM payload types
317 * - reserved - 2 bytes of 0
318 **/
319RspType<uint16_t, // stdPayloadType
320 uint16_t, // sessSetupPayloadType
321 uint16_t, // OEMPayloadType
322 uint16_t // reserved
323 >
324 ipmiGetChannelPayloadSupport(Context::ptr ctx, uint4_t channel,
325 uint4_t reserved)
326{
Patrick Williams1318a5e2024-08-16 15:19:54 -0400327 uint8_t chNum =
328 convertCurrentChannelNum(static_cast<uint8_t>(channel), ctx->channel);
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000329
330 if (!doesDeviceExist(chNum) || !isValidChannel(chNum) || reserved)
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530331 {
George Liu82844ef2024-07-17 17:03:56 +0800332 lg2::debug("Get channel payload - Invalid field in request");
Vernon Maueryf6092892019-05-02 16:35:10 -0700333 return responseInvalidFieldRequest();
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530334 }
335
336 // Session support is available in active LAN channels.
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000337 if (getChannelSessionSupport(chNum) == EChannelSessSupported::none)
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530338 {
George Liu82844ef2024-07-17 17:03:56 +0800339 lg2::debug("Get channel payload - No support on channel");
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000340 return response(ccActionNotSupportedForChannel);
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530341 }
Vernon Maueryf6092892019-05-02 16:35:10 -0700342 constexpr uint16_t stdPayloadType = standardPayloadBit(PayloadType::IPMI) |
343 standardPayloadBit(PayloadType::SOL);
344 constexpr uint16_t sessSetupPayloadType =
345 sessionPayloadBit(PayloadType::OPEN_SESSION_REQUEST) |
346 sessionPayloadBit(PayloadType::OPEN_SESSION_RESPONSE) |
347 sessionPayloadBit(PayloadType::RAKP1) |
348 sessionPayloadBit(PayloadType::RAKP2) |
349 sessionPayloadBit(PayloadType::RAKP3) |
350 sessionPayloadBit(PayloadType::RAKP4);
351 constexpr uint16_t OEMPayloadType = 0;
352 constexpr uint16_t rspRsvd = 0;
353 return responseSuccess(stdPayloadType, sessSetupPayloadType, OEMPayloadType,
354 rspRsvd);
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530355}
356
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000357/** @brief implements the get channel payload version command
358 * @param ctx - IPMI context pointer (for channel)
359 * @param chNum - channel number to get info about
360 * @param reserved - skip 4 bits
361 * @param payloadTypeNum - to get payload type info
362
363 * @returns IPMI completion code plus response data
364 * - formatVersion - BCD encoded format version info
365 */
366
367RspType<uint8_t> // formatVersion
368 ipmiGetChannelPayloadVersion(Context::ptr ctx, uint4_t chNum,
369 uint4_t reserved, uint8_t payloadTypeNum)
370{
Patrick Williams1318a5e2024-08-16 15:19:54 -0400371 uint8_t channel =
372 convertCurrentChannelNum(static_cast<uint8_t>(chNum), ctx->channel);
Manoj Ashok271d9c22021-07-22 23:21:31 +0530373 constexpr uint8_t payloadTypeNotSupported = 0x80;
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000374
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000375 if (reserved || !isValidChannel(channel))
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000376 {
George Liu82844ef2024-07-17 17:03:56 +0800377 lg2::debug("Get channel payload version - Invalid field in request");
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000378 return responseInvalidFieldRequest();
379 }
380
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000381 if (getChannelSessionSupport(channel) == EChannelSessSupported::none)
382 {
George Liu82844ef2024-07-17 17:03:56 +0800383 lg2::debug("Get channel payload version - No support on channel");
Manoj Ashok271d9c22021-07-22 23:21:31 +0530384 return response(payloadTypeNotSupported);
jayaprakash Mutyala0e2dbee2019-12-26 13:03:04 +0000385 }
386
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000387 if (!isValidPayloadType(static_cast<PayloadType>(payloadTypeNum)))
388 {
George Liu82844ef2024-07-17 17:03:56 +0800389 lg2::error("Get channel payload version - Payload type unavailable");
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000390
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000391 return response(payloadTypeNotSupported);
392 }
393
394 // BCD encoded version representation - 1.0
395 constexpr uint8_t formatVersion = 0x10;
396
397 return responseSuccess(formatVersion);
398}
399
William A. Kennington III343d0612018-12-10 15:56:24 -0800400void registerChannelFunctions() __attribute__((constructor));
AppaRao Puli071f3f22018-05-24 16:45:30 +0530401void registerChannelFunctions()
402{
403 ipmiChannelInit();
404
NITIN SHARMA89e4bf22019-05-02 13:03:58 +0000405 registerHandler(prioOpenBmcBase, netFnApp, app::cmdSetChannelAccess,
406 Privilege::Admin, ipmiSetChannelAccess);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530407
Richard Marian Thomaiyarbc5e9ba2019-05-07 13:32:48 +0530408 registerHandler(prioOpenBmcBase, netFnApp, app::cmdGetChannelAccess,
409 Privilege::User, ipmiGetChannelAccess);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530410
Vernon Mauery6f1e9782019-05-02 16:31:07 -0700411 registerHandler(prioOpenBmcBase, netFnApp, app::cmdGetChannelInfoCommand,
412 Privilege::User, ipmiGetChannelInfo);
Saravanan Palanisamyb5a0f162019-03-04 18:34:44 +0530413
Vernon Maueryf6092892019-05-02 16:35:10 -0700414 registerHandler(prioOpenBmcBase, netFnApp, app::cmdGetChannelPayloadSupport,
415 Privilege::User, ipmiGetChannelPayloadSupport);
Ayushi Smriti6fd812d2019-04-12 18:51:31 +0000416
417 registerHandler(prioOpenBmcBase, netFnApp, app::cmdGetChannelPayloadVersion,
418 Privilege::User, ipmiGetChannelPayloadVersion);
AppaRao Puli071f3f22018-05-24 16:45:30 +0530419}
420
421} // namespace ipmi