diff options
-rw-r--r-- | manager.cpp | 17 | ||||
-rw-r--r-- | manager.hpp | 11 | ||||
-rw-r--r-- | test/manager_read_unittest.cpp | 33 |
3 files changed, 59 insertions, 2 deletions
diff --git a/manager.cpp b/manager.cpp index 712d7db..639ca2d 100644 --- a/manager.cpp +++ b/manager.cpp @@ -270,8 +270,23 @@ std::vector<uint8_t> BlobManager::read(uint16_t session, uint32_t offset, return std::vector<uint8_t>(); } + /* TODO: Currently, configure_ac isn't finding libuserlayer, w.r.t the + * symbols I need. + */ + + /** The channel to use for now. + * TODO: We will receive this information through the IPMI message call. + */ + // const int ipmiChannel = ipmi::currentChNum; + /** This information is transport specific. + * TODO: We need a way to know this dynamically. + * on BT, 4 bytes of header, and 1 reply code. + */ + // uint32_t maxTransportSize = ipmi::getChannelMaxTransferSize(ipmiChannel); + /* Try reading from it. */ - return info->handler->read(session, offset, requestedSize); + return info->handler->read(session, offset, + std::min(maximumReadSize, requestedSize)); } bool BlobManager::write(uint16_t session, uint32_t offset, diff --git a/manager.hpp b/manager.hpp index d7282e6..c0c4249 100644 --- a/manager.hpp +++ b/manager.hpp @@ -2,6 +2,7 @@ #include <blobs-ipmid/blobs.hpp> #include <ctime> +#include <host-ipmid/oemrouter.hpp> #include <memory> #include <string> #include <unordered_map> @@ -10,6 +11,16 @@ namespace blobs { +/* The maximum read size. + * NOTE: Once this can be dynamically determined, we'll switch to that method. + * Having this in a header allows it to used cleanly for now. + */ +const int crcSize = sizeof(uint16_t); +const int btReplyHdrLen = 5; +const int btTransportLength = 64; +const uint32_t maximumReadSize = + btTransportLength - (btReplyHdrLen + oem::groupMagicSize + crcSize); + struct SessionInfo { SessionInfo() = default; diff --git a/test/manager_read_unittest.cpp b/test/manager_read_unittest.cpp index 1d40f5d..73e198b 100644 --- a/test/manager_read_unittest.cpp +++ b/test/manager_read_unittest.cpp @@ -60,7 +60,7 @@ TEST(ManagerReadTest, ReadFromHandlerReturnsData) uint16_t sess = 1; uint32_t ofs = 0x54; - uint32_t requested = 0x100; + uint32_t requested = 0x10; uint16_t flags = OpenFlags::read; std::string path = "/asdf/asdf"; std::vector<uint8_t> data = {0x12, 0x14, 0x15, 0x16}; @@ -75,4 +75,35 @@ TEST(ManagerReadTest, ReadFromHandlerReturnsData) EXPECT_EQ(data.size(), result.size()); EXPECT_EQ(result, data); } + +TEST(ManagerReadTest, ReadTooManyBytesTruncates) +{ + // For now, the hard-coded maximum transfer size is 64 bytes on read + // commands, due to a hard-coded buffer in ipmid among other future + // challenges. + + BlobManager mgr; + std::unique_ptr<BlobMock> m1 = std::make_unique<BlobMock>(); + auto m1ptr = m1.get(); + EXPECT_TRUE(mgr.registerHandler(std::move(m1))); + + uint16_t sess = 1; + uint32_t ofs = 0x54; + uint32_t requested = 0x100; + uint16_t flags = OpenFlags::read; + std::string path = "/asdf/asdf"; + std::vector<uint8_t> data = {0x12, 0x14, 0x15, 0x16}; + + EXPECT_CALL(*m1ptr, canHandleBlob(path)).WillOnce(Return(true)); + EXPECT_CALL(*m1ptr, open(_, flags, path)).WillOnce(Return(true)); + EXPECT_TRUE(mgr.open(flags, path, &sess)); + + EXPECT_CALL(*m1ptr, read(sess, ofs, maximumReadSize)) + .WillOnce(Return(data)); + + std::vector<uint8_t> result = mgr.read(sess, ofs, requested); + EXPECT_EQ(data.size(), result.size()); + EXPECT_EQ(result, data); +} + } // namespace blobs |