/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see .
*
*/
package de.tud.kom.p2psim.impl.linklayer.mac.wifi;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import de.tud.kom.p2psim.api.linklayer.mac.MacAddress;
import de.tud.kom.p2psim.api.topology.views.wifi.phy.WifiMode;
/**
* The Ideal Rate Manager calculates an SNR-Threshold for all modes and search
* the suitable {@link WifiMode} for the transmission from the allowed modes. As
* reference SNR, it is using the last received Message from the station. The
* reference SNR will be stored in the {@link IdealRemoteStation}.
*
*
* This class based on NS3 (src/wifi/model/ideal-wifi-manager.cc).
*
*
* @author Christoph Muenker
* @version 1.0, 22.02.2013
*/
public class IdealRateManager extends AbstractRateManager {
/**
* The maximum Bit Error Rate acceptable at any transmission mode
*/
private double berThreshold = 10e-6;
private Map snrThresholds = new HashMap();
/**
* Calculates the SNR-Threshold-HashMap for every allowed {@link WifiMode}.
*
* @param modes
* The allowed {@link WifiMode}s
* @param defaultMode
* The defaultMode for this RateManager.
* @param mac
* The Mac, which creates this RateManager.
*/
public IdealRateManager(List modes, WifiMode defaultMode,
Ieee80211AdHocMac mac) {
super(modes, defaultMode, mac);
for (WifiMode mode : modes) {
double snrThreshold = mac.getWifiTopologyView().getErrorRateModel()
.calculateSnrThreshold(mode, berThreshold);
this.snrThresholds.put(mode, snrThreshold);
}
}
@Override
protected void doReportRtsFailed(IWifiRemoteStation station) {
// nothing
}
@Override
protected void doReportDataFailed(IWifiRemoteStation station) {
// nothing
}
@Override
protected void doReportRtsOk(IWifiRemoteStation station, double ctsSnr,
WifiMode ctsMode) {
IdealRemoteStation s = (IdealRemoteStation) station;
s.setLastSnr(ctsSnr);
}
@Override
protected void doReportDataOk(IWifiRemoteStation station, double ackSnr,
WifiMode ackMode) {
IdealRemoteStation s = (IdealRemoteStation) station;
s.setLastSnr(ackSnr);
}
@Override
protected void doReportFinalRtsFailed(IWifiRemoteStation station) {
// nothing
}
@Override
protected void doReportFinalDataFailed(IWifiRemoteStation station) {
// nothing
}
@Override
protected void doReportRxOk(IWifiRemoteStation station, double rxSnr,
WifiMode txMode) {
// nothing
}
@Override
protected IWifiRemoteStation doCreateWifiRemoteStation(MacAddress address) {
return new IdealRemoteStation(address);
}
@Override
protected WifiMode doGetUnicastDataMode(IWifiRemoteStation station) {
double maxThreshold = 0.0;
double snr = ((IdealRemoteStation) station).getLastSnr();
WifiMode maxMode = getDefaultMode();
for (WifiMode mode : getModes()) {
double threshold = snrThresholds.get(mode);
if (threshold > maxThreshold && threshold < snr) {
maxThreshold = threshold;
maxMode = mode;
}
}
return maxMode;
}
@Override
protected WifiMode doGetRtsMode(IWifiRemoteStation station) {
double maxThreshold = 0.0;
double snr = ((IdealRemoteStation) station).getLastSnr();
WifiMode maxMode = getDefaultMode();
// search within basicModes
for (WifiMode mode : getBasicModes()) {
double threshold = snrThresholds.get(mode);
if (threshold > maxThreshold && threshold < snr) {
maxThreshold = threshold;
maxMode = mode;
}
}
return maxMode;
}
}