+int number_of_clusters_nodes = 0;
+int number_of_links = 1;
+int number_of_networks = 1;
+int port_number = 1025; //Port number is limited from 1025 to 65 000
+
+static NS3Sim* ns3_sim = 0;
+
+void ns3_simulator(double min){
+ ns3_sim->simulator_start(min);
+}
+
+void* ns3_get_socket_action(void *socket){
+ return ns3_sim->get_action_from_socket(socket);
+}
+
+double ns3_get_socket_remains(void *socket){
+ return ns3_sim->get_remains_from_socket(socket);
+}
+
+double ns3_get_socket_sent(void *socket){
+ return ns3_sim->get_sent_from_socket(socket);
+}
+
+char ns3_get_socket_is_finished(void *socket){
+ return ns3_sim->get_finished(socket);
+}
+
+double ns3_time(){
+ return Simulator::Now().GetSeconds();
+}
+
+int ns3_create_flow(const char* a,const char *b,double start,u_int32_t TotalBytes,void * action)
+{
+ ns3_nodes_t node1 = ns3_find_host(a);
+ ns3_nodes_t node2 = ns3_find_host(b);
+
+ Ptr<Node> src_node = nodes.Get(node1->node_num);
+ Ptr<Node> dst_node = nodes.Get(node2->node_num);
+
+ char* addr = (char*)xbt_dynar_get_as(IPV4addr,node2->node_num,char*);
+
+ XBT_DEBUG("ns3_create_flow %d Bytes from %d to %d with Interface %s",TotalBytes, node1->node_num, node2->node_num,addr);
+ ns3_sim->create_flow_NS3(src_node,
+ dst_node,
+ port_number,
+ start,
+ addr,
+ TotalBytes,
+ action);
+
+ port_number++;
+ if(port_number >= 65001 ) xbt_die("Too many connections! Port number is saturated.");
+ return 0;
+}
+
+// clean up
+int ns3_finalize(void){
+ if (!ns3_sim) return -1;
+ delete ns3_sim;
+ ns3_sim = 0;
+ return 0;
+}
+
+// initialize the NS3 interface and environment
+int ns3_initialize(const char* TcpProtocol){
+ xbt_assert(!ns3_sim, "ns3 already initialized");
+ ns3_sim = new NS3Sim();
+
+// tcpModel are:
+// "ns3::TcpNewReno"
+// "ns3::TcpReno"
+// "ns3::TcpTahoe"
+
+ Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1024)); // 1024-byte packet for easier reading
+ Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
+
+ if(!strcmp(TcpProtocol,"default")){
+ return 0;
+ }
+ if(!strcmp(TcpProtocol,"Reno")){
+ XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+ Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpReno"));
+ return 0;
+ }
+ if(!strcmp(TcpProtocol,"NewReno")){
+ XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+ Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpNewReno"));
+ return 0;
+ }
+ if(!strcmp(TcpProtocol,"Tahoe")){
+ XBT_INFO("Switching Tcp protocol to '%s'",TcpProtocol);
+ Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue("ns3::TcpTahoe"));
+ return 0;
+ }
+
+ XBT_ERROR("The ns3/TcpModel must be : NewReno or Reno or Tahoe");
+ return 0;
+}
+
+void * ns3_add_host(const char * id)
+{
+ ns3_nodes_t host = xbt_new0(s_ns3_nodes_t,1);
+ XBT_DEBUG("Interface ns3 add host[%d] '%s'",number_of_nodes,id);
+ Ptr<Node> node = CreateObject<Node> (0);
+ stack.Install(node);
+ nodes.Add(node);
+ host->node_num = number_of_nodes;
+ host->type = NS3_NETWORK_ELEMENT_HOST;
+ host->data = GetPointer(node);
+ number_of_nodes++;
+ return host;
+}