diff options
Diffstat (limited to 'www/chromium/files/patch-content_browser_geolocation_wifi__data__provider__freebsd.cc')
-rw-r--r-- | www/chromium/files/patch-content_browser_geolocation_wifi__data__provider__freebsd.cc | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/www/chromium/files/patch-content_browser_geolocation_wifi__data__provider__freebsd.cc b/www/chromium/files/patch-content_browser_geolocation_wifi__data__provider__freebsd.cc new file mode 100644 index 000000000000..4b019d35566b --- /dev/null +++ b/www/chromium/files/patch-content_browser_geolocation_wifi__data__provider__freebsd.cc @@ -0,0 +1,204 @@ +--- content/browser/geolocation/wifi_data_provider_freebsd.cc.orig 2016-05-20 17:18:26 UTC ++++ content/browser/geolocation/wifi_data_provider_freebsd.cc +@@ -0,0 +1,201 @@ ++// Copyright (c) 2010 The Chromium Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++// For FreeBSD we use the getifaddrs(3) to obtain the list of interfaces ++// and then check for those with an 802.11 media type and able to return ++// a list of stations. This is similar to ifconfig(8). ++ ++#include "content/browser/geolocation/wifi_data_provider_freebsd.h" ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <sys/types.h> ++#include <sys/socket.h> ++#include <sys/sockio.h> ++#include <net/if.h> ++#include <net/if_media.h> ++#include <ifaddrs.h> ++#include <net80211/ieee80211_ioctl.h> ++#include <net/ethernet.h> ++ ++#include "base/strings/utf_string_conversions.h" ++#include "content/browser/geolocation/wifi_data_provider_common.h" ++#include "content/browser/geolocation/wifi_data_provider_manager.h" ++ ++namespace content { ++namespace { ++// The time periods, in milliseconds, between successive polls of the wifi data. ++const int kDefaultPollingInterval = 10000; // 10s ++const int kNoChangePollingInterval = 120000; // 2 mins ++const int kTwoNoChangePollingInterval = 600000; // 10 mins ++const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s ++ ++// Convert a wifi frequency to the corresponding channel. ++// Taken from wifi_data_provider_linux.cc where it says this was ++// adapted from geolocaiton/wifilib.cc in googleclient (internal to google). ++int frquency_to_channel(int frequency_Mhz) { ++ if (frequency_Mhz >= 2412 && frequency_Mhz <= 2472) // Channels 1-13. ++ return (frequency_Mhz - 2407) / 5; ++ if (frequency_Mhz == 2484) ++ return 14; ++ if (frequency_Mhz > 5000 && frequency_Mhz < 6000) // .11a bands. ++ return (frequency_Mhz - 5000) / 5; ++ // Ignore everything else. ++ return AccessPointData().channel; // invalid channel ++} ++ ++// Provides the wifi API binding for FreeBSD. ++class AccessPointDataFreeBSD : public WifiDataProviderCommon::WlanApiInterface { ++public: ++ AccessPointDataFreeBSD(); ++ ~AccessPointDataFreeBSD(); ++ ++ // this does nothing ++ bool Init(); ++ ++ // get the AP data ++ virtual bool GetAccessPointData(WifiData::AccessPointDataSet* data); ++ ++private: ++ DISALLOW_COPY_AND_ASSIGN(AccessPointDataFreeBSD); ++}; ++ ++AccessPointDataFreeBSD::AccessPointDataFreeBSD() { ++} ++ ++AccessPointDataFreeBSD::~AccessPointDataFreeBSD() { ++} ++ ++bool AccessPointDataFreeBSD::Init() { ++ return true; ++} ++ ++bool AccessPointDataFreeBSD::GetAccessPointData(WifiData::AccessPointDataSet* data) { ++ bool res; ++ char *dupn; ++ struct ifaddrs *ifal, *ifa; ++ struct ifreq ifr; ++ struct ifmediareq ifmr; ++ struct ieee80211req i802r; ++ int s; ++ char iscanbuf[32*1024], *vsr; ++ unsigned len; ++ AccessPointData apd; ++ ++ res = false; ++ if (getifaddrs(&ifal) < 0) ++ return res; ++ ++ dupn = NULL; ++ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { ++ memset(&ifr, 0, sizeof(ifr)); ++ ++ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) ++ continue; ++ dupn = ifa->ifa_name; ++ ++ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); ++ ifr.ifr_addr.sa_family = AF_LOCAL; ++ ++ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) ++ continue; ++ ++ (void) memset(&ifmr, 0, sizeof(ifmr)); ++ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); ++ ++ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { ++ close(s); ++ continue; ++ } ++ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { ++ close(s); ++ continue; ++ } ++ ++ (void) memset(&i802r, 0, sizeof(i802r)); ++ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); ++ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; ++ i802r.i_data = iscanbuf; ++ i802r.i_len = sizeof(iscanbuf); ++ if (ioctl(s, SIOCG80211, &i802r) < 0) { ++ close(s); ++ continue; ++ } ++ ++ close(s); ++ ++ vsr = (char *) i802r.i_data; ++ len = i802r.i_len; ++ while (len >= sizeof(struct ieee80211req_scan_result)) { ++ struct ieee80211req_scan_result *isr; ++ char *id; ++ int idlen; ++ char ssid[IEEE80211_NWID_LEN+1]; ++ ++ isr = (struct ieee80211req_scan_result *) vsr; ++ ++ if (isr->isr_meshid_len) { ++ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; ++ idlen = isr->isr_meshid_len; ++ } ++ else { ++ id = vsr + isr->isr_ie_off; ++ idlen = isr->isr_ssid_len; ++ } ++ strncpy(ssid, id, idlen); ++ ssid[idlen] = '\0'; ++ apd.ssid = base::UTF8ToUTF16(ssid); ++ apd.mac_address = MacAddressAsString16(isr->isr_bssid); ++ apd.radio_signal_strength = (isr->isr_rssi/2) + isr->isr_noise; ++ apd.signal_to_noise = apd.radio_signal_strength - isr->isr_noise; ++ apd.channel = frquency_to_channel(isr->isr_freq); ++ VLOG(1) << "FreeBSD access point: " ++ << "SSID: " << apd.ssid << ", " ++ << "MAC: " << apd.mac_address << ", " ++ << "Strength: " << apd.radio_signal_strength << ":" ++ << apd.signal_to_noise << ", " ++ << "Channel: " << apd.channel; ++ data->insert(apd); ++ res = true; ++ len -= isr->isr_len; ++ vsr += isr->isr_len; ++ } ++ } ++ ++ freeifaddrs(ifal); ++ ++ return res; ++} ++ ++} // namespace ++ ++// static ++WifiDataProvider* WifiDataProviderManager::DefaultFactoryFunction() { ++ return new WifiDataProviderFreeBSD(); ++} ++ ++WifiDataProviderFreeBSD::WifiDataProviderFreeBSD() { ++} ++ ++WifiDataProviderFreeBSD::~WifiDataProviderFreeBSD() { ++} ++ ++WifiDataProviderCommon::WlanApiInterface* WifiDataProviderFreeBSD::NewWlanApi() { ++ ++ scoped_ptr<AccessPointDataFreeBSD> wlan_api(new AccessPointDataFreeBSD); ++ if (wlan_api->Init()) ++ return wlan_api.release(); ++ ++ return NULL; ++} ++ ++WifiPollingPolicy* WifiDataProviderFreeBSD::NewPollingPolicy() { ++ return new GenericWifiPollingPolicy<kDefaultPollingInterval, ++ kNoChangePollingInterval, ++ kTwoNoChangePollingInterval, ++ kNoWifiPollingIntervalMilliseconds>; ++} ++ ++} // namespace content |