shill: vpn: Add support for creating a tunnel interface
Use the ioctl inteface for creating a TUN device (no RTNL interface
for this appears available). Also create a means for removing
interfaces, using the RTNL interface.
BUG=chromium-os:26841
TEST=New unit test for RTNL interface, manual testing for ioctl
interface and for TUN interface detection and handling.
Change-Id: If70eeeecd5d2a2e3c348b56c297c0f3dd4226b8f
Reviewed-on: https://gerrit.chromium.org/gerrit/17127
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/rtnl_message_unittest.cc b/rtnl_message_unittest.cc
index 1f8d55f..461458f 100644
--- a/rtnl_message_unittest.cc
+++ b/rtnl_message_unittest.cc
@@ -592,7 +592,7 @@
ByteString(kAddNeighborMessage, sizeof(kAddNeighborMessage))));
}
-TEST_F(RTNLMessageTest, Encode) {
+TEST_F(RTNLMessageTest, EncodeRouteAdd) {
RTNLMessage msg(RTNLMessage::kTypeRoute,
RTNLMessage::kModeAdd,
0, 1, 2, 0,
@@ -628,4 +628,33 @@
13);
}
+TEST_F(RTNLMessageTest, EncodeLinkDel) {
+ const int kInterfaceIndex = 0x1234;
+ RTNLMessage pmsg(RTNLMessage::kTypeLink,
+ RTNLMessage::kModeDelete,
+ NLM_F_REQUEST,
+ 0,
+ 0,
+ kInterfaceIndex,
+ IPAddress::kFamilyUnknown);
+
+
+ RTNLMessage msg;
+ EXPECT_TRUE(msg.Decode(pmsg.Encode()));
+
+ EXPECT_EQ(RTNLMessage::kTypeLink, msg.type());
+ EXPECT_EQ(RTNLMessage::kModeDelete, msg.mode());
+ EXPECT_EQ(kInterfaceIndex, msg.interface_index());
+
+ RTNLMessage::LinkStatus status = msg.link_status();
+ EXPECT_EQ(0, status.flags);
+ EXPECT_EQ(0, status.change);
+
+ EXPECT_FALSE(msg.HasAttribute(IFLA_ADDRESS));
+ EXPECT_FALSE(msg.HasAttribute(IFLA_IFNAME));
+ EXPECT_FALSE(msg.HasAttribute(IFLA_MTU));
+ EXPECT_FALSE(msg.HasAttribute(IFLA_QDISC));
+ EXPECT_FALSE(msg.HasAttribute(IFLA_OPERSTATE));
+}
+
} // namespace shill