diff --git a/bindings/python/callbacks_list.py b/bindings/python/callbacks_list.py index 021f571b9..2ee31e7b7 100644 --- a/bindings/python/callbacks_list.py +++ b/bindings/python/callbacks_list.py @@ -4,7 +4,7 @@ callback_classes = [ ['void', 'ns3::Ptr', 'unsigned int', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'], ['void', 'ns3::Ptr', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'], ['bool', 'ns3::Ptr', 'ns3::Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'], - ['void', 'ns3::Ptr', 'ns3::Mac48Address const&', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'], + ['void', 'ns3::Ptr', 'ns3::Mac48Address', 'ns3::Mac48Address', 'ns3::empty', 'ns3::empty', 'ns3::empty'], ['bool', 'ns3::Ptr', 'ns3::Ptr', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType'], ['bool', 'ns3::Ptr', 'ns3::Ptr', 'unsigned short', 'ns3::Address const&', 'ns3::empty', 'ns3::empty'], ['void', 'ns3::Ptr', 'ns3::Ptr', 'unsigned short', 'ns3::Address const&', 'ns3::Address const&', 'ns3::NetDevice::PacketType'], diff --git a/bindings/python/ns3_module_wifi.py b/bindings/python/ns3_module_wifi.py index dbb091e42..4a48af878 100644 --- a/bindings/python/ns3_module_wifi.py +++ b/bindings/python/ns3_module_wifi.py @@ -1099,6 +1099,16 @@ def register_Ns3WifiMac_methods(root_module, cls): 'void', [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], is_pure_virtual=True, visibility='private', is_virtual=True) + ## wifi-mac.h: void ns3::WifiMac::Enqueue(ns3::Ptr packet, ns3::Mac48Address to) [member function] + cls.add_method('Enqueue', + 'void', + [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], + is_pure_virtual=True, visibility='private', is_virtual=True) + ## wifi-mac.h: bool ns3::WifiMac::SupportsSendFrom() const [member function] + cls.add_method('SupportsSendFrom', + 'bool', + [], + is_pure_virtual=True, is_const=True, visibility='private', is_virtual=True) ## wifi-mac.h: void ns3::WifiMac::SetWifiPhy(ns3::Ptr phy) [member function] cls.add_method('SetWifiPhy', 'void', @@ -1109,10 +1119,10 @@ def register_Ns3WifiMac_methods(root_module, cls): 'void', [param('ns3::Ptr< ns3::WifiRemoteStationManager >', 'stationManager')], is_pure_virtual=True, visibility='private', is_virtual=True) - ## wifi-mac.h: void ns3::WifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] + ## wifi-mac.h: void ns3::WifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] cls.add_method('SetForwardUpCallback', 'void', - [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], + [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], is_pure_virtual=True, visibility='private', is_virtual=True) ## wifi-mac.h: void ns3::WifiMac::SetLinkUpCallback(ns3::Callback linkUp) [member function] cls.add_method('SetLinkUpCallback', @@ -1209,10 +1219,20 @@ def register_Ns3NqapWifiMac_methods(root_module, cls): 'void', [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], is_virtual=True) - ## nqap-wifi-mac.h: void ns3::NqapWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] + ## nqap-wifi-mac.h: void ns3::NqapWifiMac::Enqueue(ns3::Ptr packet, ns3::Mac48Address to) [member function] + cls.add_method('Enqueue', + 'void', + [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], + is_virtual=True) + ## nqap-wifi-mac.h: bool ns3::NqapWifiMac::SupportsSendFrom() const [member function] + cls.add_method('SupportsSendFrom', + 'bool', + [], + is_const=True, is_virtual=True) + ## nqap-wifi-mac.h: void ns3::NqapWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] cls.add_method('SetForwardUpCallback', 'void', - [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], + [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], is_virtual=True) ## nqap-wifi-mac.h: void ns3::NqapWifiMac::SetLinkUpCallback(ns3::Callback linkUp) [member function] cls.add_method('SetLinkUpCallback', @@ -1430,10 +1450,20 @@ def register_Ns3AdhocWifiMac_methods(root_module, cls): 'void', [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], is_virtual=True) - ## adhoc-wifi-mac.h: void ns3::AdhocWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] + ## adhoc-wifi-mac.h: void ns3::AdhocWifiMac::Enqueue(ns3::Ptr packet, ns3::Mac48Address to) [member function] + cls.add_method('Enqueue', + 'void', + [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], + is_virtual=True) + ## adhoc-wifi-mac.h: bool ns3::AdhocWifiMac::SupportsSendFrom() const [member function] + cls.add_method('SupportsSendFrom', + 'bool', + [], + is_const=True, is_virtual=True) + ## adhoc-wifi-mac.h: void ns3::AdhocWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] cls.add_method('SetForwardUpCallback', 'void', - [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], + [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], is_virtual=True) ## adhoc-wifi-mac.h: void ns3::AdhocWifiMac::SetLinkUpCallback(ns3::Callback linkUp) [member function] cls.add_method('SetLinkUpCallback', @@ -2279,10 +2309,20 @@ def register_Ns3NqstaWifiMac_methods(root_module, cls): 'void', [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to'), param('ns3::Mac48Address', 'from')], is_virtual=True) - ## nqsta-wifi-mac.h: void ns3::NqstaWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] + ## nqsta-wifi-mac.h: void ns3::NqstaWifiMac::Enqueue(ns3::Ptr packet, ns3::Mac48Address to) [member function] + cls.add_method('Enqueue', + 'void', + [param('ns3::Ptr< const ns3::Packet >', 'packet'), param('ns3::Mac48Address', 'to')], + is_virtual=True) + ## nqsta-wifi-mac.h: bool ns3::NqstaWifiMac::SupportsSendFrom() const [member function] + cls.add_method('SupportsSendFrom', + 'bool', + [], + is_const=True, is_virtual=True) + ## nqsta-wifi-mac.h: void ns3::NqstaWifiMac::SetForwardUpCallback(ns3::Callback, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty> upCallback) [member function] cls.add_method('SetForwardUpCallback', 'void', - [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], + [param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, ns3::Mac48Address, ns3::Mac48Address, ns3::empty, ns3::empty, ns3::empty >', 'upCallback')], is_virtual=True) ## nqsta-wifi-mac.h: void ns3::NqstaWifiMac::SetLinkUpCallback(ns3::Callback linkUp) [member function] cls.add_method('SetLinkUpCallback', diff --git a/src/devices/wifi/adhoc-wifi-mac.cc b/src/devices/wifi/adhoc-wifi-mac.cc index 0f6a86ae8..f0194f56d 100644 --- a/src/devices/wifi/adhoc-wifi-mac.cc +++ b/src/devices/wifi/adhoc-wifi-mac.cc @@ -154,7 +154,7 @@ AdhocWifiMac::SetWifiRemoteStationManager (Ptr station m_low->SetWifiRemoteStationManager (stationManager); } void -AdhocWifiMac::SetForwardUpCallback (Callback, const Mac48Address &> upCallback) +AdhocWifiMac::SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback) { m_upCallback = upCallback; } @@ -237,10 +237,7 @@ void AdhocWifiMac::ForwardUp (Ptr packet, WifiMacHeader const *hdr) { NS_LOG_DEBUG ("received size="<GetSize ()<<", from="<GetAddr2 ()); - if (hdr->GetAddr1 ().IsBroadcast () || hdr->GetAddr1 () == GetAddress ()) - { - m_upCallback (packet, hdr->GetAddr2 ()); - } + m_upCallback (packet, hdr->GetAddr2 (), hdr->GetAddr1 ()); } } // namespace ns3 diff --git a/src/devices/wifi/adhoc-wifi-mac.h b/src/devices/wifi/adhoc-wifi-mac.h index c277da122..7535ca2b0 100644 --- a/src/devices/wifi/adhoc-wifi-mac.h +++ b/src/devices/wifi/adhoc-wifi-mac.h @@ -70,7 +70,7 @@ public: virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void Enqueue (Ptr packet, Mac48Address to); virtual bool SupportsSendFrom (void) const; - virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); + virtual void SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); virtual Mac48Address GetAddress (void) const; @@ -88,7 +88,7 @@ private: Mac48Address GetBssid (void) const; Ptr m_dca; - Callback,const Mac48Address &> m_upCallback; + Callback, Mac48Address, Mac48Address> m_upCallback; Ptr m_stationManager; Ptr m_phy; DcfManager *m_dcfManager; diff --git a/src/devices/wifi/nqap-wifi-mac.cc b/src/devices/wifi/nqap-wifi-mac.cc index 600080382..08067c8a1 100644 --- a/src/devices/wifi/nqap-wifi-mac.cc +++ b/src/devices/wifi/nqap-wifi-mac.cc @@ -209,7 +209,7 @@ NqapWifiMac::SetWifiRemoteStationManager (Ptr stationM m_low->SetWifiRemoteStationManager (stationManager); } void -NqapWifiMac::SetForwardUpCallback (Callback, const Mac48Address &> upCallback) +NqapWifiMac::SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback) { NS_LOG_FUNCTION (this); m_upCallback = upCallback; @@ -266,10 +266,10 @@ NqapWifiMac::StartBeaconing (void) SendOneBeacon (); } void -NqapWifiMac::ForwardUp (Ptr packet, Mac48Address from) +NqapWifiMac::ForwardUp (Ptr packet, Mac48Address from, Mac48Address to) { NS_LOG_FUNCTION (this << packet << from); - m_upCallback (packet, from); + m_upCallback (packet, from, to); } void NqapWifiMac::ForwardDown (Ptr packet, Mac48Address from, Mac48Address to) @@ -430,7 +430,7 @@ NqapWifiMac::Receive (Ptr packet, WifiMacHeader const *hdr) if (hdr->GetAddr3 () == GetAddress ()) { NS_LOG_DEBUG ("frame for me from="<GetAddr2 ()); - ForwardUp (packet, hdr->GetAddr2 ()); + ForwardUp (packet, hdr->GetAddr2 (), hdr->GetAddr1 ()); } else { @@ -439,7 +439,7 @@ NqapWifiMac::Receive (Ptr packet, WifiMacHeader const *hdr) ForwardDown (packet, hdr->GetAddr2 (), hdr->GetAddr3 ()); - ForwardUp (copy, hdr->GetAddr2 ()); + ForwardUp (copy, hdr->GetAddr2 (), hdr->GetAddr1 ()); } } else if (hdr->IsFromDs () && diff --git a/src/devices/wifi/nqap-wifi-mac.h b/src/devices/wifi/nqap-wifi-mac.h index 82bbb3e09..48b9a2e7d 100644 --- a/src/devices/wifi/nqap-wifi-mac.h +++ b/src/devices/wifi/nqap-wifi-mac.h @@ -76,7 +76,7 @@ public: virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void Enqueue (Ptr packet, Mac48Address to); virtual bool SupportsSendFrom (void) const; - virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); + virtual void SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); virtual Mac48Address GetAddress (void) const; @@ -100,7 +100,7 @@ public: private: void Receive (Ptr packet, WifiMacHeader const *hdr); - void ForwardUp (Ptr packet, Mac48Address from); + void ForwardUp (Ptr packet, Mac48Address from, Mac48Address to); void ForwardDown (Ptr packet, Mac48Address from, Mac48Address to); void TxOk (WifiMacHeader const &hdr); void TxFailed (WifiMacHeader const &hdr); @@ -117,7 +117,7 @@ private: Ptr m_beaconDca; Ptr m_stationManager; Ptr m_phy; - Callback,const Mac48Address &> m_upCallback; + Callback,Mac48Address, Mac48Address> m_upCallback; Time m_beaconInterval; DcfManager *m_dcfManager; diff --git a/src/devices/wifi/nqsta-wifi-mac.cc b/src/devices/wifi/nqsta-wifi-mac.cc index 15f6299c3..263b79438 100644 --- a/src/devices/wifi/nqsta-wifi-mac.cc +++ b/src/devices/wifi/nqsta-wifi-mac.cc @@ -207,7 +207,7 @@ NqstaWifiMac::SetWifiRemoteStationManager (Ptr station m_low->SetWifiRemoteStationManager (stationManager); } void -NqstaWifiMac::SetForwardUpCallback (Callback, const Mac48Address &> upCallback) +NqstaWifiMac::SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback) { m_forwardUp = upCallback; } @@ -301,10 +301,10 @@ NqstaWifiMac::SetActiveProbing (bool enable) } } void -NqstaWifiMac::ForwardUp (Ptr packet, const Mac48Address &address) +NqstaWifiMac::ForwardUp (Ptr packet, Mac48Address from, Mac48Address to) { - NS_LOG_FUNCTION (this << packet << address); - m_forwardUp (packet, address); + NS_LOG_FUNCTION (this << packet << from << to); + m_forwardUp (packet, from, to); } void NqstaWifiMac::SendProbeRequest (void) @@ -480,7 +480,7 @@ NqstaWifiMac::Receive (Ptr packet, WifiMacHeader const *hdr) } else if (hdr->IsData ()) { - ForwardUp (packet, hdr->GetAddr2 ()); + ForwardUp (packet, hdr->GetAddr2 (), hdr->GetAddr1 ()); } else if (hdr->IsProbeReq () || hdr->IsAssocReq ()) diff --git a/src/devices/wifi/nqsta-wifi-mac.h b/src/devices/wifi/nqsta-wifi-mac.h index 47ba69928..31835ce1e 100644 --- a/src/devices/wifi/nqsta-wifi-mac.h +++ b/src/devices/wifi/nqsta-wifi-mac.h @@ -76,7 +76,7 @@ public: virtual void Enqueue (Ptr packet, Mac48Address to, Mac48Address from); virtual void Enqueue (Ptr packet, Mac48Address to); virtual bool SupportsSendFrom (void) const; - virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback); + virtual void SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback); virtual void SetLinkUpCallback (Callback linkUp); virtual void SetLinkDownCallback (Callback linkDown); virtual Mac48Address GetAddress (void) const; @@ -114,7 +114,7 @@ private: void SetBssid (Mac48Address bssid); void SetActiveProbing (bool enable); bool GetActiveProbing (void) const; - void ForwardUp (Ptr packet, const Mac48Address &address); + void ForwardUp (Ptr packet, Mac48Address from, Mac48Address to); void Receive (Ptr packet, WifiMacHeader const *hdr); Mac48Address GetBroadcastBssid (void); void SendProbeRequest (void); @@ -141,7 +141,7 @@ private: Time m_assocRequestTimeout; EventId m_probeRequestEvent; EventId m_assocRequestEvent; - Callback,const Mac48Address &> m_forwardUp; + Callback, Mac48Address, Mac48Address> m_forwardUp; Callback m_linkUp; Callback m_linkDown; Ptr m_dca; diff --git a/src/devices/wifi/wifi-mac.h b/src/devices/wifi/wifi-mac.h index 602aff3a9..0f18dc9f7 100644 --- a/src/devices/wifi/wifi-mac.h +++ b/src/devices/wifi/wifi-mac.h @@ -154,7 +154,7 @@ private: /** * \param upCallback the callback to invoke when a packet must be forwarded up the stack. */ - virtual void SetForwardUpCallback (Callback, const Mac48Address &> upCallback) = 0; + virtual void SetForwardUpCallback (Callback, Mac48Address, Mac48Address> upCallback) = 0; /** * \param linkUp the callback to invoke when the link becomes up. */ diff --git a/src/devices/wifi/wifi-net-device.cc b/src/devices/wifi/wifi-net-device.cc index 913649f16..25c465e3b 100644 --- a/src/devices/wifi/wifi-net-device.cc +++ b/src/devices/wifi/wifi-net-device.cc @@ -305,12 +305,36 @@ WifiNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb) } void -WifiNetDevice::ForwardUp (Ptr packet, const Mac48Address &from) +WifiNetDevice::ForwardUp (Ptr packet, Mac48Address from, Mac48Address to) { m_rxLogger (packet, from); LlcSnapHeader llc; packet->RemoveHeader (llc); - m_forwardUp (this, packet, llc.GetType (), from); + enum NetDevice::PacketType type; + if (to.IsBroadcast ()) + { + type = NetDevice::PACKET_BROADCAST; + } + else if (to.IsMulticast ()) + { + type = NetDevice::PACKET_MULTICAST; + } + else if (to == m_mac->GetAddress ()) + { + type = NetDevice::PACKET_HOST; + } + else + { + type = NetDevice::PACKET_OTHERHOST; + } + if (type != NetDevice::PACKET_OTHERHOST) + { + m_forwardUp (this, packet, llc.GetType (), from); + } + if (!m_promiscRx.IsNull ()) + { + m_promiscRx (this, packet, llc.GetType (), from, to, type); + } } void @@ -355,7 +379,7 @@ WifiNetDevice::SendFrom (Ptr packet, const Address& source, const Addres void WifiNetDevice::SetPromiscReceiveCallback (PromiscReceiveCallback cb) { - NS_FATAL_ERROR ("TODO"); + m_promiscRx = cb; } bool diff --git a/src/devices/wifi/wifi-net-device.h b/src/devices/wifi/wifi-net-device.h index 130f159bf..556ddde15 100644 --- a/src/devices/wifi/wifi-net-device.h +++ b/src/devices/wifi/wifi-net-device.h @@ -107,7 +107,7 @@ public: private: virtual void DoDispose (void); - void ForwardUp (Ptr packet, const Mac48Address &from); + void ForwardUp (Ptr packet, Mac48Address from, Mac48Address to); void LinkUp (void); void LinkDown (void); void Setup (void); @@ -117,7 +117,8 @@ private: Ptr m_channel; Ptr m_mac; Ptr m_stationManager; - ReceiveCallback m_forwardUp; + NetDevice::ReceiveCallback m_forwardUp; + NetDevice::PromiscReceiveCallback m_promiscRx; TracedCallback, Mac48Address> m_rxLogger; TracedCallback, Mac48Address> m_txLogger; uint32_t m_ifIndex;