15#include "ns3/config.h"
16#include "ns3/ethernet-header.h"
18#include "ns3/lr-wpan-mac-header.h"
19#include "ns3/lr-wpan-net-device.h"
20#include "ns3/node-list.h"
21#include "ns3/ppp-header.h"
22#include "ns3/simulator.h"
23#include "ns3/wifi-mac-header.h"
24#include "ns3/wifi-net-device.h"
33static std::vector<std::string>
36 std::vector<std::string> results;
38 while ((cutAt = str.find_first_of(
'/')) != std::string::npos)
42 results.push_back(str.substr(0, cutAt));
44 str = str.substr(cutAt + 1);
48 results.push_back(str);
68 void Print(std::ostream& os)
const override;
83 .SetGroupName(
"Visualizer")
179 std::ostringstream sstream;
180 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/MacTx";
184 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
188 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/PromiscRx";
197 std::ostringstream sstream;
198 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Tx";
202 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
211 std::ostringstream sstream;
212 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/TxQueue/Dequeue";
216 sstream <<
"/NodeList/*/DeviceList/*/$" << deviceTypeName <<
"/Rx";
224 << nodeId <<
" PacketCaptureOptions (headers size = " << options.
headers.size()
250 <<
": Have " <<
g_visualizer->m_pauseMessages.size() <<
" pause messages");
260std::vector<std::string>
264 <<
": GetPauseMessages: have " <<
g_visualizer->m_pauseMessages.size()
265 <<
" pause messages");
294 if (iter->second.time < expirationTime)
307 if (iter->second < expirationTime)
337 visualImpl->RunRealSimulator();
350 return visualImpl->GetStopTime();
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]);
472 NS_LOG_DEBUG(
"Packet " << packet->GetUid() <<
" is not of interest");
485 lastPacket.
packet = packet->Copy();
486 lastPacket.
device =
nullptr;
501 iter->second += packet->GetSize();
514 packetCopy->AddHeader(hdr);
522 const std::string& context,
524 const std::variant<Mac16Address, Mac48Address, Mac64Address>& destination)
528 std::vector<std::string> splitPath =
PathSplit(context);
529 int nodeIndex = std::stoi(splitPath[1]);
530 int devIndex = std::stoi(splitPath[3]);
547 lastPacket.
packet = packet->Copy();
548 lastPacket.
device = device;
549 lastPacket.
to = destination;
566 NS_LOG_DEBUG(
"Packet " << packet->GetUid() <<
" is not of interest");
578 if (std::holds_alternative<Mac16Address>(destination))
580 if (std::get<Mac16Address>(destination) ==
Mac16Address(
"FF:FF"))
585 else if (std::holds_alternative<Mac48Address>(destination))
587 if (std::get<Mac48Address>(destination) == device->GetBroadcast())
592 else if (std::holds_alternative<Mac64Address>(destination))
594 if (std::get<Mac64Address>(destination) ==
Mac64Address(
"FF:FF:FF:FF:FF:FF:FF:FF"))
607 packet->AddByteTag(tag);
626 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
629 destinationAddress = hdr.
GetAddr3();
633 destinationAddress = hdr.
GetAddr1();
643 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
662 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
663 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
671 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
681 const std::variant<Mac16Address, Mac48Address, Mac64Address>& source)
685 if (packet->FindFirstMatchingByteTag(tag))
693 uid = packet->GetUid();
697 std::vector<std::string> splitPath =
PathSplit(context);
698 int nodeIndex = std::stoi(splitPath[1]);
699 int devIndex = std::stoi(splitPath[3]);
717 lastPacket.
packet = packet->Copy();
718 lastPacket.
device = device;
719 lastPacket.
from = source;
731 NS_LOG_DEBUG(
"RX Packet " << uid <<
" is not of interest");
741 NS_LOG_DEBUG(
"RX Packet " << uid <<
" was not transmitted?!");
749 NS_LOG_WARN(
"Node " << node->GetId() <<
" receiving back the same packet (UID=" << uid
750 <<
") it had previously transmitted, on the same channel!");
763 <<
"/" << iter->first.transmitter->GetId() <<
", " << iter->first.receiver
764 <<
"/" << iter->first.receiver->GetId() <<
", " << iter->first.channel
765 <<
" => " << iter->second.bytes <<
" (@ " << &iter->second <<
")");
778 << channel <<
": " << packet->GetSize()
779 <<
" bytes more. => new sample with " << packet->GetSize()
788 << channel <<
": " << packet->GetSize()
789 <<
" bytes more. => sample " << &sample <<
" with bytes "
792 sample.
bytes += packet->GetSize();
811 std::variant<Mac16Address, Mac48Address, Mac64Address> sourceAddress;
833 std::variant<Mac16Address, Mac48Address, Mac64Address> sourceAddress;
851 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
852 std::variant<Mac16Address, Mac48Address, Mac64Address> sourceAddress;
853 sourceAddress = ethernetHeader.
GetSource();
860 std::variant<Mac16Address, Mac48Address, Mac64Address> sourceAddress;
869 NS_ABORT_IF(packet->PeekHeader(ethernetHeader) == 0);
877 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
889 std::variant<Mac16Address, Mac48Address, Mac64Address> destinationAddress;
890 destinationAddress = destination;
898 std::variant<Mac16Address, Mac48Address, Mac64Address> sourceAddress;
899 sourceAddress = source;
914 sample.
receiver = iter->first.receiver;
915 sample.
channel = iter->first.channel;
916 sample.
bytes = iter->second.bytes;
918 <<
": " << sample.
bytes <<
" bytes.");
919 list.push_back(sample);
934 sample.
bytes = iter->second;
936 <<
" bytes dropped.");
937 list.push_back(sample);
949std::vector<PyViz::NodeStatistics>
952 std::vector<PyViz::NodeStatistics> retval;
956 retval.push_back(stats);
This class is used by the visualizer for the process of removing lines or portions of lines outside o...
bool ClipLine(Line &line)
Clip line function.
DropReason
Reason why a packet has been dropped.
This class can contain 16 bit addresses.
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 TraceNetDevTxLrWpan(std::string context, Ptr< const Packet > packet)
Lr-Wpan transmit trace callback function.
Time GetSimulatorStopTime()
Get the stop time of the underlying visual simulator implementation.
void DoPause(const std::string &message)
Do pause function.
std::vector< NodeStatistics > GetNodesStatistics() const
Get node statistics.
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.
void TraceNetDevRxCommon(const std::string &context, Ptr< const Packet > packet, const std::variant< Mac16Address, Mac48Address, Mac64Address > &source)
Network receive common trace callback 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 TraceNetDevRxLrWpan(std::string context, Ptr< const Packet > packet)
Lr-Wpan receive 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.
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.
void TraceNetDevTxCommon(const std::string &context, Ptr< const Packet > packet, const std::variant< Mac16Address, Mac48Address, Mac64Address > &destination)
Network transmit common trace callback 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.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
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...
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.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
@ LOG_DEBUG
Full voluminous logging to support debugging.
static PyViz * g_visualizer
the visualizer
static std::vector< std::string > PathSplit(std::string str)
Vector2 start
The start point of the line.
Vector2 end
The end point of the line.
Structure to handle a sample of the last received, transmitted or drop packets in a node.
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.
std::variant< Mac16Address, Mac48Address, Mac64Address > from
The source MAC address.
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.
std::variant< Mac16Address, Mac48Address, Mac64Address > to
The destination MAC address.
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