int events;
uint32_t frag_len;
uint32_t ignore;
- uint32_t nseq;
RpcBuffer seg;
RpcBuffer frag;
};
{
const uint8_t* data = p->data;
uint16_t dsize = p->dsize;
- uint32_t seq = ntohl(p->ptrs.tcph->th_seq);
int need;
RpcStatus status;
DebugFormat(DEBUG_RPC,
"STATEFUL: Ssn: %p\n", rsdata);
- if ((rsdata->nseq != seq) && (rsdata->nseq != 0))
- {
- uint32_t overlap;
-
- if (rsdata->nseq < seq)
- {
- /* Missed packets - stop tracking */
- DebugMessage(DEBUG_RPC,
- "STATEFUL: Missed data\n");
- return RPC_STATUS__ERROR;
- }
-
- overlap = rsdata->nseq - seq;
- if (dsize <= overlap)
- {
- DebugMessage(DEBUG_RPC,
- "STATEFUL: All data overlapped\n");
- return RPC_STATUS__SUCCESS;
- }
-
- data += overlap;
- dsize -= (uint16_t)overlap;
-
- seq += overlap;
- }
-
- rsdata->nseq = seq + dsize;
-
if (rsdata->ignore)
{
if (dsize < rsdata->ignore)
return RPC_STATUS__ERROR;
}
+ DecodeBuffer.len = (RPC_FRAG_HDR_SIZE + fraglen);
+
return RPC_STATUS__SUCCESS;
}
if (RpcBufLen(&rsdata->frag) > RPC_MAX_BUF_SIZE)
RpcBufClean(&rsdata->frag);
+ DecodeBuffer.len = RpcBufLen(&rsdata->frag);
+
return RPC_STATUS__SUCCESS;
}
RpcBufClean(&rsdata->seg);
}
+ DecodeBuffer.len = (uint16_t)RpcBufLen(&rsdata->seg);
+
return RPC_STATUS__SUCCESS;
}
DebugMessage(DEBUG_RPC, "converted data:\n");
//LogNetData(data, decoded_len, p);
+ DecodeBuffer.len = (uint16_t)decoded_len;
return 0;
}
rsdata = RpcSsnDataNew(p);
}
- if (RpcSsnIsActive(rsdata)
- && ((p->packet_flags & PKT_REBUILT_STREAM)
- || (rsdata->nseq == 0)))
+ if ( RpcSsnIsActive(rsdata) and (p->packet_flags & PKT_REBUILT_STREAM) )
{
RpcStatus ret = RpcStatefulInspection(&config, rsdata, p);
DebugFormat(DEBUG_STREAM_STATE, "Talker flush policy: %s\n", flush_policy_names[talker->flush_policy]);
DebugFormat(DEBUG_STREAM_STATE, "Listener flush policy: %s\n", flush_policy_names[listener->flush_policy]);
- switch (talker->flush_policy) {
- case STREAM_FLPOLICY_IGNORE:
- DebugMessage(DEBUG_STREAM_STATE, "STREAM_FLPOLICY_IGNORE\n");
- return 0;
+ switch (talker->flush_policy)
+ {
+ case STREAM_FLPOLICY_IGNORE:
+ DebugMessage(DEBUG_STREAM_STATE, "STREAM_FLPOLICY_IGNORE\n");
+ return 0;
- case STREAM_FLPOLICY_ON_ACK:
- {
- uint32_t flags = GetReverseDir(p);
- int32_t flush_amt = flush_pdu_ackd(tcpssn, talker, &flags);
+ case STREAM_FLPOLICY_ON_ACK:
+ {
+ uint32_t flags = GetReverseDir(p);
+ int32_t flush_amt = flush_pdu_ackd(tcpssn, talker, &flags);
- while (flush_amt >= 0)
- {
- if (!flush_amt)
- flush_amt = talker->seglist_next->seq
- - talker->seglist_base_seq;
+ while (flush_amt >= 0)
+ {
+ if (!flush_amt)
+ flush_amt = talker->seglist_next->seq
+ - talker->seglist_base_seq;
- talker->seglist_next = talker->seglist;
- talker->seglist_base_seq = talker->seglist->seq;
+ talker->seglist_next = talker->seglist;
+ talker->seglist_base_seq = talker->seglist->seq;
- // for consistency with other cases, should return total
- // but that breaks flushing pipelined pdus
- flushed = flush_to_seq(tcpssn, talker, flush_amt, p, flags);
+ // for consistency with other cases, should return total
+ // but that breaks flushing pipelined pdus
+ flushed = flush_to_seq(tcpssn, talker, flush_amt, p, flags);
- // ideally we would purge just once after this loop
- // but that throws off base
+ // ideally we would purge just once after this loop
+ // but that throws off base
+ if ( flushed and talker->seglist )
purge_to_seq(tcpssn, talker, talker->seglist->seq + flushed);
- // if we didn't flush as expected, bail
- // (we can flush less than max dsize)
- if (!flushed)
- break;
+ // if we didn't flush as expected, bail
+ // (we can flush less than max dsize)
+ if (!flushed)
+ break;
- flags = GetReverseDir(p);
- flush_amt = flush_pdu_ackd(tcpssn, talker, &flags);
- }
- if (!flags && talker->splitter->is_paf())
- {
- fallback(talker);
- return CheckFlushPolicyOnAck(tcpssn, talker, listener, p);
- }
+ flags = GetReverseDir(p);
+ flush_amt = flush_pdu_ackd(tcpssn, talker, &flags);
}
- break;
+ if (!flags && talker->splitter->is_paf())
+ {
+ fallback(talker);
+ return CheckFlushPolicyOnAck(tcpssn, talker, listener, p);
+ }
+ }
+ break;
- case STREAM_FLPOLICY_ON_DATA:
- purge_flushed_ackd(tcpssn, talker);
- break;
+ case STREAM_FLPOLICY_ON_DATA:
+ purge_flushed_ackd(tcpssn, talker);
+ break;
}
return flushed;