|
|
| 20 |
#include "internet-stack-helper.h" |
20 |
#include "internet-stack-helper.h" |
| 21 |
#include "ns3/internet-stack.h" |
21 |
#include "ns3/internet-stack.h" |
| 22 |
#include "ns3/packet-socket-factory.h" |
22 |
#include "ns3/packet-socket-factory.h" |
|
|
23 |
#include "ns3/config.h" |
| 23 |
|
24 |
|
| 24 |
namespace ns3 { |
25 |
namespace ns3 { |
|
|
26 |
|
| 27 |
std::vector<InternetStackHelper::Trace> InternetStackHelper::m_traces; |
| 25 |
|
28 |
|
| 26 |
void |
29 |
void |
| 27 |
InternetStackHelper::Build (NodeContainer c) |
30 |
InternetStackHelper::Build (NodeContainer c) |
|
Lines 35-39
InternetStackHelper::Build (NodeContaine
|
Link Here
|
|---|
|
| 35 |
} |
38 |
} |
| 36 |
} |
39 |
} |
| 37 |
|
40 |
|
|
|
41 |
void |
| 42 |
InternetStackHelper::EnablePcap (std::string filename) |
| 43 |
{ |
| 44 |
m_filename = filename; |
| 45 |
Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Tx", |
| 46 |
MakeCallback (&InternetStackHelper::LogTxIp, this)); |
| 47 |
Config::Connect ("/NodeList/*/$ns3::Ipv4L3Protocol/Rx", |
| 48 |
MakeCallback (&InternetStackHelper::LogRxIp, this)); |
| 49 |
} |
| 50 |
|
| 51 |
uint32_t |
| 52 |
InternetStackHelper::GetNodeIndex (std::string context) const |
| 53 |
{ |
| 54 |
std::string::size_type pos; |
| 55 |
pos = context.find ("/NodeList/"); |
| 56 |
NS_ASSERT (pos == 0); |
| 57 |
std::string::size_type afterNodeIndex = context.find ("/", 11); |
| 58 |
NS_ASSERT (afterNodeIndex != std::string::npos); |
| 59 |
std::string index = context.substr (10, afterNodeIndex - 10); |
| 60 |
std::istringstream iss; |
| 61 |
iss.str (index); |
| 62 |
uint32_t nodeIndex; |
| 63 |
iss >> nodeIndex; |
| 64 |
return nodeIndex; |
| 65 |
} |
| 66 |
|
| 67 |
void |
| 68 |
InternetStackHelper::LogTxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex) |
| 69 |
{ |
| 70 |
Ptr<PcapWriter> writer = GetStream (GetNodeIndex (context), interfaceIndex); |
| 71 |
writer->WritePacket (packet); |
| 72 |
} |
| 73 |
|
| 74 |
void |
| 75 |
InternetStackHelper::LogRxIp (std::string context, Ptr<const Packet> packet, uint32_t interfaceIndex) |
| 76 |
{ |
| 77 |
Ptr<PcapWriter> writer = GetStream (GetNodeIndex (context), interfaceIndex); |
| 78 |
writer->WritePacket (packet); |
| 79 |
} |
| 80 |
|
| 81 |
Ptr<PcapWriter> |
| 82 |
InternetStackHelper::GetStream (uint32_t nodeId, uint32_t interfaceId) |
| 83 |
{ |
| 84 |
for (std::vector<Trace>::iterator i = m_traces.begin (); |
| 85 |
i != m_traces.end (); i++) |
| 86 |
{ |
| 87 |
if (i->nodeId == nodeId && |
| 88 |
i->interfaceId == interfaceId) |
| 89 |
{ |
| 90 |
return i->writer; |
| 91 |
} |
| 92 |
} |
| 93 |
InternetStackHelper::Trace trace; |
| 94 |
trace.nodeId = nodeId; |
| 95 |
trace.interfaceId = interfaceId; |
| 96 |
trace.writer = Create<PcapWriter> (); |
| 97 |
std::ostringstream oss; |
| 98 |
oss << m_filename << ".pcap-" << nodeId << "-" << interfaceId; |
| 99 |
trace.writer->Open (oss.str ()); |
| 100 |
trace.writer->WriteIpHeader (); |
| 101 |
m_traces.push_back (trace); |
| 102 |
return trace.writer; |
| 103 |
} |
| 38 |
|
104 |
|
| 39 |
} // namespace ns3 |
105 |
} // namespace ns3 |