65 TclObject*
create(
int,
const char*
const*)
85 Tcl &tcl = Tcl::instance();
88 if(strcasecmp(argv[1],
"getProbeSent") == 0)
93 else if((strcasecmp(argv[1],
"getProbeRecv") == 0))
98 else if((strcasecmp(argv[1],
"getProbeAckSent") == 0))
103 else if((strcasecmp(argv[1],
"getProbeAckRecv") == 0))
111 if(strcasecmp(argv[1],
"addRobustLowLayer") == 0)
116 else if(strcasecmp(argv[1],
"addFastLowLayer") == 0)
127 hdr_cmn *ch = HDR_CMN(p);
128 if (ch->direction() == hdr_cmn::UP) {
132 std::cout << NOW <<
" UwMultiTrafficRangeCtr::recv PT_MULTI_TR_PROBE_ACK from:"
133 << (int)(iph->
saddr()) <<
" in layer " << idSrc << std::endl;
140 sendSyncClMsgUp(&msg);
147 std::cout << NOW <<
" UwMultiTrafficRangeCtr::recv PT_MULTI_TR_PROBE from:"
148 << (int)iph->
saddr() <<
" in layer " << idSrc << std::endl;
158 std::cout << NOW <<
" UwMultiTrafficRangeCtr::recv PT_MULTI_TR_PROBE from :" << (int)iph->
saddr()
159 <<
" for:" << (int)iph->
daddr() <<
"and not " << msg.
getAddr() <<
" in layer "
160 << idSrc <<
" discarded" << std::endl;
167 std::cout <<
"UwMultiTrafficRangeCtr::recv(DIR=UP, no signaling)" << std::endl;
173 std::cout << NOW <<
" UwMultiTrafficRangeCtr::recv(DIR=DOWN)" << std::endl;
181 std::cout <<
"UwMultiTrafficControl::manageCheckedLayer. ERROR. Buffer not "
182 <<
"configured. Traffic " << traffic << std::endl;
185 std::map<int, UwCheckRangeTimer*>::iterator it_t =
timers.find(traffic);
189 if(to->status() == TIMER_IDLE) {
193 StatusMap::iterator it_s =
status.find(traffic);
197 if(in_range ||
status[traffic].robust_id) {
201 if(p != NULL && (
HDR_UWIP(p)->daddr() == destAdd || HDR_CMN(p)->next_hop() == destAdd ||
208 std::cout << NOW <<
" UwMultiTrafficRangeCtr::manageCheckedLayer sending packet" << std::endl;
211 sendDown(idSrc,p, it_feat->second.getUpdatedDelay(NOW));
215 it_feat->second.getUpdatedDelay(NOW));
223 std::cout << NOW <<
" UwMultiTrafficRangeCtr::manageCheckedLayer nothing to send to no one"
233 }
while (p != NULL && p != p0 && (
HDR_UWIP(p)->daddr() != destAdd ||
234 HDR_CMN(p)->next_hop() == destAdd || HDR_CMN(p)->next_hop() ==
UWIP_BROADCAST));
235 if(!(
HDR_UWIP(p)->daddr() == destAdd || HDR_CMN(p)->next_hop() == destAdd ||
238 std::cout << NOW <<
" UwMultiTrafficRangeCtr::manageCheckedLayer wrong daddr "
239 << (int)
HDR_UWIP(p)->daddr() <<
", " << (int)destAdd << std::endl;
245 sendDown(idSrc,p,it_feat->second.getUpdatedDelay(NOW));
249 it_feat->second.getUpdatedDelay(NOW));
271 std::cout <<
"UwMultiTrafficControl::manageBuffer. ERROR. Buffer not "
272 <<
"configured. Traffic " << traffic << std::endl;
278 StatusMap::iterator it_s =
status.find(traffic);
280 double delay = it_feat->second.getUpdatedDelay(NOW);
290 std::cout << NOW <<
" UwMultiTrafficRangeCtr::getBestLowerLayer(" << traffic <<
")" << std::endl;
291 DownTrafficMap::iterator it =
down_map.find(traffic);
293 StatusMap::iterator it_s =
status.find(traffic);
294 if (it_s ==
status.end()) {
299 std::cout << NOW <<
" UwMultiTrafficRangeCtr::getBestLowerLayer(" << traffic
300 <<
") status == RANGE_CNF_WAIT" << std::endl;
304 BehaviorMap::iterator it_b = temp.begin();
305 for (; it_b!=temp.end(); ++it_b)
307 int module_id_tmp = it_b->second.first;
308 switch (it_b->second.second)
313 std::cout << NOW <<
" UwMultiTrafficRangeCtr::getBestLowerLayer(" << traffic <<
"): CHECK_RANGE"
314 <<
"PROBING" << it_b->second.first << std::endl;
315 if(
status[traffic].module_ids.find(module_id_tmp)==
status[traffic].module_ids.end())
316 status[traffic].module_ids.insert(module_id_tmp);
317 checkRange(traffic, it_b->second.first, HDR_CMN(p)->next_hop());
323 std::cout << NOW <<
" UwMultiTrafficRangeCtr::getBestLowerLayer(" << traffic <<
"): ROBUST"
325 status[traffic].robust_id = module_id_tmp;
330 std::cout << NOW <<
" UwMultiTrafficRangeCtr:: DEFAULT NOT ALLOWED" << std::endl;
336 return status[traffic].robust_id;
343 StatusMap::iterator it_s =
status.find(traffic);
344 if (it_s ==
status.end()) {
349 std::cout << NOW <<
" UwMultiTrafficRangeCtr::checkRange ALREADY CHECKING" << endl;
353 std::map<int, UwCheckRangeTimer*>::iterator it_t =
timers.find(traffic);
354 if (it_t ==
timers.end()) {
357 timers.insert(std::pair<int,UwCheckRangeTimer*>(traffic, t_o));
360 it_t->second->resched(
check_to_period * (it_t->second->num_expires + 1));
363 Packet* p = Packet::alloc();
364 hdr_cmn* ch = hdr_cmn::access(p);
371 sendSyncClMsgUp(&msg);
373 iph->
daddr() = destAdd;
379 std::cout << NOW <<
" UwMultiTrafficRangeCtr(" << (int)iph->
saddr() <<
")::checkRange "
380 <<
"sending PT_MULTI_TR_PROBE to " << (int) iph->
saddr() << std::endl;
386 std::cout << NOW <<
" UwMultiTrafficRangeCtr::timerExpired(" << traffic <<
")" << std::endl;
387 StatusMap::iterator it_s =
status.find(traffic);
392 if (
status[traffic].robust_id)
394 std::map<int, UwCheckRangeTimer*>::iterator it_t =
timers.find(traffic);
395 if (it_t !=
timers.end()) {
396 it_t->second->num_expires = 0;
406 for (std::set<int>::iterator it =
status[traffic].module_ids.begin();
407 it!=
status[traffic].module_ids.end(); ++it){
421 status[traffic] = default_st;
427 CounterMap::iterator it = map_cnt.find(traffic);
428 if (it != map_cnt.end()) {
431 map_cnt[traffic] = 1;
438 CounterMap::const_iterator it = map_cnt.find(traffic);
439 if (it == map_cnt.end()) {
Class used to answer to UWIPClMsgReqAddr cross layer messages.
Class used to represents the UwMultiTrafficControl layer of a node.
BufferTrafficFeature buffer_feature_map
Map with features of each buffer.
virtual int command(int, const char *const *)
TCL command interpreter.
int debug_
Flag to activate debug verbosity.
virtual void addLowLayerFromTag(int traffic_id, std::string tag, int behavior)
add a lower layer from the tag name in the map
DownTrafficMap down_map
Map of lower layers.
virtual Packet * getFromBuffer(int traffic)
get a packet of a certain type from the buffer and return it
virtual Packet * removeFromBuffer(int traffic)
remove a packet of a certain type from the buffer and return it
virtual void recv(Packet *p)
recv method.
virtual void insertInBuffer(Packet *p, int traffic)
insert a packet of a certain type in the buffer
Class that represents the binding with the tcl configuration script.
UwMultiTrafficRangeCtrClass()
Constructor of the class.
TclObject * create(int, const char *const *)
Creates the TCL object needed for the tcl language interpretation.
Definition of timer class.
int num_expires
expires counter
int const max_increment
max increment of the timeout
virtual void expire(Event *e)
Timer expire procedure: handles the PROBE timeout.
Class used to represents the UwMultiTrafficRangeCtr layer of a node.
virtual void manageCheckedLayer(int module_id, uint8_t destAdd, bool in_range, int idSrc=0)
procedure when a CHECKED stack is checked
virtual void manageBuffer(int traffic)
manage to tx a packet of traffic type
CounterMap rx_probe_ack_cnt
Number of probe ACK pkts recv for each traffic.
StatusMap status
Map of status per traffic types.
virtual void recv(Packet *p, int idSrc)
Handle a packet coming from upper layers.
CounterMap tx_probe_cnt
Number of probe pkts sent for each traffic.
void incrSignalingCounter(int traffic, CounterMap &map_cnt)
Incement number of signaling pkts sent for the given traffic.
virtual int command(int, const char *const *)
TCL command interpreter.
virtual void initStatus(int traffic)
default status initialization
CounterMap tx_probe_ack_cnt
Number of probe ACK pkts sent for each traffic.
int signaling_pktSize
Signaling packet size.
double check_to_period
Time-Out period.
uint getSignalingCounter(int traffic, const CounterMap &map_cnt) const
Return the number of signaling pkts sent for the given traffic.
UwMultiTrafficRangeCtr()
Constructor of UwMultiPhy class.
std::map< int, UwCheckRangeTimer * > timers
Map of timer per traffic types.
virtual void checkRange(int traffic, int module_id, uint8_t destAdd=UWIP_BROADCAST)
procedure to check if a
virtual void sendDown(Packet *p, double delay=0)
Send a packet to the module(s) of the bottom layers.
virtual void timerExpired(int traffic)
handle when a a timer expires
CounterMap rx_probe_cnt
Number of probe pkts recv for each traffic.
virtual int getBestLowerLayer(int traffic, Packet *p=NULL)
return the Best Lower Layer id where to forward the packet of traffic type
std::set< int > module_ids
hdr_uwcbr describes UWCBR packets.
char & priority()
Reference to the priority_ variable.
hdr_uwip describes UWIP packets.
uint8_t & daddr()
Reference to the daddr_ variable.
uint8_t & saddr()
Reference to the saddr_ variable.
int & traffic()
Reference to the traffic ID.
Provides the UWCBR packets header description and the definition of the class UWCBR.
Cross layer messages definition for the UWIP Module.
static const uint8_t UWIP_BROADCAST
Variable used to represent a broadcast UWIP.
std::map< int, BehaviorItem > BehaviorMap
stack_id, behavior>
UwMultiTrafficRangeCtrClass class_tr_range_control
packet_t PT_MULTI_TR_PROBE
std::map< int, uint > CounterMap
traffic, status
packet_t PT_MULTI_TR_PROBE_ACK