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
41static 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()
269std::vector<std::string>
274 <<
" pause messages");
301 for (std::map<TxRecordKey, TxRecordValue>::iterator iter =
m_txRecords.begin();
304 if (iter->second.time < expirationTime)
318 if (iter->second < expirationTime)
347 visualImpl->RunRealSimulator();
388 std::map<uint32_t, std::vector<NetDeviceStatistics>>::iterator nodeStatsIter =
390 std::vector<NetDeviceStatistics>* stats;
398 stats = &(nodeStatsIter->second);
407 std::map<uint32_t, PacketCaptureOptions>::const_iterator iter =
415 *outOptions = &iter->second;
423 switch (options.
mode)
430 while (metadataIterator.
HasNext())
442 std::set<TypeId> missingHeaders(options.
headers);
444 while (metadataIterator.
HasNext())
447 std::set<TypeId>::iterator missingIter = missingHeaders.find(item.
tid);
448 if (missingIter != missingHeaders.end())
450 missingHeaders.erase(missingIter);
453 return missingHeaders.empty();
466 std::vector<std::string> splitPath =
PathSplit(context);
467 int nodeIndex = std::stoi(splitPath[1]);
476 NS_LOG_DEBUG(
"Packet " << packet->GetUid() <<
" is not of interest");
489 lastPacket.
packet = packet->Copy();
490 lastPacket.
device =
nullptr;
505 iter->second += packet->GetSize();
518 packetCopy->AddHeader(hdr);
531 std::vector<std::string> splitPath =
PathSplit(context);
532 int nodeIndex = std::stoi(splitPath[1]);
533 int devIndex = std::stoi(splitPath[3]);
550 lastPacket.
packet = packet->Copy();
551 lastPacket.
device = device;
552 lastPacket.
to = destinationAddress;
568 NS_LOG_DEBUG(
"Packet " << packet->GetUid() <<
" is not of interest");
579 if (destinationAddress == device->GetBroadcast())
589 packet->AddByteTag(tag);
610 destinationAddress = hdr.
GetAddr3();
614 destinationAddress = hdr.
GetAddr1();
618 destinationAddress = hdr.
GetAddr1();
622 destinationAddress = hdr.
GetAddr3();
631 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
650 if (packet->FindFirstMatchingByteTag(tag))
657 NS_LOG_WARN(
"Packet has no byte tag; wimax link?");
658 uid = packet->GetUid();
662 std::vector<std::string> splitPath =
PathSplit(context);
663 int nodeIndex = std::stoi(splitPath[1]);
664 int devIndex = std::stoi(splitPath[3]);
682 lastPacket.
packet = packet->Copy();
683 lastPacket.
device = device;
684 lastPacket.
from = from;
695 NS_LOG_DEBUG(
"RX Packet " << uid <<
" is not of interest");
701 std::map<TxRecordKey, TxRecordValue>::iterator recordIter =
706 NS_LOG_DEBUG(
"RX Packet " << uid <<
" was not transmitted?!");
714 NS_LOG_WARN(
"Node " << node->GetId() <<
" receiving back the same packet (UID=" << uid
715 <<
") it had previously transmitted, on the same channel!");
725 for (std::map<TransmissionSampleKey, TransmissionSampleValue>::const_iterator iter =
731 <<
"/" << iter->first.transmitter->GetId() <<
", " << iter->first.receiver
732 <<
"/" << iter->first.receiver->GetId() <<
", " << iter->first.channel
733 <<
" => " << iter->second.bytes <<
" (@ " << &iter->second <<
")");
739 std::map<TransmissionSampleKey, TransmissionSampleValue>::iterator iter =
747 << channel <<
": " << packet->GetSize()
748 <<
" bytes more. => new sample with " << packet->GetSize()
757 << channel <<
": " << packet->GetSize()
758 <<
" bytes more. => sample " << &sample <<
" with bytes "
761 sample.
bytes += packet->GetSize();
805 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
819 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
870 for (std::map<TransmissionSampleKey, TransmissionSampleValue>::const_iterator iter =
877 sample.
receiver = iter->first.receiver;
878 sample.
channel = iter->first.channel;
879 sample.
bytes = iter->second.bytes;
881 <<
": " << sample.
bytes <<
" bytes.");
882 list.push_back(sample);
899 sample.
bytes = iter->second;
901 <<
" bytes dropped.");
902 list.push_back(sample);
914std::vector<PyViz::NodeStatistics>
917 std::vector<PyViz::NodeStatistics> retval;
918 for (std::map<
uint32_t, std::vector<NetDeviceStatistics>>::const_iterator iter =
924 retval.push_back(stats);
934 std::map<uint32_t, LastPacketsSample>::const_iterator iter =
m_lastPackets.find(nodeId);
1017 line.
end.
x += line.
dx * (m_clipMin.
y - line.
end.
y) / line.
dy;
1018 line.
end.
y = m_clipMin.
y;
1027 line.
end.
x += line.
dx * (m_clipMax.
y - line.
end.
y) / line.
dy;
1028 line.
end.
y = m_clipMax.
y;
1037 line.
end.
y += line.
dy * (m_clipMax.
x - line.
end.
x) / line.
dx;
1038 line.
end.
x = m_clipMax.
x;
1047 line.
end.
y += line.
dy * (m_clipMin.
x - line.
end.
x) / line.
dx;
1048 line.
end.
x = m_clipMin.
x;
1059 : m_clipMin(clipMin),
1071 uint8_t lineCode = 0;
1073 if (line.
end.
y < m_clipMin.
y)
1077 else if (line.
end.
y > m_clipMax.
y)
1082 if (line.
end.
x > m_clipMax.
x)
1086 else if (line.
end.
x < m_clipMin.
x)
1091 if (line.
start.
y < m_clipMin.
y)
1095 else if (line.
start.
y > m_clipMax.
y)
1100 if (line.
start.
x > m_clipMax.
x)
1104 else if (line.
start.
x < m_clipMin.
x)
1129 ClipEndBottom(line);
1134 if (line.
end.
y > m_clipMax.
y)
1136 ClipEndBottom(line);
1142 if (line.
end.
y > m_clipMax.
y)
1144 ClipEndBottom(line);
1154 if (line.
end.
y < m_clipMin.
y)
1162 if (line.
end.
y < m_clipMin.
y)
1170 ClipStartLeft(line);
1174 ClipStartLeft(line);
1179 ClipStartLeft(line);
1180 if (line.
start.
y > m_clipMax.
y)
1184 ClipEndBottom(line);
1188 ClipStartLeft(line);
1189 if (line.
start.
y > m_clipMax.
y)
1193 ClipEndBottom(line);
1194 if (line.
end.
x > m_clipMax.
x)
1201 ClipStartLeft(line);
1202 if (line.
start.
y < m_clipMin.
y)
1210 ClipStartLeft(line);
1211 if (line.
start.
y < m_clipMin.
y)
1216 if (line.
end.
x > m_clipMax.
x)
1224 ClipStartRight(line);
1228 ClipStartRight(line);
1233 ClipStartRight(line);
1234 if (line.
start.
y > m_clipMax.
y)
1238 ClipEndBottom(line);
1242 ClipStartRight(line);
1243 if (line.
start.
y > m_clipMax.
y)
1247 ClipEndBottom(line);
1248 if (line.
end.
x < m_clipMin.
x)
1255 ClipStartRight(line);
1256 if (line.
start.
y < m_clipMin.
y)
1264 ClipStartRight(line);
1265 if (line.
start.
y < m_clipMin.
y)
1270 if (line.
end.
x < m_clipMin.
x)
1278 ClipStartBottom(line);
1282 ClipStartBottom(line);
1283 if (line.
start.
x < m_clipMin.
x)
1288 if (line.
end.
y > m_clipMax.
y)
1290 ClipEndBottom(line);
1295 ClipStartBottom(line);
1296 if (line.
start.
x > m_clipMax.
x)
1304 ClipStartBottom(line);
1309 ClipStartBottom(line);
1310 if (line.
start.
x < m_clipMin.
x)
1315 if (line.
end.
y < m_clipMin.
y)
1322 ClipStartBottom(line);
1323 if (line.
start.
x > m_clipMax.
x)
1328 if (line.
end.
y < m_clipMin.
y)
1336 ClipStartLeft(line);
1337 if (line.
start.
y > m_clipMax.
y)
1339 ClipStartBottom(line);
1345 if (line.
end.
y > m_clipMax.
y)
1349 ClipStartBottom(line);
1350 if (line.
start.
x < m_clipMin.
x)
1352 ClipStartLeft(line);
1358 if (line.
end.
x < m_clipMin.
x)
1362 ClipStartBottom(line);
1363 if (line.
start.
x < m_clipMin.
x)
1365 ClipStartLeft(line);
1370 ClipStartLeft(line);
1371 if (line.
start.
y < m_clipMin.
y)
1376 if (line.
end.
y > m_clipMax.
y)
1380 if (line.
start.
y > m_clipMax.
y)
1382 ClipStartBottom(line);
1384 if (line.
end.
y < m_clipMin.
y)
1392 ClipStartRight(line);
1393 if (line.
start.
y > m_clipMax.
y)
1395 ClipStartBottom(line);
1401 if (line.
end.
y > m_clipMax.
y)
1405 ClipStartBottom(line);
1406 if (line.
start.
x > m_clipMax.
x)
1408 ClipStartRight(line);
1414 if (line.
end.
x > m_clipMax.
x)
1418 ClipStartRight(line);
1419 if (line.
start.
y > m_clipMax.
y)
1421 ClipStartBottom(line);
1427 if (line.
end.
y > m_clipMax.
y)
1431 ClipStartRight(line);
1432 if (line.
start.
y < m_clipMin.
y)
1436 if (line.
end.
y < m_clipMin.
y)
1440 if (line.
start.
y > m_clipMax.
y)
1442 ClipStartBottom(line);
1453 if (line.
start.
x < m_clipMin.
x)
1462 if (line.
start.
x > m_clipMax.
x)
1471 ClipEndBottom(line);
1476 if (line.
start.
x < m_clipMin.
x)
1481 if (line.
end.
y > m_clipMax.
y)
1483 ClipEndBottom(line);
1489 if (line.
start.
x > m_clipMax.
x)
1494 if (line.
end.
y > m_clipMax.
y)
1496 ClipEndBottom(line);
1502 ClipStartLeft(line);
1503 if (line.
start.
y < m_clipMin.
y)
1511 if (line.
end.
y < m_clipMin.
y)
1516 if (line.
start.
x < m_clipMin.
x)
1518 ClipStartLeft(line);
1523 ClipEndBottom(line);
1524 if (line.
end.
x < m_clipMin.
x)
1528 ClipStartLeft(line);
1529 if (line.
start.
y < m_clipMin.
y)
1536 ClipStartLeft(line);
1537 if (line.
start.
y > m_clipMax.
y)
1542 if (line.
end.
y < m_clipMin.
y)
1546 if (line.
start.
y < m_clipMin.
y)
1550 if (line.
end.
y > m_clipMax.
y)
1552 ClipEndBottom(line);
1558 ClipStartRight(line);
1559 if (line.
start.
y < m_clipMin.
y)
1567 if (line.
end.
y < m_clipMin.
y)
1572 if (line.
start.
x > m_clipMax.
x)
1574 ClipStartRight(line);
1579 ClipEndBottom(line);
1580 if (line.
end.
x > m_clipMax.
x)
1584 ClipStartRight(line);
1585 if (line.
start.
y < m_clipMin.
y)
1593 if (line.
end.
y < m_clipMin.
y)
1597 ClipStartRight(line);
1598 if (line.
start.
y > m_clipMax.
y)
1602 if (line.
end.
y > m_clipMax.
y)
1604 ClipEndBottom(line);
1606 if (line.
start.
y < m_clipMin.
y)
1628 FastClipping::Vector2 clipMin = {boundsX1, boundsY1};
1629 FastClipping::Vector2 clipMax = {boundsX2, boundsY2};
1630 FastClipping::Line line = {{lineX1, lineY1},
1635 FastClipping clipper(clipMin, clipMax);
1636 clipper.ClipLine(line);
1637 lineX1 = line.start.x;
1638 lineX2 = line.end.x;
1639 lineY1 = line.start.y;
1640 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.
static Ptr< Node > GetNode(uint32_t n)
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.
@ NO_CONTEXT
Flag for events not associated with any particular context.
static Time Now()
Return the current simulation virtual time.
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