A Discrete-Event Network Simulator
API
fd-net-device.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 INRIA, 2012 University of Washington
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: Alina Quereilhac <alina.quereilhac@inria.fr>
18  * Claudio Freire <klaussfreire@sourceforge.net>
19  */
20 
21 #ifndef FD_NET_DEVICE_H
22 #define FD_NET_DEVICE_H
23 
24 #include "ns3/address.h"
25 #include "ns3/callback.h"
26 #include "ns3/data-rate.h"
27 #include "ns3/event-id.h"
28 #include "ns3/fd-reader.h"
29 #include "ns3/mac48-address.h"
30 #include "ns3/net-device.h"
31 #include "ns3/node.h"
32 #include "ns3/packet.h"
33 #include "ns3/ptr.h"
34 #include "ns3/traced-callback.h"
35 
36 #include <mutex>
37 #include <queue>
38 #include <utility>
39 
40 namespace ns3
41 {
42 
54 {
55  public:
57 
62  void SetBufferSize(uint32_t bufferSize);
63 
64  private:
65  FdReader::Data DoRead() override;
66 
67  uint32_t m_bufferSize;
68 };
69 
70 class Node;
71 
83 class FdNetDevice : public NetDevice
84 {
85  public:
90  static TypeId GetTypeId();
91 
96  {
97  DIX,
98  LLC,
99  DIXPI,
105  };
106 
110  FdNetDevice();
111 
115  ~FdNetDevice() override;
116 
117  // Delete assignment operator to avoid misuse
118  FdNetDevice(const FdNetDevice&) = delete;
119 
127 
134 
139  void SetFileDescriptor(int fd);
140 
146  void Start(Time tStart);
147 
153  void Stop(Time tStop);
154 
155  // inherited from NetDevice base class.
156  void SetIfIndex(const uint32_t index) override;
157  uint32_t GetIfIndex() const override;
158  Ptr<Channel> GetChannel() const override;
159  void SetAddress(Address address) override;
160  Address GetAddress() const override;
161  bool SetMtu(const uint16_t mtu) override;
162  uint16_t GetMtu() const override;
163  bool IsLinkUp() const override;
164  void AddLinkChangeCallback(Callback<void> callback) override;
165  bool IsBroadcast() const override;
166  Address GetBroadcast() const override;
167  bool IsMulticast() const override;
168  Address GetMulticast(Ipv4Address multicastGroup) const override;
169  bool IsPointToPoint() const override;
170  bool IsBridge() const override;
171  bool Send(Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber) override;
172  bool SendFrom(Ptr<Packet> packet,
173  const Address& source,
174  const Address& dest,
175  uint16_t protocolNumber) override;
176  Ptr<Node> GetNode() const override;
177  void SetNode(Ptr<Node> node) override;
178  bool NeedsArp() const override;
181  bool SupportsSendFrom() const override;
182  Address GetMulticast(Ipv6Address addr) const override;
183 
188  virtual void SetIsBroadcast(bool broadcast);
193  virtual void SetIsMulticast(bool multicast);
194 
201  virtual ssize_t Write(uint8_t* buffer, size_t length);
202 
203  protected:
207  void DoInitialize() override;
208 
209  void DoDispose() override;
210 
215  int GetFileDescriptor() const;
216 
222  virtual uint8_t* AllocateBuffer(size_t len);
223 
228  virtual void FreeBuffer(uint8_t* buf);
229 
235  void ReceiveCallback(uint8_t* buf, ssize_t len);
236 
240  std::mutex m_pendingReadMutex;
241 
245  std::queue<std::pair<uint8_t*, ssize_t>> m_pendingQueue;
246 
247  private:
251  void StartDevice();
252 
256  void StopDevice();
257 
263 
267  virtual void DoFinishStartingDevice();
268 
272  virtual void DoFinishStoppingDevice();
273 
277  void ForwardUp();
278 
285 
289  void NotifyLinkUp();
290 
295 
301  uint32_t m_nodeId;
302 
307  uint32_t m_ifIndex;
308 
312  uint16_t m_mtu;
313 
317  int m_fd;
318 
323 
328 
333 
338  bool m_linkUp;
339 
344 
350 
356 
361 
366 
371 
380 
385 
391 
399 
407 
416 
425 
434 
444 
451 
471 
491 };
492 
493 } // namespace ns3
494 
495 #endif /* FD_NET_DEVICE_H */
a polymophic address class
Definition: address.h:101
An identifier for simulation events.
Definition: event-id.h:55
This class performs the actual data reading from the sockets.
Definition: fd-net-device.h:54
uint32_t m_bufferSize
size of the read buffer
Definition: fd-net-device.h:67
void SetBufferSize(uint32_t bufferSize)
Set size of the read buffer.
FdReader::Data DoRead() override
The read implementation.
a NetDevice to read/write network traffic from/into a file descriptor.
Definition: fd-net-device.h:84
EventId m_stopEvent
NetDevice stop event.
void StopDevice()
Tear down the device.
virtual void FreeBuffer(uint8_t *buf)
Free the given packet buffer.
bool m_isBroadcast
Flag indicating whether or not the underlying net device supports broadcast.
Ptr< FdReader > m_fdReader
Reader for the file descriptor.
bool IsMulticast() const override
TracedCallback< Ptr< const Packet > > m_macRxDropTrace
The trace source fired for packets successfully received by the device but which are dropped before b...
uint32_t m_ifIndex
The ns-3 interface index (in the sense of net device index) that has been assigned to this network de...
int m_fd
The file descriptor used for receive/send network traffic.
virtual uint8_t * AllocateBuffer(size_t len)
Allocate packet buffer.
uint16_t m_mtu
The MTU associated to the file descriptor technology.
void SetReceiveCallback(NetDevice::ReceiveCallback cb) override
virtual void SetIsBroadcast(bool broadcast)
Set if the NetDevice is able to send Broadcast messages.
Ptr< Node > GetNode() const override
void Start(Time tStart)
Set a start time for the device.
Ptr< Node > m_node
The ns-3 node associated to the net device.
bool SetMtu(const uint16_t mtu) override
int GetFileDescriptor() const
Get the associated file descriptor.
TracedCallback m_linkChangeCallbacks
Callbacks to fire if the link changes state (up or down).
virtual Ptr< FdReader > DoCreateFdReader()
Create the FdReader object.
void SetAddress(Address address) override
Set the address of this interface.
uint32_t m_maxPendingReads
Maximum number of packets that can be received and scheduled for read but not yet read.
std::mutex m_pendingReadMutex
Mutex to increase pending read counter.
Address GetBroadcast() const override
NetDevice::ReceiveCallback m_rxCallback
The callback used to notify higher layers that a packet has been received.
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
Time m_tStart
Time to start spinning up the device.
void SetNode(Ptr< Node > node) override
std::queue< std::pair< uint8_t *, ssize_t > > m_pendingQueue
Number of packets that were received and scheduled for read but not yet read.
void Stop(Time tStop)
Set a stop time for the device.
void SetIfIndex(const uint32_t index) override
EventId m_startEvent
NetDevice start event.
void StartDevice()
Spin up the device.
bool m_isMulticast
Flag indicating whether or not the underlying net device supports multicast.
void DoDispose() override
Destructor implementation.
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition,...
bool IsBroadcast() const override
TracedCallback< Ptr< const Packet > > m_promiscSnifferTrace
A trace source that emulates a promiscuous mode protocol sniffer connected to the device.
Address GetAddress() const override
FdNetDevice()
Constructor for the FdNetDevice.
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
bool NeedsArp() const override
~FdNetDevice() override
Destructor for the FdNetDevice.
uint16_t GetMtu() const override
void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode)
Set the link layer encapsulation mode of this device.
static TypeId GetTypeId()
Get the type ID.
bool IsBridge() const override
Return true if the net device is acting as a bridge.
void SetPromiscReceiveCallback(NetDevice::PromiscReceiveCallback cb) override
EncapsulationMode m_encapMode
The type of encapsulation of the received/transmitted frames.
bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber) override
Ptr< Channel > GetChannel() const override
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode.
void NotifyLinkUp()
Notify that the link is up and ready.
bool TransmitStart(Ptr< Packet > p)
Start Sending a Packet Down the Wire.
TracedCallback< Ptr< const Packet > > m_phyRxDropTrace
The trace source fired when the phy layer drops a packet it has received.
Address GetMulticast(Ipv4Address multicastGroup) const override
Make and return a MAC multicast address using the provided multicast group.
uint32_t GetIfIndex() const override
void AddLinkChangeCallback(Callback< void > callback) override
EncapsulationMode
Enumeration of the types of frames supported in the class.
Definition: fd-net-device.h:96
@ DIX
DIX II / Ethernet II packet.
Definition: fd-net-device.h:97
@ DIXPI
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:99
@ LLC
802.2 LLC/SNAP Packet
Definition: fd-net-device.h:98
bool m_linkUp
Flag indicating whether or not the link is up.
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
virtual void DoFinishStoppingDevice()
Complete additional actions, if any, to tear down the device.
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber) override
void SetFileDescriptor(int fd)
Set the associated file descriptor.
Time m_tStop
Time to start tearing down the device.
TracedCallback< Ptr< const Packet > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it.
virtual ssize_t Write(uint8_t *buffer, size_t length)
Write packet data to device.
bool IsLinkUp() const override
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...
Mac48Address m_address
The net device mac address.
virtual void SetIsMulticast(bool multicast)
Set if the NetDevice is able to send Multicast messages.
void ForwardUp()
Forward the frame to the appropriate callback for processing.
void DoInitialize() override
Method Initialization for start and stop attributes.
FdNetDevice::EncapsulationMode GetEncapsulationMode() const
Get the link layer encapsulation mode of this device.
bool SupportsSendFrom() const override
uint32_t m_nodeId
a copy of the node id so the read thread doesn't have to GetNode() in in order to find the node ID.
virtual void DoFinishStartingDevice()
Complete additional actions, if any, to spin up down the device.
FdNetDevice(const FdNetDevice &)=delete
bool IsPointToPoint() const override
Return true if the net device is on a point-to-point link.
A class that asynchronously reads from a file descriptor.
Definition: fd-reader.h:57
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Describes an IPv6 address.
Definition: ipv6-address.h:49
an EUI-48 address
Definition: mac48-address.h:46
Network layer to device interface.
Definition: net-device.h:98
Callback< bool, Ptr< NetDevice >, Ptr< const Packet >, uint16_t, const Address & > ReceiveCallback
Definition: net-device.h:322
A network Node.
Definition: node.h:57
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Forward calls to a chain of Callback.
a unique identifier for an interface.
Definition: type-id.h:59
address
Definition: first.py:47
Every class exported by the ns3 library is enclosed in the ns3 namespace.
A structure representing data read.
Definition: fd-reader.h:91