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