process: rework lookup to use map for handlers
Switches lookup to use a map as adding another command makes the list
too long.
Change-Id: I35257ff5ae8c4c14c88aa2fa7d866642370ef38f
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/process.cpp b/process.cpp
index 595b5c2..b3939eb 100644
--- a/process.cpp
+++ b/process.cpp
@@ -19,6 +19,7 @@
#include "ipmi.hpp"
#include <cstring>
+#include <unordered_map>
#include <vector>
namespace blobs
@@ -32,10 +33,22 @@
uint8_t data; /* one byte minimum of data. */
} __attribute__((packed));
+static const std::unordered_map<BlobOEMCommands, IpmiBlobHandler> handlers = {
+ {BlobOEMCommands::bmcBlobGetCount, getBlobCount},
+ {BlobOEMCommands::bmcBlobEnumerate, enumerateBlob},
+ {BlobOEMCommands::bmcBlobOpen, openBlob},
+ {BlobOEMCommands::bmcBlobRead, readBlob},
+ {BlobOEMCommands::bmcBlobWrite, writeBlob},
+ {BlobOEMCommands::bmcBlobCommit, commitBlob},
+ {BlobOEMCommands::bmcBlobClose, closeBlob},
+ {BlobOEMCommands::bmcBlobDelete, deleteBlob},
+ {BlobOEMCommands::bmcBlobStat, statBlob},
+ {BlobOEMCommands::bmcBlobSessionStat, sessionStatBlob},
+};
+
IpmiBlobHandler validateBlobCommand(CrcInterface* crc, const uint8_t* reqBuf,
uint8_t* replyCmdBuf, size_t* dataLen)
{
- IpmiBlobHandler cmd;
size_t requestLength = (*dataLen);
/* We know dataLen is at least 1 already */
auto command = static_cast<BlobOEMCommands>(reqBuf[0]);
@@ -81,46 +94,14 @@
}
}
- /* Grab the corresponding handler for the command (could do map or array
- * of function pointer lookup).
- */
- switch (command)
+ /* Grab the corresponding handler for the command. */
+ auto found = handlers.find(command);
+ if (found == handlers.end())
{
- case BlobOEMCommands::bmcBlobGetCount:
- cmd = getBlobCount;
- break;
- case BlobOEMCommands::bmcBlobEnumerate:
- cmd = enumerateBlob;
- break;
- case BlobOEMCommands::bmcBlobOpen:
- cmd = openBlob;
- break;
- case BlobOEMCommands::bmcBlobRead:
- cmd = readBlob;
- break;
- case BlobOEMCommands::bmcBlobWrite:
- cmd = writeBlob;
- break;
- case BlobOEMCommands::bmcBlobCommit:
- cmd = commitBlob;
- break;
- case BlobOEMCommands::bmcBlobClose:
- cmd = closeBlob;
- break;
- case BlobOEMCommands::bmcBlobDelete:
- cmd = deleteBlob;
- break;
- case BlobOEMCommands::bmcBlobStat:
- cmd = statBlob;
- break;
- case BlobOEMCommands::bmcBlobSessionStat:
- cmd = sessionStatBlob;
- break;
- default:
- return nullptr;
+ return nullptr;
}
- return cmd;
+ return found->second;
}
ipmi_ret_t processBlobCommand(IpmiBlobHandler cmd, ManagerInterface* mgr,