00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "adhoc-wifi-mac.h"
00022 #include "dca-txop.h"
00023 #include "mac-low.h"
00024 #include "mac-rx-middle.h"
00025 #include "wifi-phy.h"
00026 #include "dcf-manager.h"
00027 #include "ns3/packet.h"
00028 #include "ns3/log.h"
00029
00030 NS_LOG_COMPONENT_DEFINE ("AdhocWifiMac");
00031
00032 namespace ns3 {
00033
00034 NS_OBJECT_ENSURE_REGISTERED (AdhocWifiMac);
00035
00036 #undef NS_LOG_APPEND_CONTEXT
00037 #define NS_LOG_APPEND_CONTEXT if (m_low != 0) {std::clog << "[mac=" << m_low->GetAddress () << "] ";}
00038
00039 TypeId
00040 AdhocWifiMac::GetTypeId (void)
00041 {
00042 static TypeId tid = TypeId ("ns3::AdhocWifiMac")
00043 .SetParent<WifiMac> ()
00044 .AddConstructor<AdhocWifiMac> ()
00045 ;
00046 return tid;
00047 }
00048
00049 AdhocWifiMac::AdhocWifiMac ()
00050 {
00051 m_rxMiddle = new MacRxMiddle ();
00052 m_rxMiddle->SetForwardCallback (MakeCallback (&AdhocWifiMac::ForwardUp, this));
00053
00054 m_low = CreateObject<MacLow> ();
00055 m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle));
00056 m_low->SetBssid (GetBssid ());
00057
00058 m_dcfManager = new DcfManager ();
00059 m_dcfManager->SetupLowListener (m_low);
00060
00061 m_dca = CreateObject<DcaTxop> ();
00062 m_dca->SetLow (m_low);
00063 m_dca->SetManager (m_dcfManager);
00064 }
00065 AdhocWifiMac::~AdhocWifiMac ()
00066 {}
00067
00068 void
00069 AdhocWifiMac::DoDispose (void)
00070 {
00071 delete m_rxMiddle;
00072 delete m_dcfManager;
00073 m_rxMiddle = 0;
00074 m_dcfManager = 0;
00075 m_low = 0;
00076 m_phy = 0;
00077 m_dca = 0;
00078 m_stationManager = 0;
00079 WifiMac::DoDispose ();
00080 }
00081
00082 void
00083 AdhocWifiMac::SetSlot (Time slotTime)
00084 {
00085 m_dcfManager->SetSlot (slotTime);
00086 m_low->SetSlotTime (slotTime);
00087 }
00088 void
00089 AdhocWifiMac::SetSifs (Time sifs)
00090 {
00091 m_dcfManager->SetSifs (sifs);
00092 m_low->SetSifs (sifs);
00093 }
00094 void
00095 AdhocWifiMac::SetEifsNoDifs (Time eifsNoDifs)
00096 {
00097 m_dcfManager->SetEifsNoDifs (eifsNoDifs);
00098 m_eifsNoDifs = eifsNoDifs;
00099 }
00100 void
00101 AdhocWifiMac::SetAckTimeout (Time ackTimeout)
00102 {
00103 m_low->SetAckTimeout (ackTimeout);
00104 }
00105 void
00106 AdhocWifiMac::SetCtsTimeout (Time ctsTimeout)
00107 {
00108 m_low->SetCtsTimeout (ctsTimeout);
00109 }
00110 void
00111 AdhocWifiMac::SetPifs (Time pifs)
00112 {
00113 m_low->SetPifs (pifs);
00114 }
00115 Time
00116 AdhocWifiMac::GetSlot (void) const
00117 {
00118 return m_low->GetSlotTime ();
00119 }
00120 Time
00121 AdhocWifiMac::GetSifs (void) const
00122 {
00123 return m_low->GetSifs ();
00124 }
00125 Time
00126 AdhocWifiMac::GetEifsNoDifs (void) const
00127 {
00128 return m_eifsNoDifs;
00129 }
00130 Time
00131 AdhocWifiMac::GetAckTimeout (void) const
00132 {
00133 return m_low->GetAckTimeout ();
00134 }
00135 Time
00136 AdhocWifiMac::GetCtsTimeout (void) const
00137 {
00138 return m_low->GetCtsTimeout ();
00139 }
00140 Time
00141 AdhocWifiMac::GetPifs (void) const
00142 {
00143 return m_low->GetPifs ();
00144 }
00145 void
00146 AdhocWifiMac::SetWifiPhy (Ptr<WifiPhy> phy)
00147 {
00148 m_phy = phy;
00149 m_dcfManager->SetupPhyListener (phy);
00150 m_low->SetPhy (phy);
00151 }
00152 void
00153 AdhocWifiMac::SetWifiRemoteStationManager (Ptr<WifiRemoteStationManager> stationManager)
00154 {
00155 m_stationManager = stationManager;
00156 m_dca->SetWifiRemoteStationManager (stationManager);
00157 m_low->SetWifiRemoteStationManager (stationManager);
00158 }
00159 void
00160 AdhocWifiMac::SetForwardUpCallback (Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> upCallback)
00161 {
00162 m_upCallback = upCallback;
00163 }
00164 void
00165 AdhocWifiMac::SetLinkUpCallback (Callback<void> linkUp)
00166 {
00167
00168 linkUp ();
00169 }
00170 void
00171 AdhocWifiMac::SetLinkDownCallback (Callback<void> linkDown)
00172 {}
00173 Mac48Address
00174 AdhocWifiMac::GetAddress (void) const
00175 {
00176 return m_low->GetAddress ();
00177 }
00178 Ssid
00179 AdhocWifiMac::GetSsid (void) const
00180 {
00181 return m_ssid;
00182 }
00183 Mac48Address
00184 AdhocWifiMac::GetBssid (void) const
00185 {
00186 return m_low->GetBssid ();
00187 }
00188 void
00189 AdhocWifiMac::SetAddress (Mac48Address address)
00190 {
00191 m_low->SetAddress (address);
00192 m_low->SetBssid (address);
00193
00194
00195 }
00196 void
00197 AdhocWifiMac::SetSsid (Ssid ssid)
00198 {
00199
00200 m_ssid = ssid;
00201 }
00202
00203 void
00204 AdhocWifiMac::Enqueue (Ptr<const Packet> packet, Mac48Address to, Mac48Address from)
00205 {
00206 NS_FATAL_ERROR ("Adhoc does not support a from != m_low->GetAddress ()");
00207 }
00208 void
00209 AdhocWifiMac::Enqueue (Ptr<const Packet> packet, Mac48Address to)
00210 {
00211 NS_LOG_FUNCTION (packet->GetSize () << to);
00212 WifiMacHeader hdr;
00213 hdr.SetType (WIFI_MAC_DATA);
00214 hdr.SetAddr1 (to);
00215 hdr.SetAddr2 (m_low->GetAddress ());
00216 hdr.SetAddr3 (GetBssid ());
00217 hdr.SetDsNotFrom ();
00218 hdr.SetDsNotTo ();
00219
00220 WifiRemoteStation *destination = m_stationManager->Lookup (to);
00221 if (destination->IsBrandNew ())
00222 {
00223
00224
00225 for (uint32_t i = 0; i < m_phy->GetNModes (); i++)
00226 {
00227 destination->AddSupportedMode (m_phy->GetMode (i));
00228 }
00229 destination->RecordDisassociated ();
00230 }
00231
00232 m_dca->Queue (packet, hdr);
00233 }
00234 bool
00235 AdhocWifiMac::SupportsSendFrom (void) const
00236 {
00237 return false;
00238 }
00239
00240 void
00241 AdhocWifiMac::ForwardUp (Ptr<Packet> packet, WifiMacHeader const *hdr)
00242 {
00243 NS_LOG_DEBUG ("received size="<<packet->GetSize ()<<", from="<<hdr->GetAddr2 ());
00244 m_upCallback (packet, hdr->GetAddr2 (), hdr->GetAddr1 ());
00245 }
00246
00247 }