shill: rtnl: Handle setting of peer address

Bonus changes: Rename "subnet_cidr" to "subnet_prefix".  Set a default
subnet prefix for OpenVPNDriver IPConfigs.

BUG=chromium-os:28003
TEST=Unit tests.

Change-Id: I953748b3ecb1a45237cedc18482c647eebe27efa
Reviewed-on: https://gerrit.chromium.org/gerrit/18461
Reviewed-by: Darin Petkov <petkov@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
diff --git a/rtnl_handler.cc b/rtnl_handler.cc
index 0ab508b..8936c94 100644
--- a/rtnl_handler.cc
+++ b/rtnl_handler.cc
@@ -268,8 +268,10 @@
                                  RTNLMessage::Mode mode,
                                  int flags,
                                  const IPAddress &local,
-                                 const IPAddress &gateway) {
+                                 const IPAddress &gateway,
+                                 const IPAddress &peer) {
   CHECK(local.family() == gateway.family());
+  CHECK(local.family() == peer.family());
 
   RTNLMessage msg(
       RTNLMessage::kTypeAddress,
@@ -285,24 +287,27 @@
       0,
       0));
 
-  // TODO(pstew): This code only works for Ethernet-like setups,
-  //              not with devices that have a peer address like PPP.
   msg.SetAttribute(IFA_LOCAL, local.address());
   if (!gateway.IsDefault()) {
     msg.SetAttribute(IFA_BROADCAST, gateway.address());
   }
+  if (!peer.IsDefault()) {
+    msg.SetAttribute(IFA_ADDRESS, peer.address());
+  }
 
   return SendMessage(&msg);
 }
 
 bool RTNLHandler::AddInterfaceAddress(int interface_index,
                                       const IPAddress &local,
-                                      const IPAddress &broadcast) {
+                                      const IPAddress &broadcast,
+                                      const IPAddress &peer) {
     return AddressRequest(interface_index,
                           RTNLMessage::kModeAdd,
                           NLM_F_CREATE | NLM_F_EXCL,
                           local,
-                          broadcast);
+                          broadcast,
+                          peer);
 }
 
 bool RTNLHandler::RemoveInterfaceAddress(int interface_index,
@@ -311,6 +316,7 @@
                         RTNLMessage::kModeDelete,
                         0,
                         local,
+                        IPAddress(local.family()),
                         IPAddress(local.family()));
 }