fstman: add HAL version 1.0

Add version 1.0 of the fstman HAL.
This HAL is served by the fst-manager daemon,
and allows the WIFI framework to control the
FST session and support features such as:
- Dynamic enslave of both master interface (wlan0)
and rate upgrade interface (wigig0). This allows
auto-detection and switching to FST connection
without special UI and disable/enable WIFI.
- Support renaming of group interfaces, this is
needed because the WIFI framework can assign
different names to the client interface (such
as wlan0/wlan1).
- Infrastructure for supporting fst-manager for
SoftAP in parallel with STA fst-manager.
- Support FST and WIFI SON modes.

Change-Id: I51b5c5eda9bdc401e25e915b295efa4abf2d50f1
diff --git a/Android.bp b/Android.bp
index 3769b92..5e90856 100644
--- a/Android.bp
+++ b/Android.bp
@@ -39,3 +39,8 @@
     name: "vendor.qti.hardware.bluetooth_dun",
     path: "vendor/qcom/opensource/interfaces/bluetooth_dun",
 }
+
+hidl_package_root {
+    name: "vendor.qti.hardware.fstman",
+    path: "vendor/qcom/opensource/interfaces/fstman",
+}
diff --git a/fstman/1.0/IFstGroup.hal b/fstman/1.0/IFstGroup.hal
new file mode 100644
index 0000000..9fd10c8
--- /dev/null
+++ b/fstman/1.0/IFstGroup.hal
@@ -0,0 +1,213 @@
+/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+
+package vendor.qti.hardware.fstman@1.0;
+
+import IFstGroupCallback;
+
+/**
+ * Interface exposed by the supplicant for each FST group (e.g bond0)
+ * it controls.
+ */
+interface IFstGroup {
+
+  /**
+   * Retrieves the name of the FST group.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|
+   * @return name Name of the FST group, e.g., bond0
+   */
+  getName() generates (FstManagerStatus status, string name);
+
+  /**
+   * Register for callbacks from this group.
+   *
+   * These callbacks are invoked for events that are specific to this group.
+   * Registration of multiple callback objects is supported. These objects must
+   * be automatically deleted when the corresponding client process is dead or
+   * if this group is removed.
+   *
+   * @param callback An instance of the |IFstGroupCallback| HIDL
+   *        interface object.
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   */
+  registerCallback(IFstGroupCallback callback)
+      generates (FstManagerStatus status);
+
+  /**
+   * Retrieve a list of all interfaces belonging to this group.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|
+   * @return ifaceNames List of names for interfaces belonging to this group.
+   */
+  listInterfaces() generates (FstManagerStatus status, vec<string> ifaceNames);
+
+  /**
+   * check if FST mode is supported for this group.
+   * When FST mode is supported, framework should detect FST-capable AP by
+   * checking for presence of MB IE in probe response.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   * @return supported true if FST mode is supported, false if not.
+   */
+  isFstModeSupported() generates (FstManagerStatus status, bool supported);
+
+  /**
+   * check if WIFI SON mode is supported for this group.
+   * When SON mode is supported, framework should detect SON-capable AP by
+   * checking for presence of SON IE in probe response.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   * @return supported true if WIFI SON mode supported, false if not.
+   */
+  isWifiSonModeSupported() generates (FstManagerStatus status, bool supported);
+
+  /**
+   * get the name of the MUX interface used by this group.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   * @return name name of the MUX interface (such as bond0)
+   */
+  getMuxInterfaceName() generates (FstManagerStatus status, string name);
+
+  /**
+   * set the name of the MUX interface used by this group.
+   * The group must not have any enslaved interfaces or active connection.
+   *
+   * @param name new name for the MUX interface.
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   */
+  setMuxInterfaceName(string name) generates (FstManagerStatus status);
+
+  /**
+   * Enslave or release a group interface.
+   * When enslaving, interface will be added to master
+   * interface as a slave.
+   * When releasing, interface will be detached from
+   * master interface and no longer be a slave.
+   * When releasing, fst-manager will also disconnect
+   * any active connection on the interface (via supplicant)
+   *
+   * @param ifname interface name, must be one of the group interfaces.
+   * @param enslave true to enslave, false to release
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_ARGS_INVALID|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   */
+   enslave(string ifname, bool enslave)
+       generates (FstManagerStatus status);
+
+  /**
+   * check if the interface is currently enslaved under the
+   * MUX interface.
+   *
+   * @param ifname interface name, must be one of the group interfaces.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_ARGS_INVALID|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   * @return enslaved true if interface is enslaved, false if not.
+   */
+   isEnslaved(string ifname)
+       generates (FstManagerStatus status, bool enslaved);
+
+   /**
+    * Changes the MAC address of the group master interface
+    * and its underlying interfaces.
+    *
+    * @param mac MAC address to change into.
+    * @return status WifiStatus of the operation.
+    *         Possible status codes:
+    *         |FstManagerStatusCode.SUCCESS|,
+    *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+    */
+   setMacAddress(MacAddress mac) generates (FstManagerStatus status);
+
+  /**
+   * check if the specified interface is the rate upgrade master for
+   * this group. The rate upgrade master is typically the "always on"
+   * connection which is used as a fallback when the faster (but less
+   * reliable) interface is not available.
+   *
+   * @param ifname interface name, must be one of the group interfaces.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_ARGS_INVALID|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   * @return isMaster true if interface is rate upgrade master, false if not.
+   */
+   isRateUpgradeMaster(string ifname)
+       generates (FstManagerStatus status, bool isMaster);
+
+  /**
+   * rename one of the group interfaces.
+   * The interface must not be enslaved, and the group must
+   * not have an active connection.
+   *
+   * @param ifname interface name, must be one of the group interfaces.
+   * @param newifname new interface name for this interface.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_ARGS_INVALID|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   */
+   renameInterface(string ifname, string newifname)
+       generates (FstManagerStatus status);
+};
diff --git a/fstman/1.0/IFstGroupCallback.hal b/fstman/1.0/IFstGroupCallback.hal
new file mode 100644
index 0000000..ae6de9b
--- /dev/null
+++ b/fstman/1.0/IFstGroupCallback.hal
@@ -0,0 +1,42 @@
+/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+package vendor.qti.hardware.fstman@1.0;
+
+/**
+ * Callback Interface exposed by the fst-manager service
+ * for each FST group (IFstGroup).
+ *
+ * Clients need to host an instance of this HIDL interface object and
+ * pass a reference of the object to the supplicant via the
+ * corresponding |IFstGroup.registerCallback| method.
+ */
+interface IFstGroupCallback {
+
+};
diff --git a/fstman/1.0/IFstManager.hal b/fstman/1.0/IFstManager.hal
new file mode 100644
index 0000000..3909703
--- /dev/null
+++ b/fstman/1.0/IFstManager.hal
@@ -0,0 +1,118 @@
+/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+package vendor.qti.hardware.fstman@1.0;
+
+import IFstGroup;
+
+/**
+ * interface for communicating with fst-manager
+ */
+interface IFstManager {
+
+  /**
+   * Debug levels for the fst-manager.
+   * Only log messages with a level greater than the set level
+   * (via |setDebugParams|) will be logged.
+   */
+  enum DebugLevel : uint32_t {
+    EXCESSIVE = 0,
+    MSGDUMP = 1,
+    DEBUG = 2,
+    INFO = 3,
+    WARNING = 4,
+    ERROR = 5
+  };
+
+  /**
+   * Gets a HIDL interface object for the group corresponding to group
+   * name which the fst-manager already controls.
+   *
+   * @param groupName The group name.
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|,
+   *         |FstManagerStatusCode.FAILURE_GROUP_UNKOWN|
+   * @return group HIDL interface object representing the group if
+   *         successful, null otherwise.
+   */
+  getGroup(string groupName)
+      generates (FstManagerStatus status, IFstGroup group);
+
+  /**
+   * Retrieve a list of all the groups controlled by the fst-manager.
+   *
+   * The corresponding |IFstGroup| object for any group can be
+   * retrieved using |getGroup| method.
+   *
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|
+   * @return groupNames List of all group names controlled by the fst-manager.
+   */
+  listGroups() generates (FstManagerStatus status, vec<string> groupNames);
+
+  /**
+   * Set debug parameters for the fst-manager.
+   *
+   * @param level Debug logging level for the fst-manager.
+   *        (one of |DebugLevel| values).
+   * @param timestamp Determines whether to show timestamps in logs or
+   *        not.
+   * @return status Status of the operation.
+   *         Possible status codes:
+   *         |FstManagerStatusCode.SUCCESS|,
+   *         |FstManagerStatusCode.FAILURE_UNKNOWN|
+   */
+  setDebugParams(DebugLevel level, bool showTimestamp)
+      generates (FstManagerStatus status);
+
+  /**
+   * Get the debug level set.
+   *
+   * @return level one of |DebugLevel| values.
+   */
+  getDebugLevel() generates (DebugLevel level);
+
+  /**
+   * Get whether the timestamps are shown in the debug logs or not.
+   *
+   * @return enabled true if set, false otherwise.
+   */
+  isDebugShowTimestampEnabled() generates (bool enabled);
+
+  /**
+   * Terminate the service.
+   * This must de-register the service and clear all state. If this HAL
+   * supports the lazy HAL protocol, then this may trigger daemon to exit and
+   * wait to be restarted.
+   */
+  oneway terminate();
+};
diff --git a/fstman/1.0/types.hal b/fstman/1.0/types.hal
new file mode 100644
index 0000000..824a4cd
--- /dev/null
+++ b/fstman/1.0/types.hal
@@ -0,0 +1,61 @@
+/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+package vendor.qti.hardware.fstman@1.0;
+/**
+ * Enum values indicating the status of any FST manager operation.
+ */
+enum FstManagerStatusCode : uint32_t {
+  /** No errors. */
+  SUCCESS,
+  /** Unknown failure occured. */
+  FAILURE_UNKNOWN,
+  /** One of the incoming args is invalid. */
+  FAILURE_ARGS_INVALID,
+  /** Unknown FST group */
+  FAILURE_GROUP_UNKNOWN,
+};
+
+/**
+ * Generic structure to return the status of any FST manager operation.
+ */
+struct FstManagerStatus {
+  FstManagerStatusCode code;
+  /**
+   * A vendor specific error message to provide more information beyond the
+   * status code.
+   * This will be used for debbuging purposes only.
+   */
+  string debugMessage;
+};
+
+/**
+ * Mac Address type. 6 octets representing physical address of a device.
+ */
+typedef uint8_t[6] MacAddress;
diff --git a/fstman/current.txt b/fstman/current.txt
new file mode 100644
index 0000000..dd02587
--- /dev/null
+++ b/fstman/current.txt
@@ -0,0 +1,36 @@
+# Copyright (c) 2019, The Linux Foundation. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.
+#     * Neither the name of The Linux Foundation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+
+
+######HAL released in Android Q######
+a916925177373b896bf211eb00faaeae7063ef40351286a64f4bec8e0079e6db vendor.qti.hardware.fstman@1.0::types
+951b29cb64137afe92a225d85af245d96c89405dae56c6af5339f13f4c4e2904 vendor.qti.hardware.fstman@1.0::IFstGroup
+24bd58f69a5d3be9294f9a671b81da1f36120ff17954d0ec94fbbff14f968a62 vendor.qti.hardware.fstman@1.0::IFstGroupCallback
+d9f95a2ba931ce60b39b564d52ae4644e875b10e7ec27ce42da83a95dcff4e81 vendor.qti.hardware.fstman@1.0::IFstManager
+