ncsi: Create Interface type to wrap a network interface instance
Define an interface as a new type, just containing the ifindex
currently.
This will allow future Interface implementations that don't interact
directly with a local Linux network interface.
Tested: "get info" (--info) and "send OEM command" (--oem-payload)
operations tested against kernel NCSI layer, to a test NC-SI device.
Change-Id: If0471ac3fa41e08bb916e9279d4fe5b668860b03
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
diff --git a/src/ncsi_netlink_main.cpp b/src/ncsi_netlink_main.cpp
index 6657c60..3ac42bd 100644
--- a/src/ncsi_netlink_main.cpp
+++ b/src/ncsi_netlink_main.cpp
@@ -56,6 +56,8 @@
argv);
}
+ Interface interface{indexInt};
+
// Parse out package argument.
auto package = (options)["package"];
try
@@ -137,7 +139,7 @@
}
return ncsi::sendOemCommand(
- indexInt, packageInt, channelInt, operationInt,
+ interface, packageInt, channelInt, operationInt,
std::span<const unsigned char>(payload.begin(), payload.end()));
}
else if ((options)["set"] == "true")
@@ -147,15 +149,15 @@
{
exitWithError("Package not specified.", argv);
}
- return ncsi::setChannel(indexInt, packageInt, channelInt);
+ return ncsi::setChannel(interface, packageInt, channelInt);
}
else if ((options)["info"] == "true")
{
- return ncsi::getInfo(indexInt, packageInt);
+ return ncsi::getInfo(interface, packageInt);
}
else if ((options)["clear"] == "true")
{
- return ncsi::clearInterface(indexInt);
+ return ncsi::clearInterface(interface);
}
else if (!(options)["pmask"].empty())
{
@@ -173,7 +175,7 @@
{
exitWithError("Package mask value is not valid", argv);
}
- return ncsi::setPackageMask(indexInt, mask);
+ return ncsi::setPackageMask(interface, mask);
}
else if (!(options)["cmask"].empty())
{
@@ -195,7 +197,7 @@
{
exitWithError("Channel mask value is not valid", argv);
}
- return ncsi::setChannelMask(indexInt, packageInt, mask);
+ return ncsi::setChannelMask(interface, packageInt, mask);
}
else
{
diff --git a/src/ncsi_util.cpp b/src/ncsi_util.cpp
index 688e8b8..8539b5c 100644
--- a/src/ncsi_util.cpp
+++ b/src/ncsi_util.cpp
@@ -265,9 +265,9 @@
return 0;
};
-int applyCmd(int ifindex, const Command& cmd, int package = DEFAULT_VALUE,
- int channel = DEFAULT_VALUE, int flags = NONE,
- CallBack function = nullptr)
+int applyCmd(Interface& interface, const Command& cmd,
+ int package = DEFAULT_VALUE, int channel = DEFAULT_VALUE,
+ int flags = NONE, CallBack function = nullptr)
{
int cb_ret = 0;
nlSocketPtr socket(nl_socket_alloc(), &::nl_socket_free);
@@ -333,12 +333,13 @@
}
}
- ret = nla_put_u32(msg.get(), ncsi_nl_attrs::NCSI_ATTR_IFINDEX, ifindex);
+ ret = nla_put_u32(msg.get(), ncsi_nl_attrs::NCSI_ATTR_IFINDEX,
+ interface.ifindex);
if (ret < 0)
{
lg2::error("Failed to set the attribute , RC : {RC} INTERFACE : "
"{INTERFACE}",
- "RC", ret, "INTERFACE", lg2::hex, ifindex);
+ "RC", ret, "INTERFACE", lg2::hex, interface.ifindex);
return ret;
}
@@ -419,88 +420,91 @@
} // namespace internal
-int sendOemCommand(int ifindex, int package, int channel, int operation,
- std::span<const unsigned char> payload)
+int sendOemCommand(Interface& interface, int package, int channel,
+ int operation, std::span<const unsigned char> payload)
{
lg2::debug("Send OEM Command, CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, "
"INTERFACE_INDEX: {INTERFACE_INDEX}",
"CHANNEL", lg2::hex, channel, "PACKAGE", lg2::hex, package,
- "INTERFACE_INDEX", lg2::hex, ifindex);
+ "INTERFACE_INDEX", lg2::hex, interface.ifindex);
if (!payload.empty())
{
lg2::debug("Payload: {PAYLOAD}", "PAYLOAD", toHexStr(payload));
}
return internal::applyCmd(
- ifindex,
+ interface,
internal::Command(ncsi_nl_commands::NCSI_CMD_SEND_CMD, operation,
payload),
package, channel, NONE, internal::sendCallBack);
}
-int setChannel(int ifindex, int package, int channel)
+int setChannel(Interface& interface, int package, int channel)
{
lg2::debug(
"Set CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, INTERFACE_INDEX: "
"{INTERFACE_INDEX}",
"CHANNEL", lg2::hex, channel, "PACKAGE", lg2::hex, package,
- "INTERFACE_INDEX", lg2::hex, ifindex);
+ "INTERFACE_INDEX", lg2::hex, interface.ifindex);
return internal::applyCmd(
- ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_INTERFACE),
+ interface, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_INTERFACE),
package, channel);
}
-int clearInterface(int ifindex)
+int clearInterface(Interface& interface)
{
lg2::debug("ClearInterface , INTERFACE_INDEX : {INTERFACE_INDEX}",
- "INTERFACE_INDEX", lg2::hex, ifindex);
+ "INTERFACE_INDEX", lg2::hex, interface.ifindex);
return internal::applyCmd(
- ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE));
+ interface,
+ internal::Command(ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE));
}
-int getInfo(int ifindex, int package)
+int getInfo(Interface& interface, int package)
{
lg2::debug(
"Get Info , PACKAGE : {PACKAGE}, INTERFACE_INDEX: {INTERFACE_INDEX}",
- "PACKAGE", lg2::hex, package, "INTERFACE_INDEX", lg2::hex, ifindex);
+ "PACKAGE", lg2::hex, package, "INTERFACE_INDEX", lg2::hex,
+ interface.ifindex);
if (package == DEFAULT_VALUE)
{
return internal::applyCmd(
- ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_PKG_INFO),
+ interface, internal::Command(ncsi_nl_commands::NCSI_CMD_PKG_INFO),
package, DEFAULT_VALUE, NLM_F_DUMP, internal::infoCallBack);
}
else
{
- return internal::applyCmd(ifindex, ncsi_nl_commands::NCSI_CMD_PKG_INFO,
- package, DEFAULT_VALUE, NONE,
- internal::infoCallBack);
+ return internal::applyCmd(interface,
+ ncsi_nl_commands::NCSI_CMD_PKG_INFO, package,
+ DEFAULT_VALUE, NONE, internal::infoCallBack);
}
}
-int setPackageMask(int ifindex, unsigned int mask)
+int setPackageMask(Interface& interface, unsigned int mask)
{
lg2::debug(
"Set Package Mask , INTERFACE_INDEX: {INTERFACE_INDEX} MASK: {MASK}",
- "INTERFACE_INDEX", lg2::hex, ifindex, "MASK", lg2::hex, mask);
+ "INTERFACE_INDEX", lg2::hex, interface.ifindex, "MASK", lg2::hex, mask);
auto payload = std::span<const unsigned char>(
reinterpret_cast<const unsigned char*>(&mask),
reinterpret_cast<const unsigned char*>(&mask) + sizeof(decltype(mask)));
return internal::applyCmd(
- ifindex, internal::Command(ncsi_nl_commands::NCSI_CMD_SET_PACKAGE_MASK,
- 0, payload));
+ interface,
+ internal::Command(ncsi_nl_commands::NCSI_CMD_SET_PACKAGE_MASK, 0,
+ payload));
}
-int setChannelMask(int ifindex, int package, unsigned int mask)
+int setChannelMask(Interface& interface, int package, unsigned int mask)
{
lg2::debug(
"Set Channel Mask , INTERFACE_INDEX: {INTERFACE_INDEX}, PACKAGE : {PACKAGE} MASK: {MASK}",
- "INTERFACE_INDEX", lg2::hex, ifindex, "PACKAGE", lg2::hex, package,
- "MASK", lg2::hex, mask);
+ "INTERFACE_INDEX", lg2::hex, interface.ifindex, "PACKAGE", lg2::hex,
+ package, "MASK", lg2::hex, mask);
auto payload = std::span<const unsigned char>(
reinterpret_cast<const unsigned char*>(&mask),
reinterpret_cast<const unsigned char*>(&mask) + sizeof(decltype(mask)));
return internal::applyCmd(
- ifindex,
+ interface,
internal::Command(ncsi_nl_commands::NCSI_CMD_SET_CHANNEL_MASK, 0,
payload),
package);
diff --git a/src/ncsi_util.hpp b/src/ncsi_util.hpp
index dfa39e5..da45a38 100644
--- a/src/ncsi_util.hpp
+++ b/src/ncsi_util.hpp
@@ -12,19 +12,24 @@
constexpr auto DEFAULT_VALUE = -1;
constexpr auto NONE = 0;
+struct Interface
+{
+ int ifindex;
+};
+
/* @brief This function will ask underlying NCSI driver
* to send an OEM command (command type 0x50) with
* the specified payload as the OEM data.
* This function talks with the NCSI driver over
* netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
* @param[in] package - NCSI Package.
* @param[in] channel - Channel number with in the package.
* @param[in] opcode - NCSI Send Command sub-operation
* @param[in] payload - OEM data to send.
* @returns 0 on success and negative value for failure.
*/
-int sendOemCommand(int ifindex, int package, int channel, int opcode,
+int sendOemCommand(Interface& interface, int package, int channel, int opcode,
std::span<const unsigned char> payload);
/* @brief This function will ask underlying NCSI driver
@@ -32,31 +37,31 @@
* combination as the preferred choice.
* This function talks with the NCSI driver over
* netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
* @param[in] package - NCSI Package.
* @param[in] channel - Channel number with in the package.
* @returns 0 on success and negative value for failure.
*/
-int setChannel(int ifindex, int package, int channel);
+int setChannel(Interface& interface, int package, int channel);
/* @brief This function will ask underlying NCSI driver
* to clear any preferred setting from the given
* interface.
* This function talks with the NCSI driver over
* netlink messages.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
* @returns 0 on success and negative value for failure.
*/
-int clearInterface(int ifindex);
+int clearInterface(Interface& interface);
/* @brief This function is used to dump all the info
* of the package and the channels underlying
* the package.
- * @param[in] ifindex - Interface Index.
+ * @param[in] interface - Interface
* @param[in] package - NCSI Package.
* @returns 0 on success and negative value for failure.
*/
-int getInfo(int ifindex, int package);
+int getInfo(Interface& interface, int package);
/* @brief This function assigns a mask controlling responses to AEN from a
* package.
@@ -64,7 +69,7 @@
* @param[in] mask - A 32-bit mask integer
* @returns 0 on success and negative value for failure.
*/
-int setPackageMask(int ifindex, unsigned int mask);
+int setPackageMask(Interface& interface, unsigned int mask);
/* @brief This function sets the AEN mask for the channels inside the selected
* package.
@@ -73,7 +78,7 @@
* @param[in] mask - A 32-bit mask integer
* @returns 0 on success and negative value for failure.
*/
-int setChannelMask(int ifindex, int package, unsigned int mask);
+int setChannelMask(Interface& interface, int package, unsigned int mask);
} // namespace ncsi
} // namespace network