23 #include "ns3/packet.h"
25 #include "ns3/pointer.h"
26 #include "ns3/mesh-point-device.h"
27 #include "ns3/wifi-net-device.h"
28 #include "ns3/mesh-wifi-interface-mac.h"
42 .AddConstructor<MeshPointDevice> ()
43 .AddAttribute (
"Mtu",
"The MAC-level Maximum Transmission Unit",
47 MakeUintegerChecker<uint16_t> ())
48 .AddAttribute (
"RoutingProtocol",
49 "The mesh routing protocol used by this mesh point.",
62 m_channel = CreateObject<BridgeChannel> ();
101 uint16_t& realProtocol = protocol;
110 if (
m_routingProtocol->RemoveRoutingStuff (incomingPort->GetIfIndex (), src48, dst48, packet_copy, realProtocol))
113 Forward (incomingPort, packet, protocol, src48, dst48);
123 if (
m_routingProtocol->RemoveRoutingStuff (incomingPort->GetIfIndex (), src48, dst48, packet_copy, realProtocol))
132 Forward (incomingPort, packet->
Copy (), protocol, src48, dst48);
175 NS_LOG_WARN (
"Manual changing mesh point address can cause routing errors.");
260 uint16_t protocolNumber)
332 if ((*i)->GetIfIndex () == n)
340 std::vector<Ptr<NetDevice> >
353 NS_FATAL_ERROR (
"Device does not support eui 48 addresses: cannot be used as a mesh point interface.");
355 if (!iface->SupportsSendFrom ())
357 NS_FATAL_ERROR (
"Device does not support SendFrom: cannot be used as a mesh point interface.");
368 NS_FATAL_ERROR (
"Device is not a WiFi NIC: cannot be used as a mesh point interface.");
374 "WiFi device doesn't have correct MAC installed: cannot be used as a mesh point interface.");
376 ifaceMac->SetMeshPointAddress (
m_address);
382 m_channel->AddChannel (iface->GetChannel ());
394 "Routing protocol must be installed on mesh point to be useful.");
406 uint16_t protocol, uint32_t outIface)
429 if (outIface != 0xffffffff)
431 GetInterface (outIface)->SendFrom (packet, src, dst, protocol);
437 (*i)->SendFrom (packet->
Copy (), src, dst, protocol);
442 unicastData (0), unicastDataBytes (0), broadcastData (0), broadcastDataBytes (0)
449 os <<
"<Statistics" << std::endl <<
uint32_t GetNInterfaces() const
static bool IsMatchingType(const Address &address)
Mac48Address m_address
Mesh point MAC address, supposed to be the address of the first added interface.
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
virtual bool IsBridge() const
Return true if the net device is acting as a bridge.
NetDevice::ReceiveCallback m_rxCallback
Receive action.
void ResetStats()
Reset statistics counters.
virtual bool IsBroadcast() const
uint64_t GetUid(void) const
A packet is allocated a new uid when it is created empty or with zero-filled payload.
virtual bool SetMtu(const uint16_t mtu)
bool IsNull(void) const
Check for null implementation.
virtual ~MeshPointDevice()
D-tor.
#define NS_ASSERT(condition)
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
uint32_t GetSize(void) const
bool IsBroadcast(void) const
virtual void AddLinkChangeCallback(Callback< void > callback)
Statistics m_txStats
Counters.
virtual void DoDispose(void)
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
virtual bool IsLinkUp() const
virtual bool IsMulticast() const
Ptr< MeshL2RoutingProtocol > m_routingProtocol
Current routing protocol, used mainly by GetRoutingProtocol.
virtual void DoDispose()
This method is called by Object::Dispose or by the object's destructor, whichever comes first...
Ptr< BridgeChannel > m_channel
Virtual channel for upper layers.
#define NS_FATAL_ERROR(msg)
fatal error handling
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
a polymophic address class
virtual Address GetAddress() const
std::vector< Ptr< NetDevice > > GetInterfaces() const
virtual void SetAddress(Address a)
Set the address of this interface.
Ptr< NetDevice > GetInterface(uint32_t id) const
void SetRoutingProtocol(Ptr< MeshL2RoutingProtocol > protocol)
Register routing protocol to be used. Protocol must be already installed on this mesh point...
Statistics m_rxStats
Counters.
static Mac48Address GetMulticast(Ipv4Address address)
void Forward(Ptr< NetDevice > incomingPort, Ptr< const Packet > packet, uint16_t protocol, const Mac48Address src, const Mac48Address dst)
Forward packet down to interfaces.
Hold an unsigned integer type.
Ptr< AttributeChecker > MakePointerChecker(void)
T * PeekPointer(const Ptr< T > &p)
Hold together all Wifi-related objects.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
virtual uint32_t GetIfIndex() const
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
virtual Ptr< Node > GetNode() const
virtual uint16_t GetMtu() const
void AddInterface(Ptr< NetDevice > port)
Attach new interface to the station.
uint32_t broadcastDataBytes
virtual void SetNode(Ptr< Node > node)
static Mac48Address ConvertFrom(const Address &address)
void Report(std::ostream &os) const
Print statistics counters.
Ptr< Packet > Copy(void) const
uint16_t m_mtu
MTU in bytes.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
Statistics m_fwdStats
Counters.
Ptr< Node > m_node
Parent node.
void DoSend(bool success, Ptr< Packet > packet, Mac48Address src, Mac48Address dst, uint16_t protocol, uint32_t iface)
Response callback for L2 routing protocol.
uint32_t unicastDataBytes
virtual Address GetBroadcast() const
static TypeId GetTypeId()
Object type ID for NS3 object system.
virtual Ptr< Channel > GetChannel() const
uint32_t m_ifIndex
If index.
Interface for L2 mesh routing protocol and mesh point communication.
void RegisterProtocolHandler(ProtocolHandler handler, uint16_t protocolType, Ptr< NetDevice > device, bool promiscuous=false)
#define NS_ASSERT_MSG(condition, message)
MeshPointDevice()
C-tor create empty (without interfaces and protocols) mesh point.
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
Network layer to device interface.
virtual bool NeedsArp() const
virtual bool IsPointToPoint() const
Return true if the net device is on a point-to-point link.
#define NS_LOG_DEBUG(msg)
std::vector< Ptr< NetDevice > > m_ifaces
List of interfaces.
virtual void SetIfIndex(const uint32_t index)
PacketType
Packet types are used as they are in Linux.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
void ReceiveFromDevice(Ptr< NetDevice > device, Ptr< const Packet > packet, uint16_t protocol, Address const &source, Address const &destination, PacketType packetType)
Receive packet from interface.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
Promisc receive action.
a unique identifier for an interface.
virtual bool SupportsSendFrom() const
TypeId SetParent(TypeId tid)
Basic MAC of mesh point Wi-Fi interface.
Ptr< MeshL2RoutingProtocol > GetRoutingProtocol() const
Access current routing protocol.
NS_LOG_COMPONENT_DEFINE("MeshPointDevice")