A Discrete-Event Network Simulator
API
fd-net-device.h
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 #ifndef FD_NET_DEVICE_H
23 #define FD_NET_DEVICE_H
24 
25 #include "ns3/address.h"
26 #include "ns3/callback.h"
27 #include "ns3/data-rate.h"
28 #include "ns3/event-id.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/system-condition.h"
35 #include "ns3/traced-callback.h"
36 #include "ns3/unix-fd-reader.h"
37 #include "ns3/system-mutex.h"
38 
39 #include <utility>
40 #include <queue>
41 
42 namespace ns3 {
43 
44 
56 {
57 public:
59 
63  void SetBufferSize (uint32_t bufferSize);
64 
65 private:
66  FdReader::Data DoRead (void);
67 
68  uint32_t m_bufferSize;
69 };
70 
71 class Node;
72 
84 class FdNetDevice : public NetDevice
85 {
86 public:
91  static TypeId GetTypeId (void);
92 
97  {
98  DIX,
99  LLC,
106  };
107 
111  FdNetDevice ();
112 
116  virtual ~FdNetDevice ();
117 
125 
132 
137  void SetFileDescriptor (int fd);
138 
144  void Start (Time tStart);
145 
151  void Stop (Time tStop);
152 
153  // inherited from NetDevice base class.
154  virtual void SetIfIndex (const uint32_t index);
155  virtual uint32_t GetIfIndex (void) const;
156  virtual Ptr<Channel> GetChannel (void) const;
157  virtual void SetAddress (Address address);
158  virtual Address GetAddress (void) const;
159  virtual bool SetMtu (const uint16_t mtu);
160  virtual uint16_t GetMtu (void) const;
161  virtual bool IsLinkUp (void) const;
162  virtual void AddLinkChangeCallback (Callback<void> callback);
163  virtual bool IsBroadcast (void) const;
164  virtual Address GetBroadcast (void) const;
165  virtual bool IsMulticast (void) const;
166  virtual Address GetMulticast (Ipv4Address multicastGroup) const;
167  virtual bool IsPointToPoint (void) const;
168  virtual bool IsBridge (void) const;
169  virtual bool Send (Ptr<Packet> packet, const Address& dest, uint16_t protocolNumber);
170  virtual bool SendFrom (Ptr<Packet> packet, const Address& source, const Address& dest, uint16_t protocolNumber);
171  virtual Ptr<Node> GetNode (void) const;
172  virtual void SetNode (Ptr<Node> node);
173  virtual bool NeedsArp (void) const;
176  virtual bool SupportsSendFrom () const;
177  virtual Address GetMulticast (Ipv6Address addr) const;
178 
183  virtual void SetIsBroadcast (bool broadcast);
188  virtual void SetIsMulticast (bool multicast);
189 
190 protected:
191  virtual void DoDispose (void);
192 
193 private:
200  FdNetDevice (FdNetDevice const &);
201 
205  void StartDevice (void);
206 
210  void StopDevice (void);
211 
215  void ReceiveCallback (uint8_t *buf, ssize_t len);
216 
220  void ForwardUp (void);
221 
227  bool TransmitStart (Ptr<Packet> p);
228 
232  void NotifyLinkUp (void);
233 
238 
244  uint32_t m_nodeId;
245 
249  uint32_t m_ifIndex;
250 
254  uint16_t m_mtu;
255 
259  int m_fd;
260 
265 
270 
275 
280  bool m_linkUp;
281 
286 
292 
298 
302  std::queue< std::pair<uint8_t *, ssize_t> > m_pendingQueue;
303 
308 
313 
318 
323 
332 
337 
342 
350 
358 
367 
376 
385 
395 
402 
422 
442 
443 };
444 
445 } // namespace ns3
446 
447 #endif /* FD_NET_DEVICE_H */
448 
virtual uint32_t GetIfIndex(void) const
virtual Ptr< Node > GetNode(void) const
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
void StopDevice(void)
Tear down the device.
A structure representing data read.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
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 bool IsLinkUp(void) const
uint16_t m_mtu
The MTU associated to the file descriptor technology.
DIX II / Ethernet II packet.
Definition: fd-net-device.h:98
void SetFileDescriptor(int fd)
Set the associated file descriptor.
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...
Forward calls to a chain of Callback.
virtual bool SendFrom(Ptr< Packet > packet, const Address &source, const Address &dest, uint16_t protocolNumber)
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...
Time m_tStart
Time to start spinning up the device.
virtual bool SupportsSendFrom() const
Ptr< FdNetDeviceFdReader > m_fdReader
Reader for the file descriptor.
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.
virtual void SetIfIndex(const uint32_t index)
a polymophic address class
Definition: address.h:90
A class that asynchronously reads from a file descriptor.
void NotifyLinkUp(void)
Notify that the link is up and ready.
virtual bool IsPointToPoint(void) const
Return true if the net device is on a point-to-point link.
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 bool IsBridge(void) const
Return true if the net device is acting as a bridge.
virtual bool IsBroadcast(void) const
bool TransmitStart(Ptr< Packet > p)
Start Sending a Packet Down the Wire.
virtual void SetIsMulticast(bool multicast)
Set if the NetDevice is able to send Multicast messages.
virtual Address GetAddress(void) const
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...
This class performs the actual data reading from the sockets.
Definition: fd-net-device.h:55
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.
TracedCallback< Ptr< const Packet > > m_macRxDropTrace
The trace source fired for packets successfully received by the device but which are dropped before b...
void SetEncapsulationMode(FdNetDevice::EncapsulationMode mode)
Set the link layer encapsulation mode of this device.
EventId m_stopEvent
NetDevice stop event.
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).
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:37
virtual uint16_t GetMtu(void) const
virtual void SetNode(Ptr< Node > node)
an EUI-48 address
Definition: mac48-address.h:43
virtual Address GetBroadcast(void) const
A class which provides a relatively platform-independent Mutual Exclusion thread synchronization prim...
Definition: system-mutex.h:58
TracedCallback< Ptr< const Packet > > m_snifferTrace
A trace source that emulates a non-promiscuous protocol sniffer connected to the device.
virtual bool NeedsArp(void) const
FdReader::Data DoRead(void)
The read implementation.
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
uint32_t m_ifIndex
The ns-3 interface index (in the sense of net device index) that has been assigned to this network de...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
802.2 LLC/SNAP Packet
Definition: fd-net-device.h:99
static TypeId GetTypeId(void)
Get the type ID.
An identifier for simulation events.
Definition: event-id.h:53
Network layer to device interface.
Definition: net-device.h:95
TracedCallback< Ptr< const Packet > > m_phyTxDropTrace
The trace source fired when the phy layer drops a packet as it tries to transmit it.
virtual void SetAddress(Address address)
Set the address of this interface.
void Start(Time tStart)
Set a start time for the device.
A network Node.
Definition: node.h:56
virtual void SetReceiveCallback(NetDevice::ReceiveCallback cb)
EventId m_startEvent
NetDevice start event.
NetDevice::PromiscReceiveCallback m_promiscRxCallback
The callback used to notify higher layers that a packet has been received in promiscuous mode...
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.
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.
bool m_isBroadcast
Flag indicating whether or not the underlying net device supports broadcast.
virtual void DoDispose(void)
Destructor implementation.
bool m_linkUp
Flag indicating whether or not the link is up.
a unique identifier for an interface.
Definition: type-id.h:58
FdNetDevice()
Constructor for the FdNetDevice.
virtual ~FdNetDevice()
Destructor for the FdNetDevice.
bool m_isMulticast
Flag indicating whether or not the underlying net device supports multicast.
virtual bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
Time m_tStop
Time to start tearing down the device.
virtual bool IsMulticast(void) const
SystemMutex m_pendingReadMutex
Mutex to increase pending read counter.