diff --git a/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralConstants.java b/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralConstants.java index d25cc42..b6f49d3 100644 --- a/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralConstants.java +++ b/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralConstants.java @@ -22,7 +22,7 @@ public final class UCentralConstants { public static final String BAND_2G = "2G"; /** String of the 5 GHz band */ public static final String BAND_5G = "5G"; - /** List of all bands */ + /** List of all bands ordered from lowest to highest */ public static final List BANDS = Collections .unmodifiableList(Arrays.asList(BAND_2G, BAND_5G)); diff --git a/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralUtils.java b/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralUtils.java index afead9d..f96c358 100644 --- a/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralUtils.java +++ b/lib-cloudsdk/src/main/java/com/facebook/openwifi/cloudsdk/UCentralUtils.java @@ -63,6 +63,8 @@ public class UCentralUtils { Arrays.asList(36, 40, 44, 48, 149, 153, 157, 161, 165) ) ); + // NOTE: later, we may want to support channels 12, 13, and/or 14, if + // the AP supports it and OWF vendors will use them bandToChannelsMap.put( UCentralConstants.BAND_2G, Collections.unmodifiableList( @@ -416,23 +418,6 @@ public class UCentralUtils { return bssidMap; } - /** - * Converts channel number to that channel's center frequency in MHz. - * - * @param channel channel number - * @return the center frequency of the given channel in MHz - */ - public static int channelToFrequencyMHz(int channel) { - // TODO fixme - if (channel <= 14) { - // 2.4 GHz - return 2407 + 5 * channel; - } else { - // 5 GHz - return 5000 + channel; - } - } - /** * Determines if the given channel is in the given band. * @@ -444,20 +429,13 @@ public class UCentralUtils { return AVAILABLE_CHANNELS_BAND.get(band).contains(channel); } - /** - * Given the channel, gets the band by checking lower bound and upper bound - * of each band - * - * @param channel channel number - * @return band if the channel can be mapped to a valid band; null otherwise - */ - public static String getBandFromChannel(int channel) { - for (String band : UCentralConstants.BANDS) { - if (isChannelInBand(channel, band)) { - return band; - } + /** Return which band contains the given frequency (MHz). */ + public static String freqToBand(int freqMHz) { + if (2412 <= freqMHz && freqMHz <= 2484) { + return "2G"; + } else { + return "5G"; } - return null; } /** diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/modules/ModelerUtils.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/modules/ModelerUtils.java index 50001cf..57b0ef1 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/modules/ModelerUtils.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/modules/ModelerUtils.java @@ -30,6 +30,9 @@ import com.facebook.openwifi.cloudsdk.models.ap.State.Interface.SSID.Association import com.facebook.openwifi.rrm.aggregators.Aggregator; import com.facebook.openwifi.rrm.aggregators.MeanAggregator; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; /** * Modeler utilities. @@ -555,4 +558,28 @@ public class ModelerUtils { station ); } + + /** Return the radio's band, or null if band cannot be found */ + public static String getBand( + State.Radio radio, + JsonObject deviceCapability + ) { + if (radio.phy == null) { + return null; + } + JsonElement radioCapabilityElement = deviceCapability.get(radio.phy); + if (radioCapabilityElement == null) { + return null; + } + JsonObject radioCapability = radioCapabilityElement.getAsJsonObject(); + JsonElement bandsElement = radioCapability.get("band"); + if (bandsElement == null) { + return null; + } + JsonArray bands = bandsElement.getAsJsonArray(); + if (bands.isEmpty()) { + return null; + } + return bands.get(0).getAsString(); + } } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/ChannelOptimizer.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/ChannelOptimizer.java index 0a92abe..e0fc8df 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/ChannelOptimizer.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/ChannelOptimizer.java @@ -28,6 +28,8 @@ import com.facebook.openwifi.rrm.DeviceConfig; import com.facebook.openwifi.rrm.DeviceDataManager; import com.facebook.openwifi.rrm.modules.ConfigManager; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.facebook.openwifi.rrm.modules.ModelerUtils; +import com.google.gson.JsonObject; /** * Channel optimizer base class. @@ -298,25 +300,28 @@ public abstract class ChannelOptimizer { List scanRespsFiltered = new ArrayList(); for (WifiScanEntry entry : scanResps) { - if (UCentralUtils.isChannelInBand(entry.channel, band)) { - int channelWidth = getChannelWidthFromWiFiScan( + final String entryBand = UCentralUtils + .freqToBand(entry.frequency); + if (entryBand == null || !entryBand.equals(band)) { + continue; + } + int channelWidth = getChannelWidthFromWiFiScan( + entry.channel, + entry.ht_oper, + entry.vht_oper + ); + int primaryChannel = + getPrimaryChannel(entry.channel, channelWidth); + List coveredChannels = + getCoveredChannels( entry.channel, - entry.ht_oper, - entry.vht_oper + primaryChannel, + channelWidth ); - int primaryChannel = - getPrimaryChannel(entry.channel, channelWidth); - List coveredChannels = - getCoveredChannels( - entry.channel, - primaryChannel, - channelWidth - ); - for (Integer newChannel : coveredChannels) { - WifiScanEntry newEntry = new WifiScanEntry(entry); - newEntry.channel = newChannel; - scanRespsFiltered.add(newEntry); - } + for (Integer newChannel : coveredChannels) { + WifiScanEntry newEntry = new WifiScanEntry(entry); + newEntry.channel = newChannel; + scanRespsFiltered.add(newEntry); } } @@ -344,6 +349,7 @@ public abstract class ChannelOptimizer { * @param band the operational band (e.g., "2G") * @param serialNumber the device's serial number * @param state the latest state of all the devices + * @param latestDeviceCapabilities latest device capabilities * @return the current channel and channel width (MHz) of the device in the * given band; returns a current channel of 0 if no channel in the given * band is found. @@ -351,7 +357,8 @@ public abstract class ChannelOptimizer { protected static int[] getCurrentChannel( String band, String serialNumber, - State state + State state, + Map latestDeviceCapabilities ) { int currentChannel = 0; int currentChannelWidth = MIN_CHANNEL_WIDTH; @@ -361,27 +368,40 @@ public abstract class ChannelOptimizer { radioIndex < state.radios.length; radioIndex++ ) { - int tempChannel = state.radios[radioIndex].channel; - if (UCentralUtils.isChannelInBand(tempChannel, band)) { - currentChannel = tempChannel; - // treat as two separate 80MHz channel and only assign to one - // TODO: support 80p80 properly - Integer parsedChannelWidth = UCentralUtils - .parseChannelWidth( - state.radios[radioIndex].channel_width, - true - ); - if (parsedChannelWidth != null) { - currentChannelWidth = parsedChannelWidth; - break; - } - - logger.error( - "Invalid channel width {}", - state.radios[radioIndex].channel_width - ); + State.Radio radio = state.radios[radioIndex]; + // check if radio is in band of interest + JsonObject deviceCapability = + latestDeviceCapabilities.get(serialNumber); + if (deviceCapability == null) { continue; } + final String radioBand = ModelerUtils.getBand( + radio, + deviceCapability + ); + if (radioBand == null || !radioBand.equals(band)) { + continue; + } + + int tempChannel = radio.channel; + currentChannel = tempChannel; + // treat as two separate 80MHz channel and only assign to one + // TODO: support 80p80 properly + Integer parsedChannelWidth = UCentralUtils + .parseChannelWidth( + radio.channel_width, + true + ); + if (parsedChannelWidth != null) { + currentChannelWidth = parsedChannelWidth; + break; + } + + logger.error( + "Invalid channel width {}", + radio.channel_width + ); + continue; } return new int[] { currentChannel, currentChannelWidth }; } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizer.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizer.java index 4dab17f..924d076 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizer.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizer.java @@ -393,7 +393,12 @@ public class LeastUsedChannelOptimizer extends ChannelOptimizer { continue; } int[] currentChannelInfo = - getCurrentChannel(band, serialNumber, state); + getCurrentChannel( + band, + serialNumber, + state, + model.latestDeviceCapabilities + ); int currentChannel = currentChannelInfo[0]; // Filter out APs if the radios in the state do not contain a // channel in a band given by the state. This can happen when diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializer.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializer.java index 6ede8a7..3ce16c7 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializer.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializer.java @@ -23,8 +23,8 @@ import com.facebook.openwifi.cloudsdk.UCentralUtils; import com.facebook.openwifi.cloudsdk.WifiScanEntry; import com.facebook.openwifi.cloudsdk.models.ap.State; import com.facebook.openwifi.rrm.DeviceDataManager; -import com.facebook.openwifi.rrm.modules.ModelerUtils; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.facebook.openwifi.rrm.modules.ModelerUtils; /** * Random channel initializer. @@ -204,7 +204,12 @@ public class RandomChannelInitializer extends ChannelOptimizer { continue; } int[] currentChannelInfo = - getCurrentChannel(band, serialNumber, state); + getCurrentChannel( + band, + serialNumber, + state, + model.latestDeviceCapabilities + ); int currentChannel = currentChannelInfo[0]; int currentChannelWidth = currentChannelInfo[1]; if (currentChannel == 0) { diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPC.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPC.java index 14bb498..20e74ba 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPC.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPC.java @@ -18,12 +18,11 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.facebook.openwifi.cloudsdk.UCentralUtils; import com.facebook.openwifi.cloudsdk.models.ap.State; import com.facebook.openwifi.rrm.DeviceConfig; import com.facebook.openwifi.rrm.DeviceDataManager; -import com.facebook.openwifi.rrm.modules.ModelerUtils; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.facebook.openwifi.rrm.modules.ModelerUtils; /** * Location-based optimal TPC algorithm. @@ -153,6 +152,7 @@ public class LocationBasedOptimalTPC extends TPC { /** * Calculate new tx powers for the given band. * + * @param band band (e.g., "2G") * @param channel channel * @param serialNumbers The serial numbers of the APs with the channel * @param txPowerMap this map from serial number to band to new tx power @@ -160,13 +160,13 @@ public class LocationBasedOptimalTPC extends TPC { * this method with the new tx powers. */ private void buildTxPowerMapForChannel( + String band, int channel, List serialNumbers, Map> txPowerMap ) { int numOfAPs = 0; int boundary = 100; - String band = UCentralUtils.getBandFromChannel(channel); Map validAPs = new TreeMap<>(); List apLocX = new ArrayList<>(); List apLocY = new ArrayList<>(); @@ -283,9 +283,27 @@ public class LocationBasedOptimalTPC extends TPC { @Override public Map> computeTxPowerMap() { Map> txPowerMap = new TreeMap<>(); - Map> apsPerChannel = getApsPerChannel(); - for (Map.Entry> e : apsPerChannel.entrySet()) { - buildTxPowerMapForChannel(e.getKey(), e.getValue(), txPowerMap); + Map>> bandToChannelToAps = + getApsPerChannel(); + for ( + Map.Entry>> bandEntry : bandToChannelToAps + .entrySet() + ) { + final String band = bandEntry.getKey(); + Map> channelToAps = bandEntry.getValue(); + for ( + Map.Entry> channelEntry : channelToAps + .entrySet() + ) { + final int channel = channelEntry.getKey(); + List serialNumbers = channelEntry.getValue(); + buildTxPowerMapForChannel( + band, + channel, + serialNumbers, + txPowerMap + ); + } } return txPowerMap; } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPC.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPC.java index 0f199f3..7abd085 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPC.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPC.java @@ -25,6 +25,8 @@ import com.facebook.openwifi.cloudsdk.WifiScanEntry; import com.facebook.openwifi.cloudsdk.models.ap.State; import com.facebook.openwifi.rrm.DeviceDataManager; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.facebook.openwifi.rrm.modules.ModelerUtils; +import com.google.gson.JsonObject; /** * Measurement-based AP-AP TPC algorithm. @@ -217,7 +219,14 @@ public class MeasurementBasedApApTPC extends TPC { // At a given AP, if we receive a signal from ap_2, then it gets added to the rssi list for ap_2 latestScan.stream() - .filter(entry -> (managedBSSIDs.contains(entry.bssid) && UCentralUtils.isChannelInBand(entry.channel, band))) + .filter((entry) -> { + if (!managedBSSIDs.contains(entry.bssid)) { + return false; + } + String entryBand = UCentralUtils + .freqToBand(entry.frequency); + return entryBand != null && entryBand.equals(band); + }) .forEach( entry -> { bssidToRssiValues.get(entry.bssid).add(entry.signal); @@ -296,17 +305,18 @@ public class MeasurementBasedApApTPC extends TPC { /** * Calculate new tx powers for the given channel on the given APs . * + * @param band band (e.g., "2G") * @param channel channel * @param serialNumbers the serial numbers of the APs with the channel * @param txPowerMap this maps from serial number to band to new tx power (dBm) * and is updated by this method with the new tx powers. */ protected void buildTxPowerMapForChannel( + String band, int channel, List serialNumbers, Map> txPowerMap ) { - String band = UCentralUtils.getBandFromChannel(channel); Set managedBSSIDs = getManagedBSSIDs(model); Map> bssidToRssiValues = buildRssiMap(managedBSSIDs, model.latestWifiScans, band); @@ -363,9 +373,16 @@ public class MeasurementBasedApApTPC extends TPC { State.Radio radio = state.radios[idx]; // this specific SSID is not on the band of interest - if ( - !UCentralUtils.isChannelInBand(radio.channel, band) - ) { + JsonObject deviceCapability = model.latestDeviceCapabilities + .get(serialNumber); + if (deviceCapability == null) { + continue; + } + final String radioBand = ModelerUtils.getBand( + radio, + deviceCapability + ); + if (radioBand == null || !radioBand.equals(band)) { continue; } @@ -409,9 +426,27 @@ public class MeasurementBasedApApTPC extends TPC { @Override public Map> computeTxPowerMap() { Map> txPowerMap = new TreeMap<>(); - Map> apsPerChannel = getApsPerChannel(); - for (Map.Entry> e : apsPerChannel.entrySet()) { - buildTxPowerMapForChannel(e.getKey(), e.getValue(), txPowerMap); + Map>> bandToChannelToAps = + getApsPerChannel(); + for ( + Map.Entry>> bandEntry : bandToChannelToAps + .entrySet() + ) { + final String band = bandEntry.getKey(); + Map> channelToAps = bandEntry.getValue(); + for ( + Map.Entry> channelEntry : channelToAps + .entrySet() + ) { + final int channel = channelEntry.getKey(); + List serialNumbers = channelEntry.getValue(); + buildTxPowerMapForChannel( + band, + channel, + serialNumbers, + txPowerMap + ); + } } return txPowerMap; } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPC.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPC.java index fd45a88..b8a01e1 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPC.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPC.java @@ -15,13 +15,15 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.facebook.openwifi.cloudsdk.UCentralUtils; import com.facebook.openwifi.cloudsdk.models.ap.State; import com.facebook.openwifi.rrm.DeviceDataManager; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.facebook.openwifi.rrm.modules.ModelerUtils; +import com.google.gson.JsonObject; /** * Measurement-based AP-client algorithm. @@ -305,8 +307,15 @@ public class MeasurementBasedApClientTPC extends TPC { Map radioMap = new TreeMap<>(); for (State.Radio radio : state.radios) { - int currentChannel = radio.channel; - String band = UCentralUtils.getBandFromChannel(currentChannel); + JsonObject deviceCapability = model.latestDeviceCapabilities + .get(serialNumber); + if (deviceCapability == null) { + continue; + } + final String band = ModelerUtils.getBand( + radio, + deviceCapability + ); if (band == null) { continue; } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializer.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializer.java index f44826b..8f6b324 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializer.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializer.java @@ -18,7 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.facebook.openwifi.cloudsdk.UCentralConstants; -import com.facebook.openwifi.cloudsdk.UCentralUtils; import com.facebook.openwifi.rrm.DeviceDataManager; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; @@ -137,36 +136,44 @@ public class RandomTxPowerInitializer extends TPC { logger.info("Default power: {}", defaultTxPower); } - Map> apsPerChannel = getApsPerChannel(); + Map>> bandToChannelToAps = + getApsPerChannel(); Map> txPowerMap = new TreeMap<>(); - for (Map.Entry> e : apsPerChannel.entrySet()) { - int channel = e.getKey(); - List serialNumbers = e.getValue(); - - String band = UCentralUtils.getBandFromChannel(channel); - for (String serialNumber : serialNumbers) { - int txPower = defaultTxPower; - if (setDifferentTxPowerPerAp) { - List curTxPowerChoices = updateTxPowerChoices( - band, + for ( + Map.Entry>> bandEntry : bandToChannelToAps + .entrySet() + ) { + final String band = bandEntry.getKey(); + Map> channelToAps = bandEntry.getValue(); + for ( + Map.Entry> channelEntry : channelToAps + .entrySet() + ) { + List serialNumbers = channelEntry.getValue(); + for (String serialNumber : serialNumbers) { + int txPower = defaultTxPower; + if (setDifferentTxPowerPerAp) { + List curTxPowerChoices = updateTxPowerChoices( + band, + serialNumber, + DEFAULT_TX_POWER_CHOICES + ); + txPower = curTxPowerChoices + .get(rng.nextInt(curTxPowerChoices.size())); + } + txPowerMap + .computeIfAbsent(serialNumber, k -> new TreeMap<>()) + .put(band, txPower); + logger.info( + "Device {} band {}: Assigning tx power = {}", serialNumber, - DEFAULT_TX_POWER_CHOICES + band, + txPower ); - txPower = curTxPowerChoices - .get(rng.nextInt(curTxPowerChoices.size())); } - txPowerMap.computeIfAbsent(serialNumber, k -> new TreeMap<>()) - .put(band, txPower); - logger.info( - "Device {} band {}: Assigning tx power = {}", - serialNumber, - band, - txPower - ); } } - return txPowerMap; } } diff --git a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/TPC.java b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/TPC.java index e6c5867..d240f8f 100644 --- a/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/TPC.java +++ b/owrrm/src/main/java/com/facebook/openwifi/rrm/optimizers/tpc/TPC.java @@ -25,6 +25,8 @@ import com.facebook.openwifi.rrm.DeviceConfig; import com.facebook.openwifi.rrm.DeviceDataManager; import com.facebook.openwifi.rrm.modules.ConfigManager; import com.facebook.openwifi.rrm.modules.Modeler.DataModel; +import com.facebook.openwifi.rrm.modules.ModelerUtils; +import com.google.gson.JsonObject; /** * TPC (Transmit Power Control) base class. @@ -180,10 +182,10 @@ public abstract class TPC { /** * Get AP serial numbers per channel. * - * @return the map from channel to the list of AP serial numbers + * @return map from band to channel to list of AP serial numbers */ - protected Map> getApsPerChannel() { - Map> apsPerChannel = new TreeMap<>(); + protected Map>> getApsPerChannel() { + Map>> apsPerChannel = new TreeMap<>(); for (Map.Entry> e : model.latestStates.entrySet()) { String serialNumber = e.getKey(); List states = e.getValue(); @@ -202,7 +204,20 @@ public abstract class TPC { if (currentChannel == 0) { continue; } + JsonObject deviceCapability = + model.latestDeviceCapabilities.get(serialNumber); + if (deviceCapability == null) { + continue; + } + final String band = ModelerUtils.getBand( + radio, + deviceCapability + ); + if (band == null) { + continue; + } apsPerChannel + .computeIfAbsent(band, k -> new TreeMap<>()) .computeIfAbsent(currentChannel, k -> new ArrayList<>()) .add(serialNumber); } diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/TestUtils.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/TestUtils.java index 5a509be..1d7a237 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/TestUtils.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/TestUtils.java @@ -56,6 +56,45 @@ public class TestUtils { return topology; } + /** + * Given the channel, gets the lowest band that contains that channel (there + * may be multiple bands that contain the same channel number due to channel + * numbering schemes). + * + * @param channel channel number + * @return band lowest band containing the channel; null if no such band + */ + private static String channelToLowestMatchingBand(int channel) { + for (String band : UCentralConstants.BANDS) { + if (UCentralUtils.isChannelInBand(channel, band)) { + return band; + } + } + return null; + } + + /** + * Converts channel number to that channel's center frequency in MHz. If, + * due to channel numbering schemes, the channel number appears in multiple + * bands, use the lowest such band. + * + * @param channel channel number + * @return the center frequency of the given channel in MHz + */ + private static int channelToFrequencyMHzInLowestMatchingBand(int channel) { + if (UCentralUtils.isChannelInBand(channel, UCentralConstants.BAND_2G)) { + if (channel <= 13) { + return 2407 + 5 * channel; + } else { + // special case + return 2484; + } + } else { + // 5G + return 5000 + channel; + } + } + /** * Create a radio info object which forms one element of the list of radio * info objects representing a device's status. @@ -158,7 +197,7 @@ public class TestUtils { JsonArray jsonList = new JsonArray(); jsonList.add( createDeviceStatusRadioObject( - UCentralUtils.getBandFromChannel(channel), + channelToLowestMatchingBand(channel), channel, DEFAULT_CHANNEL_WIDTH, txPower2G @@ -201,7 +240,7 @@ public class TestUtils { public static WifiScanEntry createWifiScanEntry(int channel) { WifiScanEntry entry = new WifiScanEntry(); entry.channel = channel; - entry.frequency = UCentralUtils.channelToFrequencyMHz(channel); + entry.frequency = channelToFrequencyMHzInLowestMatchingBand(channel); entry.signal = -60; entry.unixTimeMs = TestUtils.DEFAULT_WIFISCANENTRY_TIME.toEpochMilli(); return entry; @@ -262,7 +301,7 @@ public class TestUtils { WifiScanEntry entry = new WifiScanEntry(); entry.bssid = bssid; entry.channel = channel; - entry.frequency = UCentralUtils.channelToFrequencyMHz(channel); + entry.frequency = channelToFrequencyMHzInLowestMatchingBand(channel); entry.signal = -60; entry.ht_oper = htOper; entry.vht_oper = vhtOper; @@ -326,6 +365,21 @@ public class TestUtils { return wifiScanList; } + /** + * Generate the String for the "phy" field of a State's radio at a given + * index. This field also appears in the device capability object. + * + * @param index index of the radio in the state + * @return the String value for the "phy" field of the radio + */ + private static String generatePhyString(int index) { + String phyId = "platform/soc/c000000.wifi"; + if (index > 0) { + phyId += String.format("+%d", index); + } + return phyId; + } + /** * Create an uplink0 interface with one radio, to place in * {@link State#interfaces}. @@ -335,6 +389,7 @@ public class TestUtils { * {@link State#interfaces} */ private static State.Interface createUpStateInterface(int index) { + final String phyId = generatePhyString(index); // @formatter:off return gson.fromJson( String.format( @@ -369,7 +424,7 @@ public class TestUtils { " },\n" + " \"iface\": \"wlan%d\",\n" + " \"mode\": \"ap\",\n" + - " \"phy\": \"platform/soc/c000000.wifi\",\n" + + " \"phy\": \"%s\",\n" + " \"radio\": {\n" + " \"$ref\": \"#/radios/%d\"\n" + " },\n" + @@ -380,6 +435,7 @@ public class TestUtils { index, index, index, + phyId, index, index ), @@ -423,13 +479,13 @@ public class TestUtils { // @formatter:on } - /** Create an element of {@link State#radios}. */ - private static State.Radio createStateRadio() { + /** Create an element of {@link State#radios} at a given index. */ + private static State.Radio createStateRadio(int index) { State.Radio radio = new State.Radio(); radio.active_ms = 564328; radio.busy_ms = 36998; radio.noise = 4294967193L; - radio.phy = "platform/soc/c000000.wifi"; + radio.phy = generatePhyString(index); radio.receive_ms = 28; radio.transmit_ms = 4893; return radio; @@ -506,7 +562,7 @@ public class TestUtils { state.interfaces[numRadios] = createDownStateInterface(numRadios); state.radios = new State.Radio[numRadios]; for (int i = 0; i < numRadios; i++) { - state.radios[i] = createStateRadio(); + state.radios[i] = createStateRadio(i); state.radios[i].channel = channels[i]; state.radios[i].channel_width = Integer.toString(channelWidths[i]); state.radios[i].tx_power = txPowers[i]; @@ -705,6 +761,44 @@ public class TestUtils { ); } + /** + * Create a radio capability object which is part of the device capability. + */ + public static JsonObject createRadioCapability(String band) { + JsonObject radioCapability = new JsonObject(); + JsonArray bandArray = new JsonArray(); + bandArray.add(band); + radioCapability.add("band", bandArray); + // the following fields are present but unused so they are excluded here + // channels + // dfs_channels + // frequencies + // he_mac_capa + // he_phy_capa + // ht_capa + // htmode + // rx_ant + // tx_ant + // vht_capa + return radioCapability; + } + + /** Create a device capability object with radios in the given bands. */ + public static JsonObject createDeviceCapability(String[] bands) { + JsonObject deviceCapability = new JsonObject(); + for (int i = 0; i < bands.length; i++) { + String phyId = generatePhyString(i); + JsonObject radioCapability = createRadioCapability(bands[i]); + deviceCapability.add(phyId, radioCapability); + } + return deviceCapability; + } + + /** Create a device capability object with a radio in the given band. */ + public static JsonObject createDeviceCapability(String band) { + return createDeviceCapability(new String[] { band }); + } + /** * Create an AggregatedState from given radio info. * diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizerTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizerTest.java index 94aa824..ef26e97 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizerTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/LeastUsedChannelOptimizerTest.java @@ -63,6 +63,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -85,6 +89,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(40, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -108,6 +116,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC)) @@ -155,6 +167,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -177,6 +193,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(6, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -195,6 +215,10 @@ public class LeastUsedChannelOptimizerTest { deviceC, Arrays.asList(TestUtils.createState(6, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList( @@ -251,6 +275,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -272,6 +300,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(40, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -294,6 +326,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC)) @@ -349,6 +385,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -372,6 +412,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(40, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -395,6 +439,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC)) @@ -444,6 +492,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -468,6 +520,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(40, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -491,6 +547,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC)) @@ -511,6 +571,10 @@ public class LeastUsedChannelOptimizerTest { deviceD, Arrays.asList(TestUtils.createState(40, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceD, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceD, Arrays.asList(TestUtils.createWifiScanList(channelsD)) @@ -567,6 +631,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -589,6 +657,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(36, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -612,6 +684,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC)) @@ -634,6 +710,10 @@ public class LeastUsedChannelOptimizerTest { deviceD, Arrays.asList(TestUtils.createState(36, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceD, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceD, Arrays.asList(TestUtils.createWifiScanList(channelsD)) @@ -662,6 +742,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceE, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceE, Arrays.asList( @@ -711,6 +795,10 @@ public class LeastUsedChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -732,6 +820,10 @@ public class LeastUsedChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(48, channelWidth, dummyBssid)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList( @@ -766,6 +858,10 @@ public class LeastUsedChannelOptimizerTest { TestUtils.createState(149, channelWidth, dummyBssid) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC1)) diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializerTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializerTest.java index 294539a..3b987a4 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializerTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/RandomChannelInitializerTest.java @@ -67,6 +67,14 @@ public class RandomChannelInitializerTest { deviceB, TestUtils.createDeviceStatus(band, 8) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); ChannelOptimizer optimizer = new RandomChannelInitializer( dataModel, @@ -116,6 +124,22 @@ public class RandomChannelInitializerTest { deviceB, TestUtils.createDeviceStatus(band, 8) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_2G } + ) + ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_2G } + ) + ); ChannelOptimizer optimizer = new RandomChannelInitializer( dataModel, diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/UnmanagedApAwareChannelOptimizerTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/UnmanagedApAwareChannelOptimizerTest.java index 98cab32..ac190b7 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/UnmanagedApAwareChannelOptimizerTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/channel/UnmanagedApAwareChannelOptimizerTest.java @@ -65,6 +65,10 @@ public class UnmanagedApAwareChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, bssidA) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -89,6 +93,10 @@ public class UnmanagedApAwareChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(40, channelWidth, bssidB)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -123,6 +131,10 @@ public class UnmanagedApAwareChannelOptimizerTest { deviceC, Arrays.asList(TestUtils.createState(149, channelWidth, bssidC)) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList(TestUtils.createWifiScanList(channelsC, bssidsC)) @@ -173,6 +185,10 @@ public class UnmanagedApAwareChannelOptimizerTest { .createState(aExpectedChannel, channelWidth, bssidA) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceA, Arrays.asList( @@ -195,6 +211,10 @@ public class UnmanagedApAwareChannelOptimizerTest { deviceB, Arrays.asList(TestUtils.createState(6, channelWidth, bssidB)) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceB, Arrays.asList(TestUtils.createWifiScanList(channelsB)) @@ -213,6 +233,10 @@ public class UnmanagedApAwareChannelOptimizerTest { deviceC, Arrays.asList(TestUtils.createState(6, channelWidth, bssidC)) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(band) + ); dataModel.latestWifiScans.put( deviceC, Arrays.asList( diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPCTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPCTest.java index 37d0d55..c009a33 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPCTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/LocationBasedOptimalTPCTest.java @@ -145,6 +145,14 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); } Map> expected = new HashMap<>(); @@ -214,6 +222,14 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel2.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); } dataModel2.latestDeviceStatusRadios .put( @@ -233,6 +249,10 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel2.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); Map> expected2 = new HashMap<>(); for (String band : UCentralConstants.BANDS) { @@ -327,6 +347,14 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel2.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); } Map> expected2 = new HashMap<>(); @@ -388,6 +416,14 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel3.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); } Map> expected3 = new HashMap<>(); @@ -439,6 +475,14 @@ public class LocationBasedOptimalTPCTest { ) ) ); + dataModel4.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_2G } + ) + ); } Map> expected4 = new HashMap<>(); diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPCTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPCTest.java index a500162..eb3011f 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPCTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApApTPCTest.java @@ -108,6 +108,10 @@ public class MeasurementBasedApApTPCTest { TestUtils .createDeviceStatusSingleBand(channel, MAX_TX_POWER) ); + model.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability(band) + ); } return model; @@ -157,6 +161,14 @@ public class MeasurementBasedApApTPCTest { MAX_TX_POWER ) ); + model.latestDeviceCapabilities.put( + device, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); } return model; @@ -592,6 +604,10 @@ public class MeasurementBasedApApTPCTest { MAX_TX_POWER ) ); + dataModel.latestDeviceCapabilities.put( + DEVICE_C, + TestUtils.createDeviceCapability(UCentralConstants.BAND_2G) + ); optimizer = new MeasurementBasedApApTPC( dataModel, TEST_ZONE, diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPCTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPCTest.java index 5d4e412..08c1cd6 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPCTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/MeasurementBasedApClientTPCTest.java @@ -61,12 +61,20 @@ public class MeasurementBasedApClientTPCTest { TestUtils.createState(36, 20, 20, null, new int[] {}) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceB, Arrays.asList( TestUtils.createState(36, 20, 20, "", new int[] { -65 }) ) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceC, Arrays.asList( @@ -79,18 +87,30 @@ public class MeasurementBasedApClientTPCTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceD, Arrays.asList( TestUtils.createState(36, 20, 22, null, new int[] { -80 }) ) ); + dataModel.latestDeviceCapabilities.put( + deviceD, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceE, Arrays.asList( TestUtils.createState(36, 20, 23, null, new int[] { -45 }) ) ); + dataModel.latestDeviceCapabilities.put( + deviceE, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); TPC optimizer = new MeasurementBasedApClientTPC( dataModel, @@ -158,6 +178,10 @@ public class MeasurementBasedApClientTPCTest { TestUtils.createState(1, 20, 20, null, new int[] {}) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(UCentralConstants.BAND_2G) + ); // 5G only dataModel.latestStates.put( deviceB, @@ -165,6 +189,10 @@ public class MeasurementBasedApClientTPCTest { TestUtils.createState(36, 20, 20, null, new int[] {}) ) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); // 2G and 5G dataModel.latestStates.put( deviceC, @@ -181,6 +209,14 @@ public class MeasurementBasedApClientTPCTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_2G, + UCentralConstants.BAND_5G } + ) + ); // No valid bands in 2G or 5G dataModel.latestStates.put( deviceD, @@ -248,12 +284,20 @@ public class MeasurementBasedApClientTPCTest { TestUtils.createState(36, 20, 20, null, new int[] {}) ) ); + dataModel.latestDeviceCapabilities.put( + deviceA, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceB, Arrays.asList( TestUtils.createState(36, 20, 20, "", new int[] { -65 }) ) ); + dataModel.latestDeviceCapabilities.put( + deviceB, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); dataModel.latestStates.put( deviceC, Arrays.asList( @@ -266,6 +310,10 @@ public class MeasurementBasedApClientTPCTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + deviceC, + TestUtils.createDeviceCapability(UCentralConstants.BAND_5G) + ); TPC optimizer = new MeasurementBasedApClientTPC( dataModel, diff --git a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializerTest.java b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializerTest.java index 54b6d15..1d09fcd 100644 --- a/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializerTest.java +++ b/owrrm/src/test/java/com/facebook/openwifi/rrm/optimizers/tpc/RandomTxPowerInitializerTest.java @@ -78,6 +78,14 @@ public class RandomTxPowerInitializerTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + DEVICE_A, + TestUtils.createDeviceCapability( + new String[] { + UCentralConstants.BAND_5G, + UCentralConstants.BAND_2G } + ) + ); dataModel.latestStates.put( DEVICE_B, Arrays.asList( @@ -89,6 +97,10 @@ public class RandomTxPowerInitializerTest { ) ) ); + dataModel.latestDeviceCapabilities.put( + DEVICE_B, + TestUtils.createDeviceCapability(UCentralConstants.BAND_2G) + ); return dataModel; }