#include "surf/ns3/ns3_simulator.h"
#include "xbt/dict.h"
#include "xbt/log.h"
+#include "xbt/sysdep.h"
using namespace ns3;
using namespace std;
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){
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){
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);
// 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,
{
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;
}