void TcpSegmentDescriptor::set_retransmit_flag()
{
- assert(!meta_ack_packet);
-
if ( PacketTracer::is_active() )
{
PacketTracer::log("Packet was retransmitted and %s from the retry queue.\n",
{ return pkt->dsize; }
void set_len(uint16_t seg_len)
- {
- assert(!meta_ack_packet);
- pkt->dsize = seg_len;
- }
+ { pkt->dsize = seg_len; }
bool is_data_segment() const
{ return pkt->dsize > 0; }
- void update_len(int32_t offset)
- {
- assert(!meta_ack_packet);
- pkt->dsize += offset;
- }
-
bool is_packet_from_client() const
{ return packet_from_client; }
void slide_segment_in_rcv_window(int32_t offset)
{
- assert(!meta_ack_packet);
seq += offset;
pkt->data += offset;
pkt->dsize -= offset;
}
void set_packet_flags(uint32_t flags) const
- {
- assert(!meta_ack_packet);
- pkt->packet_flags |= flags;
- }
+ { pkt->packet_flags |= flags; }
bool are_packet_flags_set(uint32_t flags) const
{ return (pkt->packet_flags & flags) == flags; }
void rewrite_payload(uint16_t offset, uint8_t* from, uint16_t length)
{
- assert(!meta_ack_packet);
memcpy(const_cast<uint8_t*>(pkt->data + offset), from, length);
set_packet_flags(PKT_MODIFIED);
}
bool TcpStateListen::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( trk.session->tcp_config->require_3whs() || tsd.has_wscale() || ( tsd.is_data_segment() ) )
+ if ( trk.session->tcp_config->require_3whs() || tsd.has_wscale() || tsd.is_data_segment() )
{
if ( tsd.is_packet_from_server() )
trk.session->tel.set_tcp_event(EVENT_4WHS);
bool TcpStateListen::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
if ( trk.session->tcp_config->midstream_allowed(tsd.get_pkt())
- && (tsd.has_wscale() || (tsd.is_data_segment() )) )
+ && (tsd.has_wscale() || tsd.is_data_segment()) )
{
Flow* flow = tsd.get_flow();
flow->session_state |= ( STREAM_STATE_ACK | STREAM_STATE_SYN_ACK |
bool TcpStateListen::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || (tsd.is_data_segment() )) )
+ if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || tsd.is_data_segment()) )
{
Flow* flow = tsd.get_flow();
bool TcpStateNone::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || (tsd.is_data_segment())) )
+ if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || tsd.is_data_segment()) )
{
Flow* flow = tsd.get_flow();
bool TcpStateNone::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || (tsd.is_data_segment())) )
+ if ( trk.session->is_midstream_allowed(tsd) && (tsd.has_wscale() || tsd.is_data_segment()) )
{
Flow* flow = tsd.get_flow();
TcpStateSynRecv::TcpStateSynRecv(TcpStateMachine& tsm) :
TcpStateHandler(TcpStreamTracker::TCP_SYN_RECV, tsm)
-{
-}
+{ }
bool TcpStateSynRecv::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
flow->set_session_flags(SSNFLAG_SEEN_SERVER);
trk.session->tel.set_tcp_event(EVENT_4WHS);
}
+
return true;
}
{
if ( tsd.is_data_segment() )
trk.session->handle_data_on_syn(tsd);
+
return true;
}
trk.finish_server_init(tsd);
trk.normalizer.ecn_tracker(tsd.get_tcph(), trk.session->tcp_config->require_3whs());
flow->session_state |= STREAM_STATE_SYN_ACK;
+
return true;
}
if ( tsd.is_data_segment() )
trk.session->handle_data_on_syn(tsd);
}
+
return true;
}
bool TcpStateSynRecv::ack_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
if ( trk.session->tcp_config->midstream_allowed(tsd.get_pkt()) )
- {
- trk.session->update_session_on_ack( );
- }
+ trk.session->update_session_on_ack();
+
return true;
}
bool TcpStateSynRecv::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( trk.is_ack_valid(tsd.get_ack()) )
+ if ( !tsd.is_meta_ack_packet() && trk.is_ack_valid(tsd.get_ack()) )
{
Flow* flow = tsd.get_flow();
else
trk.session->check_for_window_slam(tsd);
}
+
return true;
}
trk.update_tracker_ack_sent(tsd);
if ( trk.session->no_ack_mode_enabled() )
trk.update_tracker_no_ack_recv(tsd);
+
return true;
}
}
if ( tsd.is_data_segment() )
trk.session->handle_data_segment(tsd);
+
return true;
}
trk.set_tcp_state(TcpStreamTracker::TCP_CLOSE_WAIT);
}
}
+
return true;
}
// FIXIT-L might be good to create alert specific to RST with data
if ( tsd.is_data_segment() )
trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+
return true;
}
bool TcpStateSynSent::syn_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
trk.session->check_for_repeated_syn(tsd);
+
return true;
}
if ( tsd.is_data_segment() )
trk.session->handle_data_on_syn(tsd);
trk.set_tcp_state(TcpStreamTracker::TCP_SYN_RECV);
+
return true;
}
trk.session->update_timestamp_tracking(tsd);
trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
+
return true;
}
bool TcpStateSynSent::ack_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
- if ( tsd.is_data_segment() )
+ if ( !tsd.is_meta_ack_packet() && tsd.is_data_segment() )
trk.session->handle_data_segment(tsd);
+
return true;
}
trk.session->update_timestamp_tracking(tsd);
trk.session->update_perf_base_state(TcpStreamTracker::TCP_ESTABLISHED);
trk.set_tcp_state(TcpStreamTracker::TCP_ESTABLISHED);
+
return true;
}
bool TcpStateSynSent::data_seg_recv(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
trk.session->handle_data_segment(tsd);
+
return true;
}
{
if ( tsd.is_data_segment() )
trk.session->handle_data_segment(tsd);
+
return true;
}
// FIXIT-L might be good to create alert specific to RST with data
if ( tsd.is_data_segment() )
trk.session->tel.set_tcp_event(EVENT_DATA_AFTER_RST_RCVD);
+
return true;
}