use WifiMode rather than mode indexes in MacStations API.

This commit is contained in:
Mathieu Lacage
2007-10-08 15:43:19 +02:00
parent 5e5800363e
commit f807067337
2 changed files with 151 additions and 16 deletions

View File

@@ -20,6 +20,7 @@
*/
#include "mac-stations.h"
#include "ns3/assert.h"
namespace ns3 {
@@ -32,8 +33,9 @@ public:
namespace ns3 {
MacStations::MacStations ()
: m_nonUnicast (0)
MacStations::MacStations (WifiMode defaultTxMode)
: m_nonUnicast (0),
m_defaultTxMode (defaultTxMode)
{}
MacStations::~MacStations ()
@@ -61,7 +63,7 @@ MacStations::Lookup (Mac48Address address)
return (*i).second;
}
}
MacStation *station = CreateStation ();
MacStation *station = CreateStation (m_defaultTxMode);
m_stations.push_back (std::make_pair (address, station));
return station;
}
@@ -80,11 +82,17 @@ MacStations::LookupNonUnicast (void)
namespace ns3 {
MacStation::MacStation ()
: m_state (DISASSOC)
MacStation::WifiRate::WifiRate (WifiMode _mode, bool _isBasic)
: mode (_mode), isBasic (_isBasic)
{}
MacStation::MacStation (WifiMode txMode)
: m_state (DISASSOC),
m_defaultTxMode (txMode)
{
NS_ASSERT (m_defaultTxMode.IsMandatory ());
ResetModes ();
}
MacStation::~MacStation ()
{}
@@ -119,5 +127,112 @@ MacStation::RecordDisassociated (void)
m_state = DISASSOC;
}
void
MacStation::ResetModes (void)
{
m_rates.clear ();
AddBasicMode (m_defaultTxMode);
}
void
MacStation::AddBasicMode (WifiMode mode)
{
if (IsIn (mode))
{
return;
}
m_rates.push_back (WifiRate (mode, true));
}
void
MacStation::AddExtendedMode (WifiMode mode)
{
if (IsIn (mode))
{
return;
}
m_rates.push_back (WifiRate (mode, false));
}
bool
MacStation::IsIn (WifiMode mode) const
{
for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
{
if (i->mode == mode)
{
return true;
}
}
return false;
}
WifiMode
MacStation::GetControlAnswerMode (WifiMode reqMode)
{
/**
* see ieee 802.11e, section 9.6:
*
* To allow the transmitting STA to calculate the contents of
* the Duration/ID field, a STA responding to a received frame
* shall transmit its Control Response frame (either CTS or ACK)
* frames, other than the Block-Ack control frame, at the highest
* rate in the BSSBasicRateSet parameter that is less than or equal
* to the rate of the immediately previous frame in the frame
* exchange sequence (as defined in 9.79.12) and that is of the
* same modulation type as the received frame. If no rate in the
* basic rate set meets these conditions, then the control frame
* sent in response to a received frame shall be transmitted at
* the highest mandatory rate of the PHY that is less than or equal
* to the rate of the received frame, and that is of the same
* modulation type as the received frame. In addition, the Control
* Response frame shall be sent using the same PHY options as the
* received frame, unless they conflict with the requirement to use
* the BSSBasicRateSet parameter.
*/
WifiMode mode = m_defaultTxMode;
bool found = false;
// First, search the BSS Basic Rate set
for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
{
if (i->mode.GetPhyRate () > mode.GetPhyRate () &&
i->mode.GetPhyRate () <= reqMode.GetPhyRate () &&
i->mode.GetModulationType () == reqMode.GetModulationType () &&
i->isBasic)
{
mode = i->mode;
found = true;
}
}
if (found)
{
return mode;
}
// Then, search the mandatory rates.
for (WifiRates::const_iterator i = m_rates.begin (); i != m_rates.end (); i++)
{
if (i->mode.GetPhyRate () > mode.GetPhyRate () &&
i->mode.GetPhyRate () <= reqMode.GetPhyRate () &&
i->mode.GetModulationType () == reqMode.GetModulationType () &&
i->mode.IsMandatory ())
{
mode = i->mode;
}
}
return mode;
}
WifiMode
MacStation::GetCtsMode (WifiMode rtsMode)
{
return GetControlAnswerMode (rtsMode);
}
WifiMode
MacStation::GetAckMode (WifiMode dataMode)
{
return GetControlAnswerMode (dataMode);
}
} // namespace ns3

View File

@@ -24,6 +24,7 @@
#include <list>
#include <utility>
#include "ns3/mac48-address.h"
#include "wifi-mode.h"
namespace ns3 {
@@ -31,7 +32,7 @@ class MacStation;
class MacStations {
public:
MacStations ();
MacStations (WifiMode defaultTxMode);
virtual ~MacStations ();
MacStation *Lookup (Mac48Address address);
@@ -39,9 +40,10 @@ public:
private:
typedef std::list <std::pair<Mac48Address, MacStation *> > Stations;
typedef std::list <std::pair<Mac48Address, MacStation *> >::iterator StationsI;
virtual class MacStation *CreateStation (void) = 0;
virtual class MacStation *CreateStation (WifiMode mode) = 0;
Stations m_stations;
MacStation *m_nonUnicast;
WifiMode m_defaultTxMode;
};
} // namespace ns3
@@ -50,10 +52,13 @@ namespace ns3 {
class MacStation {
public:
MacStation ();
MacStation (WifiMode defaultTxMode);
virtual ~MacStation ();
void ResetModes (void);
void AddBasicMode (WifiMode mode);
void AddExtendedMode (WifiMode mode);
bool IsAssociated (void) const;
bool IsWaitAssocTxOk (void) const;
void RecordWaitAssocTxOk (void);
@@ -62,23 +67,38 @@ public:
void RecordDisassociated (void);
// reception-related method
virtual void ReportRxOk (double rxSnr, uint8_t txMode) = 0;
virtual void ReportRxOk (double rxSnr, WifiMode txMode) = 0;
// transmission-related methods
virtual void ReportRtsFailed (void) = 0;
virtual void ReportDataFailed (void) = 0;
virtual void ReportRtsOk (double ctsSnr, uint8_t ctsMode, uint8_t rtsSnr) = 0;
virtual void ReportDataOk (double ackSnr, uint8_t ackMode, uint8_t dataSnr) = 0;
virtual uint8_t GetDataMode (int size) = 0;
virtual uint8_t GetRtsMode (void) = 0;
virtual uint8_t SnrToSnr (double snr) = 0;
virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0;
virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) = 0;
virtual WifiMode GetDataMode (uint32_t size) = 0;
virtual WifiMode GetRtsMode (void) = 0;
WifiMode GetCtsMode (WifiMode rtsMode);
WifiMode GetAckMode (WifiMode dataMode);
private:
struct WifiRate {
WifiRate (WifiMode mode, bool isBasic);
WifiMode mode;
bool isBasic;
};
typedef std::vector<struct WifiRate> WifiRates;
protected:
private:
bool IsIn (WifiMode mode) const;
WifiMode GetControlAnswerMode (WifiMode reqMode);
enum {
DISASSOC,
WAIT_ASSOC_TX_OK,
GOT_ASSOC_TX_OK
} m_state;
WifiRates m_rates;
WifiMode m_defaultTxMode;
};
} // namespace ns3