A Discrete-Event Network Simulator
API
netmap-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) 2017 Universita' degli Studi di Napoli Federico II
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: Pasquale Imputato <p.imputato@gmail.com>
19  */
20 
21 #ifndef NETMAP_NET_DEVICE_H
22 #define NETMAP_NET_DEVICE_H
23 
24 #include "ns3/net-device-queue-interface.h"
25 #include <mutex>
26 #include "fd-net-device.h"
27 #include <net/netmap_user.h>
28 #include <atomic>
29 
30 namespace ns3 {
31 
32 class SystemThread;
33 
45 {
46 public:
51  static TypeId GetTypeId (void);
52 
54  virtual ~NetDeviceQueueLock ();
55 
60  virtual void Start (void);
61 
66  virtual void Stop (void);
67 
73  virtual void Wake (void);
74 
82  virtual bool IsStopped (void) const;
83 
88  virtual void NotifyQueuedBytes (uint32_t bytes);
89 
94  virtual void NotifyTransmittedBytes (uint32_t bytes);
95 
96 private:
97  mutable std::mutex m_mutex;
98 };
99 
106 {
107 public:
109 
114  void SetBufferSize (uint32_t bufferSize);
115 
120  void SetNetmapIfp (struct netmap_if *nifp);
121 
122 private:
123  FdReader::Data DoRead (void);
124 
125  uint32_t m_bufferSize;
126  struct netmap_if *m_nifp;
127 };
128 
138 {
139 public:
144  static TypeId GetTypeId (void);
145 
146  NetmapNetDevice ();
147  virtual ~NetmapNetDevice ();
148 
153  uint32_t GetBytesInNetmapTxRing ();
154 
159  int GetSpaceInNetmapTxRing () const;
160 
166 
171  void SetNetmapInterfaceRepresentation (struct netmap_if *nifp);
172 
178  void SetTxRingsInfo (uint32_t nTxRings, uint32_t nTxRingsSlots);
179 
185  void SetRxRingsInfo (uint32_t nRxRings, uint32_t nRxRingsSlots);
186 
193  virtual ssize_t Write (uint8_t *buffer, size_t length);
194 
195 private:
197  void DoFinishStartingDevice (void);
198  void DoFinishStoppingDevice (void);
199 
204  virtual void SyncAndNotifyQueue ();
205 
206  struct netmap_if *m_nifp;
207  uint32_t m_nTxRings;
208  uint32_t m_nTxRingsSlots;
209  uint32_t m_nRxRings;
210  uint32_t m_nRxRingsSlots;
214  std::atomic<bool> m_syncAndNotifyQueueThreadRun;
216 };
217 
218 } // namespace ns3
219 
220 #endif /* NETMAP_NET_DEVICE_H */
struct netmap_if * m_nifp
Netmap interface representation.
int GetSpaceInNetmapTxRing() const
Get the number of slots currently available in the netmap transmission ring.
A structure representing data read.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
uint8_t m_syncAndNotifyQueuePeriod
The period of time in us after which the device syncs the netmap ring and notifies queue status...
uint32_t m_nTxRings
Number of transmission rings.
uint32_t m_nRxRings
Number of receiver rings.
uint32_t GetBytesInNetmapTxRing()
Get the number of bytes currently in the netmap transmission ring.
virtual void SyncAndNotifyQueue()
This function syncs netmap ring and notifies netdevice queue.
std::atomic< bool > m_syncAndNotifyQueueThreadRun
Running flag of the flow control thread.
uint32_t m_totalQueuedBytes
Total queued bytes.
uint32_t m_bufferSize
size of the read buffer
A class that asynchronously reads from a file descriptor.
Network device transmission queue with lock.
uint32_t m_nRxRingsSlots
Number of slots in the receiver rings.
void SetNetmapInterfaceRepresentation(struct netmap_if *nifp)
Set the netmap interface representation.
struct netmap_if * m_nifp
Netmap interface representation.
virtual void Stop(void)
Called by the device to stop this device transmission queue.
void SetNetmapIfp(struct netmap_if *nifp)
Set netmap interface representation.
void SetBufferSize(uint32_t bufferSize)
Set size of the read buffer.
virtual void NotifyQueuedBytes(uint32_t bytes)
Called by the netdevice to report the number of bytes queued to the device queue. ...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
virtual void Start(void)
Called by the device to start this device transmission queue.
Ptr< NetDeviceQueue > m_queue
NetDevice queue.
virtual void NotifyTransmittedBytes(uint32_t bytes)
Called by the netdevice to report the number of bytes it is going to transmit.
Ptr< SystemThread > m_syncAndNotifyQueueThread
Thread used to perform the flow control.
void DoFinishStartingDevice(void)
Complete additional actions, if any, to spin up down the device.
Ptr< FdReader > DoCreateFdReader(void)
Create the FdReader object.
virtual ssize_t Write(uint8_t *buffer, size_t length)
The function Writes a packet into the netmap transmission ring.
FdReader::Data DoRead(void)
The read implementation.
This class performs the actual data reading from the netmap ring.
uint32_t m_nTxRingsSlots
Number of slots in the transmission rings.
void SetNetDeviceQueue(Ptr< NetDeviceQueue > queue)
Set the NetDeviceQueue.
virtual bool IsStopped(void) const
Get the status of the device transmission queue.
a NetDevice to read/write network traffic from/into a file descriptor.
Definition: fd-net-device.h:84
static TypeId GetTypeId(void)
Get the type ID.
static TypeId GetTypeId(void)
Get the type ID.
a NetDevice to read/write network traffic from/into a netmap file descriptor.
Network device transmission queue.
void SetTxRingsInfo(uint32_t nTxRings, uint32_t nTxRingsSlots)
Set the netmap transmission rings info.
a unique identifier for an interface.
Definition: type-id.h:58
void DoFinishStoppingDevice(void)
Complete additional actions, if any, to tear down the device.
void SetRxRingsInfo(uint32_t nRxRings, uint32_t nRxRingsSlots)
Set the netmap receiver rings info.
std::mutex m_mutex
Mutex to serialize the operations performed on the queue.
virtual void Wake(void)
Called by the device to wake the queue disc associated with this device transmission queue...