Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[NS3] single call to start the NS3 simulator
[simgrid.git] / src / surf / ns3 / ns3_simulator.cc
index ccd323b..6b0ce29 100644 (file)
@@ -7,6 +7,7 @@
 #include "surf/ns3/ns3_simulator.h"
 #include "xbt/dict.h"
 #include "xbt/log.h"
+#include "xbt/sysdep.h"
 
 using namespace ns3;
 using namespace std;
@@ -70,7 +71,7 @@ void NS3Sim::create_flow_NS3(
        mysocket->action = action;
        xbt_dict_set(dict_socket,(const char*)&sock, mysocket,NULL);
        sock->Bind(InetSocketAddress(port_number));
-       Simulator::Schedule (Seconds(start),&StartFlow, sock, addr, port_number);
+       Simulator::Schedule (Seconds(0.0),&StartFlow, sock, addr, port_number);
 }
 
 void* NS3Sim::get_action_from_socket(void *socket){
@@ -89,34 +90,23 @@ double NS3Sim::get_sent_from_socket(void *socket){
   return ((MySocket *)socket)->sentBytes;
 }
 
-void NS3Sim::simulator_stop(double min){
-       if(min > 0.0)
-               Simulator::Stop(Seconds(min));
-       else
-               Simulator::Stop();
-}
-
-void NS3Sim::simulator_start(void){
-       XBT_DEBUG("Start simulator");
-       Simulator::Run ();
+void NS3Sim::simulator_start(double min){
+  if(min > 0.0)
+    Simulator::Stop(Seconds(min));
+  XBT_DEBUG("Start simulator");
+  Simulator::Run ();
 }
 
 static void receive_callback(Ptr<Socket> localSocket){
-  Address addr;
-  localSocket->GetSockName (addr);
-  InetSocketAddress iaddr = InetSocketAddress::ConvertFrom (addr);
   MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket);
-  mysocket->finished = 1;
 
-  //cout << "[" << Simulator::Now ().GetSeconds() << "] " << "Received [" << mysocket->totalBytes << "bytes],  from: " << iaddr.GetIpv4 () << " port: " << iaddr.GetPort () << endl;
-       std::stringstream sstream;
-               sstream << Simulator::Now ().GetSeconds();
-               std::string s = sstream.str();
-               size_t size = s.size() + 1;
-               char * time_sec = new char[ size ];
-               strncpy( time_sec, s.c_str(), size );
-  XBT_DEBUG("Stop simulator at %s seconds",time_sec);
-  Simulator::Stop();
+  if (mysocket->finished == 0){
+    mysocket->finished = 1;
+//    cout << "[" << Simulator::Now ().GetSeconds() << "] " << "recv_cb of F[" << mysocket->totalBytes << "] " << endl;
+    XBT_DEBUG("Stop simulator at %f seconds", Simulator::Now().GetSeconds());
+    Simulator::Stop(Seconds(0.0));
+    Simulator::Run();
+  }
 }
 
 static void send_callback(Ptr<Socket> localSocket, uint32_t txSpace){
@@ -127,7 +117,8 @@ static void send_callback(Ptr<Socket> localSocket, uint32_t txSpace){
          return;
        }
 
-       uint32_t toWrite = min (mysocket->remaining, txSpace);
+       uint32_t packetSize = 1024;
+       uint32_t toWrite = min (mysocket->remaining, packetSize);
        uint8_t *data = (uint8_t*)malloc(sizeof(uint8_t)*toWrite);
        int amountSent = localSocket->Send (&data[0], toWrite, 0);
        free (data);
@@ -150,6 +141,28 @@ static void datasent_callback(Ptr<Socket> localSocket, uint32_t dataSent){
 //  cout << "[" << Simulator::Now ().GetSeconds() << "] " << "datasent_cb of F[" << mysocket->totalBytes << "] " << dataSent << " sent." << endl;
 }
 
+static void normalClose_callback(Ptr<Socket> localSocket){
+  MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket);
+//  cout << "[" << Simulator::Now ().GetSeconds() << "] " << "normalClose_cb of F[" << mysocket->totalBytes << "]" << endl;
+  receive_callback (localSocket);
+}
+
+static void errorClose_callback(Ptr<Socket> localSocket){
+  MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket);
+//  cout << "[" << Simulator::Now ().GetSeconds() << "] " << "errorClose_cb of F[" << mysocket->totalBytes << "]" << endl;
+  xbt_die("NS3: a socket was closed anormally");
+}
+
+static void succeededConnect_callback(Ptr<Socket> localSocket){
+  MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket);
+//  cout << "[" << Simulator::Now ().GetSeconds() << "] " << "succeededConnect_cb of F[" << mysocket->totalBytes << "]" << endl;
+}
+
+static void failedConnect_callback(Ptr<Socket> localSocket){
+  MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&localSocket);
+//  cout << "[" << Simulator::Now ().GetSeconds() << "] " << "failedConnect_cb of F[" << mysocket->totalBytes << "]" << endl;
+  xbt_die("NS3: a socket failed to connect");
+}
 
 static void StartFlow(Ptr<Socket> sock,
     const char *to,
@@ -157,10 +170,13 @@ static void StartFlow(Ptr<Socket> sock,
 {
   InetSocketAddress serverAddr (to, port_number);
 
-  //cout << "[" <<  Simulator::Now().GetSeconds() << "] Starting flow to " << to << " using port " << port_number << endl;
-
   sock->Connect(serverAddr);
   sock->SetSendCallback (MakeCallback (&send_callback));
   sock->SetRecvCallback (MakeCallback (&receive_callback));
   sock->SetDataSentCallback (MakeCallback (&datasent_callback));
+  sock->SetConnectCallback (MakeCallback (&succeededConnect_callback), MakeCallback (&failedConnect_callback));
+  sock->SetCloseCallbacks (MakeCallback (&normalClose_callback), MakeCallback (&errorClose_callback));
+
+  MySocket* mysocket = (MySocket*)xbt_dict_get_or_null(dict_socket,(char*)&sock);
+//  cout << "[" <<  Simulator::Now().GetSeconds() << "] Starting flow to " << to << " using port " << port_number << endl;
 }