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 consistent 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  // Defaults to Ethernet v2 MTU
172  m_mtu (1500),
173  m_fd (-1),
174  m_fdReader (0),
175  m_isBroadcast (true),
176  m_isMulticast (false),
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 
245 
247 
248  NotifyLinkUp ();
249 }
250 
253 {
254  NS_LOG_FUNCTION (this);
255 
256  Ptr<FdNetDeviceFdReader> fdReader = Create<FdNetDeviceFdReader> ();
257  // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
258  fdReader->SetBufferSize (m_mtu + 22);
259  return fdReader;
260 }
261 
262 void
264 {
265  NS_LOG_FUNCTION (this);
266 }
267 
268 void
270 {
271  NS_LOG_FUNCTION (this);
272 }
273 
274 void
276 {
277  NS_LOG_FUNCTION (this);
278 
279  if (m_fdReader != 0)
280  {
281  m_fdReader->Stop ();
282  m_fdReader = 0;
283  }
284 
285  if (m_fd != -1)
286  {
287  close (m_fd);
288  m_fd = -1;
289  }
290 
292 }
293 
294 void
295 FdNetDevice::ReceiveCallback (uint8_t *buf, ssize_t len)
296 {
297  NS_LOG_FUNCTION (this << buf << len);
298  bool skip = false;
299 
300  {
302  if (m_pendingQueue.size () >= m_maxPendingReads)
303  {
304  NS_LOG_WARN ("Packet dropped");
305  skip = true;
306  }
307  else
308  {
309  m_pendingQueue.push (std::make_pair (buf, len));
310  }
311  }
312 
313  if (skip)
314  {
315  struct timespec time = {
316  0, 100000000L
317  }; // 100 ms
318  nanosleep (&time, NULL);
319  }
320  else
321  {
323  }
324 }
325 
336 static void
337 AddPIHeader (uint8_t *&buf, size_t &len)
338 {
339  // Synthesize PI header for our friend the kernel
340  uint8_t *buf2 = (uint8_t*)malloc (len + 4);
341  memcpy (buf2 + 4, buf, len);
342  len += 4;
343 
344  // PI = 16 bits flags (0) + 16 bits proto
345  // NOTE: be careful to interpret buffer data explicitly as
346  // little-endian to be insensible to native byte ordering.
347  uint16_t flags = 0;
348  uint16_t proto = 0x0008; // default to IPv4
349  if (len > 14)
350  {
351  if (buf[12] == 0x81 && buf[13] == 0x00 && len > 18)
352  {
353  // tagged ethernet packet
354  proto = buf[16] | (buf[17] << 8);
355  }
356  else
357  {
358  // untagged ethernet packet
359  proto = buf[12] | (buf[13] << 8);
360  }
361  }
362  buf2[0] = (uint8_t)flags;
363  buf2[1] = (uint8_t)(flags >> 8);
364  buf2[2] = (uint8_t)proto;
365  buf2[3] = (uint8_t)(proto >> 8);
366 
367  // swap buffer
368  free (buf);
369  buf = buf2;
370 }
371 
378 static void
379 RemovePIHeader (uint8_t *&buf, ssize_t &len)
380 {
381  // strip PI header if present, shrink buffer
382  if (len >= 4)
383  {
384  len -= 4;
385  memmove (buf, buf + 4, len);
386  buf = (uint8_t*)realloc (buf, len);
387  }
388 }
389 
390 uint8_t *
392 {
393  return (uint8_t*) malloc(len);
394 }
395 
396 void
398 {
399  free (buf);
400 }
401 
402 void
404 {
405 
406  uint8_t *buf = 0;
407  ssize_t len = 0;
408 
409  {
411  std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
412  m_pendingQueue.pop ();
413 
414  buf = next.first;
415  len = next.second;
416  }
417 
418  NS_LOG_FUNCTION (this << buf << len);
419 
420  // We need to remove the PI header and ignore it
421  if (m_encapMode == DIXPI)
422  {
423  RemovePIHeader (buf, len);
424  }
425 
426  //
427  // Create a packet out of the buffer we received and free that buffer.
428  //
429  Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t *> (buf), len);
430  FreeBuffer (buf);
431  buf = 0;
432 
433  //
434  // Trace sinks will expect complete packets, not packets without some of the
435  // headers
436  //
437  Ptr<Packet> originalPacket = packet->Copy ();
438 
439  Mac48Address destination;
440  Mac48Address source;
441  uint16_t protocol;
442  bool isBroadcast = false;
443  bool isMulticast = false;
444 
445  EthernetHeader header (false);
446 
447  //
448  // This device could be running in an environment where completely unexpected
449  // kinds of packets are flying around, so we need to harden things a bit and
450  // filter out packets we think are completely bogus, so we always check to see
451  // that the packet is long enough to contain the header we want to remove.
452  //
453  if (packet->GetSize () < header.GetSerializedSize ())
454  {
455  m_phyRxDropTrace (originalPacket);
456  return;
457  }
458 
459  packet->RemoveHeader (header);
460  destination = header.GetDestination ();
461  source = header.GetSource ();
462  isBroadcast = header.GetDestination ().IsBroadcast ();
463  isMulticast = header.GetDestination ().IsGroup ();
464  protocol = header.GetLengthType ();
465 
466  //
467  // If the length/type is less than 1500, it corresponds to a length
468  // interpretation packet. In this case, it is an 802.3 packet and
469  // will also have an 802.2 LLC header. If greater than 1500, we
470  // find the protocol number (Ethernet type) directly.
471  //
472  if (m_encapMode == LLC and header.GetLengthType () <= 1500)
473  {
474  LlcSnapHeader llc;
475  //
476  // Check to see that the packet is long enough to possibly contain the
477  // header we want to remove before just naively calling.
478  //
479  if (packet->GetSize () < llc.GetSerializedSize ())
480  {
481  m_phyRxDropTrace (originalPacket);
482  return;
483  }
484 
485  packet->RemoveHeader (llc);
486  protocol = llc.GetType ();
487  }
488 
489  NS_LOG_LOGIC ("Pkt source is " << source);
490  NS_LOG_LOGIC ("Pkt destination is " << destination);
491 
492  PacketType packetType;
493 
494  if (isBroadcast)
495  {
496  packetType = NS3_PACKET_BROADCAST;
497  }
498  else if (isMulticast)
499  {
500  packetType = NS3_PACKET_MULTICAST;
501  }
502  else if (destination == m_address)
503  {
504  packetType = NS3_PACKET_HOST;
505  }
506  else
507  {
508  packetType = NS3_PACKET_OTHERHOST;
509  }
510 
511  //
512  // For all kinds of packetType we receive, we hit the promiscuous sniffer
513  // hook and pass a copy up to the promiscuous callback. Pass a copy to
514  // make sure that nobody messes with our packet.
515  //
516  m_promiscSnifferTrace (originalPacket);
517 
518  if (!m_promiscRxCallback.IsNull ())
519  {
520  m_macPromiscRxTrace (originalPacket);
521  m_promiscRxCallback (this, packet, protocol, source, destination,
522  packetType);
523  }
524 
525  //
526  // If this packet is not destined for some other host, it must be for us
527  // as either a broadcast, multicast or unicast. We need to hit the mac
528  // packet received trace hook and forward the packet up the stack.
529  //
530  if (packetType != NS3_PACKET_OTHERHOST)
531  {
532  m_snifferTrace (originalPacket);
533  m_macRxTrace (originalPacket);
534  m_rxCallback (this, packet, protocol, source);
535  }
536 }
537 
538 bool
539 FdNetDevice::Send (Ptr<Packet> packet, const Address& destination, uint16_t protocolNumber)
540 {
541  NS_LOG_FUNCTION (this << packet << destination << protocolNumber);
542  return SendFrom (packet, m_address, destination, protocolNumber);
543 }
544 
545 bool
546 FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
547 {
548  NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);
549  NS_LOG_LOGIC ("packet: " << packet << " UID: " << packet->GetUid ());
550 
551  if (IsLinkUp () == false)
552  {
553  m_macTxDropTrace (packet);
554  return false;
555  }
556 
557  Mac48Address destination = Mac48Address::ConvertFrom (dest);
559 
560  NS_LOG_LOGIC ("Transmit packet with UID " << packet->GetUid ());
561  NS_LOG_LOGIC ("Transmit packet from " << source);
562  NS_LOG_LOGIC ("Transmit packet to " << destination);
563 
564  EthernetHeader header (false);
565  header.SetSource (source);
566  header.SetDestination (destination);
567 
568  NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet too big " << packet->GetSize ());
569 
570  if (m_encapMode == LLC)
571  {
572  LlcSnapHeader llc;
573  llc.SetType (protocolNumber);
574  packet->AddHeader (llc);
575 
576  header.SetLengthType (packet->GetSize ());
577  }
578  else
579  {
580  header.SetLengthType (protocolNumber);
581  }
582 
583  packet->AddHeader (header);
584 
585  //
586  // there's not much meaning associated with the different layers in this
587  // device, so don't be surprised when they're all stacked together in
588  // essentially one place. We do this for trace consistency across devices.
589  //
590  m_macTxTrace (packet);
591 
592  m_promiscSnifferTrace (packet);
593  m_snifferTrace (packet);
594 
595  NS_LOG_LOGIC ("calling write");
596 
597 
598  size_t len = (size_t) packet->GetSize ();
599  uint8_t *buffer = AllocateBuffer (len);
600  if(!buffer)
601  {
602  m_macTxDropTrace(packet);
603  return false;
604  }
605 
606  packet->CopyData (buffer, len);
607 
608  // We need to add the PI header
609  if (m_encapMode == DIXPI)
610  {
611  AddPIHeader (buffer, len);
612  }
613 
614  ssize_t written = Write(buffer, len);
615  FreeBuffer (buffer);
616 
617  if (written == -1 || (size_t) written != len)
618  {
619  m_macTxDropTrace (packet);
620  return false;
621  }
622 
623  return true;
624 }
625 
626 ssize_t
627 FdNetDevice::Write (uint8_t *buffer, size_t length)
628 {
629  NS_LOG_FUNCTION (this << buffer << length);
630 
631  uint32_t ret = write (m_fd, buffer, length);
632  return ret;
633 }
634 
635 void
637 {
638  if (m_fd == -1 and fd > 0)
639  {
640  m_fd = fd;
641  }
642 }
643 
644 int
646 {
647  return m_fd;
648 }
649 
650 void
652 {
654 }
655 
656 Address
658 {
659  return m_address;
660 }
661 
662 void
664 {
665  m_linkUp = true;
667 }
668 
669 void
670 FdNetDevice::SetIfIndex (const uint32_t index)
671 {
672  m_ifIndex = index;
673 }
674 
675 uint32_t
677 {
678  return m_ifIndex;
679 }
680 
683 {
684  return NULL;
685 }
686 
687 bool
688 FdNetDevice::SetMtu (const uint16_t mtu)
689 {
690  // The MTU depends on the technology associated to
691  // the file descriptor. The user is responsible of
692  // setting the correct value of the MTU.
693  // If the file descriptor is created using a helper,
694  // then is the responsibility of the helper to set
695  // the correct MTU value.
696  m_mtu = mtu;
697  return true;
698 }
699 
700 uint16_t
702 {
703  return m_mtu;
704 }
705 
706 bool
708 {
709  return m_linkUp;
710 }
711 
712 void
714 {
716 }
717 
718 bool
720 {
721  return m_isBroadcast;
722 }
723 
724 void
726 {
727  m_isBroadcast = broadcast;
728 }
729 
730 Address
732 {
733  return Mac48Address ("ff:ff:ff:ff:ff:ff");
734 }
735 
736 bool
738 {
739  return m_isMulticast;
740 }
741 
742 void
744 {
745  m_isMulticast = multicast;
746 }
747 
748 Address
750 {
751  return Mac48Address::GetMulticast (multicastGroup);
752 }
753 
754 Address
756 {
757  return Mac48Address::GetMulticast (addr);
758 }
759 
760 bool
762 {
763  return false;
764 }
765 
766 bool
768 {
769  return false;
770 }
771 
772 Ptr<Node>
774 {
775  return m_node;
776 }
777 
778 void
780 {
781  m_node = node;
782 
783  // Save the node ID for use in the read thread, to avoid having
784  // to make a call to GetNode ()->GetId () that increments
785  // Ptr<Node>'s reference count.
786  m_nodeId = node->GetId ();
787 }
788 
789 bool
791 {
792  return true;
793 }
794 
795 void
797 {
798  m_rxCallback = cb;
799 }
800 
801 void
803 {
804  m_promiscRxCallback = cb;
805 }
806 
807 bool
809 {
810  return true;
811 }
812 
813 } // namespace ns3
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
virtual uint32_t GetIfIndex(void) const
virtual Ptr< Node > GetNode(void) const
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:557
bool IsBroadcast(void) const
uint64_t GetUid(void) const
Returns the packet&#39;s Uid.
Definition: packet.cc:390
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
void StopDevice(void)
Tear down the device.
A structure representing data read.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
uint32_t m_nodeId
a copy of the node id so the read thread doesn&#39;t have to GetNode() in in order to find the node ID...
virtual uint8_t * AllocateBuffer(size_t len)
Allocate packet buffer.
virtual bool IsLinkUp(void) const
Callback template class.
Definition: callback.h:1278
uint16_t m_mtu
The MTU associated to the file descriptor technology.
uint32_t GetId(void) const
Definition: node.cc:109
DIX II / Ethernet II packet.
Definition: fd-net-device.h:98
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
void SetFileDescriptor(int fd)
Set the associated file descriptor.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
FdNetDevice::EncapsulationMode GetEncapsulationMode(void) const
Get the link layer encapsulation mode of this device.
virtual void AddLinkChangeCallback(Callback< void > callback)
EncapsulationMode m_encapMode
The type of encapsulation of the received/transmitted frames.
When using TAP devices, if flag IFF_NO_PI is not set on the device, IP packets will have an extra hea...
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
virtual uint32_t GetSerializedSize(void) const
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
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_macTxDropTrace
The trace source fired when packets coming into the "top" of the device at the L3/L2 transition are d...
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event&#39;s associated function will not be invoked when it expires...
Definition: simulator.cc:268
Time m_tStart
Time to start spinning up the device.
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:346
virtual bool SupportsSendFrom() const
void SetType(uint16_t type)
Set the Ethertype.
void Stop(Time tStop)
Set a stop time for the device.
virtual void SetIsBroadcast(bool broadcast)
Set if the NetDevice is able to send Broadcast messages.
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)
Mac48Address GetSource(void) const
virtual void DoFinishStartingDevice(void)
Complete additional actions, if any, to spin up down the device.
a polymophic address class
Definition: address.h:90
void NotifyLinkUp(void)
Notify that the link is up and ready.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
Ptr< const AttributeChecker > MakeMac48AddressChecker(void)
virtual ssize_t Write(uint8_t *buffer, size_t length)
Write packet data to device.
static void AddPIHeader(uint8_t *&buf, size_t &len)
Synthesize PI header for the kernel.
virtual uint32_t GetSerializedSize(void) const
virtual Ptr< Channel > GetChannel(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 FreeBuffer(uint8_t *buf)
Free the given packet buffer.
Hold variables of type enum.
Definition: enum.h:54
uint16_t GetLengthType(void) const
static Mac48Address GetMulticast(Ipv4Address address)
AttributeValue implementation for Time.
Definition: nstime.h:1342
uint16_t GetType(void)
Return the Ethertype.
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
virtual bool IsBroadcast(void) const
int m_fd
The file descriptor to read from.
virtual void SetIsMulticast(bool multicast)
Set if the NetDevice is able to send Multicast messages.
A class which provides a simple way to implement a Critical Section.
Definition: system-mutex.h:118
virtual Address GetAddress(void) const
Hold an unsigned integer type.
Definition: uinteger.h:44
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:203
void ForwardUp(void)
Forward the frame to the appropriate callback for processing.
uint32_t m_maxPendingReads
Maximum number of packets that can be received and scheduled for read but not yet read...
Mac48Address GetDestination(void) const
void StartDevice(void)
Spin up the device.
void ReceiveCallback(uint8_t *buf, ssize_t len)
Callback to invoke when a new frame is received.
Ptr< Node > m_node
The ns-3 node associated to the net device.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
static Mac48Address ConvertFrom(const Address &address)
void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode)
Set the link layer encapsulation mode of this device.
EventId m_stopEvent
NetDevice stop event.
static void ScheduleWithContext(uint32_t context, Time const &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition: simulator.h:572
virtual void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb)
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).
virtual Ptr< FdReader > DoCreateFdReader(void)
Create the FdReader object.
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...
address
Definition: first.py:44
virtual uint16_t GetMtu(void) const
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
virtual void SetNode(Ptr< Node > node)
an EUI-48 address
Definition: mac48-address.h:43
virtual Address GetBroadcast(void) const
Packet header for Ethernet.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
int GetFileDescriptor(void) const
Get the associated file descriptor.
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:1343
Ptr< FdReader > m_fdReader
Reader for the file descriptor.
virtual bool NeedsArp(void) const
bool IsGroup(void) const
FdReader::Data DoRead(void)
The read implementation.
#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:88
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
virtual bool SetMtu(const uint16_t mtu)
Describes an IPv6 address.
Definition: ipv6-address.h:49
virtual void DoFinishStoppingDevice(void)
Complete additional actions, if any, to tear down the device.
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:41
802.2 LLC/SNAP Packet
Definition: fd-net-device.h:99
static TypeId GetTypeId(void)
Get the type ID.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
Network layer to device interface.
Definition: net-device.h:95
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
AttributeValue implementation for Mac48Address.
virtual void SetAddress(Address address)
Set the address of this interface.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:378
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:273
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1278
EventId m_startEvent
NetDevice start event.
Ptr< const AttributeChecker > MakeEnumChecker(int v, std::string n, Ts... args)
Make an EnumChecker pre-configured with a set of allowed values by name.
Definition: enum.h:161
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...
EncapsulationMode
Enumeration of the types of frames supported in the class.
Definition: fd-net-device.h:96
uint32_t m_bufferSize
size of the read buffer
Definition: fd-net-device.h:68
void SetBufferSize(uint32_t bufferSize)
Set size of the read buffer.
virtual Address GetMulticast(Ipv4Address multicastGroup) const
Make and return a MAC multicast address using the provided multicast group.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:472
a NetDevice to read/write network traffic from/into a file descriptor.
Definition: fd-net-device.h:84
Mac48Address m_address
The net device mac address.
PacketType
Packet types are used as they are in Linux.
Definition: net-device.h:296
bool m_isBroadcast
Flag indicating whether or not the underlying net device supports broadcast.
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1386
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:58
FdNetDevice()
Constructor for the FdNetDevice.
virtual ~FdNetDevice()
Destructor for the FdNetDevice.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
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)
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...
Definition: callback.h:1642
Time m_tStop
Time to start tearing down the device.
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
virtual bool IsMulticast(void) const
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
static void RemovePIHeader(uint8_t *&buf, ssize_t &len)
Removes PI header.
void ConnectWithoutContext(const CallbackBase &callback)
Append a Callback to the chain (without a context).