00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef NQSTA_WIFI_MAC_H
00021 #define NQSTA_WIFI_MAC_H
00022
00023 #include <stdint.h>
00024
00025 #include "ns3/mac48-address.h"
00026 #include "ns3/callback.h"
00027 #include "ns3/event-id.h"
00028 #include "ns3/packet.h"
00029 #include "ns3/nstime.h"
00030
00031 #include "wifi-mac.h"
00032 #include "supported-rates.h"
00033
00034 namespace ns3 {
00035
00036 class WifiMacHeader;
00037 class DcaTxop;
00038 class WifiPhy;
00039 class DcfManager;
00040 class MacLow;
00041 class MacRxMiddle;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 class NqstaWifiMac : public WifiMac
00054 {
00055 public:
00056 static TypeId GetTypeId (void);
00057
00058 NqstaWifiMac ();
00059 ~NqstaWifiMac ();
00060
00061
00062 virtual void SetSlot (Time slotTime);
00063 virtual void SetSifs (Time sifs);
00064 virtual void SetEifsNoDifs (Time eifsNoDifs);
00065 virtual void SetAckTimeout (Time ackTimeout);
00066 virtual void SetCtsTimeout (Time ctsTimeout);
00067 virtual void SetPifs (Time pifs);
00068 virtual Time GetSlot (void) const;
00069 virtual Time GetSifs (void) const;
00070 virtual Time GetEifsNoDifs (void) const;
00071 virtual Time GetAckTimeout (void) const;
00072 virtual Time GetCtsTimeout (void) const;
00073 virtual Time GetPifs (void) const;
00074 virtual void SetWifiPhy (Ptr<WifiPhy> phy);
00075 virtual void SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager);
00076 virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to, Mac48Address from);
00077 virtual void Enqueue (Ptr<const Packet> packet, Mac48Address to);
00078 virtual bool SupportsSendFrom (void) const;
00079 virtual void SetForwardUpCallback (Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> upCallback);
00080 virtual void SetLinkUpCallback (Callback<void> linkUp);
00081 virtual void SetLinkDownCallback (Callback<void> linkDown);
00082 virtual Mac48Address GetAddress (void) const;
00083 virtual Ssid GetSsid (void) const;
00084 virtual void SetAddress (Mac48Address address);
00085 virtual void SetSsid (Ssid ssid);
00086 virtual Mac48Address GetBssid (void) const;
00087
00088
00089
00090
00091
00092 void SetMaxMissedBeacons (uint32_t missed);
00093
00094
00095
00096
00097
00098
00099 void SetProbeRequestTimeout (Time timeout);
00100
00101
00102
00103
00104
00105
00106 void SetAssocRequestTimeout (Time timeout);
00107
00108
00109
00110
00111 void StartActiveAssociation (void);
00112
00113 private:
00114 void SetBssid (Mac48Address bssid);
00115 void SetActiveProbing (bool enable);
00116 bool GetActiveProbing (void) const;
00117 void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
00118 void Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
00119 Mac48Address GetBroadcastBssid (void);
00120 void SendProbeRequest (void);
00121 void SendAssociationRequest (void);
00122 void TryToEnsureAssociated (void);
00123 void AssocRequestTimeout (void);
00124 void ProbeRequestTimeout (void);
00125 bool IsAssociated (void);
00126 void MissedBeacons (void);
00127 void RestartBeaconWatchdog (Time delay);
00128 SupportedRates GetSupportedRates (void) const;
00129 virtual void DoDispose (void);
00130 NqstaWifiMac (const NqstaWifiMac & ctor_arg);
00131 NqstaWifiMac &operator = (const NqstaWifiMac & ctor_arg);
00132
00133 enum {
00134 ASSOCIATED,
00135 WAIT_PROBE_RESP,
00136 WAIT_ASSOC_RESP,
00137 BEACON_MISSED,
00138 REFUSED
00139 } m_state;
00140 Time m_probeRequestTimeout;
00141 Time m_assocRequestTimeout;
00142 EventId m_probeRequestEvent;
00143 EventId m_assocRequestEvent;
00144 Callback<void, Ptr<Packet>, Mac48Address, Mac48Address> m_forwardUp;
00145 Callback<void> m_linkUp;
00146 Callback<void> m_linkDown;
00147 Ptr<DcaTxop> m_dca;
00148 EventId m_beaconWatchdog;
00149 Time m_beaconWatchdogEnd;
00150 uint32_t m_maxMissedBeacons;
00151
00152 Ptr<WifiPhy> m_phy;
00153 Ptr<WifiRemoteStationManager> m_stationManager;
00154 DcfManager *m_dcfManager;
00155 MacRxMiddle *m_rxMiddle;
00156 Ptr<MacLow> m_low;
00157 Ssid m_ssid;
00158 Time m_eifsNoDifs;
00159 };
00160
00161 }
00162
00163
00164 #endif