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