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