A Discrete-Event Network Simulator
API
fd-net-device.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2012 INRIA, 2012 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
19  * Claudio Freire <klaussfreire@sourceforge.net>
20  */
21 
22 #include "fd-net-device.h"
23 
24 #include "ns3/abort.h"
25 #include "ns3/boolean.h"
26 #include "ns3/channel.h"
27 #include "ns3/enum.h"
28 #include "ns3/ethernet-header.h"
29 #include "ns3/ethernet-trailer.h"
30 #include "ns3/log.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"
38 
39 #include <unistd.h>
40 #include <arpa/inet.h>
41 #include <net/ethernet.h>
42 
43 namespace ns3 {
44 
45 NS_LOG_COMPONENT_DEFINE ("FdNetDevice");
46 
48  : m_bufferSize (65536) // Defaults to maximum TCP window size
49 {
50 }
51 
52 void
54 {
55  NS_LOG_FUNCTION (this << bufferSize);
56  m_bufferSize = bufferSize;
57 }
58 
60 {
61  NS_LOG_FUNCTION (this);
62 
63  uint8_t *buf = (uint8_t *)malloc (m_bufferSize);
64  NS_ABORT_MSG_IF (buf == 0, "malloc() failed");
65 
66  NS_LOG_LOGIC ("Calling read on fd " << m_fd);
67  ssize_t len = read (m_fd, buf, m_bufferSize);
68  if (len <= 0)
69  {
70  free (buf);
71  buf = 0;
72  len = 0;
73  }
74  NS_LOG_LOGIC ("Read " << len << " bytes on fd " << m_fd);
75  return FdReader::Data (buf, len);
76 }
77 
79 
80 TypeId
82 {
83  static TypeId tid = TypeId ("ns3::FdNetDevice")
84  .SetParent<NetDevice> ()
85  .SetGroupName ("FdNetDevice")
86  .AddConstructor<FdNetDevice> ()
87  .AddAttribute ("Address",
88  "The MAC address of this device.",
89  Mac48AddressValue (Mac48Address ("ff:ff:ff:ff:ff:ff")),
92  .AddAttribute ("Start",
93  "The simulation time at which to spin up "
94  "the device thread.",
95  TimeValue (Seconds (0.)),
97  MakeTimeChecker ())
98  .AddAttribute ("Stop",
99  "The simulation time at which to tear down "
100  "the device thread.",
101  TimeValue (Seconds (0.)),
103  MakeTimeChecker ())
104  .AddAttribute ("EncapsulationMode",
105  "The link-layer encapsulation type to use.",
106  EnumValue (DIX),
108  MakeEnumChecker (DIX, "Dix",
109  LLC, "Llc",
110  DIXPI, "DixPi"))
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.",
115  UintegerValue (1000),
117  MakeUintegerChecker<uint32_t> ())
118  //
119  // Trace sources at the "top" of the net device, where packets transition
120  // to/from higher layers. These points do not really correspond to the
121  // MAC layer of the underlying operating system, but exist to provide
122  // a consitent tracing environment. These trace hooks should really be
123  // interpreted as the points at which a packet leaves the ns-3 environment
124  // destined for the underlying operating system or vice-versa.
125  //
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")
150 
151  //
152  // Trace sources designed to simulate a packet sniffer facility (tcpdump).
153  //
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")
164  ;
165  return tid;
166 }
167 
169  : m_node (0),
170  m_ifIndex (0),
171  m_mtu (1500), // Defaults to Ethernet v2 MTU
172  m_fd (-1),
173  m_fdReader (0),
174  m_isBroadcast (true),
175  m_isMulticast (false),
176  m_pendingReadCount (0),
177  m_startEvent (),
178  m_stopEvent ()
179 {
180  NS_LOG_FUNCTION (this);
181  Start (m_tStart);
182 }
183 
185 {
186 }
187 
189 {
190  NS_LOG_FUNCTION (this);
191 }
192 
193 void
195 {
196  NS_LOG_FUNCTION (this);
197  StopDevice ();
199 }
200 
201 void
203 {
204  NS_LOG_FUNCTION (mode);
205  m_encapMode = mode;
206  NS_LOG_LOGIC ("m_encapMode = " << m_encapMode);
207 }
208 
211 {
212  NS_LOG_FUNCTION (this);
213  return m_encapMode;
214 }
215 
216 void
218 {
219  NS_LOG_FUNCTION (tStart);
222 }
223 
224 void
226 {
227  NS_LOG_FUNCTION (tStop);
230 }
231 
232 void
234 {
235  NS_LOG_FUNCTION (this);
236 
237  if (m_fd == -1)
238  {
239  NS_LOG_DEBUG ("FdNetDevice::Start(): Failure, invalid file descriptor.");
240  return;
241  }
242  //
243  // A similar story exists for the node ID. We can't just naively do a
244  // GetNode ()->GetId () since GetNode is going to give us a Ptr<Node> which
245  // is reference counted. We need to stash away the node ID for use in the
246  // read thread.
247  //
248  m_nodeId = GetNode ()->GetId ();
249 
250  m_fdReader = Create<FdNetDeviceFdReader> ();
251  // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
252  m_fdReader->SetBufferSize(m_mtu + 22);
254 
255  NotifyLinkUp ();
256 }
257 
258 void
260 {
261  NS_LOG_FUNCTION (this);
262 
263  if (m_fdReader != 0)
264  {
265  m_fdReader->Stop ();
266  m_fdReader = 0;
267  }
268 
269  if (m_fd != -1)
270  {
271  close (m_fd);
272  m_fd = -1;
273  }
274 }
275 
276 void
277 FdNetDevice::ReceiveCallback (uint8_t *buf, ssize_t len)
278 {
279  NS_LOG_FUNCTION (this << buf << len);
280  bool skip = false;
281 
282  {
285  {
286  NS_LOG_WARN ("Packet dropped");
287  skip = true;
288  }
289  else
290  {
292  }
293  }
294 
295  if (skip)
296  {
297  struct timespec time = { 0, 100000000L }; // 100 ms
298  nanosleep (&time, NULL);
299  }
300  else
301  {
303  }
304 }
305 
309 static void
310 AddPIHeader (uint8_t *&buf, ssize_t &len)
311 {
312  // Synthesize PI header for our friend the kernel
313  uint8_t *buf2 = (uint8_t*)malloc (len + 4);
314  memcpy (buf2 + 4, buf, len);
315  len += 4;
316 
317  // PI = 16 bits flags (0) + 16 bits proto
318  // NOTE: be careful to interpret buffer data explicitly as
319  // little-endian to be insensible to native byte ordering.
320  uint16_t flags = 0;
321  uint16_t proto = 0x0008; // default to IPv4
322  if (len > 14)
323  {
324  if (buf[12] == 0x81 && buf[13] == 0x00 && len > 18)
325  {
326  // tagged ethernet packet
327  proto = buf[16] | (buf[17] << 8);
328  }
329  else
330  {
331  // untagged ethernet packet
332  proto = buf[12] | (buf[13] << 8);
333  }
334  }
335  buf2[0] = (uint8_t)flags;
336  buf2[1] = (uint8_t)(flags >> 8);
337  buf2[2] = (uint8_t)proto;
338  buf2[3] = (uint8_t)(proto >> 8);
339 
340  // swap buffer
341  free (buf);
342  buf = buf2;
343 }
344 
345 static void
346 RemovePIHeader (uint8_t *&buf, ssize_t &len)
347 {
348  // strip PI header if present, shrink buffer
349  if (len >= 4)
350  {
351  len -= 4;
352  memmove (buf, buf + 4, len);
353  buf = (uint8_t*)realloc (buf, len);
354  }
355 }
356 
357 void
358 FdNetDevice::ForwardUp (uint8_t *buf, ssize_t len)
359 {
360  NS_LOG_FUNCTION (this << buf << len);
361 
362  if (m_pendingReadCount > 0)
363  {
364  {
367  }
368  }
369 
370  // We need to remove the PI header and ignore it
371  if (m_encapMode == DIXPI)
372  {
373  RemovePIHeader (buf, len);
374  }
375 
376  //
377  // Create a packet out of the buffer we received and free that buffer.
378  //
379  Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t *> (buf), len);
380  free (buf);
381  buf = 0;
382 
383  //
384  // Trace sinks will expect complete packets, not packets without some of the
385  // headers
386  //
387  Ptr<Packet> originalPacket = packet->Copy ();
388 
389  Mac48Address destination;
390  Mac48Address source;
391  uint16_t protocol;
392  bool isBroadcast = false;
393  bool isMulticast = false;
394 
395  EthernetHeader header (false);
396 
397  //
398  // This device could be running in an environment where completely unexpected
399  // kinds of packets are flying around, so we need to harden things a bit and
400  // filter out packets we think are completely bogus, so we always check to see
401  // that the packet is long enough to contain the header we want to remove.
402  //
403  if (packet->GetSize () < header.GetSerializedSize ())
404  {
405  m_phyRxDropTrace (originalPacket);
406  return;
407  }
408 
409  packet->RemoveHeader (header);
410  destination = header.GetDestination ();
411  source = header.GetSource ();
412  isBroadcast = header.GetDestination ().IsBroadcast ();
413  isMulticast = header.GetDestination ().IsGroup ();
414  protocol = header.GetLengthType ();
415 
416  //
417  // If the length/type is less than 1500, it corresponds to a length
418  // interpretation packet. In this case, it is an 802.3 packet and
419  // will also have an 802.2 LLC header. If greater than 1500, we
420  // find the protocol number (Ethernet type) directly.
421  //
422  if (m_encapMode == LLC and header.GetLengthType () <= 1500)
423  {
424  LlcSnapHeader llc;
425  //
426  // Check to see that the packet is long enough to possibly contain the
427  // header we want to remove before just naively calling.
428  //
429  if (packet->GetSize () < llc.GetSerializedSize ())
430  {
431  m_phyRxDropTrace (originalPacket);
432  return;
433  }
434 
435  packet->RemoveHeader (llc);
436  protocol = llc.GetType ();
437  }
438 
439  NS_LOG_LOGIC ("Pkt source is " << source);
440  NS_LOG_LOGIC ("Pkt destination is " << destination);
441 
442  PacketType packetType;
443 
444  if (isBroadcast)
445  {
446  packetType = NS3_PACKET_BROADCAST;
447  }
448  else if (isMulticast)
449  {
450  packetType = NS3_PACKET_MULTICAST;
451  }
452  else if (destination == m_address)
453  {
454  packetType = NS3_PACKET_HOST;
455  }
456  else
457  {
458  packetType = NS3_PACKET_OTHERHOST;
459  }
460 
461  //
462  // For all kinds of packetType we receive, we hit the promiscuous sniffer
463  // hook and pass a copy up to the promiscuous callback. Pass a copy to
464  // make sure that nobody messes with our packet.
465  //
466  m_promiscSnifferTrace (originalPacket);
467 
468  if (!m_promiscRxCallback.IsNull ())
469  {
470  m_macPromiscRxTrace (originalPacket);
471  m_promiscRxCallback (this, packet, protocol, source, destination,
472  packetType);
473  }
474 
475  //
476  // If this packet is not destined for some other host, it must be for us
477  // as either a broadcast, multicast or unicast. We need to hit the mac
478  // packet received trace hook and forward the packet up the stack.
479  //
480  if (packetType != NS3_PACKET_OTHERHOST)
481  {
482  m_snifferTrace (originalPacket);
483  m_macRxTrace (originalPacket);
484  m_rxCallback (this, packet, protocol, source);
485  }
486 }
487 
488 bool
489 FdNetDevice::Send (Ptr<Packet> packet, const Address& destination, uint16_t protocolNumber)
490 {
491  NS_LOG_FUNCTION (this << packet << destination << protocolNumber);
492  return SendFrom (packet, m_address, destination, protocolNumber);
493 }
494 
495 bool
496 FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
497 {
498  NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);
499  NS_LOG_LOGIC ("packet: " << packet << " UID: " << packet->GetUid ());
500 
501  if (IsLinkUp () == false)
502  {
503  m_macTxDropTrace (packet);
504  return false;
505  }
506 
507  Mac48Address destination = Mac48Address::ConvertFrom (dest);
509 
510  NS_LOG_LOGIC ("Transmit packet with UID " << packet->GetUid ());
511  NS_LOG_LOGIC ("Transmit packet from " << source);
512  NS_LOG_LOGIC ("Transmit packet to " << destination);
513 
514  EthernetHeader header (false);
515  header.SetSource (source);
516  header.SetDestination (destination);
517 
518  NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet too big " << packet->GetSize ());
519 
520  if (m_encapMode == LLC)
521  {
522  LlcSnapHeader llc;
523  llc.SetType (protocolNumber);
524  packet->AddHeader (llc);
525 
526  header.SetLengthType (packet->GetSize ());
527  }
528  else
529  {
530  header.SetLengthType (protocolNumber);
531  }
532 
533  packet->AddHeader (header);
534 
535  //
536  // there's not much meaning associated with the different layers in this
537  // device, so don't be surprised when they're all stacked together in
538  // essentially one place. We do this for trace consistency across devices.
539  //
540  m_macTxTrace (packet);
541 
542  m_promiscSnifferTrace (packet);
543  m_snifferTrace (packet);
544 
545  NS_LOG_LOGIC ("calling write");
546 
547 
548  ssize_t len = (ssize_t) packet->GetSize ();
549  uint8_t *buffer = (uint8_t*)malloc (len);
550  packet->CopyData (buffer, len);
551 
552  // We need to add the PI header
553  if (m_encapMode == DIXPI)
554  {
555  AddPIHeader (buffer, len);
556  }
557 
558  ssize_t written = write (m_fd, buffer, len);
559  free (buffer);
560 
561  if (written == -1 || written != len)
562  {
563  m_macTxDropTrace (packet);
564  return false;
565  }
566 
567  return true;
568 }
569 
570 void
572 {
573  if (m_fd == -1 and fd > 0)
574  {
575  m_fd = fd;
576  }
577 }
578 
579 void
581 {
583 }
584 
585 Address
587 {
588  return m_address;
589 }
590 
591 void
593 {
594  m_linkUp = true;
596 }
597 
598 void
599 FdNetDevice::SetIfIndex (const uint32_t index)
600 {
601  m_ifIndex = index;
602 }
603 
604 uint32_t
606 {
607  return m_ifIndex;
608 }
609 
612 {
613  return NULL;
614 }
615 
616 bool
617 FdNetDevice::SetMtu (const uint16_t mtu)
618 {
619  // The MTU depends on the technology associated to
620  // the file descriptor. The user is responsible of
621  // setting the correct value of the MTU.
622  // If the file descriptor is created using a helper,
623  // then is the responsibility of the helper to set
624  // the correct MTU value.
625  m_mtu = mtu;
626  return true;
627 }
628 
629 uint16_t
631 {
632  return m_mtu;
633 }
634 
635 bool
637 {
638  return m_linkUp;
639 }
640 
641 void
643 {
645 }
646 
647 bool
649 {
650  return m_isBroadcast;
651 }
652 
653 void
655 {
656  m_isBroadcast = broadcast;
657 }
658 
659 Address
661 {
662  return Mac48Address ("ff:ff:ff:ff:ff:ff");
663 }
664 
665 bool
667 {
668  return m_isMulticast;
669 }
670 
671 void
673 {
674  m_isMulticast = multicast;
675 }
676 
677 Address
679 {
680  return Mac48Address::GetMulticast (multicastGroup);
681 }
682 
683 Address
685 {
686  return Mac48Address::GetMulticast (addr);
687 }
688 
689 bool
691 {
692  return false;
693 }
694 
695 bool
697 {
698  return false;
699 }
700 
701 Ptr<Node>
703 {
704  return m_node;
705 }
706 
707 void
709 {
710  m_node = node;
711 }
712 
713 bool
715 {
716  return true;
717 }
718 
719 void
721 {
722  m_rxCallback = cb;
723 }
724 
725 void
727 {
728  m_promiscRxCallback = cb;
729 }
730 
731 bool
733 {
734  return true;
735 }
736 
737 } // namespace ns3
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:268
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
void StopDevice(void)
Tear down the device.
A structure representing data read.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
uint16_t m_mtu
The MTU associated to the file descriptor technology.
void ForwardUp(uint8_t *buf, ssize_t len)
Forward the frame to the appropriate callback for processing.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
void SetFileDescriptor(int fd)
Set the associated file descriptor.
virtual void AddLinkChangeCallback(Callback< void > callback)
virtual bool SupportsSendFrom() const
EncapsulationMode m_encapMode
The typ of encapsulation of the received/transmited frames.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: enum.h:209
virtual bool NeedsArp(void) const
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
uint64_t GetUid(void) const
Returns the packet's Uid.
Definition: packet.cc:380
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1078
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
DIX II / Ethernet II packet.
Definition: fd-net-device.h:92
PacketType
Packet types are used as they are in Linux.
Definition: net-device.h:272
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
uint16_t GetLengthType(void) const
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:766
bool IsBroadcast(void) const
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
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...
static void RemovePIHeader(uint8_t *&buf, ssize_t &len)
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:339
Ptr< const AttributeChecker > MakeMac48AddressChecker(void)
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...
Definition: simulator.cc:311
Time m_tStart
Time to start spinning up the device.
virtual bool IsMulticast(void) const
void SetType(uint16_t type)
Set the Ethertype.
Ptr< FdNetDeviceFdReader > m_fdReader
Reader for the file descriptor.
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Definition: simulator.h:819
void Stop(Time tStop)
Set a stop time for the device.
virtual void SetIsBroadcast(bool broadcast)
virtual uint32_t GetIfIndex(void) const
void SetSource(Mac48Address source)
Ptr< const AttributeAccessor > MakeMac48AddressAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
virtual void SetIfIndex(const uint32_t index)
a polymophic address class
Definition: address.h:90
void NotifyLinkUp(void)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
virtual Ptr< Node > GetNode(void) const
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:446
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition...
Hold variables of type enum.
Definition: enum.h:54
virtual Ptr< Channel > GetChannel(void) const
static Mac48Address GetMulticast(Ipv4Address address)
AttributeValue implementation for Time.
Definition: nstime.h:928
uint16_t GetType(void)
Return the Ethertype.
int m_fd
The file descriptor to read from.
virtual void SetIsMulticast(bool multicast)
A class which provides a simple way to implement a Critical Section.
Definition: system-mutex.h:118
Hold an unsigned integer type.
Definition: uinteger.h:44
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
uint32_t m_maxPendingReads
Maximum number of packets that can be received and scheduled for read but not yeat read...
virtual Address GetBroadcast(void) const
FdNetDeviceFdReader()
Constructor for the FdNetDevice.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1296
void StartDevice(void)
Spin up the device.
void ReceiveCallback(uint8_t *buf, ssize_t len)
Callback to invoke when a new frame is received.
802.2 LLC/SNAP Packet
Definition: fd-net-device.h:93
Ptr< Node > m_node
The ns-3 node associated to the net device.
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
static void ScheduleWithContext(uint32_t context, Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event with the given context.
Definition: simulator.h:899
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
virtual bool IsLinkUp(void) const
static Mac48Address ConvertFrom(const Address &address)
void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode)
Set the link layer encapsulation mode of this device.
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:122
int m_fd
The file descriptor used for receive/send network traffic.
TracedCallback m_linkChangeCallbacks
Callbacks to fire if the link changes state (up or down).
Every class exported by the ns3 library is enclosed in the ns3 namespace.
TracedCallback< Ptr< const Packet > > m_promiscSnifferTrace
A trace source that emulates a promiscuous mode protocol sniffer connected to the device...
bool IsGroup(void) const
virtual bool IsBroadcast(void) const
virtual void SetNode(Ptr< Node > node)
an EUI-48 address
Definition: mac48-address.h:43
Packet header for Ethernet.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: nstime.h:929
When using TAP devices, if flag IFF_NO_PI is not set on the device, IP packets will have an extra hea...
Definition: fd-net-device.h:94
FdReader::Data DoRead(void)
The read implementation.
FdNetDevice::EncapsulationMode GetEncapsulationMode(void) const
Get the link layer encapsulation mode of this device.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:90
Mac48Address GetSource(void) const
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
uint32_t m_pendingReadCount
Number of packets that were received and scheduled for read but not yeat read.
virtual bool SetMtu(const uint16_t mtu)
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
Make an EnumChecker pre-configured with a set of allowed values by name.
Definition: enum.cc:184
Describes an IPv6 address.
Definition: ipv6-address.h:47
Mac48Address GetDestination(void) const
uint32_t m_ifIndex
The ns-3 interface index (in the sense of net device index) that has been assigned to this network de...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
static TypeId GetTypeId(void)
void ConnectWithoutContext(const CallbackBase &callback)
Append a Callback to the chain (without a context).
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
uint32_t GetId(void) const
Definition: node.cc:107
virtual Address GetAddress(void) const
Network layer to device interface.
Definition: net-device.h:75
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:228
AttributeValue implementation for Mac48Address.
virtual void SetAddress(Address address)
Set the address of this interface.
virtual uint32_t GetSerializedSize(void) const
void Start(Time tStart)
Set a start time for the device.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:236
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:866
virtual uint32_t GetSerializedSize(void) const
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode...
void SetLengthType(uint16_t size)
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
void SetBufferSize(uint32_t bufferSize)
Set size of the read buffer.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:368
a NetDevice to read/write network traffic from/into a file descriptor.
Definition: fd-net-device.h:82
tuple address
Definition: first.py:37
Mac48Address m_address
The net device mac address.
bool m_isBroadcast
Flag indicating whether or not the underlying net device supports broadcast.
static void AddPIHeader(uint8_t *&buf, ssize_t &len)
EncapsulationMode
Enumeration of the types of frames supported in the class.
Definition: fd-net-device.h:90
virtual uint16_t GetMtu(void) const
void SetDestination(Mac48Address destination)
virtual void DoDispose(void)
Destructor implementation.
bool m_linkUp
Flag indicating whether or not the link is up.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
a unique identifier for an interface.
Definition: type-id.h:57
FdNetDevice()
Constructor for the FdNetDevice.
virtual ~FdNetDevice()
Destructor for the FdNetDevice.
TypeId SetParent(TypeId tid)
Definition: type-id.cc:638
bool m_isMulticast
Flag indicating whether or not the underlying net device supports multicast.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
Time m_tStop
Time to start tearing down the device.
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:253
Header for the LLC/SNAP encapsulation.
SystemMutex m_pendingReadMutex
Mutex to increase pending read counter.
EventImpl * MakeEvent(void(*f)(void))
Make an EventImpl from a function pointer taking varying numbers of arguments.
Definition: make-event.cc:34