analysis/utils.hpp (105 lines of code) (raw):
#ifndef UTILS_HPP
#define UTILS_HPP
#include "trace-format.h"
typedef uint64_t FlowInt;
static uint32_t GetDevInt(uint16_t node, uint8_t intf){
return ((uint32_t)node << 8) | intf;
}
struct Device{
uint16_t node;
uint8_t intf;
Device(uint16_t _node, uint8_t _intf): node(_node), intf(_intf) {}
uint32_t GetDevInt(){
return ::GetDevInt(node, intf);
}
};
static inline bool IsFlow(ns3::TraceFormat &tr){
return tr.l3Prot == 0x6 || tr.l3Prot == 0x11 || tr.l3Prot == 0xFC || tr.l3Prot == 0xFD || tr.l3Prot == 0x0;
}
static inline FlowInt GetFlowInt(uint32_t sip, uint32_t dip, uint16_t sport, uint16_t dport){
FlowInt res;
uint64_t src = (sip >> 8) & 0xffff, dst = (dip >> 8) & 0xffff;
res = ((src << 16) | dst);
res = (((res << 16) | sport) << 16) | dport;
return res;
}
static inline FlowInt GetFlowInt(ns3::TraceFormat &tr){
switch (tr.l3Prot){
case 0x6:
case 0x11:
return GetFlowInt(tr.sip, tr.dip, tr.data.sport, tr.data.dport);
case 0xFC: // ACK
case 0xFD: // NACK
return GetFlowInt(tr.sip, tr.dip, tr.ack.sport, tr.ack.dport);
case 0x0: // QpAv
return GetFlowInt(tr.sip, tr.dip, tr.qp.sport, tr.qp.dport);
default:
return GetFlowInt(tr.sip, tr.dip, 0, 0);
}
}
static inline FlowInt GetReverseFlowInt(ns3::TraceFormat &tr){
switch (tr.l3Prot){
case 0x6:
case 0x11:
return GetFlowInt(tr.dip, tr.sip, tr.data.dport, tr.data.sport);
case 0xFC: // ACK
case 0xFD: // NACK
return GetFlowInt(tr.dip, tr.sip, tr.ack.dport, tr.ack.sport);
case 0x0: // QpAv
return GetFlowInt(tr.dip, tr.sip, tr.qp.dport, tr.qp.sport);
default:
return GetFlowInt(tr.dip, tr.sip, 0, 0);
}
}
// Return the forward direction FlowInt for data, and reverse FlowInt for ACK
static inline FlowInt GetStandardFlowInt(ns3::TraceFormat &tr){
if (tr.l3Prot == 0xFC || tr.l3Prot == 0xFD)
return GetReverseFlowInt(tr);
else
return GetFlowInt(tr);
}
static inline char l3ProtToChar(uint8_t p){
switch (p){
case 0x6:
return 'T';
case 0x11:
return 'U';
case 0xFC: // ACK
return 'A';
case 0xFD: // NACK
return 'N';
case 0xFE: // PFC
return 'P';
case 0xFF:
return 'C';
default:
return 'X';
}
}
static inline void print_trace(ns3::TraceFormat &tr){
switch (tr.l3Prot){
case 0x6:
case 0x11:
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %hu %hu %c %u %lu %u %hu(%hu)", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, tr.data.sport, tr.data.dport, l3ProtToChar(tr.l3Prot), tr.data.seq, tr.data.ts, tr.data.pg, tr.size, tr.data.payload);
break;
case 0xFC: // ACK
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %u %u %c 0x%02X %u %u %lu %hu", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, tr.ack.sport, tr.ack.dport, l3ProtToChar(tr.l3Prot), tr.ack.flags, tr.ack.pg, tr.ack.seq, tr.ack.ts, tr.size);
break;
case 0xFD: // NACK
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %u %u %c 0x%02X %u %u %lu %hu", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, tr.ack.sport, tr.ack.dport, l3ProtToChar(tr.l3Prot), tr.ack.flags, tr.ack.pg, tr.ack.seq, tr.ack.ts, tr.size);
break;
case 0xFE: // PFC
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %c %u %u %u %hu", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, l3ProtToChar(tr.l3Prot), tr.pfc.time, tr.pfc.qlen, tr.pfc.qIndex, tr.size);
break;
case 0xFF: // CNP
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %c %u %u %u %u %u", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, l3ProtToChar(tr.l3Prot), tr.cnp.fid, tr.cnp.qIndex, tr.cnp.ecnBits, tr.cnp.seq, tr.size);
break;
case 0x0: // QpAv
printf("%lu n:%u %u:%u %s %08x %08x %u %u", tr.time, tr.node, tr.intf, tr.qidx, EventToStr((ns3::Event)tr.event), tr.sip, tr.dip, tr.qp.sport, tr.qp.dport);
break;
default:
printf("%lu n:%u %u:%u %u %s ecn:%x %08x %08x %x %u", tr.time, tr.node, tr.intf, tr.qidx, tr.qlen, EventToStr((ns3::Event)tr.event), tr.ecn, tr.sip, tr.dip, tr.l3Prot, tr.size);
break;
}
printf("\n");
}
#endif /* UTILS_HPP */