using namespace snort;
-TcpSegmentDescriptor::TcpSegmentDescriptor(Flow* flow, Packet* pkt, TcpEventLogger& tel) :
- flow(flow), pkt(pkt)
+TcpSegmentDescriptor::TcpSegmentDescriptor(Flow* flow_, Packet* pkt_, TcpEventLogger& tel) :
+ flow(flow_),
+ pkt(pkt_),
+ tcph(pkt->ptrs.tcph),
+ src_port(tcph->src_port()),
+ dst_port(tcph->dst_port()),
+ seg_seq(tcph->seq()),
+ seg_ack(tcph->ack()),
+ seg_wnd(tcph->win()),
+ end_seq(seg_seq + (uint32_t)pkt->dsize)
{
- tcph = pkt->ptrs.tcph;
- src_port = tcph->src_port();
- dst_port = tcph->dst_port();
- seg_seq = tcph->seq();
- seg_ack = tcph->ack();
- seg_wnd = tcph->win();
- end_seq = seg_seq + (uint32_t)pkt->dsize;
- ts = 0;
-
// don't bump end_seq for fin here we will bump if/when fin is processed
if ( tcph->is_syn() )
{
void set_seg_seq(uint32_t seq)
{
- this->seg_seq = seq;
+ seg_seq = seq;
}
void update_seg_seq(int32_t offset)
void scale_seg_wnd(uint16_t wscale)
{
- this->seg_wnd <<= wscale;
+ seg_wnd <<= wscale;
}
uint32_t get_seg_wnd() const
void set_seg_len(uint16_t seg_len)
{
+ // Reset segment size to seg_len
pkt->dsize = seg_len;
}
void update_seg_len(int32_t offset)
{
+ // Increase segment size by offset
pkt->dsize += offset;
}
void slide_segment_in_rcv_window(int32_t offset)
{
+ // This actually deletes the first offset bytes of the segment, no sliding involved
seg_seq += offset;
pkt->data += offset;
pkt->dsize -= offset;
}
private:
- snort::Flow* flow;
- snort::Packet* pkt;
+ snort::Flow* const flow;
+ snort::Packet* const pkt;
- const snort::tcp::TCPHdr* tcph;
- uint16_t src_port;
- uint16_t dst_port;
+ const snort::tcp::TCPHdr* const tcph;
+ const uint16_t src_port;
+ const uint16_t dst_port;
uint32_t seg_seq;
- uint32_t seg_ack;
+ const uint32_t seg_ack;
uint32_t seg_wnd;
uint32_t end_seq;
- uint32_t ts;
+ uint32_t ts = 0;
};
#endif
bool TcpStateMachine::eval(TcpSegmentDescriptor& tsd, TcpStreamTracker& talker,
TcpStreamTracker& listener)
{
- TcpStreamTracker::TcpState tcp_state = talker.get_tcp_state( );
+ const TcpStreamTracker::TcpState talker_state = talker.get_tcp_state( );
talker.set_tcp_event(tsd);
- if ( tcp_state_handlers[ tcp_state ]->do_pre_sm_packet_actions(tsd, talker) )
+ if ( tcp_state_handlers[ talker_state ]->do_pre_sm_packet_actions(tsd, talker) )
{
- if ( tcp_state_handlers[ tcp_state ]->eval(tsd, talker) )
+ if ( tcp_state_handlers[ talker_state ]->eval(tsd, talker) )
{
- tcp_state = listener.get_tcp_state( );
+ const TcpStreamTracker::TcpState listener_state = listener.get_tcp_state( );
listener.set_tcp_event(tsd);
- tcp_state_handlers[ tcp_state ]->eval(tsd, listener);
- tcp_state_handlers[ tcp_state ]->do_post_sm_packet_actions(tsd, listener);
+ tcp_state_handlers[ listener_state ]->eval(tsd, listener);
+ tcp_state_handlers[ listener_state ]->do_post_sm_packet_actions(tsd, listener);
return true;
}
flow->server_port = tmpPort;
SwapPacketHeaderFoo( );
- TcpStreamTracker& tracker = client;
+ TcpStreamTracker tracker = client;
client = server;
server = tracker;
}
{ return rcv_nxt; }
void set_rcv_nxt(uint32_t rcv_nxt)
- { this->rcv_nxt = rcv_nxt; }
+ { this->rcv_nxt = rcv_nxt; }
uint32_t get_rcv_wnd() const
{ return rcv_wnd; }
bool is_ack_valid(uint32_t cur)
{
- // FIXIT-H do we need this check? we've always seen something by the time we get here
// If we haven't seen anything, ie, low & high are 0, return true
- if ( ( snd_una == 0 ) && ( snd_una == snd_nxt ) )
+ if ( ( snd_una == 0 ) && ( snd_nxt == 0 ) )
return true;
return ( SEQ_GEQ(cur, snd_una) && SEQ_LEQ(cur, snd_nxt) );
NORETURN_ASSERT void eval(Packet*) override;
public:
- TcpStreamConfig* config;
+ TcpStreamConfig* const config;
};
-StreamTcp::StreamTcp (TcpStreamConfig* c)
-{
- config = c;
-}
+StreamTcp::StreamTcp (TcpStreamConfig* c) : config(c) {}
StreamTcp::~StreamTcp()
{
TcpStreamSession::setup(p);
splitter_init = false;
- TcpStreamConfig* pc = get_tcp_cfg(flow->ssn_server);
+ const TcpStreamConfig* pc = get_tcp_cfg(flow->ssn_server);
flow->set_default_session_timeout(pc->session_timeout, false);
SESSION_STATS_ADD(tcpStats);
TcpStreamConfig::TcpStreamConfig() = default;
-void TcpStreamConfig::show_config()
+void TcpStreamConfig::show_config() const
{
TcpStreamConfig::show_config(this);
}
-void TcpStreamConfig::show_config(TcpStreamConfig* config)
+void TcpStreamConfig::show_config(const TcpStreamConfig* config)
{
LogMessage("Stream TCP Policy config:\n");
LogMessage(" Reassembly Policy: %s\n",
return false;
}
- void show_config();
- static void show_config(TcpStreamConfig*);
+ void show_config() const;
+ static void show_config(const TcpStreamConfig*);
StreamPolicy policy = StreamPolicy::OS_DEFAULT;
ReassemblyPolicy reassembly_policy = ReassemblyPolicy::OS_DEFAULT;
private:
TcpStreamStateMachine();
-
};
#endif
{
if ((dir == SSN_DIR_FROM_CLIENT) && (flow->ssn_state.direction == FROM_CLIENT))
{
- /* Direction already set as CLIENT */
+ // Direction already set as CLIENT
return;
}
}
{
if ((dir == SSN_DIR_FROM_SERVER) && (flow->ssn_state.direction == FROM_SERVER))
{
- /* Direction already set as SERVER */
+ // Direction already set as SERVER
return;
}
}
- /* Swap them -- leave flow->ssn_state.direction the same */
+ // Swap them -- leave flow->ssn_state.direction the same
tmpIp = flow->client_ip;
tmpPort = flow->client_port;
flow->client_ip = flow->server_ip;