A Discrete-Event Network Simulator
API
point-to-point-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) 2007, 2008 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 
19 #include "ns3/log.h"
20 #include "ns3/queue.h"
21 #include "ns3/simulator.h"
22 #include "ns3/mac48-address.h"
23 #include "ns3/llc-snap-header.h"
24 #include "ns3/error-model.h"
25 #include "ns3/trace-source-accessor.h"
26 #include "ns3/uinteger.h"
27 #include "ns3/pointer.h"
29 #include "point-to-point-channel.h"
30 #include "ppp-header.h"
31 
32 namespace ns3 {
33 
34 NS_LOG_COMPONENT_DEFINE ("PointToPointNetDevice");
35 
36 NS_OBJECT_ENSURE_REGISTERED (PointToPointNetDevice);
37 
38 TypeId
40 {
41  static TypeId tid = TypeId ("ns3::PointToPointNetDevice")
42  .SetParent<NetDevice> ()
43  .SetGroupName ("PointToPoint")
44  .AddConstructor<PointToPointNetDevice> ()
45  .AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
49  MakeUintegerChecker<uint16_t> ())
50  .AddAttribute ("Address",
51  "The MAC address of this device.",
52  Mac48AddressValue (Mac48Address ("ff:ff:ff:ff:ff:ff")),
55  .AddAttribute ("DataRate",
56  "The default data rate for point to point links",
57  DataRateValue (DataRate ("32768b/s")),
60  .AddAttribute ("ReceiveErrorModel",
61  "The receiver error model used to simulate packet loss",
62  PointerValue (),
64  MakePointerChecker<ErrorModel> ())
65  .AddAttribute ("InterframeGap",
66  "The time to wait between packet (frame) transmissions",
67  TimeValue (Seconds (0.0)),
69  MakeTimeChecker ())
70 
71  //
72  // Transmit queueing discipline for the device which includes its own set
73  // of trace hooks.
74  //
75  .AddAttribute ("TxQueue",
76  "A queue to use as the transmit queue in the device.",
77  PointerValue (),
79  MakePointerChecker<Queue> ())
80 
81  //
82  // Trace sources at the "top" of the net device, where packets transition
83  // to/from higher layers.
84  //
85  .AddTraceSource ("MacTx",
86  "Trace source indicating a packet has arrived "
87  "for transmission by this device",
89  "ns3::Packet::TracedCallback")
90  .AddTraceSource ("MacTxDrop",
91  "Trace source indicating a packet has been dropped "
92  "by the device before transmission",
94  "ns3::Packet::TracedCallback")
95  .AddTraceSource ("MacPromiscRx",
96  "A packet has been received by this device, "
97  "has been passed up from the physical layer "
98  "and is being forwarded up the local protocol stack. "
99  "This is a promiscuous trace,",
101  "ns3::Packet::TracedCallback")
102  .AddTraceSource ("MacRx",
103  "A packet has been received by this device, "
104  "has been passed up from the physical layer "
105  "and is being forwarded up the local protocol stack. "
106  "This is a non-promiscuous trace,",
108  "ns3::Packet::TracedCallback")
109 #if 0
110  // Not currently implemented for this device
111  .AddTraceSource ("MacRxDrop",
112  "Trace source indicating a packet was dropped "
113  "before being forwarded up the stack",
115  "ns3::Packet::TracedCallback")
116 #endif
117  //
118  // Trace souces at the "bottom" of the net device, where packets transition
119  // to/from the channel.
120  //
121  .AddTraceSource ("PhyTxBegin",
122  "Trace source indicating a packet has begun "
123  "transmitting over the channel",
125  "ns3::Packet::TracedCallback")
126  .AddTraceSource ("PhyTxEnd",
127  "Trace source indicating a packet has been "
128  "completely transmitted over the channel",
130  "ns3::Packet::TracedCallback")
131  .AddTraceSource ("PhyTxDrop",
132  "Trace source indicating a packet has been "
133  "dropped by the device during transmission",
135  "ns3::Packet::TracedCallback")
136 #if 0
137  // Not currently implemented for this device
138  .AddTraceSource ("PhyRxBegin",
139  "Trace source indicating a packet has begun "
140  "being received by the device",
142  "ns3::Packet::TracedCallback")
143 #endif
144  .AddTraceSource ("PhyRxEnd",
145  "Trace source indicating a packet has been "
146  "completely received by the device",
148  "ns3::Packet::TracedCallback")
149  .AddTraceSource ("PhyRxDrop",
150  "Trace source indicating a packet has been "
151  "dropped by the device during reception",
153  "ns3::Packet::TracedCallback")
154 
155  //
156  // Trace sources designed to simulate a packet sniffer facility (tcpdump).
157  // Note that there is really no difference between promiscuous and
158  // non-promiscuous traces in a point-to-point link.
159  //
160  .AddTraceSource ("Sniffer",
161  "Trace source simulating a non-promiscuous packet sniffer "
162  "attached to the device",
164  "ns3::Packet::TracedCallback")
165  .AddTraceSource ("PromiscSniffer",
166  "Trace source simulating a promiscuous packet sniffer "
167  "attached to the device",
169  "ns3::Packet::TracedCallback")
170  ;
171  return tid;
172 }
173 
174 
176  :
177  m_txMachineState (READY),
178  m_channel (0),
179  m_linkUp (false),
180  m_currentPkt (0)
181 {
182  NS_LOG_FUNCTION (this);
183 }
184 
186 {
187  NS_LOG_FUNCTION (this);
188 }
189 
190 void
191 PointToPointNetDevice::AddHeader (Ptr<Packet> p, uint16_t protocolNumber)
192 {
193  NS_LOG_FUNCTION (this << p << protocolNumber);
194  PppHeader ppp;
195  ppp.SetProtocol (EtherToPpp (protocolNumber));
196  p->AddHeader (ppp);
197 }
198 
199 bool
201 {
202  NS_LOG_FUNCTION (this << p << param);
203  PppHeader ppp;
204  p->RemoveHeader (ppp);
205  param = PppToEther (ppp.GetProtocol ());
206  return true;
207 }
208 
209 void
211 {
212  NS_LOG_FUNCTION (this);
213  // The traffic control layer, if installed, has aggregated a
214  // NetDeviceQueueInterface object to this device
215  m_queueInterface = GetObject<NetDeviceQueueInterface> ();
217 }
218 
219 void
221 {
222  NS_LOG_FUNCTION (this);
223  m_node = 0;
224  m_channel = 0;
226  m_currentPkt = 0;
227  m_queue = 0;
228  m_queueInterface = 0;
230 }
231 
232 void
234 {
235  NS_LOG_FUNCTION (this);
236  m_bps = bps;
237 }
238 
239 void
241 {
242  NS_LOG_FUNCTION (this << t.GetSeconds ());
243  m_tInterframeGap = t;
244 }
245 
246 bool
248 {
249  NS_LOG_FUNCTION (this << p);
250  NS_LOG_LOGIC ("UID is " << p->GetUid () << ")");
251 
252  //
253  // This function is called to start the process of transmitting a packet.
254  // We need to tell the channel that we've started wiggling the wire and
255  // schedule an event that will be executed when the transmission is complete.
256  //
257  NS_ASSERT_MSG (m_txMachineState == READY, "Must be READY to transmit");
259  m_currentPkt = p;
261 
262  Time txTime = m_bps.CalculateBytesTxTime (p->GetSize ());
263  Time txCompleteTime = txTime + m_tInterframeGap;
264 
265  NS_LOG_LOGIC ("Schedule TransmitCompleteEvent in " << txCompleteTime.GetSeconds () << "sec");
267 
268  bool result = m_channel->TransmitStart (p, this, txTime);
269  if (result == false)
270  {
271  m_phyTxDropTrace (p);
272  }
273  return result;
274 }
275 
276 void
278 {
279  NS_LOG_FUNCTION (this);
280 
281  //
282  // This function is called to when we're all done transmitting a packet.
283  // We try and pull another packet off of the transmit queue. If the queue
284  // is empty, we are done, otherwise we need to start transmitting the
285  // next packet.
286  //
287  NS_ASSERT_MSG (m_txMachineState == BUSY, "Must be BUSY if transmitting");
289 
290  NS_ASSERT_MSG (m_currentPkt != 0, "PointToPointNetDevice::TransmitComplete(): m_currentPkt zero");
291 
293  m_currentPkt = 0;
294 
296  if (m_queueInterface)
297  {
298  txq = m_queueInterface->GetTxQueue (0);
299  }
300 
301  Ptr<QueueItem> item = m_queue->Dequeue ();
302  if (item == 0)
303  {
304  NS_LOG_LOGIC ("No pending packets in device queue after tx complete");
305  if (txq)
306  {
307  txq->Wake ();
308  }
309  return;
310  }
311 
312  //
313  // Got another packet off of the queue, so start the transmit process again.
314  // If the queue was stopped, start it again. Note that we cannot wake the upper
315  // layers because otherwise a packet is sent to the device while the machine
316  // state is busy, thus causing the assert in TransmitStart to fail.
317  //
318  if (txq && txq->IsStopped ())
319  {
320  txq->Start ();
321  }
322  Ptr<Packet> p = item->GetPacket ();
323  m_snifferTrace (p);
325  TransmitStart (p);
326 }
327 
328 bool
330 {
331  NS_LOG_FUNCTION (this << &ch);
332 
333  m_channel = ch;
334 
335  m_channel->Attach (this);
336 
337  //
338  // This device is up whenever it is attached to a channel. A better plan
339  // would be to have the link come up when both devices are attached, but this
340  // is not done for now.
341  //
342  NotifyLinkUp ();
343  return true;
344 }
345 
346 void
348 {
349  NS_LOG_FUNCTION (this << q);
350  m_queue = q;
351 }
352 
353 void
355 {
356  NS_LOG_FUNCTION (this << em);
357  m_receiveErrorModel = em;
358 }
359 
360 void
362 {
363  NS_LOG_FUNCTION (this << packet);
364  uint16_t protocol = 0;
365 
366  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
367  {
368  //
369  // If we have an error model and it indicates that it is time to lose a
370  // corrupted packet, don't forward this packet up, let it go.
371  //
372  m_phyRxDropTrace (packet);
373  }
374  else
375  {
376  //
377  // Hit the trace hooks. All of these hooks are in the same place in this
378  // device because it is so simple, but this is not usually the case in
379  // more complicated devices.
380  //
381  m_snifferTrace (packet);
382  m_promiscSnifferTrace (packet);
383  m_phyRxEndTrace (packet);
384 
385  //
386  // Trace sinks will expect complete packets, not packets without some of the
387  // headers.
388  //
389  Ptr<Packet> originalPacket = packet->Copy ();
390 
391  //
392  // Strip off the point-to-point protocol header and forward this packet
393  // up the protocol stack. Since this is a simple point-to-point link,
394  // there is no difference in what the promisc callback sees and what the
395  // normal receive callback sees.
396  //
397  ProcessHeader (packet, protocol);
398 
399  if (!m_promiscCallback.IsNull ())
400  {
401  m_macPromiscRxTrace (originalPacket);
402  m_promiscCallback (this, packet, protocol, GetRemote (), GetAddress (), NetDevice::PACKET_HOST);
403  }
404 
405  m_macRxTrace (originalPacket);
406  m_rxCallback (this, packet, protocol, GetRemote ());
407  }
408 }
409 
412 {
413  NS_LOG_FUNCTION (this);
414  return m_queue;
415 }
416 
417 void
419 {
420  NS_LOG_FUNCTION (this);
421  m_linkUp = true;
423 }
424 
425 void
426 PointToPointNetDevice::SetIfIndex (const uint32_t index)
427 {
428  NS_LOG_FUNCTION (this);
429  m_ifIndex = index;
430 }
431 
432 uint32_t
434 {
435  return m_ifIndex;
436 }
437 
440 {
441  return m_channel;
442 }
443 
444 //
445 // This is a point-to-point device, so we really don't need any kind of address
446 // information. However, the base class NetDevice wants us to define the
447 // methods to get and set the address. Rather than be rude and assert, we let
448 // clients get and set the address, but simply ignore them.
449 
450 void
452 {
453  NS_LOG_FUNCTION (this << address);
455 }
456 
457 Address
459 {
460  return m_address;
461 }
462 
463 bool
465 {
466  NS_LOG_FUNCTION (this);
467  return m_linkUp;
468 }
469 
470 void
472 {
473  NS_LOG_FUNCTION (this);
475 }
476 
477 //
478 // This is a point-to-point device, so every transmission is a broadcast to
479 // all of the devices on the network.
480 //
481 bool
483 {
484  NS_LOG_FUNCTION (this);
485  return true;
486 }
487 
488 //
489 // We don't really need any addressing information since this is a
490 // point-to-point device. The base class NetDevice wants us to return a
491 // broadcast address, so we make up something reasonable.
492 //
493 Address
495 {
496  NS_LOG_FUNCTION (this);
497  return Mac48Address ("ff:ff:ff:ff:ff:ff");
498 }
499 
500 bool
502 {
503  NS_LOG_FUNCTION (this);
504  return true;
505 }
506 
507 Address
509 {
510  NS_LOG_FUNCTION (this);
511  return Mac48Address ("01:00:5e:00:00:00");
512 }
513 
514 Address
516 {
517  NS_LOG_FUNCTION (this << addr);
518  return Mac48Address ("33:33:00:00:00:00");
519 }
520 
521 bool
523 {
524  NS_LOG_FUNCTION (this);
525  return true;
526 }
527 
528 bool
530 {
531  NS_LOG_FUNCTION (this);
532  return false;
533 }
534 
535 bool
537  Ptr<Packet> packet,
538  const Address &dest,
539  uint16_t protocolNumber)
540 {
542  if (m_queueInterface)
543  {
544  txq = m_queueInterface->GetTxQueue (0);
545  }
546 
547  NS_ASSERT_MSG (!txq || !txq->IsStopped (), "Send should not be called when the device is stopped");
548 
549  NS_LOG_FUNCTION (this << packet << dest << protocolNumber);
550  NS_LOG_LOGIC ("p=" << packet << ", dest=" << &dest);
551  NS_LOG_LOGIC ("UID is " << packet->GetUid ());
552 
553  //
554  // If IsLinkUp() is false it means there is no channel to send any packet
555  // over so we just hit the drop trace on the packet and return an error.
556  //
557  if (IsLinkUp () == false)
558  {
559  m_macTxDropTrace (packet);
560  return false;
561  }
562 
563  //
564  // Stick a point to point protocol header on the packet in preparation for
565  // shoving it out the door.
566  //
567  AddHeader (packet, protocolNumber);
568 
569  m_macTxTrace (packet);
570 
571  //
572  // We should enqueue and dequeue the packet to hit the tracing hooks.
573  //
574  if (m_queue->Enqueue (Create<QueueItem> (packet)))
575  {
576  //
577  // If the channel is ready for transition we send the packet right now
578  //
579  if (m_txMachineState == READY)
580  {
581  packet = m_queue->Dequeue ()->GetPacket ();
582  m_snifferTrace (packet);
583  m_promiscSnifferTrace (packet);
584  return TransmitStart (packet);
585  }
586  return true;
587  }
588 
589  // Enqueue may fail (overflow). Stop the tx queue, so that the upper layers
590  // do not send packets until there is room in the queue again.
591  m_macTxDropTrace (packet);
592  if (txq)
593  {
594  txq->Stop ();
595  }
596  return false;
597 }
598 
599 bool
601  const Address &source,
602  const Address &dest,
603  uint16_t protocolNumber)
604 {
605  NS_LOG_FUNCTION (this << packet << source << dest << protocolNumber);
606  return false;
607 }
608 
609 Ptr<Node>
611 {
612  return m_node;
613 }
614 
615 void
617 {
618  NS_LOG_FUNCTION (this);
619  m_node = node;
620 }
621 
622 bool
624 {
625  NS_LOG_FUNCTION (this);
626  return false;
627 }
628 
629 void
631 {
632  m_rxCallback = cb;
633 }
634 
635 void
637 {
638  m_promiscCallback = cb;
639 }
640 
641 bool
643 {
644  NS_LOG_FUNCTION (this);
645  return false;
646 }
647 
648 void
650 {
651  NS_LOG_FUNCTION (this << p);
652  Receive (p);
653 }
654 
655 Address
657 {
658  NS_LOG_FUNCTION (this);
659  NS_ASSERT (m_channel->GetNDevices () == 2);
660  for (uint32_t i = 0; i < m_channel->GetNDevices (); ++i)
661  {
662  Ptr<NetDevice> tmp = m_channel->GetDevice (i);
663  if (tmp != this)
664  {
665  return tmp->GetAddress ();
666  }
667  }
668  NS_ASSERT (false);
669  // quiet compiler.
670  return Address ();
671 }
672 
673 bool
675 {
676  NS_LOG_FUNCTION (this << mtu);
677  m_mtu = mtu;
678  return true;
679 }
680 
681 uint16_t
683 {
684  NS_LOG_FUNCTION (this);
685  return m_mtu;
686 }
687 
688 uint16_t
690 {
692  switch(proto)
693  {
694  case 0x0021: return 0x0800; //IPv4
695  case 0x0057: return 0x86DD; //IPv6
696  default: NS_ASSERT_MSG (false, "PPP Protocol number not defined!");
697  }
698  return 0;
699 }
700 
701 uint16_t
703 {
705  switch(proto)
706  {
707  case 0x0800: return 0x0021; //IPv4
708  case 0x86DD: return 0x0057; //IPv6
709  default: NS_ASSERT_MSG (false, "PPP Protocol number not defined!");
710  }
711  return 0;
712 }
713 
714 
715 } // namespace ns3
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:268
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the PointToPointNetDevice.
virtual void DoInitialize(void)
Initialize() implementation.
Definition: object.cc:346
PointToPointNetDevice()
Construct a PointToPointNetDevice.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
NetDevice::ReceiveCallback m_rxCallback
Receive callback.
void NotifyLinkUp(void)
Make the link up and running.
virtual bool IsLinkUp(void) const
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
static TypeId GetTypeId(void)
Get the TypeId.
Ptr< Queue > GetQueue(void) const
Get a copy of the attached Queue.
The transmitter is busy transmitting a packet.
TracedCallback< Ptr< const Packet > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet before it tries to transmit it...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
Time CalculateBytesTxTime(uint32_t bytes) const
Calculate transmission time.
Definition: data-rate.cc:235
uint32_t m_mtu
The Maximum Transmission Unit.
virtual bool SupportsSendFrom(void) const
virtual ~PointToPointNetDevice()
Destroy a PointToPointNetDevice.
static const uint16_t DEFAULT_MTU
Default MTU.
TracedCallback< Ptr< const Packet > > m_phyRxEndTrace
The trace source fired when a packet ends the reception process from the medium.
Ptr< Node > m_node
Node owning this NetDevice.
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
uint64_t GetUid(void) const
Returns the packet's Uid.
Definition: packet.cc:368
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1258
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
TracedCallback< Ptr< const Packet > > m_phyTxBeginTrace
The trace source fired when a packet begins the transmission process on the medium.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
Ptr< Packet > m_currentPkt
Current packet processed.
static uint16_t EtherToPpp(uint16_t protocol)
Ethernet to PPP protocol number mapping.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:786
Ptr< const AttributeChecker > MakeMac48AddressChecker(void)
virtual void DoDispose(void)
Destructor implementation.
Definition: object.cc:339
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
virtual Ptr< Node > GetNode(void) const
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
Packet addressed oo us.
Definition: net-device.h:540
Ptr< const AttributeAccessor > MakeMac48AddressAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
The transmitter is ready to begin transmission of a packet.
bool ProcessHeader(Ptr< Packet > p, uint16_t &param)
Removes, from a packet of data, all headers and trailers that relate to the protocol implemented by t...
a polymophic address class
Definition: address.h:90
Packet header for PPP.
Definition: ppp-header.h:48
Ptr< const AttributeChecker > MakeDataRateChecker(void)
Definition: data-rate.cc:30
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
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:446
static uint16_t PppToEther(uint16_t protocol)
PPP to Ethernet protocol number mapping.
Class for representing data rates.
Definition: data-rate.h:88
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
virtual void SetPromiscReceiveCallback(PromiscReceiveCallback cb)
void SetProtocol(uint16_t protocol)
Set the protocol type carried by this PPP packet.
Definition: ppp-header.cc:96
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: pointer.h:220
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1216
virtual void SetAddress(Address address)
Set the address of this interface.
AttributeValue implementation for Time.
Definition: nstime.h:957
Hold an unsigned integer type.
Definition: uinteger.h:44
void TransmitComplete(void)
Stop Sending a Packet Down the Wire and Begin the Interframe Gap.
TracedCallback m_linkChangeCallbacks
Callback for the link change event.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
Ptr< NetDeviceQueueInterface > m_queueInterface
NetDevice queue interface.
bool TransmitStart(Ptr< Packet > p)
Start Sending a Packet Down the Wire.
void SetInterframeGap(Time t)
Set the interframe gap used to separate packets.
A Device for a Point to Point Network Link.
NetDevice::PromiscReceiveCallback m_promiscCallback
Receive callback.
Mac48Address m_address
Mac48Address of this NetDevice.
uint16_t GetProtocol(void)
Get the protocol type carried by this PPP packet.
Definition: ppp-header.cc:102
Ptr< const AttributeAccessor > MakeDataRateAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: data-rate.h:241
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
Time m_tInterframeGap
The interframe gap that the Net Device uses to throttle packet transmission.
virtual void AddLinkChangeCallback(Callback< void > callback)
static Mac48Address ConvertFrom(const Address &address)
virtual bool NeedsArp(void) const
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:122
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual uint32_t GetIfIndex(void) const
Hold objects of type Ptr.
Definition: pointer.h:36
virtual Ptr< Channel > GetChannel(void) const
virtual void DoInitialize(void)
Initialize() implementation.
virtual Address GetAddress(void) const
an EUI-48 address
Definition: mac48-address.h:43
virtual bool IsBridge(void) const
Return true if the net device is acting as a bridge.
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:958
void DoMpiReceive(Ptr< Packet > p)
Handler for MPI receive event.
DataRate m_bps
The data rate that the Net Device uses to simulate packet transmission timing.
Ptr< PointToPointChannel > m_channel
The PointToPointChannel to which this PointToPointNetDevice has been attached.
TracedCallback< Ptr< const Packet > > m_promiscSnifferTrace
A trace source that emulates a promiscuous mode protocol sniffer connected to the device...
Ptr< ErrorModel > m_receiveErrorModel
Error model for receive packet events.
#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
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
Describes an IPv6 address.
Definition: ipv6-address.h:48
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
uint32_t m_ifIndex
Index of the interface.
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
TracedCallback< Ptr< const Packet > > m_phyRxBeginTrace
The trace source fired when a packet begins the reception process from the medium – when the simulat...
void ConnectWithoutContext(const CallbackBase &callback)
Append a Callback to the chain (without a context).
TxMachineState m_txMachineState
The state of the Net Device transmit state machine.
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...
Network layer to device interface.
Definition: net-device.h:337
virtual bool SetMtu(const uint16_t mtu)
virtual void SetIfIndex(const uint32_t index)
AttributeValue implementation for DataRate.
Definition: data-rate.h:241
AttributeValue implementation for Mac48Address.
void SetDataRate(DataRate bps)
Set the Data Rate used for transmission of packets.
TracedCallback< Ptr< const Packet > > m_macRxDropTrace
The trace source fired for packets successfully received by the device but are dropped before being f...
void Receive(Ptr< Packet > p)
Receive a packet from a connected PointToPointChannel.
virtual bool IsBroadcast(void) const
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
bool Attach(Ptr< PointToPointChannel > ch)
Attach the device to a channel.
Ptr< Queue > m_queue
The Queue which this PointToPointNetDevice uses as a packet source.
virtual void DoDispose(void)
Dispose of the object.
virtual void SetNode(Ptr< Node > node)
bool m_linkUp
Identify if the link is up or not.
tuple address
Definition: first.py:37
void AddHeader(Ptr< Packet > p, uint16_t protocolNumber)
Adds the necessary headers and trailers to a packet of data in order to respect the protocol implemen...
virtual uint16_t GetMtu(void) const
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
virtual bool IsMulticast(void) const
a unique identifier for an interface.
Definition: type-id.h:58
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition...
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:826
virtual Address GetBroadcast(void) const
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:257
void SetQueue(Ptr< Queue > queue)
Attach a queue to the PointToPointNetDevice.
TracedCallback< Ptr< const Packet > > m_phyTxEndTrace
The trace source fired when a packet ends the transmission process on the medium. ...