1 /* 2 * Copyright (C) 2019 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 package com.android.server.wifi; 17 18 19 import android.annotation.NonNull; 20 import android.hardware.wifi.supplicant.V1_4.DppFailureCode; 21 import android.net.wifi.WifiSsid; 22 import android.util.Log; 23 24 import com.android.server.wifi.hotspot2.WnmData; 25 import com.android.server.wifi.util.NativeUtil; 26 27 import java.util.ArrayList; 28 29 abstract class SupplicantStaIfaceCallbackHidlV1_4Impl extends 30 android.hardware.wifi.supplicant.V1_4.ISupplicantStaIfaceCallback.Stub { 31 private static final String TAG = SupplicantStaIfaceCallbackHidlV1_4Impl.class.getSimpleName(); 32 private final SupplicantStaIfaceHalHidlImpl mStaIfaceHal; 33 private final String mIfaceName; 34 private final WifiMonitor mWifiMonitor; 35 private final SsidTranslator mSsidTranslator; 36 private final Object mLock; 37 private final SupplicantStaIfaceHalHidlImpl.SupplicantStaIfaceHalCallbackV1_3 mCallbackV13; 38 private final SupplicantStaIfaceHalHidlImpl.SupplicantStaIfaceHalCallback mCallbackV10; 39 SupplicantStaIfaceCallbackHidlV1_4Impl(@onNull SupplicantStaIfaceHalHidlImpl staIfaceHal, @NonNull String ifaceName, @NonNull Object lock, @NonNull WifiMonitor wifiMonitor, @NonNull SsidTranslator ssidTranslator)40 SupplicantStaIfaceCallbackHidlV1_4Impl(@NonNull SupplicantStaIfaceHalHidlImpl staIfaceHal, 41 @NonNull String ifaceName, @NonNull Object lock, 42 @NonNull WifiMonitor wifiMonitor, 43 @NonNull SsidTranslator ssidTranslator) { 44 mStaIfaceHal = staIfaceHal; 45 mIfaceName = ifaceName; 46 mLock = lock; 47 mWifiMonitor = wifiMonitor; 48 mSsidTranslator = ssidTranslator; 49 // Create an older callback for function delegation, 50 // and it would cascadingly create older one. 51 mCallbackV13 = mStaIfaceHal.new SupplicantStaIfaceHalCallbackV1_3(mIfaceName); 52 mCallbackV10 = mCallbackV13.getCallbackV10(); 53 } 54 55 @Override onNetworkAdded(int id)56 public void onNetworkAdded(int id) { 57 mCallbackV13.onNetworkAdded(id); 58 } 59 60 @Override onNetworkRemoved(int id)61 public void onNetworkRemoved(int id) { 62 mCallbackV13.onNetworkRemoved(id); 63 } 64 65 @Override onStateChanged(int newState, byte[ ] bssid, int id, ArrayList<Byte> ssid)66 public void onStateChanged(int newState, byte[/* 6 */] bssid, int id, 67 ArrayList<Byte> ssid) { 68 mCallbackV13.onStateChanged(newState, bssid, id, ssid); 69 } 70 71 @Override onAnqpQueryDone_1_4(byte[ ] bssid, AnqpData data, Hs20AnqpData hs20Data)72 public void onAnqpQueryDone_1_4(byte[/* 6 */] bssid, 73 AnqpData data, 74 Hs20AnqpData hs20Data) { 75 synchronized (mLock) { 76 mStaIfaceHal.logCallback("onAnqpQueryDone_1_4"); 77 mCallbackV10.onAnqpQueryDone(bssid, data.V1_0 /* v1.0 elemnt */, hs20Data, 78 data /* v1.4 element */); 79 } 80 } 81 82 @Override onAnqpQueryDone(byte[ ] bssid, android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback.AnqpData data, Hs20AnqpData hs20Data)83 public void onAnqpQueryDone(byte[/* 6 */] bssid, 84 android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback.AnqpData data, 85 Hs20AnqpData hs20Data) { 86 mCallbackV13.onAnqpQueryDone(bssid, data, hs20Data); 87 } 88 89 @Override onHs20IconQueryDone(byte[ ] bssid, String fileName, ArrayList<Byte> data)90 public void onHs20IconQueryDone(byte[/* 6 */] bssid, String fileName, 91 ArrayList<Byte> data) { 92 mCallbackV13.onHs20IconQueryDone(bssid, fileName, data); 93 } 94 95 @Override onHs20SubscriptionRemediation(byte[ ] bssid, byte osuMethod, String url)96 public void onHs20SubscriptionRemediation(byte[/* 6 */] bssid, 97 byte osuMethod, String url) { 98 mCallbackV13.onHs20SubscriptionRemediation(bssid, osuMethod, url); 99 } 100 101 @Override onHs20DeauthImminentNotice(byte[ ] bssid, int reasonCode, int reAuthDelayInSec, String url)102 public void onHs20DeauthImminentNotice(byte[/* 6 */] bssid, int reasonCode, 103 int reAuthDelayInSec, String url) { 104 mCallbackV13.onHs20DeauthImminentNotice(bssid, reasonCode, reAuthDelayInSec, url); 105 } 106 107 @Override onDisconnected(byte[ ] bssid, boolean locallyGenerated, int reasonCode)108 public void onDisconnected(byte[/* 6 */] bssid, boolean locallyGenerated, 109 int reasonCode) { 110 mCallbackV13.onDisconnected(bssid, locallyGenerated, reasonCode); 111 } 112 113 @Override onAssociationRejected_1_4(AssociationRejectionData assocRejectData)114 public void onAssociationRejected_1_4(AssociationRejectionData assocRejectData) { 115 synchronized (mLock) { 116 mStaIfaceHal.logCallback("onAssociationRejected_1_4"); 117 mCallbackV10.onAssociationRejected(assocRejectData); 118 } 119 } 120 121 @Override onAssociationRejected(byte[ ] bssid, int statusCode, boolean timedOut)122 public void onAssociationRejected(byte[/* 6 */] bssid, int statusCode, 123 boolean timedOut) { 124 mCallbackV13.onAssociationRejected(bssid, statusCode, timedOut); 125 } 126 127 @Override onAuthenticationTimeout(byte[ ] bssid)128 public void onAuthenticationTimeout(byte[/* 6 */] bssid) { 129 mCallbackV13.onAuthenticationTimeout(bssid); 130 } 131 132 @Override onBssidChanged(byte reason, byte[ ] bssid)133 public void onBssidChanged(byte reason, byte[/* 6 */] bssid) { 134 mCallbackV13.onBssidChanged(reason, bssid); 135 } 136 137 @Override onEapFailure()138 public void onEapFailure() { 139 mCallbackV13.onEapFailure(); 140 } 141 142 @Override onEapFailure_1_1(int code)143 public void onEapFailure_1_1(int code) { 144 mCallbackV13.onEapFailure_1_1(code); 145 } 146 147 @Override onEapFailure_1_3(int code)148 public void onEapFailure_1_3(int code) { 149 mCallbackV13.onEapFailure_1_3(code); 150 } 151 152 @Override onWpsEventSuccess()153 public void onWpsEventSuccess() { 154 mCallbackV13.onWpsEventSuccess(); 155 } 156 157 @Override onWpsEventFail(byte[ ] bssid, short configError, short errorInd)158 public void onWpsEventFail(byte[/* 6 */] bssid, short configError, short errorInd) { 159 mCallbackV13.onWpsEventFail(bssid, configError, errorInd); 160 } 161 162 @Override onWpsEventPbcOverlap()163 public void onWpsEventPbcOverlap() { 164 mCallbackV13.onWpsEventPbcOverlap(); 165 } 166 167 @Override onExtRadioWorkStart(int id)168 public void onExtRadioWorkStart(int id) { 169 mCallbackV13.onExtRadioWorkStart(id); 170 } 171 172 @Override onExtRadioWorkTimeout(int id)173 public void onExtRadioWorkTimeout(int id) { 174 mCallbackV13.onExtRadioWorkTimeout(id); 175 } 176 177 @Override onDppSuccessConfigReceived(ArrayList<Byte> ssid, String password, byte[] psk, int securityAkm)178 public void onDppSuccessConfigReceived(ArrayList<Byte> ssid, String password, 179 byte[] psk, int securityAkm) { 180 mCallbackV13.onDppSuccessConfigReceived( 181 ssid, password, psk, securityAkm); 182 } 183 184 @Override onDppSuccessConfigSent()185 public void onDppSuccessConfigSent() { 186 mCallbackV13.onDppSuccessConfigSent(); 187 } 188 189 @Override onDppProgress(int code)190 public void onDppProgress(int code) { 191 mCallbackV13.onDppProgress(code); 192 } 193 halToFrameworkDppFailureCode(int failureCode)194 private int halToFrameworkDppFailureCode(int failureCode) { 195 switch(failureCode) { 196 case DppFailureCode.INVALID_URI: 197 return SupplicantStaIfaceHal.DppFailureCode.INVALID_URI; 198 case DppFailureCode.AUTHENTICATION: 199 return SupplicantStaIfaceHal.DppFailureCode.AUTHENTICATION; 200 case DppFailureCode.NOT_COMPATIBLE: 201 return SupplicantStaIfaceHal.DppFailureCode.NOT_COMPATIBLE; 202 case DppFailureCode.CONFIGURATION: 203 return SupplicantStaIfaceHal.DppFailureCode.CONFIGURATION; 204 case DppFailureCode.BUSY: 205 return SupplicantStaIfaceHal.DppFailureCode.BUSY; 206 case DppFailureCode.TIMEOUT: 207 return SupplicantStaIfaceHal.DppFailureCode.TIMEOUT; 208 case DppFailureCode.FAILURE: 209 return SupplicantStaIfaceHal.DppFailureCode.FAILURE; 210 case DppFailureCode.NOT_SUPPORTED: 211 return SupplicantStaIfaceHal.DppFailureCode.NOT_SUPPORTED; 212 case DppFailureCode.CONFIGURATION_REJECTED: 213 return SupplicantStaIfaceHal.DppFailureCode.CONFIGURATION_REJECTED; 214 case DppFailureCode.CANNOT_FIND_NETWORK: 215 return SupplicantStaIfaceHal.DppFailureCode.CANNOT_FIND_NETWORK; 216 case DppFailureCode.ENROLLEE_AUTHENTICATION: 217 return SupplicantStaIfaceHal.DppFailureCode.ENROLLEE_AUTHENTICATION; 218 case DppFailureCode.URI_GENERATION: 219 return SupplicantStaIfaceHal.DppFailureCode.URI_GENERATION; 220 default: 221 Log.e(TAG, "Invalid DppFailureCode received"); 222 return -1; 223 } 224 } 225 226 @Override onDppFailure(int code)227 public void onDppFailure(int code) { 228 mCallbackV13.onDppFailureInternal(halToFrameworkDppFailureCode(code)); 229 } 230 231 @Override onPmkCacheAdded(long expirationTimeInSec, ArrayList<Byte> serializedEntry)232 public void onPmkCacheAdded(long expirationTimeInSec, ArrayList<Byte> serializedEntry) { 233 mCallbackV13.onPmkCacheAdded(expirationTimeInSec, serializedEntry); 234 } 235 236 @Override onDppProgress_1_3(int code)237 public void onDppProgress_1_3(int code) { 238 mCallbackV13.onDppProgress_1_3(code); 239 } 240 241 @Override onDppFailure_1_3(int code, String ssid, String channelList, ArrayList<Short> bandList)242 public void onDppFailure_1_3(int code, String ssid, String channelList, 243 ArrayList<Short> bandList) { 244 mCallbackV13.onDppFailureInternal_1_3( 245 halToFrameworkDppFailureCode(code), ssid, channelList, bandList); 246 } 247 248 @Override onDppSuccess(int code)249 public void onDppSuccess(int code) { 250 mCallbackV13.onDppSuccess(code); 251 } 252 253 @Override onBssTmHandlingDone(BssTmData tmData)254 public void onBssTmHandlingDone(BssTmData tmData) { 255 mCallbackV13.onBssTmHandlingDone(tmData); 256 } 257 258 @Override onStateChanged_1_3(int newState, byte[ ] bssid, int id, ArrayList<Byte> ssid, boolean filsHlpSent)259 public void onStateChanged_1_3(int newState, byte[/* 6 */] bssid, int id, 260 ArrayList<Byte> ssid, boolean filsHlpSent) { 261 mCallbackV13.onStateChanged_1_3(newState, bssid, id, ssid, filsHlpSent); 262 } 263 264 @Override onHs20TermsAndConditionsAcceptanceRequestedNotification(byte[ ] bssid, String url)265 public void onHs20TermsAndConditionsAcceptanceRequestedNotification(byte[/* 6 */] bssid, 266 String url) { 267 synchronized (mLock) { 268 mStaIfaceHal.logCallback("onHs20TermsAndConditionsAcceptanceRequestedNotification"); 269 mWifiMonitor.broadcastWnmEvent(mIfaceName, 270 WnmData.createTermsAndConditionsAccetanceRequiredEvent( 271 NativeUtil.macAddressToLong(bssid), url)); 272 } 273 } 274 275 @Override onNetworkNotFound(ArrayList<Byte> ssid)276 public void onNetworkNotFound(ArrayList<Byte> ssid) { 277 mStaIfaceHal.logCallback("onNetworkNotFoundNotification"); 278 if (mStaIfaceHal.connectToFallbackSsid(mIfaceName)) { 279 return; 280 } 281 mWifiMonitor.broadcastNetworkNotFoundEvent(mIfaceName, 282 mSsidTranslator.getTranslatedSsidForStaIface(WifiSsid.fromBytes( 283 NativeUtil.byteArrayFromArrayList(ssid)), mIfaceName).toString()); 284 } 285 } 286