RINASim  October 2016
Documentation of framework for OMNeT++
Fabric_Routing.cc
Go to the documentation of this file.
1 #include "Fabric_Routing.h"
2 
3 
4 
5 namespace NSPSimpleDC {
6 
7  Register_Class(Fabric_Routing);
8 
10  if(dst.type == 1
11  || (dst.type == 0 && dst.a != Im.a)
12  || (dst.type == 2 && dst.a != Im.b)) {
13  cerr << "I'm " << Im
14  << " -- "
15  << "Invalid neighbour "<< dst
16  << endl;
17  return;
18  }
19 
20  linkId lid = linkId(dst, Im);
21  linkInfo & li = myLinks [lid];
22 
23  if(!li.status) {
24  li.status = true;
25  if(start == nullptr) {
26  li.timestamp = simTime();
27  } else {
28  li.timestamp = 0;
29  }
30 
31  linksKo.erase(lid);
33  }
34  }
35 
37  if((dst.type != 0 || dst.a != Im.a)
38  && (dst.type != 2 || dst.a != Im.b)) {
39  cerr << "Invalid neighbour" << endl;
40  return;
41  }
42 
43  linkId lid = linkId(dst, Im);
44  linkInfo & li = myLinks [lid];
45 
46  if(li.status) {
47  li.status = false;
48  li.timestamp = simTime();
49  linksKo[lid] = li;
51  }
52  }
53 
55  for(int i = 0; i < torXpod; i++) {
56  linkId l = linkId(DCAddr(0, Im.a, i), Im);
57  myLinks [l] = linkInfo(l, false, 0);
58  linksKo[l] = linkInfo(l, false, 0);
59  }
60  for(int i = 0; i < spineXfabric; i++) {
61  linkId l = linkId(Im, DCAddr(2, Im.b, i));
62  myLinks [l] = linkInfo(l, false, 0);
63  linksKo[l] = linkInfo(l, false, 0);
64  }
65  }
66 
67  set<DCAddr> Fabric_Routing::getNotOptimalDst(map<DCAddr, tableNode> * table) {
68 
69  set<DCAddr> ret;
70 
71  for(auto & e : *table) {
72  const DCAddr & dst = e.first;
73  tableNode & tn = e.second;
74  if(dst == Im) { continue; }
75  switch(dst.type) {
76  case 0: {
77  if(dst.a == Im.a) {
78  if(tn.d > 1 || (int)tn.L.size() != 1) {
79  ret.insert(dst);
80  } else {
81  const linkId & li = **(tn.L.begin());
82  if(li.src != dst) {
83  ret.insert(dst);
84  }
85  }
86  } else {
87  if(tn.d > 3 || (int)tn.L.size() != spineXfabric) {
88  ret.insert(dst);
89  } else for(auto & k : tn.L) {
90  if(k->dst.type != 2) {
91  ret.insert(dst);
92  break;
93  }
94  }
95  }
96  } break;
97  case 1: {
98  if(dst.a == Im.a) {
99  if(tn.d > 2 || (int)tn.L.size() != torXpod) {
100  ret.insert(dst);
101  } else for(auto & k : tn.L) {
102  if(k->src.type != 0) {
103  ret.insert(dst);
104  break;
105  }
106  }
107  } else if(dst.b == Im.b) {
108  if(tn.d > 2 || (int)tn.L.size() != spineXfabric) {
109  ret.insert(dst);
110  } else for(auto & k : tn.L) {
111  if(k->dst.type != 2) {
112  ret.insert(dst);
113  break;
114  }
115  }
116  } else if(tn.d > 4 || (int)tn.L.size() != torXpod+spineXfabric) {
117  ret.insert(dst);
118  }
119  }break;
120  case 2: {
121  if(dst.a == Im.b) {
122  if(tn.d > 1 || (int)tn.L.size() != 1) {
123  ret.insert(dst);
124  } else {
125  const linkId & li = **(tn.L.begin());
126  if(li.dst != dst) {
127  ret.insert(dst);
128  }
129  }
130  } else {
131  if(tn.d > 3 || (int)tn.L.size() != torXpod) {
132  ret.insert(dst);
133  }else for(auto & k : tn.L) {
134  if(k->src.type != 0) {
135  ret.insert(dst);
136  break;
137  }
138  }
139  }
140  }break;
141  case 3: {
142  if((dst.b == Im.b)) {
143  if(tn.d > 2 || (int)tn.L.size() != spineXfabric) {
144  ret.insert(dst);
145  }
146  } else if(tn.d > 4 || (int)tn.L.size() != torXpod) {
147  ret.insert(dst);
148  }
149  }break;
150 
151  }
152  }
153 
154  return ret;
155  }
156 
158 
159  }
160 }
Register_Class(SimpleDCGenerator)
void activeNeigh(const DCAddr &dst)
map< linkId, linkInfo > linksKo
Definition: IntDCRouting.h:112
set< const linkId * > L
Definition: IntDCRouting.h:73
map< linkId, linkInfo > myLinks
Definition: IntDCRouting.h:112
void insert(set< const linkId * > Ls)
Definition: IntDCRouting.cc:76
set< DCAddr > getNotOptimalDst(map< DCAddr, tableNode > *table)
void inactiveNeigh(const DCAddr &dst)