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  m_node = 0;
214  m_channel = 0;
216  m_currentPkt = 0;
218 }
219 
220 void
222 {
223  NS_LOG_FUNCTION (this);
224  m_bps = bps;
225 }
226 
227 void
229 {
230  NS_LOG_FUNCTION (this << t.GetSeconds ());
231  m_tInterframeGap = t;
232 }
233 
234 bool
236 {
237  NS_LOG_FUNCTION (this << p);
238  NS_LOG_LOGIC ("UID is " << p->GetUid () << ")");
239 
240  //
241  // This function is called to start the process of transmitting a packet.
242  // We need to tell the channel that we've started wiggling the wire and
243  // schedule an event that will be executed when the transmission is complete.
244  //
245  NS_ASSERT_MSG (m_txMachineState == READY, "Must be READY to transmit");
247  m_currentPkt = p;
249 
250  Time txTime = m_bps.CalculateBytesTxTime (p->GetSize ());
251  Time txCompleteTime = txTime + m_tInterframeGap;
252 
253  NS_LOG_LOGIC ("Schedule TransmitCompleteEvent in " << txCompleteTime.GetSeconds () << "sec");
255 
256  bool result = m_channel->TransmitStart (p, this, txTime);
257  if (result == false)
258  {
259  m_phyTxDropTrace (p);
260  }
261  return result;
262 }
263 
264 void
266 {
267  NS_LOG_FUNCTION (this);
268 
269  //
270  // This function is called to when we're all done transmitting a packet.
271  // We try and pull another packet off of the transmit queue. If the queue
272  // is empty, we are done, otherwise we need to start transmitting the
273  // next packet.
274  //
275  NS_ASSERT_MSG (m_txMachineState == BUSY, "Must be BUSY if transmitting");
277 
278  NS_ASSERT_MSG (m_currentPkt != 0, "PointToPointNetDevice::TransmitComplete(): m_currentPkt zero");
279 
281  m_currentPkt = 0;
282 
283  Ptr<Packet> p = m_queue->Dequeue ();
284  if (p == 0)
285  {
286  //
287  // No packet was on the queue, so we just exit.
288  //
289  return;
290  }
291 
292  //
293  // Got another packet off of the queue, so start the transmit process agin.
294  //
295  m_snifferTrace (p);
297  TransmitStart (p);
298 }
299 
300 bool
302 {
303  NS_LOG_FUNCTION (this << &ch);
304 
305  m_channel = ch;
306 
307  m_channel->Attach (this);
308 
309  //
310  // This device is up whenever it is attached to a channel. A better plan
311  // would be to have the link come up when both devices are attached, but this
312  // is not done for now.
313  //
314  NotifyLinkUp ();
315  return true;
316 }
317 
318 void
320 {
321  NS_LOG_FUNCTION (this << q);
322  m_queue = q;
323 }
324 
325 void
327 {
328  NS_LOG_FUNCTION (this << em);
329  m_receiveErrorModel = em;
330 }
331 
332 void
334 {
335  NS_LOG_FUNCTION (this << packet);
336  uint16_t protocol = 0;
337 
338  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
339  {
340  //
341  // If we have an error model and it indicates that it is time to lose a
342  // corrupted packet, don't forward this packet up, let it go.
343  //
344  m_phyRxDropTrace (packet);
345  }
346  else
347  {
348  //
349  // Hit the trace hooks. All of these hooks are in the same place in this
350  // device because it is so simple, but this is not usually the case in
351  // more complicated devices.
352  //
353  m_snifferTrace (packet);
354  m_promiscSnifferTrace (packet);
355  m_phyRxEndTrace (packet);
356 
357  //
358  // Trace sinks will expect complete packets, not packets without some of the
359  // headers.
360  //
361  Ptr<Packet> originalPacket = packet->Copy ();
362 
363  //
364  // Strip off the point-to-point protocol header and forward this packet
365  // up the protocol stack. Since this is a simple point-to-point link,
366  // there is no difference in what the promisc callback sees and what the
367  // normal receive callback sees.
368  //
369  ProcessHeader (packet, protocol);
370 
371  if (!m_promiscCallback.IsNull ())
372  {
373  m_macPromiscRxTrace (originalPacket);
374  m_promiscCallback (this, packet, protocol, GetRemote (), GetAddress (), NetDevice::PACKET_HOST);
375  }
376 
377  m_macRxTrace (originalPacket);
378  m_rxCallback (this, packet, protocol, GetRemote ());
379  }
380 }
381 
384 {
385  NS_LOG_FUNCTION (this);
386  return m_queue;
387 }
388 
389 void
391 {
392  NS_LOG_FUNCTION (this);
393  m_linkUp = true;
395 }
396 
397 void
398 PointToPointNetDevice::SetIfIndex (const uint32_t index)
399 {
400  NS_LOG_FUNCTION (this);
401  m_ifIndex = index;
402 }
403 
404 uint32_t
406 {
407  return m_ifIndex;
408 }
409 
412 {
413  return m_channel;
414 }
415 
416 //
417 // This is a point-to-point device, so we really don't need any kind of address
418 // information. However, the base class NetDevice wants us to define the
419 // methods to get and set the address. Rather than be rude and assert, we let
420 // clients get and set the address, but simply ignore them.
421 
422 void
424 {
425  NS_LOG_FUNCTION (this << address);
427 }
428 
429 Address
431 {
432  return m_address;
433 }
434 
435 bool
437 {
438  NS_LOG_FUNCTION (this);
439  return m_linkUp;
440 }
441 
442 void
444 {
445  NS_LOG_FUNCTION (this);
447 }
448 
449 //
450 // This is a point-to-point device, so every transmission is a broadcast to
451 // all of the devices on the network.
452 //
453 bool
455 {
456  NS_LOG_FUNCTION (this);
457  return true;
458 }
459 
460 //
461 // We don't really need any addressing information since this is a
462 // point-to-point device. The base class NetDevice wants us to return a
463 // broadcast address, so we make up something reasonable.
464 //
465 Address
467 {
468  NS_LOG_FUNCTION (this);
469  return Mac48Address ("ff:ff:ff:ff:ff:ff");
470 }
471 
472 bool
474 {
475  NS_LOG_FUNCTION (this);
476  return true;
477 }
478 
479 Address
481 {
482  NS_LOG_FUNCTION (this);
483  return Mac48Address ("01:00:5e:00:00:00");
484 }
485 
486 Address
488 {
489  NS_LOG_FUNCTION (this << addr);
490  return Mac48Address ("33:33:00:00:00:00");
491 }
492 
493 bool
495 {
496  NS_LOG_FUNCTION (this);
497  return true;
498 }
499 
500 bool
502 {
503  NS_LOG_FUNCTION (this);
504  return false;
505 }
506 
507 bool
509  Ptr<Packet> packet,
510  const Address &dest,
511  uint16_t protocolNumber)
512 {
513  NS_LOG_FUNCTION (this << packet << dest << protocolNumber);
514  NS_LOG_LOGIC ("p=" << packet << ", dest=" << &dest);
515  NS_LOG_LOGIC ("UID is " << packet->GetUid ());
516 
517  //
518  // If IsLinkUp() is false it means there is no channel to send any packet
519  // over so we just hit the drop trace on the packet and return an error.
520  //
521  if (IsLinkUp () == false)
522  {
523  m_macTxDropTrace (packet);
524  return false;
525  }
526 
527  //
528  // Stick a point to point protocol header on the packet in preparation for
529  // shoving it out the door.
530  //
531  AddHeader (packet, protocolNumber);
532 
533  m_macTxTrace (packet);
534 
535  //
536  // We should enqueue and dequeue the packet to hit the tracing hooks.
537  //
538  if (m_queue->Enqueue (packet))
539  {
540  //
541  // If the channel is ready for transition we send the packet right now
542  //
543  if (m_txMachineState == READY)
544  {
545  packet = m_queue->Dequeue ();
546  m_snifferTrace (packet);
547  m_promiscSnifferTrace (packet);
548  return TransmitStart (packet);
549  }
550  return true;
551  }
552 
553  // Enqueue may fail (overflow)
554  m_macTxDropTrace (packet);
555  return false;
556 }
557 
558 bool
560  const Address &source,
561  const Address &dest,
562  uint16_t protocolNumber)
563 {
564  NS_LOG_FUNCTION (this << packet << source << dest << protocolNumber);
565  return false;
566 }
567 
568 Ptr<Node>
570 {
571  return m_node;
572 }
573 
574 void
576 {
577  NS_LOG_FUNCTION (this);
578  m_node = node;
579 }
580 
581 bool
583 {
584  NS_LOG_FUNCTION (this);
585  return false;
586 }
587 
588 void
590 {
591  m_rxCallback = cb;
592 }
593 
594 void
596 {
597  m_promiscCallback = cb;
598 }
599 
600 bool
602 {
603  NS_LOG_FUNCTION (this);
604  return false;
605 }
606 
607 void
609 {
610  NS_LOG_FUNCTION (this << p);
611  Receive (p);
612 }
613 
614 Address
616 {
617  NS_LOG_FUNCTION (this);
618  NS_ASSERT (m_channel->GetNDevices () == 2);
619  for (uint32_t i = 0; i < m_channel->GetNDevices (); ++i)
620  {
621  Ptr<NetDevice> tmp = m_channel->GetDevice (i);
622  if (tmp != this)
623  {
624  return tmp->GetAddress ();
625  }
626  }
627  NS_ASSERT (false);
628  // quiet compiler.
629  return Address ();
630 }
631 
632 bool
634 {
635  NS_LOG_FUNCTION (this << mtu);
636  m_mtu = mtu;
637  return true;
638 }
639 
640 uint16_t
642 {
643  NS_LOG_FUNCTION (this);
644  return m_mtu;
645 }
646 
647 uint16_t
649 {
651  switch(proto)
652  {
653  case 0x0021: return 0x0800; //IPv4
654  case 0x0057: return 0x86DD; //IPv6
655  default: NS_ASSERT_MSG (false, "PPP Protocol number not defined!");
656  }
657  return 0;
658 }
659 
660 uint16_t
662 {
664  switch(proto)
665  {
666  case 0x0800: return 0x0021; //IPv4
667  case 0x86DD: return 0x0057; //IPv6
668  default: NS_ASSERT_MSG (false, "PPP Protocol number not defined!");
669  }
670  return 0;
671 }
672 
673 
674 } // namespace ns3
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:266
void SetReceiveErrorModel(Ptr< ErrorModel > em)
Attach a receive ErrorModel to the PointToPointNetDevice.
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:366
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:278
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.
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 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:47
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:75
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:255
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. ...