#include "protocols/ip.h"
#include "protocols/packet.h"
#include "protocols/tcp.h"
+#include "protocols/tcp_options.h"
#include "utils/util.h"
#include "active.h"
{ return s_pkt_trace ? s_pkt_trace->daq_activated : false; }
#endif
+static std::string stringify_tcp_options(const Packet* const pkt)
+{
+ std::ostringstream oss;
+ tcp::TcpOptIterator iter(pkt->ptrs.tcph, pkt);
+
+ for (const tcp::TcpOption& opt : iter)
+ {
+ switch (opt.code)
+ {
+ case tcp::TcpOptCode::WSCALE:
+ oss << "ws " << (uint16_t)opt.data[0] << ", ";
+ break;
+ case tcp::TcpOptCode::MAXSEG:
+ oss << "mss " << ntohs(*((const uint16_t*)(opt.data)) ) << ", ";
+ break;
+ case tcp::TcpOptCode::SACKOK:
+ oss << "sack OK, ";
+ break;
+ default:
+ break;
+ }
+ }
+ std::string opts = oss.str();
+ if (!opts.empty())
+ {
+ opts.insert(0, "options [");
+ opts.replace(opts.size() - 2, 2, "] ");
+ }
+ return opts;
+}
+
void PacketTracer::set_log_file(const std::string& file)
{ log_file = file; }
char tcpFlags[10];
p.ptrs.tcph->stringify_flags(tcpFlags);
+ std::string opts;
+ if (p.ptrs.tcph->th_flags & TH_SYN)
+ opts = stringify_tcp_options(&p);
+
if (p.ptrs.tcph->th_flags & TH_ACK)
- PacketTracer::log("Packet %" PRIu64 ": TCP %s, %s, seq %u, ack %u, dsize %u%s\n",
+ PacketTracer::log("Packet %" PRIu64 ": TCP %s, %s, seq %u, ack %u, win %u, %sdsize %u%s\n",
p.context->packet_number, tcpFlags, timestamp,
- p.ptrs.tcph->seq(), p.ptrs.tcph->ack(), p.dsize,
+ p.ptrs.tcph->seq(), p.ptrs.tcph->ack(), p.ptrs.tcph->win(), opts.c_str(), p.dsize,
p.is_retry() ? ", retry pkt" : "");
else
- PacketTracer::log("Packet %" PRIu64 ": TCP %s, %s, seq %u, dsize %u%s\n",
+ PacketTracer::log("Packet %" PRIu64 ": TCP %s, %s, seq %u, win %u, %sdsize %u%s\n",
p.context->packet_number, tcpFlags, timestamp, p.ptrs.tcph->seq(),
- p.dsize,
+ p.ptrs.tcph->win(), opts.c_str(), p.dsize,
p.is_retry() ? ", retry pkt" : "");
+ DAQ_PktTcpAckData_t* tcp_mack = (DAQ_PktTcpAckData_t*)p.daq_msg->meta[DAQ_PKT_META_TCP_ACK_DATA];
+ if ( tcp_mack )
+ PacketTracer::log("Meta_ack: ack %u, win %u\n",
+ ntohl(tcp_mack->tcp_ack_seq_num), ntohs(tcp_mack->tcp_window_size));
break;
}