| OLD | NEW |
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/network_interfaces_linux.h" | 5 #include "net/base/network_interfaces_linux.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #if !defined(OS_ANDROID) | 9 #if !defined(OS_ANDROID) |
| 10 #include <linux/ethtool.h> | 10 #include <linux/ethtool.h> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 } | 69 } |
| 70 | 70 |
| 71 } // namespace | 71 } // namespace |
| 72 | 72 |
| 73 namespace internal { | 73 namespace internal { |
| 74 | 74 |
| 75 // Gets the connection type for interface |ifname| by checking for wireless | 75 // Gets the connection type for interface |ifname| by checking for wireless |
| 76 // or ethtool extensions. | 76 // or ethtool extensions. |
| 77 NetworkChangeNotifier::ConnectionType GetInterfaceConnectionType( | 77 NetworkChangeNotifier::ConnectionType GetInterfaceConnectionType( |
| 78 const std::string& ifname) { | 78 const std::string& ifname) { |
| 79 base::ScopedFD s(socket(AF_INET, SOCK_STREAM, 0)); | 79 base::ScopedFD s = GetSocketForIoctl(); |
| 80 if (!s.is_valid()) | 80 if (!s.is_valid()) |
| 81 return NetworkChangeNotifier::CONNECTION_UNKNOWN; | 81 return NetworkChangeNotifier::CONNECTION_UNKNOWN; |
| 82 | 82 |
| 83 // Test wireless extensions for CONNECTION_WIFI | 83 // Test wireless extensions for CONNECTION_WIFI |
| 84 struct iwreq pwrq = {}; | 84 struct iwreq pwrq = {}; |
| 85 strncpy(pwrq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); | 85 strncpy(pwrq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); |
| 86 if (ioctl(s.get(), SIOCGIWNAME, &pwrq) != -1) | 86 if (ioctl(s.get(), SIOCGIWNAME, &pwrq) != -1) |
| 87 return NetworkChangeNotifier::CONNECTION_WIFI; | 87 return NetworkChangeNotifier::CONNECTION_WIFI; |
| 88 | 88 |
| 89 #if !defined(OS_ANDROID) | 89 #if !defined(OS_ANDROID) |
| 90 // Test ethtool for CONNECTION_ETHERNET | 90 // Test ethtool for CONNECTION_ETHERNET |
| 91 struct ethtool_cmd ecmd = {}; | 91 struct ethtool_cmd ecmd = {}; |
| 92 ecmd.cmd = ETHTOOL_GSET; | 92 ecmd.cmd = ETHTOOL_GSET; |
| 93 struct ifreq ifr = {}; | 93 struct ifreq ifr = {}; |
| 94 ifr.ifr_data = &ecmd; | 94 ifr.ifr_data = &ecmd; |
| 95 strncpy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1); | 95 strncpy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1); |
| 96 if (ioctl(s.get(), SIOCETHTOOL, &ifr) != -1) | 96 if (ioctl(s.get(), SIOCETHTOOL, &ifr) != -1) |
| 97 return NetworkChangeNotifier::CONNECTION_ETHERNET; | 97 return NetworkChangeNotifier::CONNECTION_ETHERNET; |
| 98 #endif // !defined(OS_ANDROID) | 98 #endif // !defined(OS_ANDROID) |
| 99 | 99 |
| 100 return NetworkChangeNotifier::CONNECTION_UNKNOWN; | 100 return NetworkChangeNotifier::CONNECTION_UNKNOWN; |
| 101 } | 101 } |
| 102 | 102 |
| 103 std::string GetInterfaceSSID(const std::string& ifname) { | 103 std::string GetInterfaceSSID(const std::string& ifname) { |
| 104 base::ScopedFD ioctl_socket(socket(AF_INET, SOCK_DGRAM, 0)); | 104 base::ScopedFD ioctl_socket = GetSocketForIoctl(); |
| 105 if (!ioctl_socket.is_valid()) | 105 if (!ioctl_socket.is_valid()) |
| 106 return ""; | 106 return ""; |
| 107 struct iwreq wreq = {}; | 107 struct iwreq wreq = {}; |
| 108 strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); | 108 strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); |
| 109 | 109 |
| 110 char ssid[IW_ESSID_MAX_SIZE + 1] = {0}; | 110 char ssid[IW_ESSID_MAX_SIZE + 1] = {0}; |
| 111 wreq.u.essid.pointer = ssid; | 111 wreq.u.essid.pointer = ssid; |
| 112 wreq.u.essid.length = IW_ESSID_MAX_SIZE; | 112 wreq.u.essid.length = IW_ESSID_MAX_SIZE; |
| 113 if (ioctl(ioctl_socket.get(), SIOCGIWESSID, &wreq) != -1) | 113 if (ioctl(ioctl_socket.get(), SIOCGIWESSID, &wreq) != -1) |
| 114 return ssid; | 114 return ssid; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 std::string ssid = get_interface_ssid(interfaces[i].name); | 194 std::string ssid = get_interface_ssid(interfaces[i].name); |
| 195 if (i == 0) { | 195 if (i == 0) { |
| 196 connected_ssid = ssid; | 196 connected_ssid = ssid; |
| 197 } else if (ssid != connected_ssid) { | 197 } else if (ssid != connected_ssid) { |
| 198 return ""; | 198 return ""; |
| 199 } | 199 } |
| 200 } | 200 } |
| 201 return connected_ssid; | 201 return connected_ssid; |
| 202 } | 202 } |
| 203 | 203 |
| 204 base::ScopedFD GetSocketForIoctl() { |
| 205 base::ScopedFD ioctl_socket(socket(AF_INET6, SOCK_DGRAM, 0)); |
| 206 if (ioctl_socket.is_valid()) |
| 207 return ioctl_socket; |
| 208 return base::ScopedFD(socket(AF_INET, SOCK_DGRAM, 0)); |
| 209 } |
| 210 |
| 204 } // namespace internal | 211 } // namespace internal |
| 205 | 212 |
| 206 bool GetNetworkList(NetworkInterfaceList* networks, int policy) { | 213 bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
| 207 if (networks == NULL) | 214 if (networks == NULL) |
| 208 return false; | 215 return false; |
| 209 | 216 |
| 210 internal::AddressTrackerLinux tracker; | 217 internal::AddressTrackerLinux tracker; |
| 211 tracker.Init(); | 218 tracker.Init(); |
| 212 | 219 |
| 213 return internal::GetNetworkListImpl( | 220 return internal::GetNetworkListImpl( |
| 214 networks, policy, tracker.GetOnlineLinks(), tracker.GetAddressMap(), | 221 networks, policy, tracker.GetOnlineLinks(), tracker.GetAddressMap(), |
| 215 &internal::AddressTrackerLinux::GetInterfaceName); | 222 &internal::AddressTrackerLinux::GetInterfaceName); |
| 216 } | 223 } |
| 217 | 224 |
| 218 std::string GetWifiSSID() { | 225 std::string GetWifiSSID() { |
| 219 // On Android, obtain the SSID using the Android-specific APIs. | 226 // On Android, obtain the SSID using the Android-specific APIs. |
| 220 #if defined(OS_ANDROID) | 227 #if defined(OS_ANDROID) |
| 221 return android::GetWifiSSID(); | 228 return android::GetWifiSSID(); |
| 222 #endif | 229 #endif |
| 223 NetworkInterfaceList networks; | 230 NetworkInterfaceList networks; |
| 224 if (GetNetworkList(&networks, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { | 231 if (GetNetworkList(&networks, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { |
| 225 return internal::GetWifiSSIDFromInterfaceListInternal( | 232 return internal::GetWifiSSIDFromInterfaceListInternal( |
| 226 networks, internal::GetInterfaceSSID); | 233 networks, internal::GetInterfaceSSID); |
| 227 } | 234 } |
| 228 return ""; | 235 return ""; |
| 229 } | 236 } |
| 230 | 237 |
| 231 } // namespace net | 238 } // namespace net |
| OLD | NEW |