NetAnim: VALGR still reachable

This commit is contained in:
John Abraham
2012-05-24 00:17:05 -04:00
parent 022b805341
commit 5c283ad55c
2 changed files with 30 additions and 167 deletions

View File

@@ -62,22 +62,10 @@ namespace ns3 {
static bool initialized = false;
std::map <uint32_t, std::string> AnimationInterface::nodeDescriptions;
AnimationInterface::AnimationInterface ()
: m_fHandle (STDOUT_FILENO), m_xml (false), m_mobilityPollInterval (Seconds(0.25)),
m_usingSockets (false), m_port (0), m_outputFileName (""),
m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0),m_randomPosition (true),
m_writeCallback (0), m_started (false),
m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)),
m_maxPktsPerFile (MAX_PKTS_PER_TRACE_FILE)
{
initialized = true;
StartAnimation ();
}
AnimationInterface::AnimationInterface (const std::string fn, uint64_t maxPktsPerFile, bool usingXML)
: m_fHandle (STDOUT_FILENO), m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)),
m_usingSockets (false), m_port (0), m_outputFileName (fn),
m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0), m_randomPosition (true),
: m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)),
m_outputFileName (fn),
m_outputFileSet (false), gAnimUid (0), m_randomPosition (true),
m_writeCallback (0), m_started (false),
m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)),
m_maxPktsPerFile (maxPktsPerFile), m_originalFileName (fn)
@@ -86,18 +74,6 @@ AnimationInterface::AnimationInterface (const std::string fn, uint64_t maxPktsPe
StartAnimation ();
}
AnimationInterface::AnimationInterface (const uint16_t port, bool usingXML)
: m_fHandle (STDOUT_FILENO), m_xml (usingXML), m_mobilityPollInterval (Seconds(0.25)),
m_usingSockets (true), m_port (port), m_outputFileName (""),
m_outputFileSet (false), m_serverPortSet (false), gAnimUid (0), m_randomPosition (true),
m_writeCallback (0), m_started (false),
m_enablePacketMetadata (false), m_startTime (Seconds(0)), m_stopTime (Seconds(3600 * 1000)),
m_maxPktsPerFile (MAX_PKTS_PER_TRACE_FILE)
{
initialized = true;
StartAnimation ();
}
AnimationInterface::~AnimationInterface ()
{
StopAnimation ();
@@ -142,21 +118,13 @@ bool AnimationInterface::SetOutputFile (const std::string& fn)
{
return true;
}
if (fn == "")
{
m_fHandle = STDOUT_FILENO;
m_outputFileSet = true;
return true;
}
NS_LOG_INFO ("Creating new trace file:" << fn.c_str ());
FILE* f = fopen (fn.c_str (), "w");
if (!f)
m_f = fopen (fn.c_str (), "w");
if (!m_f)
{
NS_FATAL_ERROR ("Unable to open Animation output file");
return false; // Can't open
}
m_fHandle = fileno (f); // Set the file handle
m_usingSockets = false;
m_outputFileName = fn;
m_outputFileSet = true;
return true;
@@ -199,39 +167,6 @@ bool AnimationInterface::IsInTimeWindow ()
return false;
}
bool AnimationInterface::SetServerPort (uint16_t port)
{
#if defined(HAVE_SYS_SOCKET_H) && defined(HAVE_NETINET_IN_H)
if (m_serverPortSet)
{
return true;
}
int s = socket (AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons (port);
addr.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (s, (struct sockaddr*)&addr, sizeof (addr)) < 0)
{
NS_LOG_WARN ("Can't bind to port " << port << ", exiting.");
return false;
}
listen (s, 1);
NS_LOG_INFO ("Waiting for animator connection");
// Now wait for the animator to connect in
m_fHandle = accept (s, 0, 0);
NS_LOG_INFO ("Got animator connection from remote");
// set the linger socket option
int t = 1;
setsockopt (s, SOL_SOCKET, SO_LINGER, &t, sizeof(t));
m_usingSockets = true;
m_serverPortSet = true;
return true;
#endif
return false; // never reached unless the above is disabled
// which is done to support a platform like MinGW
}
bool AnimationInterface::WifiPacketIsPending (uint64_t AnimUid)
{
return (m_pendingWifiPackets.find (AnimUid) != m_pendingWifiPackets.end ());
@@ -416,14 +351,7 @@ void AnimationInterface::StartAnimation (bool restart)
{
m_currentPktCount = 0;
m_started = true;
if (m_usingSockets)
{
SetServerPort (m_port);
}
else
{
SetOutputFile (m_outputFileName);
}
SetOutputFile (m_outputFileName);
// Find the min/max x/y for the xml topology element
m_topoMinX = -2;
@@ -448,7 +376,7 @@ void AnimationInterface::StartAnimation (bool restart)
oss << GetXMLOpen_anim (0);
oss << GetPreamble ();
oss << GetXMLOpen_topology (m_topoMinX, m_topoMinY, m_topoMaxX, m_topoMaxY);
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
NS_LOG_INFO ("Setting topology for "<<NodeList::GetNNodes ()<<" Nodes");
// Dump the topology
@@ -460,7 +388,7 @@ void AnimationInterface::StartAnimation (bool restart)
{
Vector v = GetPosition (n);
oss << GetXMLOpenClose_node (0, n->GetId (), v.x, v.y);
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
else
{
@@ -468,7 +396,7 @@ void AnimationInterface::StartAnimation (bool restart)
Vector v = GetPosition (n);
oss << "0.0 N " << n->GetId ()
<< " " << v.x << " " << v.y << std::endl;
WriteN (m_fHandle, oss.str ().c_str (), oss.str ().length ());
WriteN (oss.str ().c_str (), oss.str ().length ());
}
}
NS_LOG_INFO ("Setting p2p links");
@@ -508,7 +436,7 @@ void AnimationInterface::StartAnimation (bool restart)
{
oss << "0.0 L " << n1Id << " " << n2Id << std::endl;
}
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
}
}
@@ -520,7 +448,7 @@ void AnimationInterface::StartAnimation (bool restart)
}
if (m_xml && !restart)
{
WriteN (m_fHandle, GetXMLClose ("topology"));
WriteN (GetXMLClose ("topology"));
Simulator::Schedule (m_mobilityPollInterval, &AnimationInterface::MobilityAutoCheck, this);
}
if (!restart)
@@ -564,32 +492,24 @@ void AnimationInterface::StopAnimation ()
m_started = false;
NS_LOG_INFO ("Stopping Animation");
ResetAnimWriteCallback ();
if (m_fHandle > 0)
if (m_f)
{
if (m_xml)
{ // Terminate the anim element
WriteN (m_fHandle, GetXMLClose ("anim"));
WriteN (GetXMLClose ("anim"));
}
if (m_fHandle != STDOUT_FILENO)
{
close (m_fHandle);
}
m_outputFileSet = false;
m_fHandle = -1;
fclose (m_f);
}
m_outputFileSet = false;
}
int AnimationInterface::WriteN (int h, const std::string& st)
int AnimationInterface::WriteN (const std::string& st)
{
if (h < 0)
{
return 0;
}
if (m_writeCallback)
{
m_writeCallback (st.c_str ());
}
return WriteN (h, st.c_str (), st.length ());
return WriteN (st.c_str (), st.length ());
}
// Private methods
@@ -655,19 +575,15 @@ void AnimationInterface::RecalcTopoBounds (Vector v)
}
}
int AnimationInterface::WriteN (HANDLETYPE h, const char* data, uint32_t count)
int AnimationInterface::WriteN (const char* data, uint32_t count)
{
if (h < 0)
{
return 0;
}
// Write count bytes to h from data
uint32_t nLeft = count;
const char* p = data;
uint32_t written = 0;
while (nLeft)
{
int n = write (h, p, nLeft);
int n = fwrite (p, nLeft, 1, m_f);
if (n <= 0)
{
return written;
@@ -693,7 +609,7 @@ void AnimationInterface::WriteDummyPacket ()
oss << GetXMLOpenClose_rx (0, 0, fbRx, lbRx);
oss << GetXMLClose ("packet");
}
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
@@ -731,7 +647,7 @@ void AnimationInterface::DevTxTrace (std::string context, Ptr<const Packet> p,
<< (now + rxTime - txTime).GetSeconds () << " " // first bit rx time
<< (now + rxTime).GetSeconds () << std::endl; // last bit rx time
}
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
@@ -1129,7 +1045,7 @@ void AnimationInterface::MobilityCourseChangeTrace (Ptr <const MobilityModel> mo
oss << GetXMLOpen_topology (m_topoMinX, m_topoMinY, m_topoMaxX, m_topoMaxY);
oss << GetXMLOpenClose_node (0,n->GetId (),v.x,v.y);
oss << GetXMLClose ("topology");
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
WriteDummyPacket ();
}
@@ -1163,7 +1079,7 @@ void AnimationInterface::MobilityAutoCheck ()
oss << GetXMLOpenClose_node (0, n->GetId (), v.x, v.y);
}
oss << GetXMLClose ("topology");
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
WriteDummyPacket ();
if (!Simulator::IsFinished ())
{
@@ -1251,7 +1167,7 @@ void AnimationInterface::OutputWirelessPacket (Ptr<const Packet> p, AnimPacketIn
oss << GetXMLOpenClose_meta (GetPacketMetadata (p));
oss << GetXMLClose ("wpacket");
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
void AnimationInterface::OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo &pktInfo, AnimRxInfo pktrxInfo)
@@ -1268,7 +1184,7 @@ void AnimationInterface::OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo &
if (m_enablePacketMetadata)
oss << GetXMLOpenClose_meta (GetPacketMetadata (p));
oss << GetXMLClose ("packet");
WriteN (m_fHandle, oss.str ());
WriteN (oss.str ());
}
void AnimationInterface::SetConstantPosition (Ptr <Node> n, double x, double y, double z)

View File

@@ -35,21 +35,6 @@
#include "ns3/animation-interface-helper.h"
#include "ns3/mac48-address.h"
#ifdef WIN32
#include <winsock2.h>
#include <io.h>
#define STDOUT_FILENO (SOCKET)GetStdHandle(STD_OUTPUT_HANDLE)
#define close _close
#define write _write
#undef GetObject
#undef min
#undef max
#define HANDLETYPE SOCKET
#else
#include "ns3/netanim-config.h"
#define HANDLETYPE int
#endif
namespace ns3 {
#define MAX_PKTS_PER_TRACE_FILE 100000
@@ -72,18 +57,6 @@ class AnimationInterface
{
public:
/**
* \brief Construct the animator interface. No arguments needed.
*
*/
AnimationInterface ();
/**
* \brief Destructor for the animator interface.
*
*/
~AnimationInterface ();
/**
* \brief Constructor
* \param filename The Filename for the trace file used by the Animator
@@ -99,13 +72,10 @@ public:
bool usingXML = true);
/**
* \brief Constructor
* \param port Port on which ns-3 should listen to for connection from the
* external netanim application
* \param usingXML Set to true if XML output traces are required
* \brief Destructor for the animator interface.
*
*/
AnimationInterface (uint16_t port, bool usingXML = true);
~AnimationInterface ();
/**
* \brief Check if AnimationInterface is initialized
@@ -154,21 +124,6 @@ public:
*/
void SetStopTime (Time t);
/**
* \brief (Deprecated) Specify that animation commands are to be written to
* a socket.
*
* This call is used to set the ns3 process in server mode, waiting
* for a TCP connection from the animator. This call will not
* return until the animator connects in, or if the bind to the
* specified port fails.
*
* \param port Port number to bind to.
* \returns true if connection created, false if bind failed.
*
*/
bool SetServerPort (uint16_t port);
/**
* \brief Writes the topology information and sets up the appropriate
* animation packet tx callback
@@ -289,21 +244,13 @@ public:
private:
#ifndef WIN32
int m_fHandle; // File handle for output (-1 if none)
FILE * m_f; // File handle for output (-1 if none)
// Write specified amount of data to the specified handle
int WriteN (int, const char*, uint32_t);
#else
SOCKET m_fHandle; // File handle for output (-1 if none)
int WriteN (SOCKET, const char*, uint32_t);
#endif
int WriteN (const char*, uint32_t);
bool m_xml; // True if xml format desired
Time m_mobilityPollInterval;
bool m_usingSockets;
uint16_t m_port;
std::string m_outputFileName;
bool m_outputFileSet;
bool m_serverPortSet;
uint64_t gAnimUid ; // Packet unique identifier used by Animtion
bool m_randomPosition;
AnimWriteCallback m_writeCallback;
@@ -360,7 +307,7 @@ private:
void MobilityCourseChangeTrace (Ptr <const MobilityModel> mob);
// Write a string to the specified handle;
int WriteN (int, const std::string&);
int WriteN (const std::string&);
void OutputWirelessPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);
void OutputCsmaPacket (Ptr<const Packet> p, AnimPacketInfo& pktInfo, AnimRxInfo pktrxInfo);