X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/02519cb2c391d94f3b8d6042f6119ffc71ebab97..9003b522ca66f1a3723c63ce1c4753ad7aea9b70:/src/surf/gtnets/gtnets_simulator.cc diff --git a/src/surf/gtnets/gtnets_simulator.cc b/src/surf/gtnets/gtnets_simulator.cc index d0f1967718..626d2ca906 100644 --- a/src/surf/gtnets/gtnets_simulator.cc +++ b/src/surf/gtnets/gtnets_simulator.cc @@ -1,4 +1,3 @@ -/* $Id$ */ /* Copyright (c) 2007 Kayo Fujiwara. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -8,11 +7,12 @@ #include "gtnets_topology.h" #include #include -#ifdef DEBUG0 - #undef DEBUG0 +#ifdef XBT_DEBUG + #undef XBT_DEBUG #endif #include "xbt/log.h" #include "xbt/asserts.h" +#include "RngStream.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_simulator, surf_network_gtnets, "Logging specific to the SURF network GTNetS simulator"); @@ -27,24 +27,138 @@ static int meta_flg = 0; void static tcp_sent_callback(void* action, double completion_time); + // Constructor. // TODO: check the default values. -GTSim::GTSim(){ - int wsize = 20000; +GTSim::GTSim(int WindowSize){ + int wsize = WindowSize; is_topology_ = 0; nflow_ = 0; + jitter_ = 0; + jitter_seed_ = 10; + + // EXTRACTED FROM GTNETS SOURCE CODE COMMENTS + // REDQueue::REDQueue( + // DCount_t in_w_q, Count_t in_min_th, Count_t in_max_th, + // Count_t in_limit, DCount_t in_max_p, Count_t in_mean_pktsize) : iface(nil) + // Set default values. + //Doc:Desc This constructor the critical RED parameters and builds a + //Doc:Desc correspoding RED queue + //Doc:Arg1 weight of the queue + //Doc:Arg2 minimum threshold + //Doc:Arg3 maximum threshold + //Doc:Arg4 Limit/max size for the queue + //Doc:Arg5 maximum value for mark/drop probability + //Doc:Arg6 Average packet size + + //Default Parameters + //REDQueue *default_red_queue_ = new REDQueue(0.002, 2500, 7500, 30000, 0.10, 500); + //Same as above + //REDQueue *default_red_queue_ = new REDQueue(); + + //See for details of how those values are calucated below + //[1] Sally Floyd and Van Jacobson, "Random Early Detection Gateways with Congestion Avoidance", + // IEEE/ACM Transactions on Networking, vol. 1, n. 4, august 1993. + // + //[2] Kostas Pentikousis, "Active Queue Management", ACM Crossroads, vol. 7, n. 5, + // mid-summer 2001 + // + //[3] Stefann De Cnodder, Omar Ecoumi, Kenny Paulwels, "RED behavior with different packet sizes", + // 5th IEEE Symposium on Computers and Communication, (ISCC 2000) + // + //[4] http://www.opalsoft.net/qos/DS-26.htm + // + //short explanation: + // q_weight = fixed to 0.002 in most literature + // min_bytes = max / 3 = 16,666,666 + // max_bytes = mean_bw * max_tolerable_latency, set to 1e8 * 0.5 = 50,000,000 + // limit_bytes = 8 * max = 400,000,000 + // prob = follow most literature 0.02 + // avgpkt = fixed to the same TCP segment size, 1000 Bytes + // + // burst = (2*(min+max))/(3*avgpkt) ***DON'T USED BY GTNetS*** + REDQueue *default_red_queue_ = new REDQueue(0.002, 16666666, 50000000, 400000000, 0.02, 1000); + + Queue::Default(*default_red_queue_); + delete default_red_queue_; + + TCP::DefaultAdvWin(wsize); + TCP::DefaultSegSize(1000); + TCP::DefaultTxBuffer(128000); + TCP::DefaultRxBuffer(128000); + sim_ = new Simulator(); + sim_->verbose=false; topo_ = new GTNETS_Topology(); + + // Manual routing + rm_ = new RoutingManual(); + Routing::SetRouting(rm_); +} + +// Constructor. +// TODO: check the default values. +GTSim::GTSim(){ + int wsize = 20000; + is_topology_ = 0; + nflow_ = 0; jitter_ = 0; jitter_seed_ = 10; - sim_->verbose=false; + // EXTRACTED FROM GTNETS SOURCE CODE COMMENTS + // REDQueue::REDQueue( + // DCount_t in_w_q, Count_t in_min_th, Count_t in_max_th, + // Count_t in_limit, DCount_t in_max_p, Count_t in_mean_pktsize) : iface(nil) // Set default values. + //Doc:Desc This constructor the critical RED parameters and builds a + //Doc:Desc correspoding RED queue + //Doc:Arg1 weight of the queue + //Doc:Arg2 minimum threshold + //Doc:Arg3 maximum threshold + //Doc:Arg4 Limit/max size for the queue + //Doc:Arg5 maximum value for mark/drop probability + //Doc:Arg6 Average packet size + + //Default Parameters + //REDQueue *default_red_queue_ = new REDQueue(0.002, 2500, 7500, 30000, 0.10, 500); + //Same as above + //REDQueue *default_red_queue_ = new REDQueue(); + + //See for details of how those values are calucated below + //[1] Sally Floyd and Van Jacobson, "Random Early Detection Gateways with Congestion Avoidance", + // IEEE/ACM Transactions on Networking, vol. 1, n. 4, august 1993. + // + //[2] Kostas Pentikousis, "Active Queue Management", ACM Crossroads, vol. 7, n. 5, + // mid-summer 2001 + // + //[3] Stefann De Cnodder, Omar Ecoumi, Kenny Paulwels, "RED behavior with different packet sizes", + // 5th IEEE Symposium on Computers and Communication, (ISCC 2000) + // + //[4] http://www.opalsoft.net/qos/DS-26.htm + // + //short explanation: + // q_weight = fixed to 0.002 in most literature + // min_bytes = max / 3 = 16,666,666 + // max_bytes = mean_bw * max_tolerable_latency, set to 1e8 * 0.5 = 50,000,000 + // limit_bytes = 8 * max = 400,000,000 + // prob = follow most literature 0.02 + // avgpkt = fixed to the same TCP segment size, 1000 Bytes + // + // burst = (2*(min+max))/(3*avgpkt) ***DON'T USED BY GTNetS*** + REDQueue *default_red_queue_ = new REDQueue(0.002, 16666666, 50000000, 400000000, 0.02, 1000); + + Queue::Default(*default_red_queue_); + delete default_red_queue_; + TCP::DefaultAdvWin(wsize); TCP::DefaultSegSize(1000); TCP::DefaultTxBuffer(128000); TCP::DefaultRxBuffer(128000); + sim_ = new Simulator(); + sim_->verbose=false; + topo_ = new GTNETS_Topology(); + // Manual routing rm_ = new RoutingManual(); Routing::SetRouting(rm_); @@ -97,25 +211,20 @@ GTSim::~GTSim(){ } int GTSim::add_router(int id){ - xbt_assert1(!(topo_->add_router(id) < 0), "can't add router %d. already exists", id); + xbt_assert(!(topo_->add_router(id) < 0), "can't add router %d. already exists", id); } //bandwidth: in bytes. //latency: in seconds. int GTSim::add_link(int id, double bandwidth, double latency){ double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS). - xbt_assert1(!(topo_->add_link(id) < 0),"Can't add link %d. already exists", id); - DEBUG3("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency); + xbt_assert(!(topo_->add_link(id) < 0),"Can't add link %d. already exists", id); + XBT_DEBUG("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency); gtnets_links_[id] = new Linkp2p(bw, latency); if(jitter_ > 0){ - DEBUG2("Using jitter %f, and seed %u", jitter_, jitter_seed_); + XBT_DEBUG("Using jitter %f, and seed %u", jitter_, jitter_seed_); double min = -1*jitter_*latency; double max = jitter_*latency; - //initialize the random seed only once, when adding the first link - if(uniform_jitter_generator_.empty()){ - Random::GlobalSeed(jitter_seed_ , jitter_seed_+1, jitter_seed_+2, - jitter_seed_+3, jitter_seed_+4, jitter_seed_+5); - } uniform_jitter_generator_[id] = new Uniform(min,max); gtnets_links_[id]->Jitter((const Random &) *(uniform_jitter_generator_[id])); } @@ -135,7 +244,7 @@ bool GTSim::link_include(int id){ } int GTSim::add_onehop_route(int src, int dst, int link){ - xbt_assert3(!(topo_->add_onehop_route(src, dst, link) < 0), "Cannot add a route, src: %d, dst: %d, link: %d", src, dst, link); + xbt_assert(!(topo_->add_onehop_route(src, dst, link) < 0), "Cannot add a route, src: %d, dst: %d, link: %d", src, dst, link); return 0; } @@ -150,7 +259,7 @@ void GTSim::add_nodes(){ id = (*it)->id(); gtnets_nodes_[id] = new Node(); gtnets_nodes_[id]->SetIPAddr(address++); - DEBUG2("In GTSim, add_node: %d, with IPAddr %s", id, helper.ToDotted(address-1)); + XBT_DEBUG("In GTSim, add_node: %d, with IPAddr %s", id, helper.ToDotted(address-1)); } } @@ -170,7 +279,7 @@ void GTSim::node_connect(){ gtnets_nodes_[srcid]-> AddDuplexLink(gtnets_nodes_[dstid], *(gtnets_links_[linkid])); - DEBUG3("Setting DuplexLink, src %d, dst %d, linkid %d", srcid, dstid, linkid); + XBT_DEBUG("Setting DuplexLink, src %d, dst %d, linkid %d", srcid, dstid, linkid); } } } @@ -199,8 +308,8 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){ int src_node = topo_->nodeid_from_hostid(src); int dst_node = topo_->nodeid_from_hostid(dst); - xbt_assert1(!(gtnets_nodes_.find(src_node) == gtnets_nodes_.end()), "Node %d not found", src_node); - xbt_assert1(!(gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()), "Node %d not found", dst_node); + xbt_assert(!(gtnets_nodes_.find(src_node) == gtnets_nodes_.end()), "Node %d not found", src_node); + xbt_assert(!(gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()), "Node %d not found", dst_node); Node* tmpsrc = gtnets_nodes_[src_node]; Node* tmpdst = gtnets_nodes_[dst_node]; @@ -209,10 +318,10 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){ cur_node = src_node; for (int i = 0; i < nlink; i++){ - xbt_assert1(!(gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()), "Node %d not found", cur_node); + xbt_assert(!(gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()), "Node %d not found", cur_node); next_node = topo_->peer_node_id(links[i], cur_node); - xbt_assert0(!(next_node < 0), "Peer node not found"); - xbt_assert1(!(gtnets_nodes_.find(next_node) == gtnets_nodes_.end()), "Node %d not found", next_node); + xbt_assert(!(next_node < 0), "Peer node not found"); + xbt_assert(!(gtnets_nodes_.find(next_node) == gtnets_nodes_.end()), "Node %d not found", next_node); //add route Node* tmpcur = gtnets_nodes_[cur_node]; @@ -231,7 +340,7 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){ cur_node = next_node; } - xbt_assert2(!(cur_node != dst_node), "Route inconsistency, last: %d, dst: %d",cur_node, dst_node); + xbt_assert(!(cur_node != dst_node), "Route inconsistency, last: %d, dst: %d",cur_node, dst_node); return 0; } @@ -247,10 +356,10 @@ int GTSim::create_flow(int src, int dst, long datasize, void* metadata){ } int src_node = topo_->nodeid_from_hostid(src); - xbt_assert1(!(src_node < 0), "Src %d not found", src_node); + xbt_assert(!(src_node < 0), "Src %d not found", src_node); int dst_node = topo_->nodeid_from_hostid(dst); - xbt_assert1(!(dst_node < 0), "Dst %d not found", dst_node); + xbt_assert(!(dst_node < 0), "Dst %d not found", dst_node); gtnets_servers_[nflow_] = (TCPServer*) gtnets_nodes_[dst_node]-> AddApplication(TCPServer(TCPReno())); @@ -281,8 +390,8 @@ Time_t GTSim::get_time_to_next_flow_completion(){ pipe(pfds); t1 = 0; - - if ( (soon_pid=fork()) != 0){ + fflush (NULL); + if( (soon_pid=fork()) != 0){ read(pfds[0], &t1, sizeof(Time_t)); waitpid(soon_pid, &status, 0); }else{ @@ -300,6 +409,7 @@ double GTSim::gtnets_get_flow_rx(void *metadata){ return gtnets_servers_[flow_id]->GetTotRx(); } + int GTSim::run_until_next_flow_completion(void ***metadata, int *number_of_flows){ meta_flows.clear(); @@ -319,12 +429,17 @@ int GTSim::run(double delta){ } void GTSim::set_jitter(double d){ - xbt_assert1(((0 <= d)&&(d <= 1)), "The jitter value must be within interval [0.0;1.0], got %f", d); + xbt_assert(((0 <= d)&&(d <= 1)), "The jitter value must be within interval [0.0;1.0), got %f", d); jitter_ = d; } void GTSim::set_jitter_seed(int s){ jitter_seed_ = s; + + if(jitter_seed_ > 0.0){ + XBT_INFO("Setting the jitter_seed with %d", jitter_seed_ ); + Random::GlobalSeed(jitter_seed_ , jitter_seed_ , jitter_seed_ ,jitter_seed_ ,jitter_seed_ ,jitter_seed_); + } } void static tcp_sent_callback(void* action, double completion_time){