diff options
author | Ahmed ElArabawy <arabawy@google.com> | 2019-12-05 17:05:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-12-05 17:05:57 +0000 |
commit | 10a5c7df94073a6d47040f3b5604464d52da0fc0 (patch) | |
tree | 248eaaece090c4497ca143559ea7161099ca5b2a | |
parent | d44eaf0f88044996f2b935418c71c2144fa4c7f6 (diff) | |
parent | 116127c874cbbfbb0d3c9a32e3aae2cd58d4514c (diff) |
Merge "Upgrade WifiChipEventCallback to handle 6GHz band"
-rw-r--r-- | service/java/com/android/server/wifi/WifiVendorHal.java | 142 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java | 54 |
2 files changed, 181 insertions, 15 deletions
diff --git a/service/java/com/android/server/wifi/WifiVendorHal.java b/service/java/com/android/server/wifi/WifiVendorHal.java index f8ec5f143..dce3a1fd2 100644 --- a/service/java/com/android/server/wifi/WifiVendorHal.java +++ b/service/java/com/android/server/wifi/WifiVendorHal.java @@ -46,6 +46,7 @@ import android.hardware.wifi.V1_0.WifiDebugTxPacketFateReport; import android.hardware.wifi.V1_0.WifiInformationElement; import android.hardware.wifi.V1_0.WifiStatus; import android.hardware.wifi.V1_0.WifiStatusCode; +import android.hardware.wifi.V1_2.IWifiChipEventCallback.IfaceInfo; import android.net.MacAddress; import android.net.apf.ApfCapabilities; import android.net.wifi.ScanResult; @@ -241,6 +242,7 @@ public class WifiVendorHal { private final IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback; private final ChipEventCallback mIWifiChipEventCallback; private final ChipEventCallbackV12 mIWifiChipEventCallbackV12; + private final ChipEventCallbackV14 mIWifiChipEventCallbackV14; // Plumbing for event handling. // @@ -256,6 +258,7 @@ public class WifiVendorHal { mIWifiStaIfaceEventCallback = new StaIfaceEventCallback(); mIWifiChipEventCallback = new ChipEventCallback(); mIWifiChipEventCallbackV12 = new ChipEventCallbackV12(); + mIWifiChipEventCallbackV14 = new ChipEventCallbackV14(); } public static final Object sLock = new Object(); @@ -559,8 +562,12 @@ public class WifiVendorHal { if (mIWifiChip == null) return boolResult(false); try { WifiStatus status; + android.hardware.wifi.V1_4.IWifiChip iWifiChipV14 = getWifiChipForV1_4Mockable(); android.hardware.wifi.V1_2.IWifiChip iWifiChipV12 = getWifiChipForV1_2Mockable(); - if (iWifiChipV12 != null) { + + if (iWifiChipV14 != null) { + status = iWifiChipV14.registerEventCallback_1_4(mIWifiChipEventCallbackV14); + } else if (iWifiChipV12 != null) { status = iWifiChipV12.registerEventCallback_1_2(mIWifiChipEventCallbackV12); } else { status = mIWifiChip.registerEventCallback(mIWifiChipEventCallback); @@ -2822,6 +2829,18 @@ public class WifiVendorHal { } } + private boolean areSameIfaceNames(List<IfaceInfo> ifaceList1, List<IfaceInfo> ifaceList2) { + List<String> ifaceNamesList1 = ifaceList1 + .stream() + .map(i -> i.name) + .collect(Collectors.toList()); + List<String> ifaceNamesList2 = ifaceList2 + .stream() + .map(i -> i.name) + .collect(Collectors.toList()); + return ifaceNamesList1.containsAll(ifaceNamesList2); + } + /** * Callback for events on the 1.2 chip. */ @@ -2857,25 +2876,118 @@ public class WifiVendorHal { mIWifiChipEventCallback.onDebugErrorAlert(errorCode, debugData); } - private boolean areSameIfaceNames(List<IfaceInfo> ifaceList1, List<IfaceInfo> ifaceList2) { - List<String> ifaceNamesList1 = ifaceList1 - .stream() - .map(i -> i.name) - .collect(Collectors.toList()); - List<String> ifaceNamesList2 = ifaceList2 - .stream() - .map(i -> i.name) - .collect(Collectors.toList()); - return ifaceNamesList1.containsAll(ifaceNamesList2); + @Override + public void onRadioModeChange(ArrayList<RadioModeInfo> radioModeInfoList) { + mVerboseLog.d("onRadioModeChange " + radioModeInfoList); + WifiNative.VendorHalRadioModeChangeEventHandler handler; + synchronized (sLock) { + if (mRadioModeChangeEventHandler == null || radioModeInfoList == null) return; + handler = mRadioModeChangeEventHandler; + } + // Should only contain 1 or 2 radio infos. + if (radioModeInfoList.size() == 0 || radioModeInfoList.size() > 2) { + mLog.e("Unexpected number of radio info in list " + radioModeInfoList.size()); + return; + } + RadioModeInfo radioModeInfo0 = radioModeInfoList.get(0); + RadioModeInfo radioModeInfo1 = + radioModeInfoList.size() == 2 ? radioModeInfoList.get(1) : null; + // Number of ifaces on each radio should be equal. + if (radioModeInfo1 != null + && radioModeInfo0.ifaceInfos.size() != radioModeInfo1.ifaceInfos.size()) { + mLog.e("Unexpected number of iface info in list " + + radioModeInfo0.ifaceInfos.size() + ", " + + radioModeInfo1.ifaceInfos.size()); + return; + } + int numIfacesOnEachRadio = radioModeInfo0.ifaceInfos.size(); + // Only 1 or 2 ifaces should be present on each radio. + if (numIfacesOnEachRadio == 0 || numIfacesOnEachRadio > 2) { + mLog.e("Unexpected number of iface info in list " + numIfacesOnEachRadio); + return; + } + Runnable runnable = null; + // 2 ifaces simultaneous on 2 radios. + if (radioModeInfoList.size() == 2 && numIfacesOnEachRadio == 1) { + // Iface on radio0 should be different from the iface on radio1 for DBS & SBS. + if (areSameIfaceNames(radioModeInfo0.ifaceInfos, radioModeInfo1.ifaceInfos)) { + mLog.e("Unexpected for both radio infos to have same iface"); + return; + } + if (radioModeInfo0.bandInfo != radioModeInfo1.bandInfo) { + runnable = () -> { + handler.onDbs(); + }; + } else { + runnable = () -> { + handler.onSbs(radioModeInfo0.bandInfo); + }; + } + // 2 ifaces time sharing on 1 radio. + } else if (radioModeInfoList.size() == 1 && numIfacesOnEachRadio == 2) { + IfaceInfo ifaceInfo0 = radioModeInfo0.ifaceInfos.get(0); + IfaceInfo ifaceInfo1 = radioModeInfo0.ifaceInfos.get(1); + if (ifaceInfo0.channel != ifaceInfo1.channel) { + runnable = () -> { + handler.onMcc(radioModeInfo0.bandInfo); + }; + } else { + runnable = () -> { + handler.onScc(radioModeInfo0.bandInfo); + }; + } + } else { + // Not concurrency scenario, uninteresting... + } + if (runnable != null) mHalEventHandler.post(runnable); } + } - private boolean areSameIfaces(List<IfaceInfo> ifaceList1, List<IfaceInfo> ifaceList2) { - return ifaceList1.containsAll(ifaceList2); + /** + * Callback for events on the 1.4 chip. + */ + private class ChipEventCallbackV14 extends + android.hardware.wifi.V1_4.IWifiChipEventCallback.Stub { + @Override + public void onChipReconfigured(int modeId) { + mIWifiChipEventCallback.onChipReconfigured(modeId); } @Override - public void onRadioModeChange(ArrayList<RadioModeInfo> radioModeInfoList) { - mVerboseLog.d("onRadioModeChange " + radioModeInfoList); + public void onChipReconfigureFailure(WifiStatus status) { + mIWifiChipEventCallback.onChipReconfigureFailure(status); + } + + public void onIfaceAdded(int type, String name) { + mIWifiChipEventCallback.onIfaceAdded(type, name); + } + + @Override + public void onIfaceRemoved(int type, String name) { + mIWifiChipEventCallback.onIfaceRemoved(type, name); + } + + @Override + public void onDebugRingBufferDataAvailable( + WifiDebugRingBufferStatus status, java.util.ArrayList<Byte> data) { + mIWifiChipEventCallback.onDebugRingBufferDataAvailable(status, data); + } + + @Override + public void onDebugErrorAlert(int errorCode, java.util.ArrayList<Byte> debugData) { + mIWifiChipEventCallback.onDebugErrorAlert(errorCode, debugData); + } + + @Override + public void onRadioModeChange( + ArrayList<android.hardware.wifi.V1_2.IWifiChipEventCallback.RadioModeInfo> + radioModeInfoList) { + mIWifiChipEventCallbackV12.onRadioModeChange(radioModeInfoList); + } + + @Override + public void onRadioModeChange_1_4(ArrayList<RadioModeInfo> radioModeInfoList) { + mVerboseLog.d("onRadioModeChange_1_4 " + radioModeInfoList); WifiNative.VendorHalRadioModeChangeEventHandler handler; synchronized (sLock) { if (mRadioModeChangeEventHandler == null || radioModeInfoList == null) return; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java index 229c3d5e2..3d290e450 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiVendorHalTest.java @@ -162,6 +162,7 @@ public class WifiVendorHalTest extends WifiBaseTest { private IWifiStaIfaceEventCallback mIWifiStaIfaceEventCallback; private IWifiChipEventCallback mIWifiChipEventCallback; private android.hardware.wifi.V1_2.IWifiChipEventCallback mIWifiChipEventCallbackV12; + private android.hardware.wifi.V1_4.IWifiChipEventCallback mIWifiChipEventCallbackV14; @Mock private WifiNative.VendorHalDeathEventHandler mVendorHalDeathHandler; @Mock @@ -436,6 +437,15 @@ public class WifiVendorHalTest extends WifiBaseTest { return (mWifiStatusSuccess); })); + when(mIWifiChipV14.registerEventCallback_1_4( + any(android.hardware.wifi.V1_4.IWifiChipEventCallback.class))) + .thenAnswer(answerWifiStatus((invocation) -> { + Object[] args = invocation.getArguments(); + mIWifiChipEventCallbackV14 = + (android.hardware.wifi.V1_4.IWifiChipEventCallback) args[0]; + return (mWifiStatusSuccess); + })); + doAnswer(new AnswerWithArguments() { public void answer(IWifiIface.getNameCallback cb) throws RemoteException { @@ -3092,6 +3102,42 @@ public class WifiVendorHalTest extends WifiBaseTest { } /** + * Verifies radio mode change callback to indicate DBS mode using V1.4 callback. + */ + @Test + public void testRadioModeChangeCallbackToDbsModeV14() throws Exception { + startHalInStaModeAndRegisterRadioModeChangeCallback14(); + + android.hardware.wifi.V1_4.IWifiChipEventCallback.RadioModeInfo radioModeInfo0 = + new android.hardware.wifi.V1_4.IWifiChipEventCallback.RadioModeInfo(); + radioModeInfo0.bandInfo = WifiScanner.WIFI_BAND_6_GHZ; + android.hardware.wifi.V1_4.IWifiChipEventCallback.RadioModeInfo radioModeInfo1 = + new android.hardware.wifi.V1_4.IWifiChipEventCallback.RadioModeInfo(); + radioModeInfo1.bandInfo = WifiScanner.WIFI_BAND_24_GHZ; + + IfaceInfo ifaceInfo0 = new IfaceInfo(); + ifaceInfo0.name = TEST_IFACE_NAME; + ifaceInfo0.channel = 34; + IfaceInfo ifaceInfo1 = new IfaceInfo(); + ifaceInfo1.name = TEST_IFACE_NAME_1; + ifaceInfo1.channel = 1; + + radioModeInfo0.ifaceInfos.add(ifaceInfo0); + radioModeInfo1.ifaceInfos.add(ifaceInfo1); + + ArrayList<android.hardware.wifi.V1_4.IWifiChipEventCallback.RadioModeInfo> radioModeInfos = + new ArrayList<>(); + radioModeInfos.add(radioModeInfo0); + radioModeInfos.add(radioModeInfo1); + + mIWifiChipEventCallbackV14.onRadioModeChange_1_4(radioModeInfos); + mLooper.dispatchAll(); + verify(mVendorHalRadioModeChangeHandler).onDbs(); + + verifyNoMoreInteractions(mVendorHalRadioModeChangeHandler); + } + + /** * Verifies radio mode change callback to indicate SBS mode. */ @Test @@ -3223,6 +3269,14 @@ public class WifiVendorHalTest extends WifiBaseTest { assertNotNull(mIWifiChipEventCallbackV12); } + private void startHalInStaModeAndRegisterRadioModeChangeCallback14() { + // Expose the 1.4 IWifiChip. + mWifiVendorHal = new WifiVendorHalSpyV1_4(mHalDeviceManager, mHandler); + mWifiVendorHal.registerRadioModeChangeHandler(mVendorHalRadioModeChangeHandler); + assertTrue(mWifiVendorHal.startVendorHalSta()); + assertNotNull(mIWifiChipEventCallbackV14); + } + private void testAlertCallbackUsingProvidedCallback(IWifiChipEventCallback chipCallback) throws Exception { when(mIWifiChip.enableDebugErrorAlerts(anyBoolean())).thenReturn(mWifiStatusSuccess); |