Home | History | Annotate | Download | only in wifi
      1 //
      2 // Copyright (C) 2015 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "shill/wifi/wifi_driver_hal.h"
     18 
     19 #include <base/logging.h>
     20 #include <hardware_brillo/wifi_driver_hal.h>
     21 #include <hardware/hardware.h>
     22 
     23 using std::string;
     24 
     25 namespace shill {
     26 
     27 namespace {
     28 
     29 base::LazyInstance<WiFiDriverHal> g_wifi_driver_hal = LAZY_INSTANCE_INITIALIZER;
     30 
     31 bool WiFiDriverInit(wifi_driver_device_t** out_driver) {
     32   const hw_module_t* module;
     33   wifi_driver_device_t* driver;
     34   int ret;
     35 
     36   ret = hw_get_module(WIFI_DRIVER_DEVICE_ID_MAIN, &module);
     37   if (ret != 0) {
     38     LOG(ERROR) << "Failed to find HAL module";
     39     return false;
     40   }
     41 
     42   if (wifi_driver_open(module, &driver) != 0) {
     43     LOG(ERROR) << "Failed to open WiFi HAL module";
     44     return false;
     45   }
     46 
     47   wifi_driver_error error;
     48   error = (*driver->wifi_driver_initialize)();
     49   if (error != WIFI_SUCCESS) {
     50     LOG(ERROR) << "Failed to initialize WiFi driver";
     51     wifi_driver_close(driver);
     52     return false;
     53   }
     54 
     55   *out_driver = driver;
     56   return true;
     57 }
     58 
     59 void WiFiDriverShutdown(wifi_driver_device_t* driver) {
     60   wifi_driver_close(driver);
     61 }
     62 
     63 string WiFiDriverSetupInterface(wifi_driver_mode mode) {
     64   wifi_driver_device_t* driver;
     65   if (!WiFiDriverInit(&driver)) {
     66     return "";
     67   }
     68 
     69   string name_str;
     70   char device_name[DEFAULT_WIFI_DEVICE_NAME_SIZE];
     71   wifi_driver_error error =
     72       (*driver->wifi_driver_set_mode)(mode, device_name, sizeof(device_name));
     73   if (error != WIFI_SUCCESS) {
     74     LOG(ERROR) << "WiFi driver setup for mode " << mode << " failed: " << error;
     75   } else {
     76     name_str = string(device_name);
     77   }
     78 
     79   WiFiDriverShutdown(driver);
     80   return name_str;
     81 }
     82 
     83 }  // namespace
     84 
     85 WiFiDriverHal::WiFiDriverHal() {}
     86 
     87 WiFiDriverHal::~WiFiDriverHal() {}
     88 
     89 WiFiDriverHal* WiFiDriverHal::GetInstance() {
     90   return g_wifi_driver_hal.Pointer();
     91 }
     92 
     93 string WiFiDriverHal::SetupStationModeInterface() {
     94   return WiFiDriverSetupInterface(WIFI_MODE_STATION);
     95 }
     96 
     97 string WiFiDriverHal::SetupApModeInterface() {
     98   return WiFiDriverSetupInterface(WIFI_MODE_AP);
     99 }
    100 
    101 }  // namespace shill
    102