DESERT 4.0.0
uwmulti-traffic-control.h
Go to the documentation of this file.
1//
2// Copyright (c) 2014 Regents of the SIGNET lab, University of Padova.
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions
7// are met:
8// 1. Redistributions of source code must retain the above copyright
9// notice, this list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright
11// notice, this list of conditions and the following disclaimer in the
12// documentation and/or other materials provided with the distribution.
13// 3. Neither the name of the University of Padova (SIGNET lab) nor the
14// names of its contributors may be used to endorse or promote products
15// derived from this software without specific prior written permission.
16//
17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
27// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
38#ifndef UWMULTI_TRAFFIC_Control_H
39#define UWMULTI_TRAFFIC_Control_H
40
41#include <algorithm>
42#include <climits>
43#include <cmath>
44#include <iostream>
45#include <map>
46#include <module.h>
47#include <packet.h>
48#include <queue>
49#include <rng.h>
50#include <string.h>
51#include <tclcl.h>
52
53// DEFINE BEHAVIORS
54#define DEFAULT 1
55
56struct BufferType {
58 DISCARD_INCOMING = 0, // Discard incoming packets
59 CIRCULAR // Discard old packets (first packets in the queue)
60 };
61 uint max_size;
63 double send_delay;
64 uint pkts_lost;
67 BufferType(uint size, BufferBehavior behav, double del)
68 : max_size(size)
69 , behavior_buff(behav)
70 , send_delay(del)
71 , pkts_lost(0)
72 , last_sched_tx(0)
73 {
74 }
75
76 double
77 getUpdatedDelay(double time_instant)
78 {
79 if ((time_instant - last_sched_tx) >= send_delay) {
80 last_sched_tx = time_instant;
81 return 0; // last_sched_tx - time_instant
82 } else {
84 return std::max(last_sched_tx - time_instant,
85 0.0); // max to avoid problem with double precision
86 }
87 }
88};
89
90// DEFINE STATES
91
92typedef std::map<int, int> UpTrafficMap;
93typedef std::pair<int, int> BehaviorItem;
94typedef std::map<int, BehaviorItem> BehaviorMap;
95typedef std::map<int, BehaviorMap> DownTrafficMap;
96typedef std::queue<Packet *> Buffer;
97typedef std::map<int, Buffer *> DownTrafficBuffer;
99typedef std::map<int, BufferType> BufferTrafficFeature;
100
104class UwMultiTrafficControl : public Module
105{
106
107public:
112
117 {
118 }
119
130 virtual int command(int, const char *const *);
131
137 virtual void recv(Packet *p);
138
139protected:
140 int debug_;
152 virtual void recvFromUpperLayers(Packet *p);
153
160 virtual void manageBuffer(int traffic);
161
168 virtual void insertInBuffer(Packet *p, int traffic);
169
177 virtual Packet *removeFromBuffer(int traffic);
178
186 virtual Packet *getFromBuffer(int traffic);
187
195 void inline insertTraffic2UpLayer(int traffic, int upper_layer_id)
196 {
197 up_map[traffic] = upper_layer_id;
198 }
199
209 void inline insertTraffic2LowerLayer(int traffic, int lower_layer_stack,
210 int lower_layer_id, int behavior)
211 {
212 down_map[traffic][lower_layer_stack] =
213 std::make_pair(lower_layer_id, behavior);
214 // std::cout << "down_map(" << traffic << ", " << lower_layer_stack <<
215 // ") = " << (down_map[traffic][lower_layer_stack]).first << std::endl;
216 }
217
226 virtual int getBestLowerLayer(int traffic, Packet *p = NULL);
227
236 virtual int getUpperLayer(int traffic);
237
245 virtual void eraseTraffic2LowerLayer(int traffic, int lower_layer_stack);
246
253 virtual void eraseTraffic2Low(int traffic);
254
261 virtual void eraseTraffic2Up(int traffic);
262
271 virtual bool addUpLayerFromTag(int traffic_id, const std::string &tag);
272
282 virtual bool addLowLayerFromTag(
283 int traffic_id, const std::string &tag, int behavior);
284
293 void setBufferFeature(int traffic_id, int max_size, bool is_circular,
294 double send_down_delay = 0);
295
300 virtual void incrPktLoss(int traffic_id);
301
308 virtual uint getDiscardedPacket(int traffic_id) const;
309
310private:
311 // Variables
312};
313
314#endif /* UWMULTI_TRAFFIC_Control_H */
Definition uwmulti-traffic-control.h:105
virtual bool addLowLayerFromTag(int traffic_id, const std::string &tag, int behavior)
Definition uwmulti-traffic-control.cc:147
BufferTrafficFeature buffer_feature_map
Definition uwmulti-traffic-control.h:145
DownTrafficBuffer down_buffer
Definition uwmulti-traffic-control.h:143
virtual ~UwMultiTrafficControl()
Definition uwmulti-traffic-control.h:116
virtual void recvFromUpperLayers(Packet *p)
Definition uwmulti-traffic-control.cc:202
void setBufferFeature(int traffic_id, int max_size, bool is_circular, double send_down_delay=0)
Definition uwmulti-traffic-control.cc:394
virtual int command(int, const char *const *)
Definition uwmulti-traffic-control.cc:79
UwMultiTrafficControl()
Definition uwmulti-traffic-control.cc:67
virtual int getUpperLayer(int traffic)
Definition uwmulti-traffic-control.cc:348
int debug_
Definition uwmulti-traffic-control.h:140
virtual void manageBuffer(int traffic)
Definition uwmulti-traffic-control.cc:274
DownTrafficMap down_map
Definition uwmulti-traffic-control.h:142
virtual bool addUpLayerFromTag(int traffic_id, const std::string &tag)
Definition uwmulti-traffic-control.cc:118
virtual int getBestLowerLayer(int traffic, Packet *p=NULL)
Definition uwmulti-traffic-control.cc:327
UpTrafficMap up_map
Definition uwmulti-traffic-control.h:141
virtual Packet * getFromBuffer(int traffic)
Definition uwmulti-traffic-control.cc:311
virtual Packet * removeFromBuffer(int traffic)
Definition uwmulti-traffic-control.cc:294
virtual void eraseTraffic2Low(int traffic)
Definition uwmulti-traffic-control.cc:376
virtual void recv(Packet *p)
Definition uwmulti-traffic-control.cc:184
virtual void eraseTraffic2LowerLayer(int traffic, int lower_layer_stack)
Definition uwmulti-traffic-control.cc:361
virtual void incrPktLoss(int traffic_id)
Definition uwmulti-traffic-control.cc:409
virtual uint getDiscardedPacket(int traffic_id) const
Definition uwmulti-traffic-control.cc:422
virtual void eraseTraffic2Up(int traffic)
Definition uwmulti-traffic-control.cc:385
void insertTraffic2UpLayer(int traffic, int upper_layer_id)
Definition uwmulti-traffic-control.h:195
void insertTraffic2LowerLayer(int traffic, int lower_layer_stack, int lower_layer_id, int behavior)
Definition uwmulti-traffic-control.h:209
virtual void insertInBuffer(Packet *p, int traffic)
Definition uwmulti-traffic-control.cc:217
Definition uwmulti-traffic-control.h:56
double last_sched_tx
Definition uwmulti-traffic-control.h:65
BufferBehavior behavior_buff
Definition uwmulti-traffic-control.h:62
double getUpdatedDelay(double time_instant)
Definition uwmulti-traffic-control.h:77
uint pkts_lost
Definition uwmulti-traffic-control.h:64
double send_delay
Definition uwmulti-traffic-control.h:63
uint max_size
Definition uwmulti-traffic-control.h:61
BufferType(uint size, BufferBehavior behav, double del)
Definition uwmulti-traffic-control.h:67
BufferBehavior
Definition uwmulti-traffic-control.h:57
@ CIRCULAR
Definition uwmulti-traffic-control.h:59
@ DISCARD_INCOMING
Definition uwmulti-traffic-control.h:58
std::pair< int, int > BehaviorItem
Definition uwmulti-traffic-control.h:93
std::map< int, BehaviorItem > BehaviorMap
Definition uwmulti-traffic-control.h:94
std::map< int, BehaviorMap > DownTrafficMap
Definition uwmulti-traffic-control.h:95
std::map< int, BufferType > BufferTrafficFeature
Definition uwmulti-traffic-control.h:99
std::map< int, Buffer * > DownTrafficBuffer
Definition uwmulti-traffic-control.h:97
std::map< int, int > UpTrafficMap
Definition uwmulti-traffic-control.h:92
std::queue< Packet * > Buffer
Definition uwmulti-traffic-control.h:96