xref: /openbmc/phosphor-ipmi-blobs/ipmi.hpp (revision aceb4baa)
1 #pragma once
2 
3 #include <host-ipmid/ipmid-api.h>
4 
5 #include <blobs-ipmid/manager.hpp>
6 #include <string>
7 
8 namespace blobs
9 {
10 
11 enum BlobOEMCommands
12 {
13     bmcBlobGetCount = 0,
14     bmcBlobEnumerate = 1,
15     bmcBlobOpen = 2,
16     bmcBlobRead = 3,
17     bmcBlobWrite = 4,
18     bmcBlobCommit = 5,
19     bmcBlobClose = 6,
20     bmcBlobDelete = 7,
21     bmcBlobStat = 8,
22     bmcBlobSessionStat = 9,
23 };
24 
25 /* Used by bmcBlobGetCount */
26 struct BmcBlobCountTx
27 {
28     uint8_t cmd; /* bmcBlobGetCount */
29 } __attribute__((packed));
30 
31 struct BmcBlobCountRx
32 {
33     uint16_t crc;
34     uint32_t blobCount;
35 } __attribute__((packed));
36 
37 /* Used by bmcBlobEnumerate */
38 struct BmcBlobEnumerateTx
39 {
40     uint8_t cmd; /* bmcBlobEnumerate */
41     uint16_t crc;
42     uint32_t blobIdx;
43 } __attribute__((packed));
44 
45 struct BmcBlobEnumerateRx
46 {
47     uint16_t crc;
48     char blobId[];
49 } __attribute__((packed));
50 
51 /* Used by bmcBlobOpen */
52 struct BmcBlobOpenTx
53 {
54     uint8_t cmd; /* bmcBlobOpen */
55     uint16_t crc;
56     uint16_t flags;
57     char blobId[]; /* Must correspond to a valid blob. */
58 } __attribute__((packed));
59 
60 struct BmcBlobOpenRx
61 {
62     uint16_t crc;
63     uint16_t sessionId;
64 } __attribute__((packed));
65 
66 /* Used by bmcBlobClose */
67 struct BmcBlobCloseTx
68 {
69     uint8_t cmd; /* bmcBlobClose */
70     uint16_t crc;
71     uint16_t sessionId; /* Returned from BmcBlobOpen. */
72 } __attribute__((packed));
73 
74 /* Used by bmcBlobDelete */
75 struct BmcBlobDeleteTx
76 {
77     uint8_t cmd; /* bmcBlobDelete */
78     uint16_t crc;
79     char blobId[];
80 } __attribute__((packed));
81 
82 /* Used by bmcBlobStat */
83 struct BmcBlobStatTx
84 {
85     uint8_t cmd; /* bmcBlobStat */
86     uint16_t crc;
87     char blobId[];
88 } __attribute__((packed));
89 
90 struct BmcBlobStatRx
91 {
92     uint16_t crc;
93     uint16_t blobState;
94     uint32_t size; /* Size in bytes of the blob. */
95     uint8_t metadataLen;
96     uint8_t metadata[]; /* Optional blob-specific metadata. */
97 } __attribute__((packed));
98 
99 /* Used by bmcBlobSessionStat */
100 struct BmcBlobSessionStatTx
101 {
102     uint8_t cmd; /* bmcBlobSessionStat */
103     uint16_t crc;
104     uint16_t sessionId;
105 } __attribute__((packed));
106 
107 /* Used by bmcBlobCommit */
108 struct BmcBlobCommitTx
109 {
110     uint8_t cmd; /* bmcBlobCommit */
111     uint16_t crc;
112     uint16_t sessionId;
113     uint8_t commitDataLen;
114     uint8_t commitData[]; /* Optional blob-specific commit data. */
115 } __attribute__((packed));
116 
117 /* Used by bmcBlobRead */
118 struct BmcBlobReadTx
119 {
120     uint8_t cmd; /* bmcBlobRead */
121     uint16_t crc;
122     uint16_t sessionId;
123     uint32_t offset;        /* The byte sequence start, 0-based. */
124     uint32_t requestedSize; /* The number of bytes requested for reading. */
125 } __attribute__((packed));
126 
127 struct BmcBlobReadRx
128 {
129     uint16_t crc;
130     uint8_t data[];
131 } __attribute__((packed));
132 
133 /* Used by bmcBlobWrite */
134 struct BmcBlobWriteTx
135 {
136     uint8_t cmd; /* bmcBlobWrite */
137     uint16_t crc;
138     uint16_t sessionId;
139     uint32_t offset; /* The byte sequence start, 0-based. */
140     uint8_t data[];
141 } __attribute__((packed));
142 
143 /**
144  * Validate the minimum request length if there is one.
145  *
146  * @param[in] subcommand - the command
147  * @param[in] requestLength - the length of the request
148  * @return bool - true if valid.
149  */
150 bool validateRequestLength(BlobOEMCommands command, size_t requestLen);
151 
152 /**
153  * Given a pointer into an IPMI request buffer and the length of the remaining
154  * buffer, builds a string.  This does no string validation w.r.t content.
155  *
156  * @param[in] start - the start of the expected string.
157  * @param[in] length - the number of bytes remaining in the buffer.
158  * @return the string if valid otherwise an empty string.
159  */
160 std::string stringFromBuffer(const char* start, size_t length);
161 
162 /**
163  * Writes out a BmcBlobCountRx structure and returns IPMI_OK.
164  */
165 ipmi_ret_t getBlobCount(ManagerInterface* mgr, const uint8_t* reqBuf,
166                         uint8_t* replyCmdBuf, size_t* dataLen);
167 
168 /**
169  * Writes out a BmcBlobEnumerateRx in response to a BmcBlobEnumerateTx
170  * request.  If the index does not correspond to a blob, then this will
171  * return failure.
172  *
173  * It will also return failure if the response buffer is of an invalid
174  * length.
175  */
176 ipmi_ret_t enumerateBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
177                          uint8_t* replyCmdBuf, size_t* dataLen);
178 
179 /**
180  * Attempts to open the blobId specified and associate with a session id.
181  */
182 ipmi_ret_t openBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
183                     uint8_t* replyCmdBuf, size_t* dataLen);
184 
185 /**
186  * Attempts to close the session specified.
187  */
188 ipmi_ret_t closeBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
189                      uint8_t* replyCmdBuf, size_t* dataLen);
190 
191 /**
192  * Attempts to delete the blobId specified.
193  */
194 ipmi_ret_t deleteBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
195                       uint8_t* replyCmdBuf, size_t* dataLen);
196 
197 /**
198  * Attempts to retrieve the Stat for the blobId specified.
199  */
200 ipmi_ret_t statBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
201                     uint8_t* replyCmdBuf, size_t* dataLen);
202 
203 /**
204  * Attempts to retrieve the Stat for the session specified.
205  */
206 ipmi_ret_t sessionStatBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
207                            uint8_t* replyCmdBuf, size_t* dataLen);
208 
209 /**
210  * Attempts to commit the data in the blob.
211  */
212 ipmi_ret_t commitBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
213                       uint8_t* replyCmdBuf, size_t* dataLen);
214 
215 /**
216  * Attempt to read data from the blob.
217  */
218 ipmi_ret_t readBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
219                     uint8_t* replyCmdBuf, size_t* dataLen);
220 
221 /**
222  * Attempt to write data to the blob.
223  */
224 ipmi_ret_t writeBlob(ManagerInterface* mgr, const uint8_t* reqBuf,
225                      uint8_t* replyCmdBuf, size_t* dataLen);
226 } // namespace blobs
227