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)
84 .AddConstructor<FdNetDevice> ()
85 .AddAttribute (
"Address",
86 "The MAC address of this device.",
89 MakeMac48AddressChecker ())
90 .AddAttribute (
"Start",
91 "The simulation time at which to spin up the device thread.",
95 .AddAttribute (
"Stop",
96 "The simulation time at which to tear down the device thread.",
100 .AddAttribute (
"EncapsulationMode",
101 "The link-layer encapsulation type to use.",
107 .AddAttribute (
"RxQueueSize",
"Maximum size of the read queue. "
108 "This value limits number of packets that have been read "
109 "from the network into a memory buffer but have not yet "
110 "been processed by the simulator.",
113 MakeUintegerChecker<uint32_t> ())
122 .AddTraceSource (
"MacTx",
123 "Trace source indicating a packet has arrived for transmission by this device",
125 .AddTraceSource (
"MacTxDrop",
126 "Trace source indicating a packet has been dropped by the device before transmission",
128 .AddTraceSource (
"MacPromiscRx",
129 "A packet has been received by this device, has been passed up from the physical layer "
130 "and is being forwarded up the local protocol stack. This is a promiscuous trace,",
132 .AddTraceSource (
"MacRx",
133 "A packet has been received by this device, has been passed up from the physical layer "
134 "and is being forwarded up the local protocol stack. This is a non-promiscuous trace,",
140 .AddTraceSource (
"Sniffer",
141 "Trace source simulating a non-promiscuous packet sniffer attached to the device",
143 .AddTraceSource (
"PromiscSniffer",
144 "Trace source simulating a promiscuous packet sniffer attached to the device",
156 m_isBroadcast (true),
157 m_isMulticast (false),
158 m_pendingReadCount (0),
221 NS_LOG_DEBUG (
"FdNetDevice::Start(): Failure, invalid file descriptor.");
278 struct timespec time = { 0, 100000000L };
279 nanosleep (&time, NULL);
294 uint8_t *buf2 = (uint8_t*)malloc (len + 4);
295 memcpy (buf2 + 4, buf, len);
302 uint16_t proto = 0x0008;
305 if (buf[12] == 0x81 && buf[13] == 0x00 && len > 18)
308 proto = buf[16] | (buf[17] << 8);
313 proto = buf[12] | (buf[13] << 8);
316 buf2[0] = (uint8_t)flags;
317 buf2[1] = (uint8_t)(flags >> 8);
318 buf2[2] = (uint8_t)proto;
319 buf2[3] = (uint8_t)(proto >> 8);
333 memmove (buf, buf + 4, len);
334 buf = (uint8_t*)realloc (buf, len);
360 Ptr<Packet> packet = Create<Packet> (
reinterpret_cast<const uint8_t *
> (buf), len);
373 bool isBroadcast =
false;
374 bool isMulticast =
false;
429 else if (isMulticast)
529 ssize_t len = (ssize_t) packet->
GetSize ();
530 uint8_t *buffer = (uint8_t*)malloc (len);
539 ssize_t written = write (
m_fd, buffer, len);
542 if (written == -1 || written != len)
554 if (
m_fd == -1 and fd > 0)