Skip to content

Commit 2d0b48d

Browse files
committed
ncsi: make Interface virtual
Now that we have encapsulation for passing NCSI commands and responses to/from an interface, we can make the Interface object virtual, and have the Netlink implementation as a subclass. We keep the netlink-specific operations in NetlinkInterface; getInfo(), setChannel(), clearInterface(), and the channel/package mask operations are all netlink-specific items to control kernel state. Change-Id: I30b9cec41712d2e32d12685dd8406e08c6dea1f0 Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
1 parent b788524 commit 2d0b48d

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed

src/ncsi_netlink_main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ int main(int argc, char** argv)
122122
argv);
123123
}
124124

125-
Interface interface{indexInt};
125+
NetlinkInterface interface(indexInt);
126126

127127
// Parse out package argument.
128128
auto package = (options)["package"];

src/ncsi_util.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ CallBack sendCallBack = [](struct nl_msg* msg, void* arg) {
272272
return static_cast<int>(NL_STOP);
273273
};
274274

275-
int applyCmd(Interface& interface, const NetlinkCommand& cmd,
275+
int applyCmd(NetlinkInterface& interface, const NetlinkCommand& cmd,
276276
int package = DEFAULT_VALUE, int channel = DEFAULT_VALUE,
277277
int flags = NONE, CallBack function = nullptr, void* arg = nullptr)
278278
{
@@ -422,10 +422,17 @@ int applyCmd(Interface& interface, const NetlinkCommand& cmd,
422422

423423
std::string to_string(Interface& interface)
424424
{
425-
return std::to_string(interface.ifindex);
425+
return interface.toString();
426426
}
427427

428-
std::optional<NCSIResponse> Interface::sendCommand(NCSICommand& cmd)
428+
NetlinkInterface::NetlinkInterface(int ifindex) : ifindex(ifindex) {}
429+
430+
std::string NetlinkInterface::toString()
431+
{
432+
return std::to_string(ifindex);
433+
}
434+
435+
std::optional<NCSIResponse> NetlinkInterface::sendCommand(NCSICommand& cmd)
429436
{
430437
lg2::debug("Send Command, CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, "
431438
"INTERFACE: {INTERFACE}",
@@ -448,7 +455,7 @@ std::optional<NCSIResponse> Interface::sendCommand(NCSICommand& cmd)
448455
return ctx.resp;
449456
}
450457

451-
int Interface::setChannel(int package, int channel)
458+
int NetlinkInterface::setChannel(int package, int channel)
452459
{
453460
lg2::debug("Set CHANNEL : {CHANNEL} , PACKAGE : {PACKAGE}, INTERFACE : "
454461
"{INTERFACE}",
@@ -460,15 +467,15 @@ int Interface::setChannel(int package, int channel)
460467
return internal::applyCmd(*this, cmd, package, channel);
461468
}
462469

463-
int Interface::clearInterface()
470+
int NetlinkInterface::clearInterface()
464471
{
465472
lg2::debug("ClearInterface , INTERFACE : {INTERFACE}", "INTERFACE", this);
466473

467474
internal::NetlinkCommand cmd(ncsi_nl_commands::NCSI_CMD_CLEAR_INTERFACE);
468475
return internal::applyCmd(*this, cmd);
469476
}
470477

471-
std::optional<InterfaceInfo> Interface::getInfo(int package)
478+
std::optional<InterfaceInfo> NetlinkInterface::getInfo(int package)
472479
{
473480
int rc, flags = package == DEFAULT_VALUE ? NLM_F_DUMP : NONE;
474481
InterfaceInfo info;
@@ -493,7 +500,7 @@ std::optional<InterfaceInfo> Interface::getInfo(int package)
493500
return info;
494501
}
495502

496-
int Interface::setPackageMask(unsigned int mask)
503+
int NetlinkInterface::setPackageMask(unsigned int mask)
497504
{
498505
lg2::debug("Set Package Mask , INTERFACE: {INTERFACE} MASK: {MASK}",
499506
"INTERFACE", this, "MASK", lg2::hex, mask);
@@ -506,7 +513,7 @@ int Interface::setPackageMask(unsigned int mask)
506513
return internal::applyCmd(*this, cmd);
507514
}
508515

509-
int Interface::setChannelMask(int package, unsigned int mask)
516+
int NetlinkInterface::setChannelMask(int package, unsigned int mask)
510517
{
511518
lg2::debug(
512519
"Set Channel Mask , INTERFACE: {INTERFACE}, PACKAGE : {PACKAGE} MASK: {MASK}",

src/ncsi_util.hpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,26 @@ struct Interface
8383
* @param[in] payload - OEM data to send.
8484
* @returns the NCSI response message to this command, or no value on error.
8585
*/
86+
virtual std::optional<NCSIResponse> sendCommand(NCSICommand& cmd) = 0;
87+
88+
/**
89+
* @brief Create a string representation of this interface
90+
*
91+
* @returns a string containing an interface identifier, for logging
92+
*/
93+
virtual std::string toString() = 0;
94+
95+
/* virtual destructor for vtable */
96+
virtual ~Interface() {};
97+
};
98+
99+
std::string to_string(Interface& interface);
100+
101+
struct NetlinkInterface : Interface
102+
{
103+
/* implementations for Interface */
86104
std::optional<NCSIResponse> sendCommand(NCSICommand& cmd);
105+
std::string toString();
87106

88107
/* @brief This function will ask underlying NCSI driver
89108
* to set a specific package or package/channel
@@ -129,11 +148,11 @@ struct Interface
129148
*/
130149
int setChannelMask(int package, unsigned int mask);
131150

151+
NetlinkInterface(int ifindex);
152+
132153
int ifindex;
133154
};
134155

135-
std::string to_string(Interface& interface);
136-
137156
} // namespace ncsi
138157
} // namespace network
139158
} // namespace phosphor

0 commit comments

Comments
 (0)