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