From 3e2d671a4cd81dc7f13fa3465494b547ed5a5626 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Thu, 6 Oct 2016 13:16:23 -0700 Subject: [PATCH] wifi: Add the various iface object implementation This CL adds the implementation classes for the various iface HIDL interfaces defined. These classes implement the |getName| & |getType| methods in the Iface HIDL interface. Integration of these objects with WifiChip class is implemented in the next CL. Bug: 31943042 Test: Compiles Change-Id: I219afd6441e15c76cf7c61f7bcd2b3568dba2b98 --- wifi/1.0/default/Android.mk | 8 +++- wifi/1.0/default/wifi_ap_iface.cpp | 53 ++++++++++++++++++++++++++ wifi/1.0/default/wifi_ap_iface.h | 59 +++++++++++++++++++++++++++++ wifi/1.0/default/wifi_chip.h | 14 ++++++- wifi/1.0/default/wifi_nan_iface.cpp | 53 ++++++++++++++++++++++++++ wifi/1.0/default/wifi_nan_iface.h | 59 +++++++++++++++++++++++++++++ wifi/1.0/default/wifi_p2p_iface.cpp | 53 ++++++++++++++++++++++++++ wifi/1.0/default/wifi_p2p_iface.h | 59 +++++++++++++++++++++++++++++ wifi/1.0/default/wifi_sta_iface.cpp | 53 ++++++++++++++++++++++++++ wifi/1.0/default/wifi_sta_iface.h | 59 +++++++++++++++++++++++++++++ 10 files changed, 467 insertions(+), 3 deletions(-) create mode 100644 wifi/1.0/default/wifi_ap_iface.cpp create mode 100644 wifi/1.0/default/wifi_ap_iface.h create mode 100644 wifi/1.0/default/wifi_nan_iface.cpp create mode 100644 wifi/1.0/default/wifi_nan_iface.h create mode 100644 wifi/1.0/default/wifi_p2p_iface.cpp create mode 100644 wifi/1.0/default/wifi_p2p_iface.h create mode 100644 wifi/1.0/default/wifi_sta_iface.cpp create mode 100644 wifi/1.0/default/wifi_sta_iface.h diff --git a/wifi/1.0/default/Android.mk b/wifi/1.0/default/Android.mk index 07865a5df7..ecb16e2549 100644 --- a/wifi/1.0/default/Android.mk +++ b/wifi/1.0/default/Android.mk @@ -19,9 +19,13 @@ LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_CPPFLAGS := -std=c++11 -Wall -Wno-unused-parameter -Werror -Wextra LOCAL_SRC_FILES := \ failure_reason_util.cpp \ - wifi_chip.cpp \ wifi.cpp \ - wifi_legacy_hal.cpp + wifi_ap_iface.cpp \ + wifi_chip.cpp \ + wifi_legacy_hal.cpp \ + wifi_nan_iface.cpp \ + wifi_p2p_iface.cpp \ + wifi_sta_iface.cpp LOCAL_SHARED_LIBRARIES := \ android.hardware.wifi@1.0 \ libbase \ diff --git a/wifi/1.0/default/wifi_ap_iface.cpp b/wifi/1.0/default/wifi_ap_iface.cpp new file mode 100644 index 0000000000..aded04d194 --- /dev/null +++ b/wifi/1.0/default/wifi_ap_iface.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wifi_ap_iface.h" + +#include + +#include "failure_reason_util.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +WifiApIface::WifiApIface(const std::string& ifname, + const std::weak_ptr legacy_hal) + : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {} + +void WifiApIface::invalidate() { + legacy_hal_.reset(); + is_valid_ = false; +} + +Return WifiApIface::getName(getName_cb cb) { + hidl_string hidl_ifname; + hidl_ifname.setToExternal(ifname_.c_str(), ifname_.size()); + cb(hidl_ifname); + return Void(); +} + +Return WifiApIface::getType() { + return IfaceType::AP; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android diff --git a/wifi/1.0/default/wifi_ap_iface.h b/wifi/1.0/default/wifi_ap_iface.h new file mode 100644 index 0000000000..b95a3d8ed6 --- /dev/null +++ b/wifi/1.0/default/wifi_ap_iface.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WIFI_AP_IFACE_H_ +#define WIFI_AP_IFACE_H_ + +#include +#include + +#include "wifi_legacy_hal.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +/** + * HIDL interface object used to control a AP Iface instance. + */ +class WifiApIface : public IWifiApIface { + public: + WifiApIface(const std::string& ifname, + const std::weak_ptr legacy_hal); + // Refer to |WifiChip::invalidate()|. + void invalidate(); + + // HIDL methods exposed. + Return getName(getName_cb cb) override; + Return getType() override; + + private: + std::string ifname_; + std::weak_ptr legacy_hal_; + bool is_valid_; + + DISALLOW_COPY_AND_ASSIGN(WifiApIface); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android + +#endif // WIFI_AP_IFACE_H_ diff --git a/wifi/1.0/default/wifi_chip.h b/wifi/1.0/default/wifi_chip.h index ef2137b5ce..84e5470376 100644 --- a/wifi/1.0/default/wifi_chip.h +++ b/wifi/1.0/default/wifi_chip.h @@ -38,7 +38,19 @@ namespace implementation { class WifiChip : public IWifiChip { public: WifiChip(ChipId chip_id, const std::weak_ptr legacy_hal); - // Invalidate this instance once the HAL is stopped. + // HIDL does not provide a built-in mechanism to let the server invalidate + // a HIDL interface object after creation. If any client process holds onto + // a reference to the object in their context, any method calls on that + // reference will continue to be directed to the server. + // + // However Wifi HAL needs to control the lifetime of these objects. So, add + // a public |invalidate| method to |WifiChip| and it's child objects. This + // will be used to mark an object invalid when either: + // a) Wifi HAL is stopped, or + // b) Wifi Chip is reconfigured. + // + // All HIDL method implementations should check if the object is still marked + // valid before processing them. void invalidate(); // HIDL methods exposed. diff --git a/wifi/1.0/default/wifi_nan_iface.cpp b/wifi/1.0/default/wifi_nan_iface.cpp new file mode 100644 index 0000000000..3c7ae4b8cf --- /dev/null +++ b/wifi/1.0/default/wifi_nan_iface.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wifi_nan_iface.h" + +#include + +#include "failure_reason_util.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +WifiNanIface::WifiNanIface(const std::string& ifname, + const std::weak_ptr legacy_hal) + : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {} + +void WifiNanIface::invalidate() { + legacy_hal_.reset(); + is_valid_ = false; +} + +Return WifiNanIface::getName(getName_cb cb) { + hidl_string hidl_ifname; + hidl_ifname.setToExternal(ifname_.c_str(), ifname_.size()); + cb(hidl_ifname); + return Void(); +} + +Return WifiNanIface::getType() { + return IfaceType::NAN; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android diff --git a/wifi/1.0/default/wifi_nan_iface.h b/wifi/1.0/default/wifi_nan_iface.h new file mode 100644 index 0000000000..93e2e7795f --- /dev/null +++ b/wifi/1.0/default/wifi_nan_iface.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WIFI_NAN_IFACE_H_ +#define WIFI_NAN_IFACE_H_ + +#include +#include + +#include "wifi_legacy_hal.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +/** + * HIDL interface object used to control a NAN Iface instance. + */ +class WifiNanIface : public IWifiNanIface { + public: + WifiNanIface(const std::string& ifname, + const std::weak_ptr legacy_hal); + // Refer to |WifiChip::invalidate()|. + void invalidate(); + + // HIDL methods exposed. + Return getName(getName_cb cb) override; + Return getType() override; + + private: + std::string ifname_; + std::weak_ptr legacy_hal_; + bool is_valid_; + + DISALLOW_COPY_AND_ASSIGN(WifiNanIface); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android + +#endif // WIFI_NAN_IFACE_H_ diff --git a/wifi/1.0/default/wifi_p2p_iface.cpp b/wifi/1.0/default/wifi_p2p_iface.cpp new file mode 100644 index 0000000000..349a158fb5 --- /dev/null +++ b/wifi/1.0/default/wifi_p2p_iface.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wifi_p2p_iface.h" + +#include + +#include "failure_reason_util.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +WifiP2pIface::WifiP2pIface(const std::string& ifname, + const std::weak_ptr legacy_hal) + : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {} + +void WifiP2pIface::invalidate() { + legacy_hal_.reset(); + is_valid_ = false; +} + +Return WifiP2pIface::getName(getName_cb cb) { + hidl_string hidl_ifname; + hidl_ifname.setToExternal(ifname_.c_str(), ifname_.size()); + cb(hidl_ifname); + return Void(); +} + +Return WifiP2pIface::getType() { + return IfaceType::P2P; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android diff --git a/wifi/1.0/default/wifi_p2p_iface.h b/wifi/1.0/default/wifi_p2p_iface.h new file mode 100644 index 0000000000..d70415df66 --- /dev/null +++ b/wifi/1.0/default/wifi_p2p_iface.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WIFI_P2P_IFACE_H_ +#define WIFI_P2P_IFACE_H_ + +#include +#include + +#include "wifi_legacy_hal.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +/** + * HIDL interface object used to control a P2P Iface instance. + */ +class WifiP2pIface : public IWifiP2pIface { + public: + WifiP2pIface(const std::string& ifname, + const std::weak_ptr legacy_hal); + // Refer to |WifiChip::invalidate()|. + void invalidate(); + + // HIDL methods exposed. + Return getName(getName_cb cb) override; + Return getType() override; + + private: + std::string ifname_; + std::weak_ptr legacy_hal_; + bool is_valid_; + + DISALLOW_COPY_AND_ASSIGN(WifiP2pIface); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android + +#endif // WIFI_P2P_IFACE_H_ diff --git a/wifi/1.0/default/wifi_sta_iface.cpp b/wifi/1.0/default/wifi_sta_iface.cpp new file mode 100644 index 0000000000..225cec424e --- /dev/null +++ b/wifi/1.0/default/wifi_sta_iface.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "wifi_sta_iface.h" + +#include + +#include "failure_reason_util.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +WifiStaIface::WifiStaIface(const std::string& ifname, + const std::weak_ptr legacy_hal) + : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {} + +void WifiStaIface::invalidate() { + legacy_hal_.reset(); + is_valid_ = false; +} + +Return WifiStaIface::getName(getName_cb cb) { + hidl_string hidl_ifname; + hidl_ifname.setToExternal(ifname_.c_str(), ifname_.size()); + cb(hidl_ifname); + return Void(); +} + +Return WifiStaIface::getType() { + return IfaceType::STA; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android diff --git a/wifi/1.0/default/wifi_sta_iface.h b/wifi/1.0/default/wifi_sta_iface.h new file mode 100644 index 0000000000..fc5efec90c --- /dev/null +++ b/wifi/1.0/default/wifi_sta_iface.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef WIFI_STA_IFACE_H_ +#define WIFI_STA_IFACE_H_ + +#include +#include + +#include "wifi_legacy_hal.h" + +namespace android { +namespace hardware { +namespace wifi { +namespace V1_0 { +namespace implementation { + +/** + * HIDL interface object used to control a STA Iface instance. + */ +class WifiStaIface : public IWifiStaIface { + public: + WifiStaIface(const std::string& ifname, + const std::weak_ptr legacy_hal); + // Refer to |WifiChip::invalidate()|. + void invalidate(); + + // HIDL methods exposed. + Return getName(getName_cb cb) override; + Return getType() override; + + private: + std::string ifname_; + std::weak_ptr legacy_hal_; + bool is_valid_; + + DISALLOW_COPY_AND_ASSIGN(WifiStaIface); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace wifi +} // namespace hardware +} // namespace android + +#endif // WIFI_STA_IFACE_H_