shill: Ignore certan DNS search paths

Add a manager property to provide a list of DNS Search paths
that should be ignored when applying DHCP parameters.  This
covers a list of DNS search suffixes that are popularly
provided, but are generally unlikely to provide any useful
results, therefore significantly reducing DNS lookup performance.

BUG=chromium-os:34495
TEST=Unit-tests + Manual: Add a domain to the default search list and make sure it is filtered from the "search" line in resolv.conf.
CQ-DEPENDS: I54bdd33a05bb704d8c3ff05f71e034fe42635e89

Change-Id: Id92b39f1ad0ae64b3ff50c7671cdf388d92a07af
Reviewed-on: https://gerrit.chromium.org/gerrit/33460
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/resolver.cc b/resolver.cc
index e10c587..6826ece 100644
--- a/resolver.cc
+++ b/resolver.cc
@@ -4,6 +4,7 @@
 
 #include "shill/resolver.h"
 
+#include <algorithm>
 #include <string>
 #include <vector>
 
@@ -24,6 +25,7 @@
 base::LazyInstance<Resolver> g_resolver = LAZY_INSTANCE_INITIALIZER;
 }  // namespace
 
+const char Resolver::kDefaultIgnoredSearchList[] = "gateway.2wire.net";
 const char Resolver::kDefaultShortTimeoutTechnologies[] = "ethernet,wifi";
 const char Resolver::kDefaultTimeoutOptions[] =
     "options single-request timeout:1 attempts:3";
@@ -38,8 +40,8 @@
   return g_resolver.Pointer();
 }
 
-bool Resolver::SetDNSFromLists(const std::vector<std::string> &dns_servers,
-                               const std::vector<std::string> &domain_search,
+bool Resolver::SetDNSFromLists(const vector<string> &dns_servers,
+                               const vector<string> &domain_search,
                                TimeoutParameters timeout) {
   SLOG(Resolver, 2) << __func__;
 
@@ -57,8 +59,18 @@
     lines.push_back("nameserver " + *iter);
   }
 
-  if (!domain_search.empty()) {
-    lines.push_back("search " + JoinString(domain_search, ' '));
+  vector<string> filtered_domain_search;
+  for (iter = domain_search.begin();
+       iter != domain_search.end(); ++iter) {
+    if (std::find(ignored_search_list_.begin(),
+                  ignored_search_list_.end(),
+                  *iter) == ignored_search_list_.end()) {
+      filtered_domain_search.push_back(*iter);
+    }
+  }
+
+  if (!filtered_domain_search.empty()) {
+    lines.push_back("search " + JoinString(filtered_domain_search, ' '));
   }
 
   // Send queries one-at-a-time, rather than parallelizing IPv4