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