RINASim  October 2016
Documentation of framework for OMNeT++
TSimpleDV.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <string>
4 #include <map>
5 
6 #include <IntTSimpleRouting.h>
7 #include "common/DV_Module.h"
8 
9 
10 namespace TSimpleDV {
11 
12 using namespace common_DVModule;
13 
14 template<class T>
15 class TSimpleDV: public IntTSimpleRouting<T> {
16 protected:
17  string myAddr;
18 
19  map<string, DV_Module<T> > modules;
20 
21  class Update : public IntRoutingUpdate {
22  public:
23  string qos;
25  };
26 
27  class AutoMsg : public cMessage {
28  public:
29  string qos;
30  };
31 
32 public:
34 
35  //Process a Routing Update, return true => inform FWDG of the update
37  if(Update * u = dynamic_cast<Update*>(update)) {
38  if(modules.find(u->qos) == modules.end()) {
40  }
41 
42  return modules[u->qos].processUpdate(u->u);
43  }
44  return false;
45  }
46 
47  //Modules connection
48  virtual void chSendUpdate(Routing_Update * update, const Address & dst, Routing_Alg_I * module) {
49  bool found = false;
50  Update * up = new Update();
51  up->setDestination(dst);
52  up->setSource(IntTSimpleRouting<T>::myAddress);
53  up->u = update;
54 
55  for(const auto & md : modules) {
56  if(&md.second == module) {
57  found = true;
58  up->qos = md.first;
59  break;
60  }
61  }
62 
63  if(found){
65  }
66  }
67 
68  virtual void chScheduleAt(Routing_Alg_I * module, const simtime_t & t) {
69  Enter_Method_Silent();
70  bool found = false;
71  AutoMsg * m = new AutoMsg();
72 
73  for(const auto & md : modules) {
74  if(&md.second == module) {
75  found = true;
76  m->qos = md.first;
77  break;
78  }
79  }
80 
81  if(found){
82  IntTSimpleRouting<T>::scheduleAt(simTime()+t, m);
83  }
84  }
85 
86  //Flow inserted/removed
87  virtual void insertFlow(const Address &addr, const string &dst, const string& qos, const T &metric) {
88  if(modules.find(qos) == modules.end()) {
90  }
91  modules[qos].addFlow(addr, dst, metric);
92  }
93  virtual void removeFlow(const Address &addr, const string &dst, const string& qos) {
94  if(modules.find(qos) == modules.end()) {
96  }
97  modules[qos].removeFlow(addr, dst);
98  }
99 
100  //Get Changes // QoS // Dst // <metric, next hops>
101  virtual map<string, map<string, nhLMetric<T> > > getChanges() {
102  map<string, map<string, nhLMetric<T> > > ret;
103  for(auto & md : modules) {
104  ret[md.first] = md.second.getChanges();
105  }
106  return ret;
107  }
108  virtual map<string, map<string, nhLMetric<T> > > getAll() {
109  map<string, map<string, nhLMetric<T> > > ret;
110  for(auto & md : modules) {
111  ret[md.first] = md.second.getAll();
112  }
113  return ret;
114  }
115 
116  virtual void handleMessage(cMessage *msg){
117  if(AutoMsg * m = dynamic_cast<AutoMsg*>(msg)) {
118  if(modules.find(m->qos) == modules.end()) {
120  }
121  modules[m->qos].sendUpdate();
122  }
123  delete msg;
124  }
125 
126 
127 protected:
128  // Called after initialize
129  virtual void onPolicyInit() {
130  myAddr = IntTSimpleRouting<T>::par("myAddr").stdstringValue();
131  if(myAddr == "") {
132  myAddr = IntTSimpleRouting<T>::myAddress.getIpcAddress().getName();
133  }
134  };
135 
136  void finish(){
137  if(IntTSimpleRouting<T>::par("printAtEnd").boolValue()){
138  EV<< "Routing at "<< IntTSimpleRouting<T>::myAddress <<endl;
139  for(auto & md : modules) {
140  EV << "With QoS \"" << md.first <<"\"" << endl;
141  md.second.print();
142  }
143  }
144  }
145 };
146 
147 }
virtual void chSendUpdate(Routing_Update *update, const Address &dst, Routing_Alg_I *module)
Definition: TSimpleDV.h:48
virtual void addFlow(const Address &_nAddr, const string &_addr, const T &_metric)
Definition: DV_Module.h:208
map< string, DV_Module< T > > modules
Definition: TSimpleDV.h:19
virtual void sendUpdate()
Definition: DV_Module.h:290
virtual map< string, map< string, nhLMetric< T > > > getAll()
Definition: TSimpleDV.h:108
bool processUpdate(IntRoutingUpdate *update)
Definition: TSimpleDV.h:36
virtual void removeFlow(const Address &addr, const string &dst, const string &qos)
Definition: TSimpleDV.h:93
virtual void handleMessage(cMessage *msg)
Definition: TSimpleDV.h:116
virtual map< string, map< string, nhLMetric< T > > > getChanges()
Definition: TSimpleDV.h:101
virtual void onPolicyInit()
Definition: TSimpleDV.h:129
virtual void insertFlow(const Address &addr, const string &dst, const string &qos, const T &metric)
Definition: TSimpleDV.h:87
virtual void chScheduleAt(Routing_Alg_I *module, const simtime_t &t)
Definition: TSimpleDV.h:68
virtual void removeFlow(const Address &_nAddr, const string &_addr)
Definition: DV_Module.h:230
Routing_Update * u
Definition: TSimpleDV.h:24
void sendUpdate(IntRoutingUpdate *update)
Definition: IntRouting.cc:62
virtual bool processUpdate(Routing_Update *update)
Definition: DV_Module.h:249
Address class holds IPC Process identification.
Definition: Address.h:42