-- josh fixed a decoding issue affecting fragged packets
-- fixed byte_test config of compare value
-- fixed byte_test endian
+-- flush available data for non-paf splitters
127
-- REG_TEST out logging tcp options for rebuilt packets to match snort bug
if ( ft != FT_NOP )
{
fp = s5_paf_flush(ss, ps, ft, flags);
-
- ps->pos += fp;
- ps->seq = ps->pos;
-
+ s5_paf_jump(ps, fp);
return fp;
}
if ( !cont )
if ( (ps->paf != StreamSplitter::FLUSH) && (s5_len > ss->max()+fuzz) )
{
uint32_t fp = s5_paf_flush(ss, ps, FT_MAX, flags);
-
- ps->pos += fp;
- ps->seq = ps->pos;
-
+ s5_paf_jump(ps, fp);
return fp;
}
return 0;
return ( ps->paf != StreamSplitter::ABORT );
}
+static inline void s5_paf_jump(PAF_State* ps, uint32_t n)
+{
+ ps->pos += n;
+ ps->seq = ps->pos;
+}
+
// called on each in order segment
uint32_t s5_paf_check(
StreamSplitter* paf_config, PAF_State*, Flow* ssn,
if ( flush_pt > 0 )
{
MODULE_PROFILE_END(s5TcpPAFPerfStats);
-#if 0
- // for non-paf splitters, flush_pt > 0 means we reached
- // the minimum required, but we flush what is available
- // instead of creating more, but smaller, packets
+
+ // see flush_pdu_ackd()
if ( !trk->splitter->is_paf() && avail > flush_pt )
+ {
+ s5_paf_jump(&trk->paf_state, avail - flush_pt);
return avail;
-#endif
+ }
return flush_pt;
}
seg = seg->next;
if ( flush_pt > 0 )
{
MODULE_PROFILE_END(s5TcpPAFPerfStats);
-#if 0
+
// for non-paf splitters, flush_pt > 0 means we reached
// the minimum required, but we flush what is available
// instead of creating more, but smaller, packets
if ( !trk->splitter->is_paf() )
{
- uint32_t avail = get_q_footprint(trk);
+ // get_q_footprint() w/o side effects
+ uint32_t avail = (trk->r_win_base - trk->seglist_base_seq);
if ( avail > flush_pt )
+ {
+ s5_paf_jump(&trk->paf_state, avail - flush_pt);
return avail;
+ }
}
-#endif
return flush_pt;
}
seg = seg->next;