* toserver
+* either
+
Syntax::
flow.pkts:<direction>,[op]<number>
flow.pkts:toclient,3 # exactly 3
flow.pkts:toserver,<3 # smaller than 3
+ flow.pkts:either,>=2 # greater than or equal to 2
Signature example::
* toserver
+* either
+
Syntax::
flow.bytes:<direction>,[op]<number>
flow.bytes:toclient,3 # exactly 3
flow.bytes:toserver,<3 # smaller than 3
+ flow.bytes:either,>=2 # greater than or equal to 2
Signature example::
enum FlowDirection {
DETECT_FLOW_TOSERVER = 1,
DETECT_FLOW_TOCLIENT,
+ DETECT_FLOW_TOEITHER,
};
typedef struct DetectFlowPkts_ {
return DetectU32Match(p->flow->todstpktcnt, df->pkt_data);
} else if (df->dir == DETECT_FLOW_TOCLIENT) {
return DetectU32Match(p->flow->tosrcpktcnt, df->pkt_data);
+ } else if (df->dir == DETECT_FLOW_TOEITHER) {
+ if (DetectU32Match(p->flow->tosrcpktcnt, df->pkt_data)) {
+ return 1;
+ }
+ return DetectU32Match(p->flow->todstpktcnt, df->pkt_data);
}
return 0;
}
dir = DETECT_FLOW_TOSERVER;
} else if (strcmp(token, "toclient") == 0) {
dir = DETECT_FLOW_TOCLIENT;
+ } else if (strcmp(token, "either") == 0) {
+ dir = DETECT_FLOW_TOEITHER;
} else {
SCLogError("Invalid direction given: %s", token);
return -1;
return DetectU64Match(p->flow->todstbytecnt, df->byte_data);
} else if (df->dir == DETECT_FLOW_TOCLIENT) {
return DetectU64Match(p->flow->tosrcbytecnt, df->byte_data);
+ } else if (df->dir == DETECT_FLOW_TOEITHER) {
+ if (DetectU64Match(p->flow->tosrcbytecnt, df->byte_data)) {
+ return 1;
+ }
+ return DetectU64Match(p->flow->todstbytecnt, df->byte_data);
}
return 0;
}
dir = DETECT_FLOW_TOSERVER;
} else if (strcmp(token, "toclient") == 0) {
dir = DETECT_FLOW_TOCLIENT;
+ } else if (strcmp(token, "either") == 0) {
+ dir = DETECT_FLOW_TOEITHER;
} else {
SCLogError("Invalid direction given: %s", token);
return -1;