From: Victor Julien Date: Fri, 26 Jan 2024 13:36:16 +0000 (+0100) Subject: app-layer: flag flow for next packet in other dir X-Git-Tag: suricata-8.0.0-beta1~1202 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=866c128c43f44cb8c338c0ecaca89d60c0e6fca3;p=thirdparty%2Fsuricata.git app-layer: flag flow for next packet in other dir Add new flags to trigger FLOW_TS_APP_UPDATED/FLOW_TC_APP_UPDATED flags to be set for the next packet in the relevant direction. This allows for app relevant work to be done in the next packet in our direction. --- diff --git a/src/flow-worker.c b/src/flow-worker.c index fdc584df5d..1f219c83ad 100644 --- a/src/flow-worker.c +++ b/src/flow-worker.c @@ -523,19 +523,19 @@ static void PacketAppUpdate2FlowFlags(Packet *p) break; case UPDATE_DIR_BOTH: if (PKT_IS_TOSERVER(p)) { - p->flow->flags |= FLOW_TS_APP_UPDATED; + p->flow->flags |= FLOW_TS_APP_UPDATED | FLOW_TC_APP_UPDATE_NEXT; SCLogDebug("pcap_cnt %" PRIu64 ", FLOW_TS_APP_UPDATED set", p->pcap_cnt); } else { - p->flow->flags |= FLOW_TC_APP_UPDATED; + p->flow->flags |= FLOW_TC_APP_UPDATED | FLOW_TS_APP_UPDATE_NEXT; SCLogDebug("pcap_cnt %" PRIu64 ", FLOW_TC_APP_UPDATED set", p->pcap_cnt); } /* fall through */ case UPDATE_DIR_OPPOSING: if (PKT_IS_TOSERVER(p)) { - p->flow->flags |= FLOW_TC_APP_UPDATED; + p->flow->flags |= FLOW_TC_APP_UPDATED | FLOW_TS_APP_UPDATE_NEXT; SCLogDebug("pcap_cnt %" PRIu64 ", FLOW_TC_APP_UPDATED set", p->pcap_cnt); } else { - p->flow->flags |= FLOW_TS_APP_UPDATED; + p->flow->flags |= FLOW_TS_APP_UPDATED | FLOW_TC_APP_UPDATE_NEXT; SCLogDebug("pcap_cnt %" PRIu64 ", FLOW_TS_APP_UPDATED set", p->pcap_cnt); } break; @@ -583,6 +583,14 @@ static TmEcode FlowWorker(ThreadVars *tv, Packet *p, void *data) /* handle TCP and app layer */ if (p->flow) { + if (PKT_IS_TOSERVER(p) && (p->flow->flags & FLOW_TS_APP_UPDATE_NEXT)) { + p->flow->flags |= FLOW_TS_APP_UPDATED; + p->flow->flags &= ~FLOW_TS_APP_UPDATE_NEXT; + } else if (PKT_IS_TOCLIENT(p) && (p->flow->flags & FLOW_TC_APP_UPDATE_NEXT)) { + p->flow->flags |= FLOW_TC_APP_UPDATED; + p->flow->flags &= ~FLOW_TC_APP_UPDATE_NEXT; + } + if (PacketIsTCP(p)) { SCLogDebug("packet %" PRIu64 " is TCP. Direction %s", p->pcap_cnt, PKT_IS_TOSERVER(p) ? "TOSERVER" : "TOCLIENT"); diff --git a/src/flow.h b/src/flow.h index d633554243..bf28d02a58 100644 --- a/src/flow.h +++ b/src/flow.h @@ -52,7 +52,8 @@ typedef struct AppLayerParserState_ AppLayerParserState; /** At least one packet from the destination address was seen */ #define FLOW_TO_DST_SEEN BIT_U32(1) -// vacancy +/** next packet in toclient direction will act on updated app-layer state */ +#define FLOW_TC_APP_UPDATE_NEXT BIT_U32(2) /** Flow was inspected against IP-Only sigs in the toserver direction */ #define FLOW_TOSERVER_IPONLY_SET BIT_U32(3) @@ -117,6 +118,9 @@ typedef struct AppLayerParserState_ AppLayerParserState; #define FLOW_TS_APP_UPDATED BIT_U32(29) #define FLOW_TC_APP_UPDATED BIT_U32(30) +/** next packet in toserver direction will act on updated app-layer state */ +#define FLOW_TS_APP_UPDATE_NEXT BIT_U32(31) + /* File flags */ #define FLOWFILE_INIT 0