Squashed commit of the following:
commit
96cde40bbaef426256e5d5607c4f042033df22a9
Author: Steve Chew <stechew@cisco.com>
Date: Tue Jun 18 04:23:40 2019 -0400
stream_tcp: Add no-ack policy to handle flows that have no ACKs for data.
no_ack: Purge segment list withouth waiting for ack when using no_ack feature.
updated purge segment list fix for no_ack feature
updated some comments
}
}
+// In no-ack policy, data is implicitly acked immediately.
+void TcpStreamTracker::update_tracker_no_ack_recv(TcpSegmentDescriptor& tsd)
+{
+ snd_una = snd_nxt = tsd.get_end_seq();
+}
+
+void TcpStreamTracker::update_tracker_no_ack_sent(TcpSegmentDescriptor& tsd)
+{
+ r_win_base = tsd.get_end_seq();
+ reassembler.flush_on_ack_policy(tsd.get_pkt());
+}
+
void TcpStreamTracker::update_tracker_ack_sent(TcpSegmentDescriptor& tsd)
{
// ** this is how we track the last seq number sent
virtual void update_tracker_ack_recv(TcpSegmentDescriptor&);
virtual void update_tracker_ack_sent(TcpSegmentDescriptor&);
+ virtual void update_tracker_no_ack_recv(TcpSegmentDescriptor&);
+ virtual void update_tracker_no_ack_sent(TcpSegmentDescriptor&);
virtual bool update_on_3whs_ack(TcpSegmentDescriptor&);
virtual bool update_on_rst_recv(TcpSegmentDescriptor&);
virtual void update_on_rst_sent();
{ "max_pdu", Parameter::PT_INT, "1460:32768", "16384",
"maximum reassembled PDU size" },
+ // FIXIT-H: This should become an API call so that
+ // an inspector can enable no-ack processing on specific flows
+ { "no_ack", Parameter::PT_BOOL, nullptr, "false",
+ "received data is implicitly acked immediately" },
+
{ "policy", Parameter::PT_ENUM, TCP_POLICIES, "bsd",
"determines operating system characteristics like reassembly" },
else if ( v.is("max_pdu") )
config->paf_max = v.get_uint16();
+ else if ( v.is("no_ack") )
+ config->no_ack = v.get_bool();
+
else if ( v.is("policy") )
config->policy = static_cast< StreamPolicy >( v.get_uint8() + 1 );
st->normalizer.trim_win_payload(
tsd, (st->r_win_base + st->get_snd_wnd() - st->rcv_nxt));
+ // FIXIT-H: MSS is not being set on client so packets sent
+ // to client are not trimmed.
if (st->get_mss())
st->normalizer.trim_mss_payload(tsd, st->get_mss());
bool TcpStateEstablished::data_seg_sent(TcpSegmentDescriptor& tsd, TcpStreamTracker& trk)
{
trk.update_tracker_ack_sent(tsd);
+ if ( trk.session->config->no_ack )
+ trk.update_tracker_no_ack_recv(tsd);
return true;
}
{
trk.update_tracker_ack_recv(tsd);
trk.session->handle_data_segment(tsd);
+ if ( trk.session->config->no_ack )
+ trk.update_tracker_no_ack_sent(tsd);
return true;
}
uint32_t max_consec_small_segs = STREAM_DEFAULT_CONSEC_SMALL_SEGS;
uint32_t max_consec_small_seg_size = STREAM_DEFAULT_MAX_SMALL_SEG_SIZE;
- int hs_timeout = -1;
uint32_t paf_max = 16384;
+ int hs_timeout = -1;
+
+ bool no_ack;
};
#endif