From 77d2b846bf3325155ba4af922eb4af7e5af9e8e2 Mon Sep 17 00:00:00 2001
From: Ajit Vaishya <ajitv@codeaurora.org>
Date: Tue, 03 Apr 2018 17:00:16 +0530
Subject: [PATCH] Wifi: Introduce client interface for vendor supplicant 2.0

This commit introduces the client side infrastructure to integrate
with qti.hardware.wifi.supplicant@2.0 service. This infrastructure
aims to configure interface and network specific information, which
shall further be used to implement WPA3 functionalities.
In addition, this commit also adds the functionality to configure
FILS AKM.

Change-Id: I967f9dc45faba3b37bb2b833d1c4df622d7e9132
CRs-Fixed: 2218453
---

diff --git a/service/Android.mk b/service/Android.mk
index 83dc143..8470a7d 100644
--- a/service/Android.mk
+++ b/service/Android.mk
@@ -68,6 +68,7 @@
 	android.hardware.wifi-V1.2-java \
 	android.hardware.wifi.hostapd-V1.0-java \
 	android.hardware.wifi.supplicant-V1.0-java \
+	vendor.qti.hardware.wifi.supplicant-V2.0-java \
 	android.hardware.wifi.supplicant-V1.1-java
 LOCAL_REQUIRED_MODULES := \
 	services \
diff --git a/service/java/com/android/server/wifi/ScanResultMatchInfo.java b/service/java/com/android/server/wifi/ScanResultMatchInfo.java
index ad29c23..53f2072 100644
--- a/service/java/com/android/server/wifi/ScanResultMatchInfo.java
+++ b/service/java/com/android/server/wifi/ScanResultMatchInfo.java
@@ -30,6 +30,8 @@
     public static final int NETWORK_TYPE_WEP = 1;
     public static final int NETWORK_TYPE_PSK = 2;
     public static final int NETWORK_TYPE_EAP = 3;
+    public static final int NETWORK_TYPE_FILS_SHA256 = 10;
+    public static final int NETWORK_TYPE_FILS_SHA384 = 11;
 
     /**
      * SSID of the network.
@@ -54,6 +56,10 @@
             info.networkType = NETWORK_TYPE_WEP;
         } else if (WifiConfigurationUtil.isConfigForOpenNetwork(config)) {
             info.networkType = NETWORK_TYPE_OPEN;
+        } else if (WifiConfigurationUtil.isConfigForSha256Network(config)) {
+            info.networkType = NETWORK_TYPE_FILS_SHA256;
+        } else if (WifiConfigurationUtil.isConfigForSha384Network(config)) {
+            info.networkType = NETWORK_TYPE_FILS_SHA384;
         } else {
             throw new IllegalArgumentException("Invalid WifiConfiguration: " + config);
         }
@@ -78,6 +84,10 @@
             info.networkType = NETWORK_TYPE_WEP;
         } else if (ScanResultUtil.isScanResultForOpenNetwork(scanResult)) {
             info.networkType = NETWORK_TYPE_OPEN;
+        } else if (ScanResultUtil.isScanResultForFilsSha256Network(scanResult)) {
+            info.networkType = NETWORK_TYPE_FILS_SHA256;
+        } else if (ScanResultUtil.isScanResultForFilsSha384Network(scanResult)) {
+            info.networkType = NETWORK_TYPE_FILS_SHA384;
         } else {
             throw new IllegalArgumentException("Invalid ScanResult: " + scanResult);
         }
diff --git a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
index 5bf44ce..f0508e5 100644
--- a/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
+++ b/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
@@ -29,6 +29,11 @@
 import android.annotation.NonNull;
 import android.content.Context;
 import android.hardware.wifi.supplicant.V1_0.ISupplicant;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendor;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendorIface;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendorStaIface;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendorNetwork;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendorStaNetwork;
 import android.hardware.wifi.supplicant.V1_0.ISupplicantIface;
 import android.hardware.wifi.supplicant.V1_0.ISupplicantNetwork;
 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaIface;
@@ -100,7 +105,9 @@
     // Supplicant HAL interface objects
     private IServiceManager mIServiceManager = null;
     private ISupplicant mISupplicant;
+    private ISupplicantVendor mISupplicantVendor; // Supplicant Vendor HAL interface objects
     private HashMap<String, ISupplicantStaIface> mISupplicantStaIfaces = new HashMap<>();
+    private HashMap<String, ISupplicantVendorStaIface> mISupplicantVendorStaIfaces = new HashMap<>();
     private HashMap<String, ISupplicantStaIfaceCallback> mISupplicantStaIfaceCallbacks =
             new HashMap<>();
     private HashMap<String, SupplicantStaNetworkHal> mCurrentNetworkRemoteHandles = new HashMap<>();
@@ -142,6 +149,13 @@
                 }
             };
 
+    private final HwRemoteBinder.DeathRecipient mSupplicantVendorDeathRecipient =
+            cookie -> {
+                synchronized (mLock) {
+                    Log.w(TAG, "ISupplicantVendor/ISupplicantVendorStaIface died: cookie=" + cookie);
+                    supplicantvendorServiceDiedHandler();
+                }
+            };
 
     public SupplicantStaIfaceHal(Context context, WifiMonitor monitor) {
         mContext = context;
@@ -188,7 +202,9 @@
                 Log.i(TAG, "Registering ISupplicant service ready callback.");
             }
             mISupplicant = null;
+            mISupplicantVendor = null;
             mISupplicantStaIfaces.clear();
+            mISupplicantVendorStaIfaces.clear();
             if (mIServiceManager != null) {
                 // Already have an IServiceManager and serviceNotification registered, don't
                 // don't register another.
@@ -238,6 +254,23 @@
         }
     }
 
+    private boolean linkToSupplicantVendorDeath() {
+        synchronized (mLock) {
+            if (mISupplicantVendor == null) return false;
+            try {
+                if (!mISupplicantVendor.linkToDeath(mSupplicantVendorDeathRecipient, 0)) {
+                    Log.wtf(TAG, "Error on linkToDeath on ISupplicantVendor");
+                    supplicantvendorServiceDiedHandler();
+                    return false;
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "ISupplicantVendor.linkToDeath exception", e);
+                return false;
+            }
+            return true;
+        }
+    }
+
     private boolean initSupplicantService() {
         synchronized (mLock) {
             try {
@@ -246,6 +279,7 @@
                 Log.e(TAG, "ISupplicant.getService exception: " + e);
                 return false;
             }
+
             if (mISupplicant == null) {
                 Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup");
                 return false;
@@ -254,9 +288,52 @@
                 return false;
             }
         }
+        if (!initSupplicantVendorService())
+            Log.e(TAG, "Failed to init SupplicantVendor service");
         return true;
     }
 
+    private boolean initSupplicantVendorService() {
+        synchronized (mLock) {
+            try {
+            // Discovering supplicantvendor service
+                mISupplicantVendor = getSupplicantVendorMockable();
+                if (mISupplicantVendor != null) {
+                   Log.e(TAG, "Discover ISupplicantVendor service successfull");
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "ISupplicantVendor.getService exception: " + e);
+                return false;
+            }
+            if (mISupplicantVendor == null) {
+                Log.e(TAG, "Got null ISupplicantVendor service. Stopping supplicantVendor HIDL startup");
+                return false;
+            }
+            // check mISupplicantVendor service and trigger death service
+            if (!linkToSupplicantVendorDeath()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean linkToSupplicantVendorStaIfaceDeath(ISupplicantVendorStaIface iface) {
+        synchronized (mLock) {
+            if (iface == null) return false;
+            try {
+                if (!iface.linkToDeath(mSupplicantVendorDeathRecipient, 0)) {
+                    Log.wtf(TAG, "Error on linkToDeath on ISupplicantVendorStaIface");
+                    supplicantvendorServiceDiedHandler();
+                    return false;
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "ISupplicantVendorStaIface.linkToDeath exception", e);
+                return false;
+            }
+            return true;
+        }
+    }
+
     private int getCurrentNetworkId(@NonNull String ifaceName) {
         synchronized (mLock) {
             WifiConfiguration currentConfig = getCurrentNetworkLocalConfig(ifaceName);
@@ -277,6 +354,7 @@
         final String methodStr = "setupIface";
         if (checkSupplicantStaIfaceAndLogFailure(ifaceName, methodStr) != null) return false;
         ISupplicantIface ifaceHwBinder;
+
         if (isV1_1()) {
             ifaceHwBinder = addIfaceV1_1(ifaceName);
         } else {
@@ -308,10 +386,109 @@
             mISupplicantStaIfaces.put(ifaceName, iface);
             mISupplicantStaIfaceCallbacks.put(ifaceName, callback);
         }
+        /** creation vendor sta iface binder */
+        if (!vendor_setupIface(ifaceName))
+            Log.e(TAG, "Failed to create vendor setupiface");
+
         return true;
     }
 
     /**
+     * Setup a Vendor STA interface for the specified iface name.
+     *
+     * @param ifaceName Name of the interface.
+     * @return true on success, false otherwise.
+     */
+    public boolean vendor_setupIface(@NonNull String ifaceName) {
+        final String methodStr = "vendor_setupIface";
+        if (checkSupplicantVendorStaIfaceAndLogFailure(ifaceName, methodStr) != null) {
+            Log.e(TAG, "Already created vendor setupinterface");
+            return true;
+        }
+        ISupplicantVendorIface Vendor_ifaceHwBinder = null;
+
+        if (isVendor_2_0()) {
+            Log.e(TAG, "Try to get Vendor HIDL@2.0 interface");
+            Vendor_ifaceHwBinder = getVendorIfaceV2_0(ifaceName);
+        }
+        if (Vendor_ifaceHwBinder == null) {
+            Log.e(TAG, "Failed to get vendor iface binder");
+            return false;
+        }
+
+        ISupplicantVendorStaIface vendor_iface = getVendorStaIfaceMockable(Vendor_ifaceHwBinder);
+        if (vendor_iface == null) {
+            Log.e(TAG, "Failed to get ISupplicantVendorStaIface proxy");
+            return false;
+        }
+        else
+            Log.e(TAG, "Successful get Vendor sta interface");
+
+        if (!linkToSupplicantVendorStaIfaceDeath(vendor_iface)) {
+            return false;
+        }
+
+        if (vendor_iface != null) {
+            mISupplicantVendorStaIfaces.put(ifaceName, vendor_iface);
+        }
+        return true;
+    }
+
+    /**
+     * Get a Vendor STA interface for the specified iface name.
+     *
+     * @param ifaceName Name of the interface.
+     * @return true on success, false otherwise.
+     */
+    private ISupplicantVendorIface getVendorIfaceV2_0(@NonNull String ifaceName) {
+        synchronized (mLock) {
+            /** List all supplicant Ifaces */
+            final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>();
+            try {
+                final String methodStr = "listVendorInterfaces";
+                if (!checkSupplicantVendorAndLogFailure(methodStr)) return null;
+                mISupplicantVendor.listVendorInterfaces((SupplicantStatus status,
+                                             ArrayList<ISupplicant.IfaceInfo> ifaces) -> {
+                    if (!checkSupplicantVendorStatusAndLogFailure(status, methodStr)) {
+                        return;
+                    }
+                    supplicantIfaces.addAll(ifaces);
+                });
+            } catch (RemoteException e) {
+                Log.e(TAG, "ISupplicantVendor.listInterfaces exception: " + e);
+                supplicantvendorServiceDiedHandler();
+                return null;
+            }
+            if (supplicantIfaces.size() == 0) {
+                Log.e(TAG, "Got zero HIDL supplicant vendor ifaces. Stopping supplicant vendor HIDL startup.");
+                return null;
+            }
+            Mutable<ISupplicantVendorIface> supplicantVendorIface = new Mutable<>();
+            for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) {
+                if (ifaceInfo.type == IfaceType.STA && ifaceName.equals(ifaceInfo.name)) {
+                    try {
+                        final String methodStr = "getVendorInterface";
+                        if (!checkSupplicantVendorAndLogFailure(methodStr)) return null;
+                        mISupplicantVendor.getVendorInterface(ifaceInfo,
+                                (SupplicantStatus status, ISupplicantVendorIface iface) -> {
+                                    if (!checkSupplicantVendorStatusAndLogFailure(status, methodStr)) {
+                                        return;
+                                    }
+                                    supplicantVendorIface.value = iface;
+                                });
+                    } catch (RemoteException e) {
+                        Log.e(TAG, "ISupplicantVendor.getInterface exception: " + e);
+                        supplicantvendorServiceDiedHandler();
+                        return null;
+                    }
+                    break;
+                }
+            }
+            return supplicantVendorIface.value;
+        }
+    }
+
+    /**
      * Get a STA interface for the specified iface name.
      *
      * @param ifaceName Name of the interface.
@@ -414,6 +591,10 @@
                 Log.e(TAG, "Trying to teardown unknown inteface");
                 return false;
             }
+            if (mISupplicantVendorStaIfaces.remove(ifaceName) == null) {
+                Log.e(TAG, "Trying to teardown unknown vendor interface");
+                return false;
+            }
             mISupplicantStaIfaceCallbacks.remove(ifaceName);
             return true;
         }
@@ -473,12 +654,28 @@
     private void clearState() {
         synchronized (mLock) {
             mISupplicant = null;
+            mISupplicantVendor = null;
             mISupplicantStaIfaces.clear();
+            mISupplicantVendorStaIfaces.clear();
             mCurrentNetworkLocalConfigs.clear();
             mCurrentNetworkRemoteHandles.clear();
         }
     }
 
+    private void supplicantServiceDiedHandler(@NonNull String ifaceName) {
+        synchronized (mLock) {
+            mWifiMonitor.broadcastSupplicantDisconnectionEvent(ifaceName);
+            supplicantServiceDiedHandler();
+        }
+    }
+
+    private void supplicantvendorServiceDiedHandler() {
+        synchronized (mLock) {
+            mISupplicantVendor = null;
+            mISupplicantVendorStaIfaces.clear();
+        }
+    }
+
     private void supplicantServiceDiedHandler() {
         synchronized (mLock) {
             for (String ifaceName : mISupplicantStaIfaces.keySet()) {
@@ -546,6 +743,17 @@
         }
     }
 
+    protected ISupplicantVendor getSupplicantVendorMockable() throws RemoteException {
+        synchronized (mLock) {
+            try {
+                return ISupplicantVendor.getService();
+            } catch (NoSuchElementException e) {
+                Log.e(TAG, "Failed to get ISupplicant", e);
+                return null;
+            }
+        }
+    }
+
     protected android.hardware.wifi.supplicant.V1_1.ISupplicant getSupplicantMockableV1_1()
             throws RemoteException {
         synchronized (mLock) {
@@ -573,6 +781,18 @@
         }
     }
 
+    protected ISupplicantVendorStaIface getVendorStaIfaceMockable(ISupplicantVendorIface iface) {
+        synchronized (mLock) {
+            return ISupplicantVendorStaIface.asInterface(iface.asBinder());
+        }
+    }
+
+    protected ISupplicantVendorStaNetwork getVendorStaNetworkMockable(ISupplicantVendorNetwork network) {
+        synchronized (mLock) {
+            return ISupplicantVendorStaNetwork.asInterface(network.asBinder());
+        }
+    }
+
     /**
      * Check if the device is running V1_1 supplicant service.
      * @return
@@ -590,13 +810,36 @@
     }
 
     /**
-     * Helper method to look up the network object for the specified iface.
+     * Check if the device is running V2_0 supplicant vendor service.
+     * @return
+     */
+    private boolean isVendor_2_0() {
+        synchronized (mLock) {
+            try {
+                return (getSupplicantVendorMockable() != null);
+            } catch (RemoteException e) {
+                Log.e(TAG, "ISupplicantVendor.getService exception: " + e);
+                supplicantServiceDiedHandler();
+                return false;
+            }
+        }
+    }
+
+    /**
+     * Helper method to look up the iface object for the specified iface.
      */
     private ISupplicantStaIface getStaIface(@NonNull String ifaceName) {
         return mISupplicantStaIfaces.get(ifaceName);
     }
 
     /**
+     * Helper method to look up the vendor_iface object for the specified iface.
+     */
+    private ISupplicantVendorStaIface getVendorStaIface(@NonNull String ifaceName) {
+        return mISupplicantVendorStaIfaces.get(ifaceName);
+    }
+
+    /**
      * Helper method to look up the network object for the specified iface.
      */
     private SupplicantStaNetworkHal getCurrentNetworkRemoteHandle(@NonNull String ifaceName) {
@@ -630,6 +873,9 @@
                 loge("Failed to add a network!");
                 return null;
             }
+            network.getId();
+            network.setVendorStaNetwork(getVendorNetwork
+                                        (ifaceName, network.getNetworkId()));
             boolean saveSuccess = false;
             try {
                 saveSuccess = network.saveWifiConfiguration(config);
@@ -686,6 +932,16 @@
                     loge("Failed to remove existing networks");
                     return false;
                 }
+               /**
+                * Handle connection to saved FILS network when wifi is
+                * restarted with altered driver configuration.
+                */
+                if (!getCapabilities(ifaceName, "key_mgmt").contains("FILS-SHA256"))
+                    config.allowedKeyManagement.clear(WifiConfiguration.KeyMgmt.FILS_SHA256);
+
+                if (!getCapabilities(ifaceName, "key_mgmt").contains("FILS-SHA384"))
+                    config.allowedKeyManagement.clear(WifiConfiguration.KeyMgmt.FILS_SHA384);
+
                 Pair<SupplicantStaNetworkHal, WifiConfiguration> pair =
                         addNetworkAndSaveConfig(ifaceName, config);
                 if (pair == null) {
@@ -695,6 +951,7 @@
                 mCurrentNetworkRemoteHandles.put(ifaceName, pair.first);
                 mCurrentNetworkLocalConfigs.put(ifaceName, pair.second);
             }
+            getCapabilities(ifaceName, "key_mgmt");
             SupplicantStaNetworkHal networkHandle =
                     checkSupplicantStaNetworkAndLogFailure(ifaceName, "connectToNetwork");
             if (networkHandle == null || !networkHandle.select()) {
@@ -1093,6 +1350,33 @@
         }
     }
 
+    /**
+     * @return The ISupplicantVendorStaNetwork object for the given SupplicantNetworkId int, returns null if
+     * the call fails
+     */
+    private ISupplicantVendorStaNetwork getVendorNetwork(@NonNull String ifaceName, int id) {
+        synchronized (mLock) {
+            final String methodStr = "getVendorNetwork";
+            ISupplicantVendorStaIface iface = checkSupplicantVendorStaIfaceAndLogFailure(ifaceName, methodStr);
+            if (iface == null) return null;
+            Mutable<ISupplicantVendorNetwork> gotNetwork = new Mutable<>();
+            try {
+                iface.getVendorNetwork(id, (SupplicantStatus status, ISupplicantVendorNetwork network) -> {
+                    if (checkStatusAndLogFailure(status, methodStr)) {
+                        gotNetwork.value = network;
+                    }
+                });
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+            }
+            if (gotNetwork.value != null) {
+                return getVendorStaNetworkMockable(gotNetwork.value);
+            } else {
+                return null;
+            }
+        }
+    }
+
     /** See ISupplicantStaNetwork.hal for documentation */
     private boolean registerCallback(
             ISupplicantStaIface iface, ISupplicantStaIfaceCallback callback) {
@@ -1844,6 +2128,36 @@
     }
 
     /**
+     * Querry driver capabilities
+     *
+     * @param ifaceName Name of the interface.
+     * @param capaType ASCII string, capability type ex: key_mgmt
+     * @return String of capabilities fetched from driver
+     */
+    public String getCapabilities(@NonNull String ifaceName, String capaType) {
+        synchronized (mLock) {
+            final String methodStr = "getCapabilities";
+            final Mutable<String> capability = new Mutable<>();
+
+            capability.value = "";
+            ISupplicantVendorStaIface iface =
+               checkSupplicantVendorStaIfaceAndLogFailure(ifaceName, methodStr);
+            if (iface == null) return capability.value;
+            try {
+                 iface.getCapabilities(capaType,
+                        (SupplicantStatus status, String capaVal) -> {
+                         if(checkVendorStatusAndLogFailure(status, methodStr)) {
+                       capability.value = capaVal;
+                    }
+                });
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+            }
+            return capability.value;
+         }
+    }
+
+    /**
      * Set country code.
      *
      * @param ifaceName Name of the interface.
@@ -2142,6 +2456,19 @@
     }
 
     /**
+     * Returns false if SupplicantVendor is null, and logs failure to call methodStr
+     */
+    private boolean checkSupplicantVendorAndLogFailure(final String methodStr) {
+        synchronized (mLock) {
+            if (mISupplicantVendor == null) {
+                Log.e(TAG, "Can't call " + methodStr + ", ISupplicantVendor is null");
+                return false;
+            }
+            return true;
+        }
+    }
+
+    /**
      * Returns false if SupplicantStaIface is null, and logs failure to call methodStr
      */
     private ISupplicantStaIface checkSupplicantStaIfaceAndLogFailure(
@@ -2157,6 +2484,21 @@
     }
 
     /**
+     * Returns false if SupplicantVendorStaIface is null, and logs failure to call methodStr
+     */
+    private ISupplicantVendorStaIface checkSupplicantVendorStaIfaceAndLogFailure(
+            @NonNull String ifaceName, final String methodStr) {
+        synchronized (mLock) {
+            ISupplicantVendorStaIface iface = getVendorStaIface(ifaceName);
+            if (iface == null) {
+                Log.e(TAG, "Can't call " + methodStr + ", ISupplicantVendorStaIface is null");
+                return null;
+            }
+            return iface;
+        }
+    }
+
+    /**
      * Returns false if SupplicantStaNetwork is null, and logs failure to call methodStr
      */
     private SupplicantStaNetworkHal checkSupplicantStaNetworkAndLogFailure(
@@ -2191,6 +2533,44 @@
     }
 
     /**
+     * Returns true if provided supplicant vendor status code is SUCCESS, logs debug message and returns false
+     * otherwise
+     */
+    private boolean checkSupplicantVendorStatusAndLogFailure(SupplicantStatus status,
+            final String methodStr) {
+        synchronized (mLock) {
+            if (status.code != SupplicantStatusCode.SUCCESS) {
+                Log.e(TAG, "ISupplicantVendor." + methodStr + " failed: " + status);
+                return false;
+            } else {
+                if (mVerboseLoggingEnabled) {
+                    Log.d(TAG, "ISupplicantVendor." + methodStr + " succeeded");
+                }
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Returns true if provided Vendor status code is SUCCESS, logs debug message and returns false
+     * otherwise
+     */
+    private boolean checkVendorStatusAndLogFailure(SupplicantStatus status,
+            final String methodStr) {
+        synchronized (mLock) {
+            if (status.code != SupplicantStatusCode.SUCCESS) {
+                Log.e(TAG, "ISupplicantVendorStaIface." + methodStr + " failed: " + status);
+                return false;
+            } else {
+                if (mVerboseLoggingEnabled) {
+                    Log.d(TAG, "ISupplicantVendorStaIface." + methodStr + " succeeded");
+                }
+                return true;
+            }
+        }
+    }
+
+    /**
      * Helper function to log callbacks.
      */
     private void logCallback(final String methodStr) {
diff --git a/service/java/com/android/server/wifi/SupplicantStaNetworkHal.java b/service/java/com/android/server/wifi/SupplicantStaNetworkHal.java
index 0efbf71..7c1a0a1 100644
--- a/service/java/com/android/server/wifi/SupplicantStaNetworkHal.java
+++ b/service/java/com/android/server/wifi/SupplicantStaNetworkHal.java
@@ -17,6 +17,7 @@
 
 import android.content.Context;
 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork;
+import vendor.qti.hardware.wifi.supplicant.V2_0.ISupplicantVendorStaNetwork;
 import android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetworkCallback;
 import android.hardware.wifi.supplicant.V1_0.SupplicantStatus;
 import android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode;
@@ -91,6 +92,7 @@
     private final String mIfaceName;
     private final WifiMonitor mWifiMonitor;
     private ISupplicantStaNetwork mISupplicantStaNetwork;
+    private ISupplicantVendorStaNetwork mISupplicantVendorStaNetwork;
     private ISupplicantStaNetworkCallback mISupplicantStaNetworkCallback;
 
     private boolean mVerboseLoggingEnabled = false;
@@ -327,6 +329,14 @@
                     Log.e(TAG, "failed to set Key Management");
                     return false;
                 }
+                if (!setVendorKeyMgmt(wifiConfigurationToSupplicantVendorKeyMgmtMask(keyMgmtMask))) {
+                    Log.e(TAG, "failed to set Vendor Key Management");
+                } else {
+                    if (keyMgmtMask.get(WifiConfiguration.KeyMgmt.FILS_SHA256) ||
+                        keyMgmtMask.get(WifiConfiguration.KeyMgmt.FILS_SHA384)) {
+                        config.enterpriseConfig.setFieldValue(WifiEnterpriseConfig.EAP_ERP, "1");
+                    }
+                }
             }
             /** Security Protocol */
             if (config.allowedProtocols.cardinality() != 0
@@ -334,6 +344,11 @@
                 Log.e(TAG, "failed to set Security Protocol");
                 return false;
             }
+            /** Vendor Security Protocol */
+            if (config.allowedProtocols.cardinality() != 0
+                    && !setVendorProto(wifiConfigurationToSupplicantVendorProtoMask(config.allowedProtocols))) {
+                Log.e(TAG, "failed to set Vendor Security Protocol");
+            }
             /** Auth Algorithm */
             if (config.allowedAuthAlgorithms.cardinality() != 0
                     && !setAuthAlg(wifiConfigurationToSupplicantAuthAlgMask(
@@ -343,11 +358,17 @@
             }
             /** Group Cipher */
             if (config.allowedGroupCiphers.cardinality() != 0
-                    && !setGroupCipher(wifiConfigurationToSupplicantGroupCipherMask(
-                    config.allowedGroupCiphers))) {
+                    && (!setGroupCipher(wifiConfigurationToSupplicantGroupCipherMask(
+                    config.allowedGroupCiphers)))) {
                 Log.e(TAG, "failed to set Group Cipher");
                 return false;
             }
+            /** Vendor Group Cipher */
+            if (config.allowedGroupCiphers.cardinality() != 0
+                    && (!setVendorGroupCipher(wifiConfigurationToSupplicantVendorGroupCipherMask(
+                    config.allowedGroupCiphers)))) {
+                Log.e(TAG, "failed to set Vendor Group Cipher");
+            }
             /** Pairwise Cipher*/
             if (config.allowedPairwiseCiphers.cardinality() != 0
                     && !setPairwiseCipher(wifiConfigurationToSupplicantPairwiseCipherMask(
@@ -355,6 +376,12 @@
                 Log.e(TAG, "failed to set PairwiseCipher");
                 return false;
             }
+            /** Vendor Pairwise Cipher */
+            if (config.allowedPairwiseCiphers.cardinality() != 0
+                    && (!setVendorPairwiseCipher(wifiConfigurationToSupplicantVendorPairwiseCipherMask(
+                    config.allowedPairwiseCiphers)))) {
+                Log.e(TAG, "failed to set Vendor Group Cipher");
+            }
             /** metadata: FQDN + ConfigKey + CreatorUid */
             final Map<String, String> metadata = new HashMap<String, String>();
             if (config.isPasspoint()) {
@@ -589,6 +616,19 @@
                 Log.e(TAG, ssid + ": failed to set proactive key caching: " + eapParam);
                 return false;
             }
+           /** EAP ERP */
+           eapParam = eapConfig.getFieldValue(WifiEnterpriseConfig.EAP_ERP);
+           if (!TextUtils.isEmpty(eapParam) && eapParam.equals("1")) {
+               if (!setEapErp(true)) {
+                   Log.e(TAG, ssid + ": failed to set eap erp");
+                   return false;
+               } else if (!setAuthAlg(0)) {
+                   /* Reset Auth Alg in order to allow supplicant to use both OPEN and FILS types */
+                   Log.e(TAG, ssid + ": failed to reset AuthAlgorithm");
+                   return false;
+               }
+           }
+
             return true;
         }
     }
@@ -625,6 +665,9 @@
                     mask |= ISupplicantStaNetwork.KeyMgmtMask.FT_EAP;
                     break;
                 case WifiConfiguration.KeyMgmt.WPA2_PSK: // This should never happen
+                case WifiConfiguration.KeyMgmt.FILS_SHA256:
+                case WifiConfiguration.KeyMgmt.FILS_SHA384:
+                    break;
                 default:
                     throw new IllegalArgumentException(
                             "Invalid protoMask bit in keyMgmt: " + bit);
@@ -633,6 +676,31 @@
         return mask;
     }
 
+    /**
+     * Maps WifiConfiguration Key Management BitSet to Supplicant Vendor HIDL bitmask int
+     * TODO(b/32571829): Update mapping when fast transition keys are added
+     * @return bitmask int describing the allowed Key Management schemes, readable by the Supplicant
+     *         HIDL hal
+     */
+    private static int wifiConfigurationToSupplicantVendorKeyMgmtMask(BitSet keyMgmt) {
+        int mask = 0;
+        for (int bit = keyMgmt.nextSetBit(0); bit != -1; bit = keyMgmt.nextSetBit(bit + 1)) {
+            switch (bit) {
+                case WifiConfiguration.KeyMgmt.FILS_SHA256:
+                    Log.e(TAG, "wifiConfigurationToSupplicantVendorKeyMgmtMask: " + WifiConfiguration.KeyMgmt.FILS_SHA256);
+                    mask |= ISupplicantVendorStaNetwork.VendorKeyMgmtMask.FILS_SHA256;
+                    break;
+                case WifiConfiguration.KeyMgmt.FILS_SHA384:
+                    Log.e(TAG, "wifiConfigurationToSupplicantVendorKeyMgmtMask: " + WifiConfiguration.KeyMgmt.FILS_SHA384);
+                    mask |= ISupplicantVendorStaNetwork.VendorKeyMgmtMask.FILS_SHA384;
+                    break;
+                default:
+                    Log.e(TAG, "Invalid VendorKeyMgmtMask bit in keyMgmt: " + bit);
+            }
+        }
+        return mask;
+    }
+
     private static int wifiConfigurationToSupplicantProtoMask(BitSet protoMask) {
         int mask = 0;
         for (int bit = protoMask.nextSetBit(0); bit != -1; bit = protoMask.nextSetBit(bit + 1)) {
@@ -654,6 +722,18 @@
         return mask;
     };
 
+    private static int wifiConfigurationToSupplicantVendorProtoMask(BitSet protoMask) {
+        int mask = 0;
+        for (int bit = protoMask.nextSetBit(0); bit != -1; bit = protoMask.nextSetBit(bit + 1)) {
+            switch (bit) {
+                    //TODO for vendor proto mask
+                default:
+		    Log.e(TAG, "Invalid protoMask bit in wificonfig: " + bit);
+            }
+        }
+        return mask;
+    };
+
     private static int wifiConfigurationToSupplicantAuthAlgMask(BitSet authAlgMask) {
         int mask = 0;
         for (int bit = authAlgMask.nextSetBit(0); bit != -1;
@@ -704,6 +784,21 @@
         return mask;
     };
 
+    private static int wifiConfigurationToSupplicantVendorGroupCipherMask(BitSet groupCipherMask) {
+        int mask = 0;
+        for (int bit = groupCipherMask.nextSetBit(0); bit != -1; bit =
+                groupCipherMask.nextSetBit(bit + 1)) {
+            switch (bit) {
+                case WifiConfiguration.GroupCipher.GCMP:
+                    mask |= ISupplicantVendorStaNetwork.VendorGroupCipherMask.GCMP_256;
+                    break;
+                default:
+                    Log.e(TAG, "Invalid VendorGroupCipherMask bit in wificonfig:: " + bit);
+            }
+        }
+        return mask;
+    };
+
     private static int wifiConfigurationToSupplicantPairwiseCipherMask(BitSet pairwiseCipherMask) {
         int mask = 0;
         for (int bit = pairwiseCipherMask.nextSetBit(0); bit != -1;
@@ -726,6 +821,21 @@
         return mask;
     };
 
+    private static int wifiConfigurationToSupplicantVendorPairwiseCipherMask(BitSet pairwiseCipherMask) {
+        int mask = 0;
+        for (int bit = pairwiseCipherMask.nextSetBit(0); bit != -1; bit =
+                pairwiseCipherMask.nextSetBit(bit + 1)) {
+            switch (bit) {
+                case WifiConfiguration.PairwiseCipher.GCMP:
+                    mask |= ISupplicantVendorStaNetwork.VendorPairwiseCipherMask.GCMP_256;
+                    break;
+                default:
+                    Log.e(TAG, "Invalid VendorPairwiseCipherMask bit in wificonfig:: " + bit);
+            }
+        }
+        return mask;
+    };
+
     private static int supplicantToWifiConfigurationEapMethod(int value) {
         switch (value) {
             case ISupplicantStaNetwork.EapMethod.PEAP:
@@ -941,7 +1051,7 @@
     };
 
     /** See ISupplicantNetwork.hal for documentation */
-    private boolean getId() {
+    public boolean getId() {
         synchronized (mLock) {
             final String methodStr = "getId";
             if (!checkISupplicantStaNetworkAndLogFailure(methodStr)) return false;
@@ -963,6 +1073,22 @@
         }
     }
 
+    /** get network current network */
+    public int getNetworkId() {
+           return mNetworkId;
+    }
+
+    /** set local vendor sta network, if it not null */
+    public void setVendorStaNetwork(ISupplicantVendorStaNetwork vendor_network) {
+           System.out.println("stanetwork getId >>" + mNetworkId);
+           if (vendor_network != null) {
+               Log.e(TAG, "set ISupplicantVendorStaNetwork successfull");
+               mISupplicantVendorStaNetwork = vendor_network;
+           } else {
+               Log.e(TAG, "Failed to set ISupplicantVendorStaNetwork due to null");
+           }
+    }
+
     /** See ISupplicantStaNetwork.hal for documentation */
     private boolean registerCallback(ISupplicantStaNetworkCallback callback) {
         synchronized (mLock) {
@@ -1053,6 +1179,21 @@
         }
     }
     /** See ISupplicantStaNetwork.hal for documentation */
+    private boolean setVendorKeyMgmt(int keyMgmtMask) {
+        synchronized (mLock) {
+            final String methodStr = "setVendorKeyMgmt";
+            Log.e(TAG, "Vendor Key Management " + keyMgmtMask);
+            if (!checkISupplicantVendorStaNetworkAndLogFailure(methodStr)) return false;
+            try {
+                SupplicantStatus status =  mISupplicantVendorStaNetwork.setVendorKeyMgmt(keyMgmtMask);
+                return checkVendorStatusAndLogFailure(status, methodStr);
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+                return false;
+            }
+        }
+    }
+    /** See ISupplicantStaNetwork.hal for documentation */
     private boolean setProto(int protoMask) {
         synchronized (mLock) {
             final String methodStr = "setProto";
@@ -1066,6 +1207,20 @@
             }
         }
     }
+    /** See ISupplicantVendorStaNetwork.hal for documentation */
+    private boolean setVendorProto(int protoMask) {
+        synchronized (mLock) {
+            final String methodStr = "setVendorProto";
+            if (!checkISupplicantVendorStaNetworkAndLogFailure(methodStr)) return false;
+            try {
+                SupplicantStatus status =  mISupplicantVendorStaNetwork.setVendorProto(protoMask);
+                return checkVendorStatusAndLogFailure(status, methodStr);
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+                return false;
+            }
+        }
+    }
     /** See ISupplicantStaNetwork.hal for documentation */
     private boolean setAuthAlg(int authAlgMask) {
         synchronized (mLock) {
@@ -1094,6 +1249,36 @@
             }
         }
     }
+    /** See ISupplicantVendorStaNetwork.hal for documentation */
+    private boolean setVendorGroupCipher(int groupCipherMask) {
+        synchronized (mLock) {
+            final String methodStr = "setVendorGroupCipher";
+            Log.e(TAG, "Vendor group cipher " + groupCipherMask);
+            if (!checkISupplicantVendorStaNetworkAndLogFailure(methodStr)) return false;
+            try {
+                SupplicantStatus status =  mISupplicantVendorStaNetwork.setVendorGroupCipher(groupCipherMask);
+                return checkVendorStatusAndLogFailure(status, methodStr);
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+                return false;
+            }
+        }
+    }
+    /** See ISupplicantVendorStaNetwork.hal for documentation */
+    private boolean setVendorPairwiseCipher(int pairwiseCipherMask) {
+        synchronized (mLock) {
+            final String methodStr = "setVendorPairwiseCipher";
+            Log.e(TAG, "Vendor Pairwise cipher " + pairwiseCipherMask);
+            if (!checkISupplicantVendorStaNetworkAndLogFailure(methodStr)) return false;
+            try {
+                SupplicantStatus status =  mISupplicantVendorStaNetwork.setVendorPairwiseCipher(pairwiseCipherMask);
+                return checkVendorStatusAndLogFailure(status, methodStr);
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+                return false;
+            }
+        }
+    }
     /** See ISupplicantStaNetwork.hal for documentation */
     private boolean setPairwiseCipher(int pairwiseCipherMask) {
         synchronized (mLock) {
@@ -1403,6 +1588,20 @@
             }
         }
     }
+    /** See ISupplicantVendorStaNetwork.hal for documentation */
+    private boolean setEapErp(boolean enable) {
+        synchronized (mLock) {
+            final String methodStr = "setEapErp";
+            if (!checkISupplicantVendorStaNetworkAndLogFailure(methodStr)) return false;
+            try {
+                SupplicantStatus status =  mISupplicantVendorStaNetwork.setEapErp(enable);
+                return checkVendorStatusAndLogFailure(status, methodStr);
+            } catch (RemoteException e) {
+                handleRemoteException(e, methodStr);
+                return false;
+            }
+        }
+    }
     /** See ISupplicantStaNetwork.hal for documentation */
     private boolean setIdStr(String idString) {
         synchronized (mLock) {
@@ -2430,6 +2629,24 @@
     }
 
     /**
+     * Returns true if provided status code is SUCCESS, logs debug message and returns false
+     * otherwise
+     */
+    private boolean checkVendorStatusAndLogFailure(SupplicantStatus status, final String methodStr) {
+        synchronized (mLock) {
+            if (status.code != SupplicantStatusCode.SUCCESS) {
+                Log.e(TAG, "ISupplicantVendorStaNetwork." + methodStr + " failed: " + status);
+                return false;
+            } else {
+                if (mVerboseLoggingEnabled) {
+                    Log.d(TAG, "ISupplicantVendorStaNetwork." + methodStr + " succeeded");
+                }
+                return true;
+            }
+        }
+    }
+
+    /**
      * Helper function to log callbacks.
      */
     private void logCallback(final String methodStr) {
@@ -2453,6 +2670,19 @@
         }
     }
 
+    /**
+     * Returns false if ISupplicantVendorStaNetwork is null, and logs failure of methodStr
+     */
+    private boolean checkISupplicantVendorStaNetworkAndLogFailure(final String methodStr) {
+        synchronized (mLock) {
+            if (mISupplicantVendorStaNetwork == null) {
+                Log.e(TAG, "Can't call " + methodStr + ", ISupplicantVendorStaNetwork is null");
+                return false;
+            }
+            return true;
+        }
+    }
+
     private void handleRemoteException(RemoteException e, String methodStr) {
         synchronized (mLock) {
             mISupplicantStaNetwork = null;
diff --git a/service/java/com/android/server/wifi/WifiConfigurationUtil.java b/service/java/com/android/server/wifi/WifiConfigurationUtil.java
index 8d94862..c35e8fc 100644
--- a/service/java/com/android/server/wifi/WifiConfigurationUtil.java
+++ b/service/java/com/android/server/wifi/WifiConfigurationUtil.java
@@ -134,6 +134,14 @@
                 || isConfigForEapNetwork(config));
     }
 
+    public static boolean isConfigForSha256Network(WifiConfiguration config) {
+        return config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.FILS_SHA256);
+    }
+
+    public static boolean isConfigForSha384Network(WifiConfiguration config) {
+        return config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.FILS_SHA384);
+    }
+
     /**
      * Compare existing and new WifiConfiguration objects after a network update and return if
      * IP parameters have changed or not.
@@ -410,8 +418,8 @@
 
     private static boolean validateKeyMgmt(BitSet keyMgmnt) {
         if (keyMgmnt.cardinality() > 1) {
-            if (keyMgmnt.cardinality() != 2) {
-                Log.e(TAG, "validateKeyMgmt failed: cardinality != 2");
+            if (keyMgmnt.cardinality() > 4) {
+                Log.e(TAG, "validateKeyMgmt failed: cardinality > 4");
                 return false;
             }
             if (!keyMgmnt.get(WifiConfiguration.KeyMgmt.WPA_EAP)) {
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
index bc599c1..e8d304f 100644
--- a/service/java/com/android/server/wifi/WifiNative.java
+++ b/service/java/com/android/server/wifi/WifiNative.java
@@ -1486,6 +1486,17 @@
     }
 
     /**
+     * Get capabilities from driver
+     *
+     * @param ifaceName Name of the interface.
+     * @param capaType which driver capability to get, ex. key_mgmt
+     * @return String of capabilities fetched from driver.
+     */
+     public String getCapabilities(@NonNull String ifaceName, String capaType) {
+         return mSupplicantStaIfaceHal.getCapabilities(ifaceName, capaType);
+    }
+
+    /**
      * Set country code.
      *
      * @param ifaceName Name of the interface.
diff --git a/service/java/com/android/server/wifi/WifiNetworkHistory.java b/service/java/com/android/server/wifi/WifiNetworkHistory.java
index 282f605..23cf5e7 100644
--- a/service/java/com/android/server/wifi/WifiNetworkHistory.java
+++ b/service/java/com/android/server/wifi/WifiNetworkHistory.java
@@ -557,7 +557,7 @@
             return false;
         }
         if (config.allowedKeyManagement.cardinality() > 1) {
-            if (config.allowedKeyManagement.cardinality() != 2) {
+            if (config.allowedKeyManagement.cardinality() > 4) {
                 return false;
             }
             if (!config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)) {
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 53fd05c..dfdeb86 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -58,6 +58,8 @@
 import android.net.NetworkUtils;
 import android.net.Uri;
 import android.net.ip.IpClient;
+import android.net.StaticIpConfiguration;
+import android.net.IpConfiguration;
 import android.net.wifi.ISoftApCallback;
 import android.net.wifi.IWifiManager;
 import android.net.wifi.ScanResult;
@@ -2196,6 +2198,10 @@
         mWifiStateMachine.deauthenticateNetwork(mWifiStateMachineChannel, holdoff, ess);
     }
 
+    public String getCapabilities(String capaType) {
+        return mWifiStateMachine.getCapabilities(capaType);
+    }
+
     /**
      * Set the country code
      * @param countryCode ISO 3166 country code.
diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java
index 3012390..e4a01cc 100644
--- a/service/java/com/android/server/wifi/WifiStateMachine.java
+++ b/service/java/com/android/server/wifi/WifiStateMachine.java
@@ -2865,6 +2865,11 @@
                 mInterfaceName, WifiNative.BLUETOOTH_COEXISTENCE_MODE_SENSE);
     }
 
+    public String getCapabilities(String capaType) {
+
+        return mWifiNative.getCapabilities(mInterfaceName, capaType);
+    }
+
     private static final long DIAGS_CONNECT_TIMEOUT_MILLIS = 60 * 1000;
     private long mDiagsConnectionStartMillis = -1;
     /**
diff --git a/service/java/com/android/server/wifi/util/InformationElementUtil.java b/service/java/com/android/server/wifi/util/InformationElementUtil.java
index 2128a41..1bfc634 100644
--- a/service/java/com/android/server/wifi/util/InformationElementUtil.java
+++ b/service/java/com/android/server/wifi/util/InformationElementUtil.java
@@ -411,6 +411,8 @@
         private static final int WPA2_AKM_FT_PSK = 0x04ac0f00;
         private static final int WPA2_AKM_EAP_SHA256 = 0x05ac0f00;
         private static final int WPA2_AKM_PSK_SHA256 = 0x06ac0f00;
+        private static final int WPA2_AKM_FILS_SHA256 = 0x0eac0f00;
+        private static final int WPA2_AKM_FILS_SHA384 = 0x0fac0f00;
 
         private static final int WPA_CIPHER_NONE = 0x00f25000;
         private static final int WPA_CIPHER_TKIP = 0x02f25000;
@@ -496,6 +498,12 @@
                         case WPA2_AKM_PSK_SHA256:
                             rsnKeyManagement.add(ScanResult.KEY_MGMT_PSK_SHA256);
                             break;
+                        case WPA2_AKM_FILS_SHA256:
+                            rsnKeyManagement.add(ScanResult.KEY_MGMT_FILS_SHA256);
+                            break;
+                        case WPA2_AKM_FILS_SHA384:
+                            rsnKeyManagement.add(ScanResult.KEY_MGMT_FILS_SHA384);
+                            break;
                         default:
                             // do nothing
                             break;
@@ -704,6 +712,10 @@
                     return "EAP-SHA256";
                 case ScanResult.KEY_MGMT_PSK_SHA256:
                     return "PSK-SHA256";
+                case ScanResult.KEY_MGMT_FILS_SHA256:
+                    return "FILS-SHA256";
+                case ScanResult.KEY_MGMT_FILS_SHA384:
+                    return "FILS-SHA384";
                 default:
                     return "?";
             }
diff --git a/service/java/com/android/server/wifi/util/ScanResultUtil.java b/service/java/com/android/server/wifi/util/ScanResultUtil.java
index cfe09d5..13950ce 100644
--- a/service/java/com/android/server/wifi/util/ScanResultUtil.java
+++ b/service/java/com/android/server/wifi/util/ScanResultUtil.java
@@ -71,6 +71,22 @@
     }
 
     /**
+     * Helper method to check if the provided |scanResult| corresponds to FILS SHA256 network.
+     * This checks if the provided capabilities string contains FILS-SHA256 or not.
+     */
+    public static boolean isScanResultForFilsSha256Network(ScanResult scanResult) {
+        return scanResult.capabilities.contains("FILS-SHA256");
+    }
+
+    /**
+     * Helper method to check if the provided |scanResult| corresponds to FILS SHA384 network.
+     * This checks if the provided capabilities string contains FILS-SHA384 or not.
+     */
+    public static boolean isScanResultForFilsSha384Network(ScanResult scanResult) {
+        return scanResult.capabilities.contains("FILS-SHA384");
+    }
+
+    /**
      * Helper method to check if the provided |scanResult| corresponds to an open network or not.
      * This checks if the provided capabilities string does not contain either of WEP, PSK or EAP
      * encryption types or not.
@@ -111,6 +127,10 @@
         } else if (isScanResultForEapNetwork(scanResult)) {
             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
+            if (isScanResultForFilsSha256Network(scanResult))
+                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.FILS_SHA256);
+            if (isScanResultForFilsSha384Network(scanResult))
+                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.FILS_SHA384);
         } else if (isScanResultForWepNetwork(scanResult)) {
             config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
             config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
