static int* meta_nflow;
static int meta_flg = 0;
+
void static tcp_sent_callback(void* action, double completion_time);
// Constructor.
node_connect();
}
+void GTSim::print_topology(){
+ topo_->print_topology();
+}
+
// Add a route that includes more than one hop. All one hop
// routes must have been added. When this function is called
// for the first time, all gtnets nodes are generated.
int GTSim::add_route(int src, int dst, int* links, int nlink){
if (is_topology_ == 0){
create_gtnets_topology();
- // topo_->print_topology();
is_topology_ = 1;
}
//generate it here.
if (is_topology_ == 0){
create_gtnets_topology();
- // topo_->print_topology();
is_topology_ = 1;
}
return -1;
}
- gtnets_servers_[nflow_] = (TCPServer*)gtnets_nodes_[dst_node]->
+ gtnets_servers_[nflow_] = (TCPServer*) gtnets_nodes_[dst_node]->
AddApplication(TCPServer(TCPReno()));
- //added by arnaud in order to avoid TCPServer duplicates.
- //It is not needed since we create a new TCPServer for
- //each flow. Also we need to control this variable
- //to proper set the value of remaining communication amount.
- //See functions:
- gtnets_servers_[nflow_]->copyOnConnect=false;
- gtnets_servers_[nflow_]->BindAndListen(80);
+ gtnets_servers_[nflow_]->BindAndListen(1000+nflow_);
gtnets_clients_[nflow_] = (TCPSend*)gtnets_nodes_[src_node]->
AddApplication(TCPSend(metadata, gtnets_nodes_[dst_node]->GetIPAddr(),
- 80, Constant(datasize), TCPReno()));
- gtnets_clients_[nflow_]->copyOnConnect=false;
+ 1000+nflow_, Constant(datasize), TCPReno()));
gtnets_clients_[nflow_]->SetSendCallBack(tcp_sent_callback);
gtnets_clients_[nflow_]->Start(0);
- //added by pedro in order to get statistics
- //map an action from a gtnets flow id
- //metadata is the action and flow is the id to gtnets
gtnets_action_to_flow_[metadata] = nflow_;
nflow_++;
int status;
Time_t t1;
int pfds[2];
+ int soon_pid=-1;
meta_flg=0;
-
+
//remain needs to be updated in the future
Count_t remain;
pipe(pfds);
t1 = 0;
- if (fork() != 0){
+
+ if ( (soon_pid=fork()) != 0){
read(pfds[0], &t1, sizeof(Time_t));
- waitpid(-1, &status, 0);
+ waitpid(soon_pid, &status, 0);
}else{
Time_t t;
t = sim_->RunUntilNextCompletion();
}
double GTSim::gtnets_get_flow_rx(void *metadata){
- int flow = gtnets_action_to_flow_[metadata];
- return ((TCPServer *)gtnets_servers_[flow])->totRx;//action_remain[flow];
+ int flow_id = gtnets_action_to_flow_[metadata];
+ return gtnets_servers_[flow_id]->GetTotRx();
}
int GTSim::run_until_next_flow_completion(void ***metadata, int *number_of_flows){
+
meta_flows.clear();
meta_nflow = number_of_flows;
meta_flg = 1;
}
}
+