1fd0f1cf9SJaghathiswari Rankappagounder Natarajan /*
2fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * Copyright 2018 Google Inc.
3fd0f1cf9SJaghathiswari Rankappagounder Natarajan  *
4fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * Licensed under the Apache License, Version 2.0 (the "License");
5fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * you may not use this file except in compliance with the License.
6fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * You may obtain a copy of the License at
7fd0f1cf9SJaghathiswari Rankappagounder Natarajan  *
8fd0f1cf9SJaghathiswari Rankappagounder Natarajan  *     http://www.apache.org/licenses/LICENSE-2.0
9fd0f1cf9SJaghathiswari Rankappagounder Natarajan  *
10fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * Unless required by applicable law or agreed to in writing, software
11fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * distributed under the License is distributed on an "AS IS" BASIS,
12fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * See the License for the specific language governing permissions and
14fd0f1cf9SJaghathiswari Rankappagounder Natarajan  * limitations under the License.
15fd0f1cf9SJaghathiswari Rankappagounder Natarajan  */
16fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
17fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include "entity_name.hpp"
18fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
190e9aae5dSPatrick Venture #include "commands.hpp"
2007f85150SPatrick Venture #include "errors.hpp"
2107f85150SPatrick Venture #include "handler.hpp"
22fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
23fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include <cstdint>
24fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include <cstring>
25fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include <string>
26fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include <vector>
27fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
28fd0f1cf9SJaghathiswari Rankappagounder Natarajan namespace google
29fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
30fd0f1cf9SJaghathiswari Rankappagounder Natarajan namespace ipmi
31fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
32fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
33fd0f1cf9SJaghathiswari Rankappagounder Natarajan namespace
34fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
35fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
36fd0f1cf9SJaghathiswari Rankappagounder Natarajan // TODO (jaghu) : Add a call to get getChannelMaxTransferSize.
37fd0f1cf9SJaghathiswari Rankappagounder Natarajan #ifndef MAX_IPMI_BUFFER
38fd0f1cf9SJaghathiswari Rankappagounder Natarajan #define MAX_IPMI_BUFFER 64
39fd0f1cf9SJaghathiswari Rankappagounder Natarajan #endif
40fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
41fd0f1cf9SJaghathiswari Rankappagounder Natarajan } // namespace
42fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
43fd0f1cf9SJaghathiswari Rankappagounder Natarajan struct GetEntityNameRequest
44fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
45fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t subcommand;
4645fad1bbSPatrick Venture     uint8_t entityId;
4745fad1bbSPatrick Venture     uint8_t entityInstance;
48fd0f1cf9SJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
49fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
50fd0f1cf9SJaghathiswari Rankappagounder Natarajan struct GetEntityNameReply
51fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
52fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t subcommand;
5345fad1bbSPatrick Venture     uint8_t entityNameLength;
54fd0f1cf9SJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
55fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
5645fad1bbSPatrick Venture ipmi_ret_t getEntityName(const uint8_t* reqBuf, uint8_t* replyBuf,
5707f85150SPatrick Venture                          size_t* dataLen, HandlerInterface* handler)
58fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
59fd0f1cf9SJaghathiswari Rankappagounder Natarajan     struct GetEntityNameRequest request;
60fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
61fd0f1cf9SJaghathiswari Rankappagounder Natarajan     if ((*dataLen) < sizeof(request))
62fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
63fd0f1cf9SJaghathiswari Rankappagounder Natarajan         std::fprintf(stderr, "Invalid command length: %u\n",
64fd0f1cf9SJaghathiswari Rankappagounder Natarajan                      static_cast<uint32_t>(*dataLen));
65fd0f1cf9SJaghathiswari Rankappagounder Natarajan         return IPMI_CC_REQ_DATA_LEN_INVALID;
66fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
67fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
68fd0f1cf9SJaghathiswari Rankappagounder Natarajan     std::memcpy(&request, &reqBuf[0], sizeof(request));
69fd0f1cf9SJaghathiswari Rankappagounder Natarajan     std::string entityName;
70fd0f1cf9SJaghathiswari Rankappagounder Natarajan     try
71fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
7207f85150SPatrick Venture         entityName =
7345fad1bbSPatrick Venture             handler->getEntityName(request.entityId, request.entityInstance);
74fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
7507f85150SPatrick Venture     catch (const IpmiException& e)
76fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
7707f85150SPatrick Venture         return e.getIpmiError();
78fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
79fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
80fd0f1cf9SJaghathiswari Rankappagounder Natarajan     int length = sizeof(struct GetEntityNameReply) + entityName.length();
81fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
82fd0f1cf9SJaghathiswari Rankappagounder Natarajan     // TODO (jaghu) : Add a call to get getChannelMaxTransferSize.
83fd0f1cf9SJaghathiswari Rankappagounder Natarajan     if (length > MAX_IPMI_BUFFER)
84fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
85fd0f1cf9SJaghathiswari Rankappagounder Natarajan         std::fprintf(stderr, "Response would overflow response buffer\n");
86fd0f1cf9SJaghathiswari Rankappagounder Natarajan         return IPMI_CC_INVALID;
87fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
88fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
89fd0f1cf9SJaghathiswari Rankappagounder Natarajan     auto reply = reinterpret_cast<struct GetEntityNameReply*>(&replyBuf[0]);
90fd0f1cf9SJaghathiswari Rankappagounder Natarajan     reply->subcommand = SysEntityName;
9145fad1bbSPatrick Venture     reply->entityNameLength = entityName.length();
92*5d789734SWilliam A. Kennington III     std::memcpy(reply + 1, entityName.c_str(), entityName.length());
93fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
94fd0f1cf9SJaghathiswari Rankappagounder Natarajan     (*dataLen) = length;
95fd0f1cf9SJaghathiswari Rankappagounder Natarajan     return IPMI_CC_OK;
96fd0f1cf9SJaghathiswari Rankappagounder Natarajan }
97fd0f1cf9SJaghathiswari Rankappagounder Natarajan } // namespace ipmi
98fd0f1cf9SJaghathiswari Rankappagounder Natarajan } // namespace google
99