24 #include "ns3/abort.h"
25 #include "ns3/config.h"
26 #include "ns3/ethernet-header.h"
28 #include "ns3/node-list.h"
29 #include "ns3/ppp-header.h"
30 #include "ns3/simulator.h"
31 #include "ns3/wifi-mac-header.h"
32 #include "ns3/wifi-net-device.h"
39 #define NUM_LAST_PACKETS 10
41 static std::vector<std::string>
44 std::vector<std::string> results;
46 while ((cutAt = str.find_first_of(
'/')) != std::string::npos)
50 results.push_back(str.substr(0, cutAt));
52 str = str.substr(cutAt + 1);
56 results.push_back(str);
76 void Print(std::ostream& os)
const override;
91 .SetGroupName(
"Visualizer")
188 std::ostringstream sstream;
189 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/MacTx";
193 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
197 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/PromiscRx";
206 std::ostringstream sstream;
207 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Tx";
211 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
220 std::ostringstream sstream;
221 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/TxQueue/Dequeue";
225 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
233 << nodeId <<
" PacketCaptureOptions (headers size = " << options.
headers.size()
269 std::vector<std::string>
274 <<
" pause messages");
303 if (iter->second.time < expirationTime)
316 if (iter->second < expirationTime)
345 visualImpl->RunRealSimulator();
387 std::vector<NetDeviceStatistics>* stats;
395 stats = &(nodeStatsIter->second);
411 *outOptions = &iter->second;
419 switch (options.
mode)
426 while (metadataIterator.
HasNext())
438 std::set<TypeId> missingHeaders(options.
headers);
440 while (metadataIterator.
HasNext())
443 auto missingIter = missingHeaders.find(item.
tid);
444 if (missingIter != missingHeaders.end())
446 missingHeaders.erase(missingIter);
449 return missingHeaders.empty();
462 std::vector<std::string> splitPath =
PathSplit(context);
463 int nodeIndex = std::stoi(splitPath[1]);
486 lastPacket.
device =
nullptr;
501 iter->second += packet->
GetSize();
527 std::vector<std::string> splitPath =
PathSplit(context);
528 int nodeIndex = std::stoi(splitPath[1]);
529 int devIndex = std::stoi(splitPath[3]);
547 lastPacket.
device = device;
548 lastPacket.
to = destinationAddress;
575 if (destinationAddress == device->GetBroadcast())
606 destinationAddress = hdr.
GetAddr3();
610 destinationAddress = hdr.
GetAddr1();
614 destinationAddress = hdr.
GetAddr1();
618 destinationAddress = hdr.
GetAddr3();
653 NS_LOG_WARN(
"Packet has no byte tag; wimax link?");
658 std::vector<std::string> splitPath =
PathSplit(context);
659 int nodeIndex = std::stoi(splitPath[1]);
660 int devIndex = std::stoi(splitPath[3]);
679 lastPacket.
device = device;
680 lastPacket.
from = from;
691 NS_LOG_DEBUG(
"RX Packet " << uid <<
" is not of interest");
701 NS_LOG_DEBUG(
"RX Packet " << uid <<
" was not transmitted?!");
709 NS_LOG_WARN(
"Node " << node->
GetId() <<
" receiving back the same packet (UID=" << uid
710 <<
") it had previously transmitted, on the same channel!");
716 #ifdef NS3_LOG_ENABLE
723 <<
"/" << iter->first.transmitter->GetId() <<
", " << iter->first.receiver
724 <<
"/" << iter->first.receiver->GetId() <<
", " << iter->first.channel
725 <<
" => " << iter->second.bytes <<
" (@ " << &iter->second <<
")");
736 NS_LOG_DEBUG(
"RX: from " << key.transmitter <<
"/" << key.transmitter->GetId() <<
" to "
737 << key.receiver <<
"/" << key.receiver->GetId() <<
" channel "
739 <<
" bytes more. => new sample with " << packet->
GetSize()
746 NS_LOG_DEBUG(
"RX: from " << key.transmitter <<
"/" << key.transmitter->GetId() <<
" to "
747 << key.receiver <<
"/" << key.receiver->GetId() <<
" channel "
749 <<
" bytes more. => sample " << &sample <<
" with bytes "
865 sample.
receiver = iter->first.receiver;
866 sample.
channel = iter->first.channel;
867 sample.
bytes = iter->second.bytes;
869 <<
": " << sample.
bytes <<
" bytes.");
870 list.push_back(sample);
885 sample.
bytes = iter->second;
887 <<
" bytes dropped.");
888 list.push_back(sample);
900 std::vector<PyViz::NodeStatistics>
903 std::vector<PyViz::NodeStatistics> retval;
907 retval.push_back(stats);
1000 line.
end.
x += line.
dx * (m_clipMin.
y - line.
end.
y) / line.
dy;
1001 line.
end.
y = m_clipMin.
y;
1010 line.
end.
x += line.
dx * (m_clipMax.
y - line.
end.
y) / line.
dy;
1011 line.
end.
y = m_clipMax.
y;
1020 line.
end.
y += line.
dy * (m_clipMax.
x - line.
end.
x) / line.
dx;
1021 line.
end.
x = m_clipMax.
x;
1030 line.
end.
y += line.
dy * (m_clipMin.
x - line.
end.
x) / line.
dx;
1031 line.
end.
x = m_clipMin.
x;
1042 : m_clipMin(clipMin),
1054 uint8_t lineCode = 0;
1056 if (line.
end.
y < m_clipMin.
y)
1060 else if (line.
end.
y > m_clipMax.
y)
1065 if (line.
end.
x > m_clipMax.
x)
1069 else if (line.
end.
x < m_clipMin.
x)
1074 if (line.
start.
y < m_clipMin.
y)
1078 else if (line.
start.
y > m_clipMax.
y)
1083 if (line.
start.
x > m_clipMax.
x)
1087 else if (line.
start.
x < m_clipMin.
x)
1112 ClipEndBottom(line);
1117 if (line.
end.
y > m_clipMax.
y)
1119 ClipEndBottom(line);
1125 if (line.
end.
y > m_clipMax.
y)
1127 ClipEndBottom(line);
1137 if (line.
end.
y < m_clipMin.
y)
1145 if (line.
end.
y < m_clipMin.
y)
1153 ClipStartLeft(line);
1157 ClipStartLeft(line);
1162 ClipStartLeft(line);
1163 if (line.
start.
y > m_clipMax.
y)
1167 ClipEndBottom(line);
1171 ClipStartLeft(line);
1172 if (line.
start.
y > m_clipMax.
y)
1176 ClipEndBottom(line);
1177 if (line.
end.
x > m_clipMax.
x)
1184 ClipStartLeft(line);
1185 if (line.
start.
y < m_clipMin.
y)
1193 ClipStartLeft(line);
1194 if (line.
start.
y < m_clipMin.
y)
1199 if (line.
end.
x > m_clipMax.
x)
1207 ClipStartRight(line);
1211 ClipStartRight(line);
1216 ClipStartRight(line);
1217 if (line.
start.
y > m_clipMax.
y)
1221 ClipEndBottom(line);
1225 ClipStartRight(line);
1226 if (line.
start.
y > m_clipMax.
y)
1230 ClipEndBottom(line);
1231 if (line.
end.
x < m_clipMin.
x)
1238 ClipStartRight(line);
1239 if (line.
start.
y < m_clipMin.
y)
1247 ClipStartRight(line);
1248 if (line.
start.
y < m_clipMin.
y)
1253 if (line.
end.
x < m_clipMin.
x)
1261 ClipStartBottom(line);
1265 ClipStartBottom(line);
1266 if (line.
start.
x < m_clipMin.
x)
1271 if (line.
end.
y > m_clipMax.
y)
1273 ClipEndBottom(line);
1278 ClipStartBottom(line);
1279 if (line.
start.
x > m_clipMax.
x)
1287 ClipStartBottom(line);
1292 ClipStartBottom(line);
1293 if (line.
start.
x < m_clipMin.
x)
1298 if (line.
end.
y < m_clipMin.
y)
1305 ClipStartBottom(line);
1306 if (line.
start.
x > m_clipMax.
x)
1311 if (line.
end.
y < m_clipMin.
y)
1319 ClipStartLeft(line);
1320 if (line.
start.
y > m_clipMax.
y)
1322 ClipStartBottom(line);
1328 if (line.
end.
y > m_clipMax.
y)
1332 ClipStartBottom(line);
1333 if (line.
start.
x < m_clipMin.
x)
1335 ClipStartLeft(line);
1341 if (line.
end.
x < m_clipMin.
x)
1345 ClipStartBottom(line);
1346 if (line.
start.
x < m_clipMin.
x)
1348 ClipStartLeft(line);
1353 ClipStartLeft(line);
1354 if (line.
start.
y < m_clipMin.
y)
1359 if (line.
end.
y > m_clipMax.
y)
1363 if (line.
start.
y > m_clipMax.
y)
1365 ClipStartBottom(line);
1367 if (line.
end.
y < m_clipMin.
y)
1375 ClipStartRight(line);
1376 if (line.
start.
y > m_clipMax.
y)
1378 ClipStartBottom(line);
1384 if (line.
end.
y > m_clipMax.
y)
1388 ClipStartBottom(line);
1389 if (line.
start.
x > m_clipMax.
x)
1391 ClipStartRight(line);
1397 if (line.
end.
x > m_clipMax.
x)
1401 ClipStartRight(line);
1402 if (line.
start.
y > m_clipMax.
y)
1404 ClipStartBottom(line);
1410 if (line.
end.
y > m_clipMax.
y)
1414 ClipStartRight(line);
1415 if (line.
start.
y < m_clipMin.
y)
1419 if (line.
end.
y < m_clipMin.
y)
1423 if (line.
start.
y > m_clipMax.
y)
1425 ClipStartBottom(line);
1436 if (line.
start.
x < m_clipMin.
x)
1445 if (line.
start.
x > m_clipMax.
x)
1454 ClipEndBottom(line);
1459 if (line.
start.
x < m_clipMin.
x)
1464 if (line.
end.
y > m_clipMax.
y)
1466 ClipEndBottom(line);
1472 if (line.
start.
x > m_clipMax.
x)
1477 if (line.
end.
y > m_clipMax.
y)
1479 ClipEndBottom(line);
1485 ClipStartLeft(line);
1486 if (line.
start.
y < m_clipMin.
y)
1494 if (line.
end.
y < m_clipMin.
y)
1499 if (line.
start.
x < m_clipMin.
x)
1501 ClipStartLeft(line);
1506 ClipEndBottom(line);
1507 if (line.
end.
x < m_clipMin.
x)
1511 ClipStartLeft(line);
1512 if (line.
start.
y < m_clipMin.
y)
1519 ClipStartLeft(line);
1520 if (line.
start.
y > m_clipMax.
y)
1525 if (line.
end.
y < m_clipMin.
y)
1529 if (line.
start.
y < m_clipMin.
y)
1533 if (line.
end.
y > m_clipMax.
y)
1535 ClipEndBottom(line);
1541 ClipStartRight(line);
1542 if (line.
start.
y < m_clipMin.
y)
1550 if (line.
end.
y < m_clipMin.
y)
1555 if (line.
start.
x > m_clipMax.
x)
1557 ClipStartRight(line);
1562 ClipEndBottom(line);
1563 if (line.
end.
x > m_clipMax.
x)
1567 ClipStartRight(line);
1568 if (line.
start.
y < m_clipMin.
y)
1576 if (line.
end.
y < m_clipMin.
y)
1580 ClipStartRight(line);
1581 if (line.
start.
y > m_clipMax.
y)
1585 if (line.
end.
y > m_clipMax.
y)
1587 ClipEndBottom(line);
1589 if (line.
start.
y < m_clipMin.
y)
1611 FastClipping::Vector2 clipMin = {boundsX1, boundsY1};
1612 FastClipping::Vector2 clipMax = {boundsX2, boundsY2};
1613 FastClipping::Line line = {{lineX1, lineY1},
1618 FastClipping clipper(clipMin, clipMax);
1619 clipper.ClipLine(line);
1620 lineX1 = line.start.x;
1621 lineX2 = line.end.x;
1622 lineY1 = line.start.y;
1623 lineY2 = line.end.y;
DropReason
Reason why a packet has been dropped.
PacketType
Packet types are used as they are in Linux.
@ PACKET_OTHERHOST
Packet addressed to someone else.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
static Ptr< Node > GetNode(uint32_t n)
PacketMetadata::ItemIterator BeginItem() const
Returns an iterator which points to the first 'item' stored in this buffer.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Ptr< Packet > Copy() const
performs a COW copy of the packet.
bool FindFirstMatchingByteTag(Tag &tag) const
Finds the first tag matching the parameter Tag type.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
uint64_t GetUid() const
Returns the packet's Uid.
void AddByteTag(const Tag &tag) const
Tag each byte included in this packet with a new byte tag.
Smart pointer class similar to boost::intrusive_ptr.
helper class to be used by the visualizer
void RegisterCsmaLikeDevice(const std::string &deviceTypeName)
Register CSMA like device function.
void TraceNetDevRxCsma(std::string context, Ptr< const Packet > packet)
CSMA receive trace callback function.
void SetPacketCaptureOptions(uint32_t nodeId, PacketCaptureOptions options)
Set packet capture options function.
void TraceNetDevRxPointToPoint(std::string context, Ptr< const Packet > packet)
Point to point receive trace callback function.
void RegisterDropTracePath(const std::string &tracePath)
Register drop trace path function.
void RegisterWifiLikeDevice(const std::string &deviceTypeName)
Register WIFI like device function.
std::map< uint32_t, PacketCaptureOptions > m_packetCaptureOptions
packet capture options
void TraceNetDevTxLte(std::string context, Ptr< const Packet > packet, const Mac48Address &destination)
LTE transmit trace callback function.
std::map< uint32_t, LastPacketsSample > m_lastPackets
last packets
void SimulatorRunUntil(Time time)
Run simulation until a given (simulated, absolute) time is reached.
PacketDropSampleList GetPacketDropSamples() const
Get packet drop samples.
void SetNodesOfInterest(std::set< uint32_t > nodes)
Set nodes of interest function.
std::map< uint32_t, std::vector< NetDeviceStatistics > > m_nodesStatistics
node statistics
void TraceNetDevTxCsma(std::string context, Ptr< const Packet > packet)
CSMA transmit trace callback function.
void TraceNetDevTxCommon(const std::string &context, Ptr< const Packet > packet, const Mac48Address &destination)
Network transmit common trace callback function.
void DoPause(const std::string &message)
Do pause function.
std::vector< NodeStatistics > GetNodesStatistics() const
Get node statistics.
void TraceNetDevRxWimax(std::string context, Ptr< const Packet > packet, const Mac48Address &source)
WiMax transmit trace callback function.
std::set< uint32_t > m_nodesOfInterest
list of node IDs whose transmissions will be monitored
void TraceNetDevPromiscRxCsma(std::string context, Ptr< const Packet > packet)
CSMA promiscuous receive function.
static void Pause(const std::string &message)
Pause function.
std::vector< std::string > m_pauseMessages
pause message
void TraceNetDevRxLte(std::string context, Ptr< const Packet > packet, const Mac48Address &source)
LTE receive trace callback function.
void TraceNetDevTxWimax(std::string context, Ptr< const Packet > packet, const Mac48Address &destination)
WiMax transmit trace callback function.
void TraceIpv4Drop(std::string context, const ns3::Ipv4Header &hdr, Ptr< const Packet > packet, ns3::Ipv4L3Protocol::DropReason reason, Ptr< Ipv4 > dummy_ipv4, uint32_t interface)
Ipv4 drop trace callback function.
void TraceNetDevRxCommon(const std::string &context, Ptr< const Packet > packet, const Mac48Address &source)
Network receive common trace callback function.
TransmissionSampleList GetTransmissionSamples() const
Get transmission samples.
static void LineClipping(double boundsX1, double boundsY1, double boundsX2, double boundsY2, double &lineX1, double &lineY1, double &lineX2, double &lineY2)
Utility function - clips a line to a bounding box.
std::map< TransmissionSampleKey, TransmissionSampleValue > m_transmissionSamples
transmission samples
void TraceNetDevTxPointToPoint(std::string context, Ptr< const Packet > packet)
Point to point transmit trace callback function.
void TraceNetDevRxWifi(std::string context, Ptr< const Packet > packet)
Wi-Fi receive trace callback function.
NetDeviceStatistics & FindNetDeviceStatistics(int node, int interface)
Find net device statistics function.
void TraceDevQueueDrop(std::string context, Ptr< const Packet > packet)
Queue drop trace callback function.
std::map< TxRecordKey, TxRecordValue > m_txRecords
transmit records
std::vector< std::string > GetPauseMessages() const
Get pause message function.
std::vector< PacketDropSample > PacketDropSampleList
PacketDropSampleList typedef.
static bool FilterPacket(Ptr< const Packet > packet, const PacketCaptureOptions &options)
Filter packet function.
void CallbackStopSimulation()
Stop simulation callback function.
void RegisterPointToPointLikeDevice(const std::string &deviceTypeName)
Register point to point like device function.
std::map< Ptr< Node >, uint32_t > m_packetDrops
packet drops
LastPacketsSample GetLastPackets(uint32_t nodeId) const
Get last packets function.
void TraceNetDevTxWifi(std::string context, Ptr< const Packet > packet)
Wi-Fi transmit trace callback function.
bool GetPacketCaptureOptions(uint32_t nodeId, const PacketCaptureOptions **outOptions) const
Get packet capture options function.
Time m_runUntil
run until time
std::map< uint32_t, Time > m_packetsOfInterest
list of packet UIDs that will be monitored
std::pair< Ptr< Channel >, uint32_t > TxRecordKey
TxRecordKey typedef.
std::vector< TransmissionSample > TransmissionSampleList
TransmissionSampleList typedef.
@ PACKET_CAPTURE_FILTER_HEADERS_OR
@ PACKET_CAPTURE_DISABLED
@ PACKET_CAPTURE_FILTER_HEADERS_AND
static Ptr< SimulatorImpl > GetImplementation()
Get the SimulatorImpl singleton.
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
static Time Now()
Return the current simulation virtual time.
@ NO_CONTEXT
Flag for events not associated with any particular context.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
TAG_BUFFER_INLINE uint32_t ReadU32()
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
tag a set of bytes in a packet
Simulation virtual time values and global simulation resolution.
a unique identifier for an interface.
static TypeId LookupByName(std::string name)
Get a TypeId by name.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Adapted from http://en.wikipedia.org/w/index.php?title=Line_clipping&oldid=248609574.
bool ClipLine(Line &line)
Clip line function.
Vector2 m_clipMin
clip minimum
void ClipEndRight(Line &line) const
Clip end right function.
Vector2 m_clipMax
clip maximum
void ClipEndBottom(Line &line) const
Clip end bottom function.
void ClipStartLeft(Line &line) const
Clip start left function.
void ClipStartTop(Line &line) const
Clip start top function.
void ClipStartBottom(Line &line) const
Clip start bottom function.
void ClipStartRight(Line &line) const
Clip start right function.
FastClipping(Vector2 clipMin, Vector2 clipMax)
Constructor.
void ClipEndLeft(Line &line) const
Clip end left function.
void ClipEndTop(Line &line) const
Clip end top function.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
void Connect(std::string path, const CallbackBase &cb)
bool ConnectFailSafe(std::string path, const CallbackBase &cb)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
@ LOG_DEBUG
Full voluminous logging to support debugging.
static PyViz * g_visualizer
the visualizer
static std::vector< std::string > PathSplit(std::string str)
LastPacketsSample structure.
std::vector< PacketSample > lastDroppedPackets
last dropped packets
std::vector< TxPacketSample > lastTransmittedPackets
last transmitted packets
std::vector< RxPacketSample > lastReceivedPackets
last received packets
NetDeviceStatistics structure.
uint64_t receivedBytes
received bytes
uint64_t transmittedBytes
transmitted bytes
uint32_t receivedPackets
received packets
uint32_t transmittedPackets
transmitted packets
NodeStatistics structure.
PacketCaptureOptions structure.
PacketCaptureMode mode
mode
uint32_t numLastPackets
num last packets
std::set< TypeId > headers
headers
PacketDropSample structure.
Ptr< Node > transmitter
transmitter
Ptr< Packet > packet
packet
Ptr< NetDevice > device
device
RxPacketSample structure.
TransmissionSample structure.
Ptr< Node > transmitter
transmitter
Ptr< Channel > channel
channel
Ptr< Node > receiver
NULL if broadcast.
TransmissionSampleKey structure.
Ptr< Channel > channel
channel
bool operator==(const TransmissionSampleKey &other) const
Equality operator.
bool operator<(const TransmissionSampleKey &other) const
Less than operator.
Ptr< Node > transmitter
transmitter
Ptr< Node > receiver
NULL if broadcast.
TransmissionSampleValue structure.
TxPacketSample structure.
Ptr< Node > srcNode
source node
bool isBroadcast
is broadcast?
PyVizPacketTag structure.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
void Deserialize(TagBuffer buf) override
void Serialize(TagBuffer buf) const override
static TypeId GetTypeId()
Get the type ID.
uint32_t m_packetId
packet id
void Print(std::ostream &os) const override
uint32_t GetSerializedSize() const override