1 /*
2 * Copyright (c) 2018-present Facebook.
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 <ipmid/api.h>
18
19 #include <commandutils.hpp>
20
21 #define IPMI_CC_PARAMETER_NOT_SUPPORTED 0x80
22
23 namespace ipmi
24 {
25
26 void registerTransportFunctions() __attribute__((constructor));
27
28 // Transport Command Codes (IPMI/Table H-1)
29 enum
30 {
31 CMD_TRANSPORT_GET_SOL_CONFIG = 0x22,
32 };
33
34 // SOL Configuration parameters (IPMI/Table 26-5)
35 enum
36 {
37 SOL_PARAM_SET_IN_PROG,
38 SOL_PARAM_SOL_ENABLE,
39 SOL_PARAM_SOL_AUTH,
40 SOL_PARAM_SOL_THRESHOLD,
41 SOL_PARAM_SOL_RETRY,
42 SOL_PARAM_SOL_BITRATE,
43 SOL_PARAM_SOL_NV_BITRATE,
44 };
45
46 //----------------------------------------------------------------------
47 // Get SoL Config (IPMI/Section 26.3) (CMD_TRANSPORT_GET_SOL_CONFIG)
48 //----------------------------------------------------------------------
ipmiTransGetSolConfig(ipmi_netfn_t,ipmi_cmd_t,ipmi_request_t request,ipmi_response_t response,ipmi_data_len_t data_len,ipmi_context_t)49 ipmi_ret_t ipmiTransGetSolConfig(
50 ipmi_netfn_t, ipmi_cmd_t, ipmi_request_t request, ipmi_response_t response,
51 ipmi_data_len_t data_len, ipmi_context_t)
52 {
53 uint8_t* req = reinterpret_cast<uint8_t*>(request);
54 uint8_t* res = reinterpret_cast<uint8_t*>(response);
55 uint8_t param = req[0];
56 uint8_t paramSel = req[1];
57
58 *res++ = 0x01; // Parameter revision
59 *data_len = 1;
60
61 /* If request for revision only then return
62 * with only one byte of data
63 */
64 if (param & 0x80)
65 return IPMI_CC_OK;
66
67 switch (paramSel)
68 {
69 case SOL_PARAM_SET_IN_PROG:
70 *res++ = 0x00; // Set this value as (set complete)
71 *data_len += 1;
72 break;
73 case SOL_PARAM_SOL_ENABLE:
74 *res++ = 0x01; // Enable SoL payload
75 *data_len += 1;
76 break;
77 case SOL_PARAM_SOL_AUTH:
78 *res++ = 0x02; // Set as (User Level)
79 *data_len += 1;
80 break;
81 case SOL_PARAM_SOL_THRESHOLD:
82 *res++ = 0x00;
83 /* Byte 2: Char send threshold: setting this value to 1 means
84 * that BMC to send packet as soon as first character arrived.
85 */
86 *res++ = 0x01;
87 *data_len += 2;
88 break;
89 case SOL_PARAM_SOL_RETRY:
90 *res++ = 0x00; // Retry count: No retry after packet transmission.
91 *res++ = 0x00; // Retry interval
92 *data_len += 2;
93 break;
94 case SOL_PARAM_SOL_BITRATE:
95 case SOL_PARAM_SOL_NV_BITRATE:
96 *res++ = 0x09; // Bit rate: set as 57.6 kbps
97 *data_len += 1;
98 break;
99 default:
100 *data_len = 0;
101 return IPMI_CC_PARAMETER_NOT_SUPPORTED;
102 break;
103 }
104
105 return IPMI_CC_OK;
106 }
107
registerTransportFunctions()108 void registerTransportFunctions()
109 {
110 ipmiPrintAndRegister(NETFUN_TRANSPORT, CMD_TRANSPORT_GET_SOL_CONFIG, NULL,
111 ipmiTransGetSolConfig,
112 PRIVILEGE_OPERATOR); // Get Sol Config
113
114 return;
115 }
116 } // namespace ipmi
117