shill: Allow service override of DHCP-derived IP parameters

Create new class StaticIPParameters which encapsulates all of the
property handling for RPC and storage, as well as applying parameters
to an IPConfig::Properties element.  When a DHCP request succeeds
these parameters are used to selectively override values gained from
DHCP with those specified on the service.

BUG=chromium-os:23930
TEST=New unit tests -- manual testing is pending

Change-Id: I3b784f897ec6ffe0c78f2efe615d07d8f8924add
Reviewed-on: https://gerrit.chromium.org/gerrit/21448
Commit-Ready: Paul Stewart <pstew@chromium.org>
Reviewed-by: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/connection.cc b/connection.cc
index 17c7ef2..9867ae1 100644
--- a/connection.cc
+++ b/connection.cc
@@ -66,8 +66,11 @@
   local.set_prefix(properties.subnet_prefix);
 
   IPAddress broadcast(properties.address_family);
-  if (!broadcast.SetAddressFromString(properties.broadcast_address) &&
-      technology_ != Technology::kVPN) {
+  if (properties.broadcast_address.empty()) {
+    if (technology_ != Technology::kVPN) {
+      LOG(WARNING) << "Broadcast address is not set.  Using default.";
+    }
+  } else if (!broadcast.SetAddressFromString(properties.broadcast_address)) {
     LOG(ERROR) << "Broadcast address " << properties.broadcast_address
                << " is invalid";
     return;