1dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen/* 2dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Copyright (C) 2017 The Android Open Source Project 3dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 4dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License"); 5dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * you may not use this file except in compliance with the License. 6dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * You may obtain a copy of the License at 7dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 8dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * http://www.apache.org/licenses/LICENSE-2.0 9dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 10dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Unless required by applicable law or agreed to in writing, software 11dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS, 12dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * See the License for the specific language governing permissions and 14dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * limitations under the License. 15dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 16dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 17dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenpackage android.net.wifi.rtt; 18dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 1967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport static android.net.wifi.ScanResult.InformationElement.EID_HT_CAPABILITIES; 2067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport static android.net.wifi.ScanResult.InformationElement.EID_VHT_CAPABILITIES; 2167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen 22dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.annotation.IntDef; 23dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.annotation.NonNull; 242892ba6611f72384314f8421befd26ae7e786a08Etan Cohenimport android.annotation.SystemApi; 25dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.MacAddress; 26dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.wifi.ScanResult; 27dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.net.wifi.aware.PeerHandle; 28dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.os.Parcel; 29dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport android.os.Parcelable; 3067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohenimport android.util.Log; 31dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 32dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.lang.annotation.Retention; 33dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.lang.annotation.RetentionPolicy; 34dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohenimport java.util.Objects; 35dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 36dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen/** 37dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Defines the configuration of an IEEE 802.11mc Responder. The Responder may be an Access Point 38dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * (AP), a Wi-Fi Aware device, or a manually configured Responder. 39dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * <p> 40dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * A Responder configuration may be constructed from a {@link ScanResult} or manually (with the 41dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * data obtained out-of-band from a peer). 42dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 432892ba6611f72384314f8421befd26ae7e786a08Etan Cohen * @hide 44dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 452892ba6611f72384314f8421befd26ae7e786a08Etan Cohen@SystemApi 466713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohenpublic final class ResponderConfig implements Parcelable { 4767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen private static final String TAG = "ResponderConfig"; 482109f705f35999374d5e3519d0782f38c87adb99Etan Cohen private static final int AWARE_BAND_2_DISCOVERY_CHANNEL = 2437; 492109f705f35999374d5e3519d0782f38c87adb99Etan Cohen 50dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** @hide */ 51dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @IntDef({RESPONDER_AP, RESPONDER_STA, RESPONDER_P2P_GO, RESPONDER_P2P_CLIENT, RESPONDER_AWARE}) 52dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Retention(RetentionPolicy.SOURCE) 53dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public @interface ResponderType { 54dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 55dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 56dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 57dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder is an AP. 58dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 59dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int RESPONDER_AP = 0; 60dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 61dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder is a STA. 62dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 63dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int RESPONDER_STA = 1; 64dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 65dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder is a Wi-Fi Direct Group Owner (GO). 66dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 67dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int RESPONDER_P2P_GO = 2; 68dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 69dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder is a Wi-Fi Direct Group Client. 70dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 71dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int RESPONDER_P2P_CLIENT = 3; 72dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 73dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder is a Wi-Fi Aware device. 74dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 75dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int RESPONDER_AWARE = 4; 76dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 77dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 78dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** @hide */ 79dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @IntDef({ 80dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen CHANNEL_WIDTH_20MHZ, CHANNEL_WIDTH_40MHZ, CHANNEL_WIDTH_80MHZ, CHANNEL_WIDTH_160MHZ, 81dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen CHANNEL_WIDTH_80MHZ_PLUS_MHZ}) 82dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Retention(RetentionPolicy.SOURCE) 83dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public @interface ChannelWidth { 84dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 85dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 86dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 87dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Channel bandwidth is 20 MHZ 88dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 89dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int CHANNEL_WIDTH_20MHZ = 0; 90dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 91dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Channel bandwidth is 40 MHZ 92dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 93dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int CHANNEL_WIDTH_40MHZ = 1; 94dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 95dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Channel bandwidth is 80 MHZ 96dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 97dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int CHANNEL_WIDTH_80MHZ = 2; 98dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 99dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Channel bandwidth is 160 MHZ 100dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 101dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int CHANNEL_WIDTH_160MHZ = 3; 102dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 103dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ 104dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 105dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; 106dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 107dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** @hide */ 108dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @IntDef({PREAMBLE_LEGACY, PREAMBLE_HT, PREAMBLE_VHT}) 109dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Retention(RetentionPolicy.SOURCE) 110dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public @interface PreambleType { 111dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 112dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 113dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 114dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Preamble type: Legacy. 115dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 116dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int PREAMBLE_LEGACY = 0; 117dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 118dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 119dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Preamble type: HT. 120dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 121dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int PREAMBLE_HT = 1; 122dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 123dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 124dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Preamble type: VHT. 125dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 126dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final int PREAMBLE_VHT = 2; 127dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 128dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 129dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 130dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * The MAC address of the Responder. Will be null if a Wi-Fi Aware peer identifier (the 131dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * peerHandle field) ise used to identify the Responder. 132dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 1336713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen public final MacAddress macAddress; 134dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 135dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 136dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * The peer identifier of a Wi-Fi Aware Responder. Will be null if a MAC Address (the macAddress 137dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * field) is used to identify the Responder. 138dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 1396713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen public final PeerHandle peerHandle; 140dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 141dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 142dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * The device type of the Responder. 143dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 144dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int responderType; 145dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 146dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 147dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Indicates whether the Responder device supports IEEE 802.11mc. 148dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 149dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final boolean supports80211mc; 150dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 151dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 152dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder channel bandwidth, specified using {@link ChannelWidth}. 153dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 154dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int channelWidth; 155dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 156dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 157dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * The primary 20 MHz frequency (in MHz) of the channel of the Responder. 158dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 159dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int frequency; 160dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 161dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 162dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Not used if the {@link #channelWidth} is 20 MHz. If the Responder uses 40, 80 or 160 MHz, 163dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * this is the center frequency (in MHz), if the Responder uses 80 + 80 MHz, this is the 164dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * center frequency of the first segment (in MHz). 165dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 166dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int centerFreq0; 167dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 168dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 169dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Only used if the {@link #channelWidth} is 80 + 80 MHz. If the Responder uses 80 + 80 MHz, 170dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * this is the center frequency of the second segment (in MHz). 171dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 172dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int centerFreq1; 173dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 174dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 175dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * The preamble used by the Responder, specified using {@link PreambleType}. 176dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 177dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public final int preamble; 178dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 179dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 1806713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * Constructs Responder configuration, using a MAC address to identify the Responder. 181dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 182dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param macAddress The MAC address of the Responder. 183dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param responderType The type of the responder device, specified using 184dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * {@link ResponderType}. 185dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc. 186dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param channelWidth Responder channel bandwidth, specified using {@link ChannelWidth}. 187dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param frequency The primary 20 MHz frequency (in MHz) of the channel of the Responder. 188dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param centerFreq0 Not used if the {@code channelWidth} is 20 MHz. If the Responder uses 189dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 40, 80 or 160 MHz, this is the center frequency (in MHz), if the 190dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder uses 80 + 80 MHz, this is the center frequency of the first 191dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * segment (in MHz). 192dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param centerFreq1 Only used if the {@code channelWidth} is 80 + 80 MHz. If the 193dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder 194dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * uses 80 + 80 MHz, this is the center frequency of the second segment 195dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * (in 196dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * MHz). 197dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param preamble The preamble used by the Responder, specified using 198dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * {@link PreambleType}. 199dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 20048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen public ResponderConfig(@NonNull MacAddress macAddress, @ResponderType int responderType, 201dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0, 202dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq1, @PreambleType int preamble) { 20348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen if (macAddress == null) { 20448856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen throw new IllegalArgumentException( 20548856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen "Invalid ResponderConfig - must specify a MAC address"); 20648856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen } 207dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.macAddress = macAddress; 208dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.peerHandle = null; 209dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.responderType = responderType; 210dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.supports80211mc = supports80211mc; 211dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.channelWidth = channelWidth; 212dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.frequency = frequency; 213dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.centerFreq0 = centerFreq0; 214dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.centerFreq1 = centerFreq1; 215dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.preamble = preamble; 216dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 217dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 218dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 2196713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * Constructs Responder configuration, using a Wi-Fi Aware PeerHandle to identify the Responder. 220dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 221dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param peerHandle The Wi-Fi Aware peer identifier of the Responder. 222dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param responderType The type of the responder device, specified using 223dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * {@link ResponderType}. 224dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc. 225dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param channelWidth Responder channel bandwidth, specified using {@link ChannelWidth}. 226dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param frequency The primary 20 MHz frequency (in MHz) of the channel of the Responder. 227dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param centerFreq0 Not used if the {@code channelWidth} is 20 MHz. If the Responder uses 228dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 40, 80 or 160 MHz, this is the center frequency (in MHz), if the 229dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder uses 80 + 80 MHz, this is the center frequency of the first 230dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * segment (in MHz). 231dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param centerFreq1 Only used if the {@code channelWidth} is 80 + 80 MHz. If the 232dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder 233dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * uses 80 + 80 MHz, this is the center frequency of the second segment 234dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * (in 235dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * MHz). 236dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @param preamble The preamble used by the Responder, specified using 237dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * {@link PreambleType}. 238dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 239dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public ResponderConfig(@NonNull PeerHandle peerHandle, @ResponderType int responderType, 240dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0, 241dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq1, @PreambleType int preamble) { 242dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.macAddress = null; 243dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.peerHandle = peerHandle; 244dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.responderType = responderType; 245dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.supports80211mc = supports80211mc; 246dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.channelWidth = channelWidth; 247dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.frequency = frequency; 248dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.centerFreq0 = centerFreq0; 249dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.centerFreq1 = centerFreq1; 250dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen this.preamble = preamble; 251dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 252dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 253dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 2546713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * Constructs Responder configuration. This is an internal-only constructor which specifies both 2556713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * a MAC address and a Wi-Fi PeerHandle to identify the Responder. 2566713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * 2576713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param macAddress The MAC address of the Responder. 2586713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param peerHandle The Wi-Fi Aware peer identifier of the Responder. 2596713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param responderType The type of the responder device, specified using 2606713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * {@link ResponderType}. 2616713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc. 2626713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param channelWidth Responder channel bandwidth, specified using {@link ChannelWidth}. 2636713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param frequency The primary 20 MHz frequency (in MHz) of the channel of the Responder. 2646713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param centerFreq0 Not used if the {@code channelWidth} is 20 MHz. If the Responder uses 2656713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * 40, 80 or 160 MHz, this is the center frequency (in MHz), if the 2666713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * Responder uses 80 + 80 MHz, this is the center frequency of the first 2676713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * segment (in MHz). 2686713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param centerFreq1 Only used if the {@code channelWidth} is 80 + 80 MHz. If the 2696713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * Responder 2706713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * uses 80 + 80 MHz, this is the center frequency of the second segment 2716713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * (in 2726713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * MHz). 2736713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @param preamble The preamble used by the Responder, specified using 2746713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * {@link PreambleType}. 2756713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen * @hide 2766713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen */ 2776713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen public ResponderConfig(@NonNull MacAddress macAddress, @NonNull PeerHandle peerHandle, 2786713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen @ResponderType int responderType, boolean supports80211mc, 2796713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen @ChannelWidth int channelWidth, int frequency, int centerFreq0, int centerFreq1, 2806713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen @PreambleType int preamble) { 2816713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.macAddress = macAddress; 2826713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.peerHandle = peerHandle; 2836713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.responderType = responderType; 2846713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.supports80211mc = supports80211mc; 2856713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.channelWidth = channelWidth; 2866713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.frequency = frequency; 2876713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.centerFreq0 = centerFreq0; 2886713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.centerFreq1 = centerFreq1; 2896713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen this.preamble = preamble; 2906713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen } 2916713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen 2926713d08239f063ff0523d6e5a915fb73abc131b1Etan Cohen /** 293dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Creates a Responder configuration from a {@link ScanResult} corresponding to an Access 294dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Point (AP), which can be obtained from {@link android.net.wifi.WifiManager#getScanResults()}. 295dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 296dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static ResponderConfig fromScanResult(ScanResult scanResult) { 29748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen MacAddress macAddress = MacAddress.fromString(scanResult.BSSID); 298dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int responderType = RESPONDER_AP; 299dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen boolean supports80211mc = scanResult.is80211mcResponder(); 3002892ba6611f72384314f8421befd26ae7e786a08Etan Cohen int channelWidth = translateScanResultChannelWidth(scanResult.channelWidth); 301dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int frequency = scanResult.frequency; 302dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq0 = scanResult.centerFreq0; 303dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq1 = scanResult.centerFreq1; 304dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 305dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int preamble; 30667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen if (scanResult.informationElements != null && scanResult.informationElements.length != 0) { 30767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen boolean htCapabilitiesPresent = false; 30867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen boolean vhtCapabilitiesPresent = false; 30967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen for (ScanResult.InformationElement ie : scanResult.informationElements) { 31067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen if (ie.id == EID_HT_CAPABILITIES) { 31167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen htCapabilitiesPresent = true; 31267f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } else if (ie.id == EID_VHT_CAPABILITIES) { 31367f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen vhtCapabilitiesPresent = true; 31467f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } 31567f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } 31667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen if (vhtCapabilitiesPresent) { 31767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen preamble = PREAMBLE_VHT; 31867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } else if (htCapabilitiesPresent) { 31967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen preamble = PREAMBLE_HT; 32067f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } else { 32167f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen preamble = PREAMBLE_LEGACY; 32267f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } 323dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } else { 32467f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen Log.e(TAG, "Scan Results do not contain IEs - using backup method to select preamble"); 32567f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen if (channelWidth == CHANNEL_WIDTH_80MHZ || channelWidth == CHANNEL_WIDTH_160MHZ) { 32667f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen preamble = PREAMBLE_VHT; 32767f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } else { 32867f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen preamble = PREAMBLE_HT; 32967f5ffb7e85465bdb6e97f64992c446e0b7f8c01Etan Cohen } 330dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 331dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 332dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth, 333dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen frequency, centerFreq0, centerFreq1, preamble); 334dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 335dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 336dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 337dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Creates a Responder configuration from a MAC address corresponding to a Wi-Fi Aware 338dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder. The Responder parameters are set to defaults. 339dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 34048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen public static ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(MacAddress macAddress) { 3412109f705f35999374d5e3519d0782f38c87adb99Etan Cohen /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder 3422109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * is expected to be brought up and available to negotiate a maximum accuracy channel 3432109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware 3442109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * Unsolicited Publisher with Ranging enabled. 3452109f705f35999374d5e3519d0782f38c87adb99Etan Cohen */ 3462109f705f35999374d5e3519d0782f38c87adb99Etan Cohen return new ResponderConfig(macAddress, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ, 3472109f705f35999374d5e3519d0782f38c87adb99Etan Cohen AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT); 348dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 349dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 350dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 351dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Creates a Responder configuration from a {@link PeerHandle} corresponding to a Wi-Fi Aware 352dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Responder. The Responder parameters are set to defaults. 353dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 354dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static ResponderConfig fromWifiAwarePeerHandleWithDefaults(PeerHandle peerHandle) { 3552109f705f35999374d5e3519d0782f38c87adb99Etan Cohen /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder 3562109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * is expected to be brought up and available to negotiate a maximum accuracy channel 3572109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware 3582109f705f35999374d5e3519d0782f38c87adb99Etan Cohen * Unsolicited Publisher with Ranging enabled. 3592109f705f35999374d5e3519d0782f38c87adb99Etan Cohen */ 3602109f705f35999374d5e3519d0782f38c87adb99Etan Cohen return new ResponderConfig(peerHandle, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ, 3612109f705f35999374d5e3519d0782f38c87adb99Etan Cohen AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT); 362dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 363dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 364dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** 365dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * Check whether the Responder configuration is valid. 366dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * 367dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @return true if valid, false otherwise. 368dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen * @hide 369dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen */ 370dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public boolean isValid(boolean awareSupported) { 371dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (macAddress == null && peerHandle == null || macAddress != null && peerHandle != null) { 372dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return false; 373dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 374dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (!awareSupported && responderType == RESPONDER_AWARE) { 375dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return false; 376dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 377dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 378dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return true; 379dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 380dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 381dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 382dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public int describeContents() { 383dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return 0; 384dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 385dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 386dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 387dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public void writeToParcel(Parcel dest, int flags) { 38848856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen if (macAddress == null) { 38948856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen dest.writeBoolean(false); 39048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen } else { 39148856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen dest.writeBoolean(true); 39248856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen macAddress.writeToParcel(dest, flags); 39348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen } 394dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (peerHandle == null) { 39548856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen dest.writeBoolean(false); 396dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } else { 39748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen dest.writeBoolean(true); 398dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(peerHandle.peerId); 399dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 400dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(responderType); 401dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(supports80211mc ? 1 : 0); 402dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(channelWidth); 403dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(frequency); 404dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(centerFreq0); 405dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(centerFreq1); 406dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen dest.writeInt(preamble); 407dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 408dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 409dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public static final Creator<ResponderConfig> CREATOR = new Creator<ResponderConfig>() { 410dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 411dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public ResponderConfig[] newArray(int size) { 412dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return new ResponderConfig[size]; 413dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 414dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 415dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 416dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public ResponderConfig createFromParcel(Parcel in) { 41748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen boolean macAddressPresent = in.readBoolean(); 41848856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen MacAddress macAddress = null; 41948856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen if (macAddressPresent) { 42048856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen macAddress = MacAddress.CREATOR.createFromParcel(in); 42148856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen } 42248856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen boolean peerHandlePresent = in.readBoolean(); 423dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen PeerHandle peerHandle = null; 42448856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen if (peerHandlePresent) { 425dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen peerHandle = new PeerHandle(in.readInt()); 426dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 427dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int responderType = in.readInt(); 428dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen boolean supports80211mc = in.readInt() == 1; 429dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int channelWidth = in.readInt(); 430dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int frequency = in.readInt(); 431dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq0 = in.readInt(); 432dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int centerFreq1 = in.readInt(); 433dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen int preamble = in.readInt(); 434dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 435dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (peerHandle == null) { 436dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth, 437dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen frequency, centerFreq0, centerFreq1, preamble); 438dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } else { 439dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return new ResponderConfig(peerHandle, responderType, supports80211mc, channelWidth, 440dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen frequency, centerFreq0, centerFreq1, preamble); 441dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 442dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 443dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen }; 444dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 445dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 446dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public boolean equals(Object o) { 447dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (this == o) { 448dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return true; 449dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 450dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 451dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen if (!(o instanceof ResponderConfig)) { 452dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return false; 453dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 454dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 455dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen ResponderConfig lhs = (ResponderConfig) o; 456dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 45748856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen return Objects.equals(macAddress, lhs.macAddress) && Objects.equals(peerHandle, 458dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen lhs.peerHandle) && responderType == lhs.responderType 459dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen && supports80211mc == lhs.supports80211mc && channelWidth == lhs.channelWidth 460dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen && frequency == lhs.frequency && centerFreq0 == lhs.centerFreq0 461dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen && centerFreq1 == lhs.centerFreq1 && preamble == lhs.preamble; 462dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 463dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 464dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 465dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public int hashCode() { 466dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return Objects.hash(macAddress, peerHandle, responderType, supports80211mc, channelWidth, 467dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen frequency, centerFreq0, centerFreq1, preamble); 468dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 469dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 470dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** @hide */ 471dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen @Override 472dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen public String toString() { 47348856ee3937de209bfd9a320c2f91a4a9007da57Etan Cohen return new StringBuffer("ResponderConfig: macAddress=").append(macAddress).append( 474dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen ", peerHandle=").append(peerHandle == null ? "<null>" : peerHandle.peerId).append( 475dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen ", responderType=").append(responderType).append(", supports80211mc=").append( 476dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen supports80211mc).append(", channelWidth=").append(channelWidth).append( 477dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen ", frequency=").append(frequency).append(", centerFreq0=").append( 478dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen centerFreq0).append(", centerFreq1=").append(centerFreq1).append( 479dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen ", preamble=").append(preamble).toString(); 480dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 481dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen 482dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen /** @hide */ 4832892ba6611f72384314f8421befd26ae7e786a08Etan Cohen static int translateScanResultChannelWidth(int scanResultChannelWidth) { 484dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen switch (scanResultChannelWidth) { 485dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen case ScanResult.CHANNEL_WIDTH_20MHZ: 486dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return CHANNEL_WIDTH_20MHZ; 487dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen case ScanResult.CHANNEL_WIDTH_40MHZ: 488dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return CHANNEL_WIDTH_40MHZ; 489dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen case ScanResult.CHANNEL_WIDTH_80MHZ: 490dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return CHANNEL_WIDTH_80MHZ; 491dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen case ScanResult.CHANNEL_WIDTH_160MHZ: 492dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return CHANNEL_WIDTH_160MHZ; 493dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen case ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ: 494dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen return CHANNEL_WIDTH_80MHZ_PLUS_MHZ; 495dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen default: 496dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen throw new IllegalArgumentException( 4972892ba6611f72384314f8421befd26ae7e786a08Etan Cohen "translateScanResultChannelWidth: bad " + scanResultChannelWidth); 498dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 499dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen } 500dd08b040375c09ed2a5469da6d854e42544a2649Etan Cohen} 501