24 #include "ns3/abort.h"
25 #include "ns3/boolean.h"
26 #include "ns3/channel.h"
28 #include "ns3/ethernet-header.h"
29 #include "ns3/ethernet-trailer.h"
31 #include "ns3/llc-snap-header.h"
32 #include "ns3/mac48-address.h"
33 #include "ns3/pointer.h"
34 #include "ns3/simulator.h"
35 #include "ns3/string.h"
36 #include "ns3/trace-source-accessor.h"
37 #include "ns3/uinteger.h"
40 #include <arpa/inet.h>
41 #include <net/ethernet.h>
48 : m_bufferSize (65536)
85 .SetGroupName (
"FdNetDevice")
87 .AddAttribute (
"Address",
88 "The MAC address of this device.",
92 .AddAttribute (
"Start",
93 "The simulation time at which to spin up "
98 .AddAttribute (
"Stop",
99 "The simulation time at which to tear down "
100 "the device thread.",
104 .AddAttribute (
"EncapsulationMode",
105 "The link-layer encapsulation type to use.",
111 .AddAttribute (
"RxQueueSize",
"Maximum size of the read queue. "
112 "This value limits number of packets that have been read "
113 "from the network into a memory buffer but have not yet "
114 "been processed by the simulator.",
117 MakeUintegerChecker<uint32_t> ())
126 .AddTraceSource (
"MacTx",
127 "Trace source indicating a packet has "
128 "arrived for transmission by this device",
130 "ns3::Packet::TracedCallback")
131 .AddTraceSource (
"MacTxDrop",
132 "Trace source indicating a packet has "
133 "been dropped by the device before transmission",
135 "ns3::Packet::TracedCallback")
136 .AddTraceSource (
"MacPromiscRx",
137 "A packet has been received by this device, "
138 "has been passed up from the physical layer "
139 "and is being forwarded up the local protocol stack. "
140 "This is a promiscuous trace,",
142 "ns3::Packet::TracedCallback")
143 .AddTraceSource (
"MacRx",
144 "A packet has been received by this device, "
145 "has been passed up from the physical layer "
146 "and is being forwarded up the local protocol stack. "
147 "This is a non-promiscuous trace,",
149 "ns3::Packet::TracedCallback")
154 .AddTraceSource (
"Sniffer",
155 "Trace source simulating a non-promiscuous "
156 "packet sniffer attached to the device",
158 "ns3::Packet::TracedCallback")
159 .AddTraceSource (
"PromiscSniffer",
160 "Trace source simulating a promiscuous "
161 "packet sniffer attached to the device",
163 "ns3::Packet::TracedCallback")
175 m_isBroadcast (true),
176 m_isMulticast (false),
247 NS_LOG_DEBUG (
"FdNetDevice::Start(): Failure, invalid file descriptor.");
266 fdReader->SetBufferSize (
m_mtu + 22);
330 struct timespec time = {
333 nanosleep (&time, NULL);
355 uint8_t *buf2 = (uint8_t*)malloc (len + 4);
356 memcpy (buf2 + 4, buf, len);
363 uint16_t proto = 0x0008;
366 if (buf[12] == 0x81 && buf[13] == 0x00 && len > 18)
369 proto = buf[16] | (buf[17] << 8);
374 proto = buf[12] | (buf[13] << 8);
377 buf2[0] = (uint8_t)flags;
378 buf2[1] = (uint8_t)(flags >> 8);
379 buf2[2] = (uint8_t)proto;
380 buf2[3] = (uint8_t)(proto >> 8);
400 memmove (buf, buf + 4, len);
401 buf = (uint8_t*)realloc (buf, len);
408 return (uint8_t*) malloc(len);
427 NS_LOG_LOGIC (
"buffer is empty, probably the device is stopped.");
440 NS_LOG_LOGIC (
"buffer: " <<
static_cast<void *
> (buf) <<
" length: " << len);
451 Ptr<Packet> packet = Create<Packet> (
reinterpret_cast<const uint8_t *
> (buf), len);
464 bool isBroadcast =
false;
465 bool isMulticast =
false;
520 else if (isMulticast)
620 size_t len = (size_t) packet->
GetSize ();
636 ssize_t written =
Write(buffer, len);
639 if (written == -1 || (
size_t) written != len)
653 uint32_t ret = write (
m_fd, buffer, length);
660 if (
m_fd == -1 and fd > 0)
a polymophic address class
bool IsNull(void) const
Check for null implementation.
Hold variables of type enum.
uint32_t m_bufferSize
size of the read buffer
void SetBufferSize(uint32_t bufferSize)
Set size of the read buffer.
FdReader::Data DoRead(void)
The read implementation.
a NetDevice to read/write network traffic from/into a file descriptor.
EventId m_stopEvent
NetDevice stop event.
virtual uint32_t GetIfIndex(void) const
virtual void FreeBuffer(uint8_t *buf)
Free the given packet buffer.
bool m_isBroadcast
Flag indicating whether or not the underlying net device supports broadcast.
Ptr< FdReader > m_fdReader
Reader for the file descriptor.
virtual void DoInitialize(void)
Method Initialization for start and stop attributes.
uint32_t m_ifIndex
The ns-3 interface index (in the sense of net device index) that has been assigned to this network de...
int m_fd
The file descriptor used for receive/send network traffic.
virtual uint8_t * AllocateBuffer(size_t len)
Allocate packet buffer.
uint16_t m_mtu
The MTU associated to the file descriptor technology.
virtual void SetIsBroadcast(bool broadcast)
Set if the NetDevice is able to send Broadcast messages.
virtual void DoDispose(void)
Destructor implementation.
virtual void SetNode(Ptr< Node > node)
virtual ~FdNetDevice()
Destructor for the FdNetDevice.
FdNetDevice::EncapsulationMode GetEncapsulationMode(void) const
Get the link layer encapsulation mode of this device.
void Start(Time tStart)
Set a start time for the device.
Ptr< Node > m_node
The ns-3 node associated to the net device.
TracedCallback m_linkChangeCallbacks
Callbacks to fire if the link changes state (up or down).
virtual uint16_t GetMtu(void) const
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
uint32_t m_maxPendingReads
Maximum number of packets that can be received and scheduled for read but not yet read.
virtual bool IsMulticast(void) const
std::mutex m_pendingReadMutex
Mutex to increase pending read counter.
std::queue< std::pair< uint8_t *, ssize_t > > m_pendingQueue
Number of packets that were received and scheduled for read but not yet read.
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
void NotifyLinkUp(void)
Notify that the link is up and ready.
virtual bool NeedsArp(void) const
Time m_tStart
Time to start spinning up the device.
void Stop(Time tStop)
Set a stop time for the device.
virtual void DoFinishStoppingDevice(void)
Complete additional actions, if any, to tear down the device.
EventId m_startEvent
NetDevice start event.
bool m_isMulticast
Flag indicating whether or not the underlying net device supports multicast.
virtual Address GetAddress(void) const
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition,...
virtual void SetIfIndex(const uint32_t index)
virtual bool SetMtu(const uint16_t mtu)
TracedCallback< Ptr< const Packet > > m_promiscSnifferTrace
A trace source that emulates a promiscuous mode protocol sniffer connected to the device.
virtual void SetAddress(Address address)
Set the address of this interface.
void ForwardUp(void)
Forward the frame to the appropriate callback for processing.
FdNetDevice()
Constructor for the FdNetDevice.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
virtual bool IsLinkUp(void) const
static TypeId GetTypeId(void)
Get the type ID.
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode)
Set the link layer encapsulation mode of this device.
virtual Ptr< FdReader > DoCreateFdReader(void)
Create the FdReader object.
virtual void AddLinkChangeCallback(Callback< void > callback)
virtual Ptr< Node > GetNode(void) const
EncapsulationMode m_encapMode
The type of encapsulation of the received/transmitted frames.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode.
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
EncapsulationMode
Enumeration of the types of frames supported in the class.
@ DIX
DIX II / Ethernet II packet.
@ DIXPI
When using TAP devices, if flag IFF_NO_PI is not set on the device, IP packets will have an extra hea...
@ LLC
802.2 LLC/SNAP Packet
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
bool m_linkUp
Flag indicating whether or not the link is up.
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
void SetFileDescriptor(int fd)
Set the associated file descriptor.
Time m_tStop
Time to start tearing down the device.
virtual ssize_t Write(uint8_t *buffer, size_t length)
Write packet data to device.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
TracedCallback< Ptr< const Packet > > m_macTxDropTrace
The trace source fired when packets coming into the "top" of the device at the L3/L2 transition are d...
virtual Ptr< Channel > GetChannel(void) const
virtual void DoFinishStartingDevice(void)
Complete additional actions, if any, to spin up down the device.
Mac48Address m_address
The net device mac address.
virtual void SetIsMulticast(bool multicast)
Set if the NetDevice is able to send Multicast messages.
virtual bool SupportsSendFrom() const
virtual bool IsBroadcast(void) const
virtual Address GetBroadcast(void) const
int GetFileDescriptor(void) const
Get the associated file descriptor.
void StopDevice(void)
Tear down the device.
uint32_t m_nodeId
a copy of the node id so the read thread doesn't have to GetNode() in in order to find the node ID.
void StartDevice(void)
Spin up the device.
int m_fd
The file descriptor to read from.
Ipv4 addresses are stored in host order in this class.
Describes an IPv6 address.
static Mac48Address GetMulticast(Ipv4Address address)
bool IsBroadcast(void) const
static Mac48Address ConvertFrom(const Address &address)
AttributeValue implementation for Mac48Address.
Network layer to device interface.
PacketType
Packet types are used as they are in Linux.
Callback< bool, Ptr< NetDevice >, Ptr< const Packet >, uint16_t, const Address & > ReceiveCallback
uint32_t GetId(void) const
virtual void DoDispose(void)
Destructor implementation.
virtual void DoInitialize(void)
Initialize() implementation.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
uint64_t GetUid(void) const
Returns the packet's Uid.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Smart pointer class similar to boost::intrusive_ptr.
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
void ConnectWithoutContext(const CallbackBase &callback)
Append a Callback to the chain (without a context).
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeMac48AddressAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeChecker > MakeMac48AddressChecker(void)
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
static void RemovePIHeader(uint8_t *&buf, ssize_t &len)
Removes PI header.
static void AddPIHeader(uint8_t *&buf, size_t &len)
Synthesize PI header for the kernel.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
EventImpl * MakeEvent(void(*f)(void))
Make an EventImpl from a function pointer taking varying numbers of arguments.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
A structure representing data read.