BUILD file and fixed tests for netlink classes.
This change:
- introduces BUILD file for netlink classes,
- fixes broken tests,
- fixes a minor bug (invalid operation was used for SETLINK).
Change-Id: I32b98cadcf1c324266211df3a96f7cb363f12249
diff --git a/common/libs/net/BUILD b/common/libs/net/BUILD
new file mode 100644
index 0000000..5f336c5
--- /dev/null
+++ b/common/libs/net/BUILD
@@ -0,0 +1,31 @@
+cc_library(
+ name = "net",
+ srcs = [
+ "netlink_client.cpp",
+ "network_interface_manager.cpp",
+ "netlink_client.h",
+ "network_interface.h",
+ "network_interface_manager.h",
+ ],
+ hdrs = [
+ "netlink_client.h",
+ "network_interface.h",
+ "network_interface_manager.h",
+ ],
+ deps = [
+ "//common/libs/fs"
+ ],
+ visibility = ["//visibility:public"],
+)
+
+cc_test(
+ name = "netlink_client_test",
+ size = "small",
+ srcs = ["netlink_client_test.cpp"],
+ deps = [
+ ":net",
+ "//common/libs/glog:cuttlefish_logging",
+ "@gtest_repo//:gtest_main",
+ ],
+)
+
diff --git a/common/libs/net/netlink_client.cpp b/common/libs/net/netlink_client.cpp
index 5e85896..024916e 100644
--- a/common/libs/net/netlink_client.cpp
+++ b/common/libs/net/netlink_client.cpp
@@ -304,34 +304,12 @@
} // namespace
std::unique_ptr<NetlinkRequest> NetlinkRequest::New(
- NetlinkRequest::RequestType type) {
- int target_type = 0;
- int target_flags = 0;
-
- switch (type) {
- case RequestType::NewLink:
- target_type = RTM_NEWLINK;
- target_flags = NLM_F_CREATE | NLM_F_EXCL;
- break;
-
- case RequestType::SetLink:
- target_type = RTM_NEWLINK;
- break;
-
- case RequestType::AddAddress:
- target_type = RTM_NEWADDR;
- target_flags = NLM_F_CREATE | NLM_F_EXCL;
- break;
-
- case RequestType::DelAddress:
- target_type = RTM_DELADDR;
- break;
- }
-
- target_flags |= NLM_F_ACK | NLM_F_REQUEST;
+ int type, int flags) {
+ // Ensure we receive response.
+ flags |= NLM_F_ACK | NLM_F_REQUEST;
return std::unique_ptr<NetlinkRequest>(new NetlinkRequestImpl(
- target_type, target_flags));
+ type, flags));
}
NetlinkClient* NetlinkClient::New() {
diff --git a/common/libs/net/netlink_client.h b/common/libs/net/netlink_client.h
index 1ddebfa..b23946e 100644
--- a/common/libs/net/netlink_client.h
+++ b/common/libs/net/netlink_client.h
@@ -27,13 +27,6 @@
// changed, and how.
class NetlinkRequest {
public:
- enum class RequestType {
- NewLink,
- SetLink,
- AddAddress,
- DelAddress
- };
-
NetlinkRequest() {}
virtual ~NetlinkRequest() {}
@@ -81,7 +74,7 @@
// Create new Netlink Request structure.
// When |create| is true, the request will inject a new instance of |type|.
- static std::unique_ptr<NetlinkRequest> New(NetlinkRequest::RequestType type);
+ static std::unique_ptr<NetlinkRequest> New(int type, int flags);
private:
NetlinkRequest(const NetlinkRequest&);
diff --git a/common/libs/net/netlink_client_test.cpp b/common/libs/net/netlink_client_test.cpp
index 0b50ad2..a566711 100644
--- a/common/libs/net/netlink_client_test.cpp
+++ b/common/libs/net/netlink_client_test.cpp
@@ -114,10 +114,6 @@
return true;
}
-
-constexpr int kNetlinkSocket = 1;
-constexpr int kNetworkSocket = 2;
-
} // namespace
class NetlinkClientTest : public ::testing::Test {
@@ -137,7 +133,8 @@
memcpy(&expected.text, kLongString, sizeof(kLongString));
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->AddString(kDummyTag, kLongString);
EXPECT_THAT(request, RequestDataIs(&expected, sizeof(expected)));
}
@@ -156,7 +153,8 @@
memcpy(&expected.text, kShortString, sizeof(expected.text));
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->AddString(kDummyTag, kShortString);
EXPECT_THAT(request, RequestDataIs(&expected, sizeof(expected)));
}
@@ -172,7 +170,8 @@
const uint32_t attr_value = kValue;
} expected;
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->AddInt32(kDummyTag, kValue);
EXPECT_THAT(request, RequestDataIs(&expected, sizeof(expected)));
}
@@ -191,7 +190,8 @@
const uint32_t attr_value = kValue;
} expected;
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->PushList(kListTag);
request->AddInt32(kDummyTag, kValue);
request->PopList();
@@ -216,7 +216,8 @@
const uint32_t attr_value = kValue;
} expected;
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->PushList(kList1Tag);
request->PushList(kList2Tag);
request->AddInt32(kDummyTag, kValue);
@@ -248,7 +249,8 @@
const uint32_t attr2_value = kValue2;
} expected;
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->PushList(kList1Tag);
request->AddInt32(kDummy1Tag, kValue1);
request->PopList();
@@ -281,7 +283,8 @@
const uint32_t attr2_value = kValue2;
} expected;
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
request->PushList(kList1Tag);
request->PushList(kList2Tag);
request->AddInt32(kDummy1Tag, kValue1);
@@ -293,7 +296,8 @@
}
TEST_F(NetlinkClientTest, SimpleNetlinkCreateHeader) {
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(true));
+ auto request =
+ avd::NetlinkRequest::New(RTM_NEWLINK, NLM_F_CREATE | NLM_F_EXCL);
constexpr char kValue[] = "random string";
request->AddString(0, kValue); // Have something to work with.
@@ -308,7 +312,8 @@
}
TEST_F(NetlinkClientTest, SimpleNetlinkUpdateHeader) {
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
+ auto request =
+ avd::NetlinkRequest::New(RTM_SETLINK, 0);
constexpr char kValue[] = "random string";
request->AddString(0, kValue); // Have something to work with.
@@ -322,27 +327,4 @@
0u));
}
-TEST_F(NetlinkClientTest, SequenceNumbers) {
- std::unique_ptr<NetlinkRequest> request(nl_client_->CreateRequest(false));
- constexpr size_t kMsgLength =
- sizeof(nlmsghdr) + sizeof(nlattr) + sizeof(int32_t);
-
- request->AddInt32(0, 0);
- EXPECT_THAT(
- request,
- RequestHeaderIs(kMsgLength, RTM_SETLINK, NLM_F_REQUEST | NLM_F_ACK, 0u));
-
- request.reset(nl_client_->CreateRequest(false));
- request->AddInt32(0, 0);
- EXPECT_THAT(
- request,
- RequestHeaderIs(kMsgLength, RTM_SETLINK, NLM_F_REQUEST | NLM_F_ACK, 1u));
-
- request.reset(nl_client_->CreateRequest(false));
- request->AddInt32(0, 0);
- EXPECT_THAT(
- request,
- RequestHeaderIs(kMsgLength, RTM_SETLINK, NLM_F_REQUEST | NLM_F_ACK, 2u));
-}
-
} // namespace avd
diff --git a/common/libs/net/network_interface_manager.cpp b/common/libs/net/network_interface_manager.cpp
index 88c0333..2999295 100644
--- a/common/libs/net/network_interface_manager.cpp
+++ b/common/libs/net/network_interface_manager.cpp
@@ -18,6 +18,8 @@
#include <arpa/inet.h>
#include <linux/if_addr.h>
#include <linux/if_link.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
#include <memory>
#include "common/libs/glog/logging.h"
@@ -27,7 +29,7 @@
namespace {
std::unique_ptr<NetlinkRequest> BuildLinkRequest(
const NetworkInterface& interface) {
- auto request = NetlinkRequest::New(NetlinkRequest::RequestType::SetLink);
+ auto request = NetlinkRequest::New(RTM_SETLINK, 0);
request->AddIfInfo(interface.Index(), interface.IsOperational());
if (!interface.Name().empty()) {
request->AddString(IFLA_IFNAME, interface.Name());
@@ -38,7 +40,7 @@
std::unique_ptr<NetlinkRequest> BuildAddrRequest(
const NetworkInterface& interface) {
- auto request = NetlinkRequest::New(NetlinkRequest::RequestType::AddAddress);
+ auto request = NetlinkRequest::New(RTM_NEWADDR, 0);
request->AddAddrInfo(interface.Index());
request->AddInt32(IFA_LOCAL, inet_addr(interface.Address().c_str()));
request->AddInt32(IFA_ADDRESS, inet_addr(interface.Address().c_str()));