diff --git a/src/devices/wifi/adhoc-wifi-mac.cc b/src/devices/wifi/adhoc-wifi-mac.cc index a67f10ecd..7a7cd7f8a 100644 --- a/src/devices/wifi/adhoc-wifi-mac.cc +++ b/src/devices/wifi/adhoc-wifi-mac.cc @@ -168,13 +168,13 @@ AdhocWifiMac::SetSsid (Ssid ssid) } void -AdhocWifiMac::Enqueue (Ptr packet, Mac48Address to) +AdhocWifiMac::Enqueue (Ptr packet, Mac48Address to, Mac48Address from) { - NS_LOG_DEBUG ("enqueue size="<GetSize ()<<", to="<GetSize () << to << from); WifiMacHeader hdr; hdr.SetType (WIFI_MAC_DATA); hdr.SetAddr1 (to); - hdr.SetAddr2 (GetAddress ()); + hdr.SetAddr2 (from); hdr.SetAddr3 (GetBssid ()); hdr.SetDsNotFrom (); hdr.SetDsNotTo (); diff --git a/src/devices/wifi/adhoc-wifi-mac.h b/src/devices/wifi/adhoc-wifi-mac.h index b8072b6ce..2b5c543dd 100644 --- a/src/devices/wifi/adhoc-wifi-mac.h +++ b/src/devices/wifi/adhoc-wifi-mac.h @@ -61,7 +61,7 @@ public: virtual Time GetEifsNoDifs (void) const; virtual void SetWifiPhy (Ptr phy); virtual void SetWifiRemoteStationManager (Ptr stationManager); - virtual void Enqueue (Ptr packet, Mac48Address to); + virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); diff --git a/src/devices/wifi/nqap-wifi-mac.cc b/src/devices/wifi/nqap-wifi-mac.cc index d40df21f1..b9dac738f 100644 --- a/src/devices/wifi/nqap-wifi-mac.cc +++ b/src/devices/wifi/nqap-wifi-mac.cc @@ -262,10 +262,10 @@ NqapWifiMac::ForwardDown (Ptr packet, Mac48Address from, Mac48Addr m_dca->Queue (packet, hdr); } void -NqapWifiMac::Enqueue (Ptr packet, Mac48Address to) +NqapWifiMac::Enqueue (Ptr packet, Mac48Address to, Mac48Address from) { - NS_LOG_FUNCTION (this << packet << to); - ForwardDown (packet, GetAddress (), to); + NS_LOG_FUNCTION (this << packet << to << from); + ForwardDown (packet, from, to); } SupportedRates NqapWifiMac::GetSupportedRates (void) const diff --git a/src/devices/wifi/nqap-wifi-mac.h b/src/devices/wifi/nqap-wifi-mac.h index 52cd76705..3863edace 100644 --- a/src/devices/wifi/nqap-wifi-mac.h +++ b/src/devices/wifi/nqap-wifi-mac.h @@ -67,7 +67,7 @@ public: virtual Time GetEifsNoDifs (void) const; virtual void SetWifiPhy (Ptr phy); virtual void SetWifiRemoteStationManager (Ptr stationManager); - virtual void Enqueue (Ptr packet, Mac48Address to); + virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); diff --git a/src/devices/wifi/nqsta-wifi-mac.cc b/src/devices/wifi/nqsta-wifi-mac.cc index 16cc98eb8..e8539e0ff 100644 --- a/src/devices/wifi/nqsta-wifi-mac.cc +++ b/src/devices/wifi/nqsta-wifi-mac.cc @@ -409,7 +409,7 @@ NqstaWifiMac::IsAssociated (void) } void -NqstaWifiMac::Enqueue (Ptr packet, Mac48Address to) +NqstaWifiMac::Enqueue (Ptr packet, Mac48Address to, Mac48Address from) { NS_LOG_FUNCTION (this << packet << to); if (!IsAssociated ()) @@ -421,7 +421,7 @@ NqstaWifiMac::Enqueue (Ptr packet, Mac48Address to) WifiMacHeader hdr; hdr.SetTypeData (); hdr.SetAddr1 (GetBssid ()); - hdr.SetAddr2 (GetAddress ()); + hdr.SetAddr2 (from); hdr.SetAddr3 (to); hdr.SetDsNotFrom (); hdr.SetDsTo (); diff --git a/src/devices/wifi/nqsta-wifi-mac.h b/src/devices/wifi/nqsta-wifi-mac.h index a0aaf0fe7..1d30c44f6 100644 --- a/src/devices/wifi/nqsta-wifi-mac.h +++ b/src/devices/wifi/nqsta-wifi-mac.h @@ -67,7 +67,7 @@ public: virtual Time GetEifsNoDifs (void) const; virtual void SetWifiPhy (Ptr phy); virtual void SetWifiRemoteStationManager (Ptr stationManager); - virtual void Enqueue (Ptr packet, Mac48Address to); + virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); diff --git a/src/devices/wifi/wifi-mac.h b/src/devices/wifi/wifi-mac.h index 0bdc5dbcf..6a9810f49 100644 --- a/src/devices/wifi/wifi-mac.h +++ b/src/devices/wifi/wifi-mac.h @@ -148,7 +148,7 @@ private: * dequeued as soon as the DCF function determines that * access it granted to this MAC. */ - virtual void Enqueue (Ptr packet, Mac48Address to) = 0; + virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from) = 0; /** * \param phy the physical layer attached to this MAC. */ diff --git a/src/devices/wifi/wifi-net-device.cc b/src/devices/wifi/wifi-net-device.cc index 7f2848540..1148b7783 100644 --- a/src/devices/wifi/wifi-net-device.cc +++ b/src/devices/wifi/wifi-net-device.cc @@ -280,7 +280,7 @@ WifiNetDevice::Send(Ptr packet, const Address& dest, uint16_t protocolNu m_txLogger (packet, realTo); - m_mac->Enqueue (packet, realTo); + m_mac->Enqueue (packet, realTo, m_mac->GetAddress ()); return true; } Ptr @@ -335,8 +335,21 @@ WifiNetDevice::LinkDown (void) bool WifiNetDevice::SendFrom (Ptr packet, const Address& source, const Address& dest, uint16_t protocolNumber) { - NS_FATAL_ERROR ("TODO"); - return false; + NS_ASSERT (Mac48Address::IsMatchingType (dest)); + NS_ASSERT (Mac48Address::IsMatchingType (source)); + + Mac48Address realTo = Mac48Address::ConvertFrom (dest); + Mac48Address realFrom = Mac48Address::ConvertFrom (source); + + LlcSnapHeader llc; + llc.SetType (protocolNumber); + packet->AddHeader (llc); + + m_txLogger (packet, realTo); + + m_mac->Enqueue (packet, realTo, realFrom); + + return true; } void