| Index: net/base/net_util_linux.cc
 | 
| diff --git a/net/base/net_util_linux.cc b/net/base/net_util_linux.cc
 | 
| index a3489128007b2d6441f0519b2fb93d3ff95c25f1..8342597032d567c57d723de2f9cfdad16ae97c6a 100644
 | 
| --- a/net/base/net_util_linux.cc
 | 
| +++ b/net/base/net_util_linux.cc
 | 
| @@ -18,7 +18,6 @@
 | 
|  #include "base/files/scoped_file.h"
 | 
|  #include "base/logging.h"
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
| -#include "base/stl_util.h"
 | 
|  #include "base/strings/string_number_conversions.h"
 | 
|  #include "base/strings/string_tokenizer.h"
 | 
|  #include "base/strings/string_util.h"
 | 
| @@ -69,7 +68,11 @@ bool TryConvertNativeToNetIPAttributes(int native_attributes,
 | 
|  namespace internal {
 | 
|  
 | 
|  inline const unsigned char* GetIPAddressData(const IPAddressNumber& ip) {
 | 
| -  return vector_as_array(&ip);
 | 
| +#if defined(OS_ANDROID)
 | 
| +  return ip.begin();
 | 
| +#else
 | 
| +  return ip.data();
 | 
| +#endif
 | 
|  }
 | 
|  
 | 
|  // Gets the connection type for interface |ifname| by checking for wireless
 | 
| @@ -100,6 +103,21 @@ NetworkChangeNotifier::ConnectionType GetInterfaceConnectionType(
 | 
|    return NetworkChangeNotifier::CONNECTION_UNKNOWN;
 | 
|  }
 | 
|  
 | 
| +std::string GetInterfaceSSID(const std::string& ifname) {
 | 
| +  base::ScopedFD ioctl_socket(socket(AF_INET, SOCK_DGRAM, 0));
 | 
| +  if (!ioctl_socket.is_valid())
 | 
| +    return "";
 | 
| +  struct iwreq wreq = {};
 | 
| +  strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1);
 | 
| +
 | 
| +  char ssid[IW_ESSID_MAX_SIZE + 1] = {0};
 | 
| +  wreq.u.essid.pointer = ssid;
 | 
| +  wreq.u.essid.length = IW_ESSID_MAX_SIZE;
 | 
| +  if (ioctl(ioctl_socket.get(), SIOCGIWESSID, &wreq) != -1)
 | 
| +    return ssid;
 | 
| +  return "";
 | 
| +}
 | 
| +
 | 
|  bool GetNetworkListImpl(
 | 
|      NetworkInterfaceList* networks,
 | 
|      int policy,
 | 
| @@ -169,6 +187,23 @@ bool GetNetworkListImpl(
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| +std::string GetWifiSSIDFromInterfaceListInternal(
 | 
| +    const NetworkInterfaceList& interfaces,
 | 
| +    internal::GetInterfaceSSIDFunction get_interface_ssid) {
 | 
| +  std::string connected_ssid;
 | 
| +  for (size_t i = 0; i < interfaces.size(); ++i) {
 | 
| +    if (interfaces[i].type != NetworkChangeNotifier::CONNECTION_WIFI)
 | 
| +      return "";
 | 
| +    std::string ssid = get_interface_ssid(interfaces[i].name);
 | 
| +    if (i == 0) {
 | 
| +      connected_ssid = ssid;
 | 
| +    } else if (ssid != connected_ssid) {
 | 
| +      return "";
 | 
| +    }
 | 
| +  }
 | 
| +  return connected_ssid;
 | 
| +}
 | 
| +
 | 
|  }  // namespace internal
 | 
|  
 | 
|  bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
 | 
| @@ -183,4 +218,13 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
 | 
|        &internal::AddressTrackerLinux::GetInterfaceName);
 | 
|  }
 | 
|  
 | 
| +std::string GetWifiSSID() {
 | 
| +  NetworkInterfaceList networks;
 | 
| +  if (GetNetworkList(&networks, net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) {
 | 
| +    return internal::GetWifiSSIDFromInterfaceListInternal(
 | 
| +        networks, internal::GetInterfaceSSID);
 | 
| +  }
 | 
| +  return "";
 | 
| +}
 | 
| +
 | 
|  }  // namespace net
 | 
| 
 |