00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef WIFI_REMOTE_STATION_MANAGER_H
00021 #define WIFI_REMOTE_STATION_MANAGER_H
00022
00023 #include <vector>
00024 #include <utility>
00025 #include "ns3/mac48-address.h"
00026 #include "ns3/packet.h"
00027 #include "ns3/object.h"
00028 #include "ns3/traced-value.h"
00029 #include "wifi-mode.h"
00030
00031 namespace ns3 {
00032
00033 class WifiRemoteStation;
00034 class NonUnicastWifiRemoteStation;
00035 class WifiPhy;
00036
00037
00038
00039
00040
00041
00042 class WifiRemoteStationManager : public Object
00043 {
00044 private:
00045 typedef std::vector<WifiMode> BasicModes;
00046 public:
00047 typedef BasicModes::const_iterator BasicModesIterator;
00048
00049 static TypeId GetTypeId (void);
00050
00051 WifiRemoteStationManager ();
00052 virtual ~WifiRemoteStationManager ();
00053
00054 virtual void SetupPhy (Ptr<WifiPhy> phy);
00055
00056 uint32_t GetMaxSsrc (void) const;
00057 uint32_t GetMaxSlrc (void) const;
00058 uint32_t GetRtsCtsThreshold (void) const;
00059 uint32_t GetFragmentationThreshold (void) const;
00060 void SetMaxSsrc (uint32_t maxSsrc);
00061 void SetMaxSlrc (uint32_t maxSlrc);
00062 void SetRtsCtsThreshold (uint32_t threshold);
00063 void SetFragmentationThreshold (uint32_t threshold);
00064
00065
00066
00067 void Reset (void);
00068
00069
00070
00071
00072
00073 void AddBasicMode (WifiMode mode);
00074
00075 WifiMode GetDefaultMode (void) const;
00076 uint32_t GetNBasicModes (void) const;
00077 WifiMode GetBasicMode (uint32_t i) const;
00078 BasicModesIterator BeginBasicModes (void) const;
00079 BasicModesIterator EndBasicModes (void) const;
00080
00081 bool IsLowLatency (void) const;
00082
00083 WifiRemoteStation *Lookup (Mac48Address address);
00084 WifiRemoteStation *LookupNonUnicast (void);
00085 protected:
00086 friend class WifiRemoteStation;
00087 virtual void DoDispose (void);
00088 private:
00089 typedef std::vector <std::pair<Mac48Address, WifiRemoteStation *> > Stations;
00090 virtual class WifiRemoteStation *CreateStation (void) = 0;
00091 Stations m_stations;
00092 WifiMode m_defaultTxMode;
00093 NonUnicastWifiRemoteStation *m_nonUnicast;
00094 BasicModes m_basicModes;
00095 bool m_isLowLatency;
00096 uint32_t m_maxSsrc;
00097 uint32_t m_maxSlrc;
00098 uint32_t m_rtsCtsThreshold;
00099 uint32_t m_fragmentationThreshold;
00100 };
00101
00102 }
00103
00104 namespace ns3 {
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 class WifiRemoteStation {
00115 public:
00116
00117 static TypeId GetTypeId (void);
00118
00119 WifiRemoteStation ();
00120 virtual ~WifiRemoteStation ();
00121
00122
00123
00124
00125
00126 void Reset (void);
00127
00128
00129
00130
00131
00132
00133
00134 void AddSupportedMode (WifiMode mode);
00135
00136 bool IsBrandNew (void) const;
00137 bool IsAssociated (void) const;
00138 bool IsWaitAssocTxOk (void) const;
00139 void RecordWaitAssocTxOk (void);
00140 void RecordGotAssocTxOk (void);
00141 void RecordGotAssocTxFailed (void);
00142 void RecordDisassociated (void);
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 void PrepareForQueue (Ptr<const Packet> packet, uint32_t fullPacketSize);
00154
00155
00156
00157
00158
00159 WifiMode GetDataMode (Ptr<const Packet> packet, uint32_t fullPacketSize);
00160
00161
00162
00163
00164
00165 WifiMode GetRtsMode (Ptr<const Packet> packet);
00166
00167
00168
00169
00170 void ReportRtsFailed (void);
00171
00172
00173
00174
00175 void ReportDataFailed (void);
00176
00177
00178
00179
00180 void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr);
00181
00182
00183
00184
00185 void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr);
00186
00187
00188
00189
00190 void ReportFinalRtsFailed (void);
00191
00192
00193
00194
00195 void ReportFinalDataFailed (void);
00196
00197
00198
00199
00200
00201
00202
00203 void ReportRxOk (double rxSnr, WifiMode txMode);
00204
00205
00206
00207
00208
00209
00210 virtual bool NeedRts (Ptr<const Packet> packet);
00211
00212
00213
00214
00215
00216 virtual bool NeedRtsRetransmission (Ptr<const Packet> packet);
00217
00218
00219
00220
00221
00222 virtual bool NeedDataRetransmission (Ptr<const Packet> packet);
00223
00224
00225
00226
00227
00228 virtual bool NeedFragmentation (Ptr<const Packet> packet);
00229
00230
00231
00232
00233
00234 virtual uint32_t GetFragmentSize (Ptr<const Packet> packet, uint32_t fragmentNumber);
00235
00236
00237
00238
00239
00240 virtual uint32_t GetFragmentOffset (Ptr<const Packet> packet, uint32_t fragmentNumber);
00241
00242
00243
00244
00245
00246 virtual bool IsLastFragment (Ptr<const Packet> packet, uint32_t fragmentNumber);
00247
00248
00249
00250
00251
00252
00253 WifiMode GetCtsMode (WifiMode rtsMode);
00254
00255
00256
00257
00258
00259 WifiMode GetAckMode (WifiMode dataMode);
00260
00261 private:
00262 typedef std::vector<WifiMode> SupportedModes;
00263 virtual Ptr<WifiRemoteStationManager> GetManager (void) const = 0;
00264 virtual WifiMode DoGetDataMode (uint32_t size) = 0;
00265 virtual WifiMode DoGetRtsMode (void) = 0;
00266 uint32_t GetNFragments (Ptr<const Packet> packet);
00267 protected:
00268 virtual void DoReportRtsFailed (void) = 0;
00269 virtual void DoReportDataFailed (void) = 0;
00270 virtual void DoReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0;
00271 virtual void DoReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) = 0;
00272 virtual void DoReportFinalRtsFailed (void) = 0;
00273 virtual void DoReportFinalDataFailed (void) = 0;
00274 virtual void DoReportRxOk (double rxSnr, WifiMode txMode) = 0;
00275 uint32_t GetNSupportedModes (void) const;
00276 WifiMode GetSupportedMode (uint32_t i) const;
00277 private:
00278 bool IsIn (WifiMode mode) const;
00279 WifiMode GetControlAnswerMode (WifiMode reqMode);
00280 enum {
00281 BRAND_NEW,
00282 DISASSOC,
00283 WAIT_ASSOC_TX_OK,
00284 GOT_ASSOC_TX_OK
00285 } m_state;
00286 SupportedModes m_modes;
00287 TracedValue<uint32_t> m_ssrc;
00288 TracedValue<uint32_t> m_slrc;
00289 };
00290
00291 }
00292
00293 #endif