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()));