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 
19*07f85150SPatrick Venture #include "errors.hpp"
20*07f85150SPatrick Venture #include "handler.hpp"
21fd0f1cf9SJaghathiswari Rankappagounder Natarajan #include "main.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;
46fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t entity_id;
47fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t entity_instance;
48fd0f1cf9SJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
49fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
50fd0f1cf9SJaghathiswari Rankappagounder Natarajan struct GetEntityNameReply
51fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
52fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t subcommand;
53fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t entity_name_len;
54fd0f1cf9SJaghathiswari Rankappagounder Natarajan     uint8_t entity_name[0];
55fd0f1cf9SJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
56fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
57fd0f1cf9SJaghathiswari Rankappagounder Natarajan ipmi_ret_t GetEntityName(const uint8_t* reqBuf, uint8_t* replyBuf,
58*07f85150SPatrick Venture                          size_t* dataLen, HandlerInterface* handler)
59fd0f1cf9SJaghathiswari Rankappagounder Natarajan {
60fd0f1cf9SJaghathiswari Rankappagounder Natarajan     struct GetEntityNameRequest request;
61fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
62fd0f1cf9SJaghathiswari Rankappagounder Natarajan     if ((*dataLen) < sizeof(request))
63fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
64fd0f1cf9SJaghathiswari Rankappagounder Natarajan         std::fprintf(stderr, "Invalid command length: %u\n",
65fd0f1cf9SJaghathiswari Rankappagounder Natarajan                      static_cast<uint32_t>(*dataLen));
66fd0f1cf9SJaghathiswari Rankappagounder Natarajan         return IPMI_CC_REQ_DATA_LEN_INVALID;
67fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
68fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
69fd0f1cf9SJaghathiswari Rankappagounder Natarajan     std::memcpy(&request, &reqBuf[0], sizeof(request));
70fd0f1cf9SJaghathiswari Rankappagounder Natarajan     std::string entityName;
71fd0f1cf9SJaghathiswari Rankappagounder Natarajan     try
72fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
73*07f85150SPatrick Venture         entityName =
74*07f85150SPatrick Venture             handler->getEntityName(request.entity_id, request.entity_instance);
75fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
76*07f85150SPatrick Venture     catch (const IpmiException& e)
77fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
78*07f85150SPatrick Venture         return e.getIpmiError();
79fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
80fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
81fd0f1cf9SJaghathiswari Rankappagounder Natarajan     int length = sizeof(struct GetEntityNameReply) + entityName.length();
82fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
83fd0f1cf9SJaghathiswari Rankappagounder Natarajan     // TODO (jaghu) : Add a call to get getChannelMaxTransferSize.
84fd0f1cf9SJaghathiswari Rankappagounder Natarajan     if (length > MAX_IPMI_BUFFER)
85fd0f1cf9SJaghathiswari Rankappagounder Natarajan     {
86fd0f1cf9SJaghathiswari Rankappagounder Natarajan         std::fprintf(stderr, "Response would overflow response buffer\n");
87fd0f1cf9SJaghathiswari Rankappagounder Natarajan         return IPMI_CC_INVALID;
88fd0f1cf9SJaghathiswari Rankappagounder Natarajan     }
89fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
90fd0f1cf9SJaghathiswari Rankappagounder Natarajan     auto reply = reinterpret_cast<struct GetEntityNameReply*>(&replyBuf[0]);
91fd0f1cf9SJaghathiswari Rankappagounder Natarajan     reply->subcommand = SysEntityName;
92fd0f1cf9SJaghathiswari Rankappagounder Natarajan     reply->entity_name_len = entityName.length();
93fd0f1cf9SJaghathiswari Rankappagounder Natarajan     std::memcpy(reply->entity_name, entityName.c_str(), entityName.length());
94fd0f1cf9SJaghathiswari Rankappagounder Natarajan 
95fd0f1cf9SJaghathiswari Rankappagounder Natarajan     (*dataLen) = length;
96fd0f1cf9SJaghathiswari Rankappagounder Natarajan     return IPMI_CC_OK;
97fd0f1cf9SJaghathiswari Rankappagounder Natarajan }
98fd0f1cf9SJaghathiswari Rankappagounder Natarajan } // namespace ipmi
99fd0f1cf9SJaghathiswari Rankappagounder Natarajan } // namespace google
100