** 1 if flagged
**
*/
-// FIXIT-H this should include frags now that they are in session
static inline int fpAddSessionAlert(Packet *p, OptTreeNode *otn)
{
if ( !p->flow )
** 1 if alert previously generated
**
*/
-// FIXIT-H this should include frags now that they are in session
static inline int fpSessionAlerted(Packet *p, OptTreeNode *otn)
{
SigInfo *si = &otn->sigInfo;
** payload, in case any of the rules have the
** 'rawbytes' option.
*/
- // FIXIT-H alt buf and file data should be obtained from
+ // FIXIT-M alt buf and file data should be obtained from
// inspector gadget as an extension of above
so = port_group->pgPms[PM_TYPE__CONTENT];
virtual bool setup(Packet*) { return true; };
virtual void update_direction(char /*dir*/, const sfip_t*, uint16_t /*port*/) { };
virtual int process(Packet*) { return 0; };
+
virtual void restart(Packet*) { };
virtual void clear() = 0;
virtual void cleanup() { clear(); };
+ virtual bool add_alert(Packet*, uint32_t /*gid*/, uint32_t /*sid*/) { return false; };
+ virtual bool check_alerted(Packet*, uint32_t /*gid*/, uint32_t /*sid*/) { return false; };
+
protected:
Session(Flow* f) { flow = f; };
ft->frag_pkts = 0;
ft->frag_time.tv_sec = p->pkth->ts.tv_sec;
ft->frag_time.tv_usec = p->pkth->ts.tv_usec;
+ ft->alert_count = 0;
ft->ip_options_len = 0;
ft->ip_options_data = NULL;
ft->copied_ip_options_len = 0;
return 0;
}
+bool IpSession::add_alert(Packet*, uint32_t gid, uint32_t sid)
+{
+ FragTracker* ft = &tracker;
+
+ /* Only track a certain number of alerts per session */
+ if ( ft->alert_count >= MAX_FRAG_ALERTS )
+ return false;
+
+ ft->alert_gid[ft->alert_count] = gid;
+ ft->alert_sid[ft->alert_count] = sid;
+ ft->alert_count++;
+
+ return true;
+}
+
+bool IpSession::check_alerted(Packet* p, uint32_t gid, uint32_t sid)
+{
+ FragTracker* ft = &tracker;
+
+ for ( unsigned i = 0; i < ft->alert_count; i++ )
+ {
+ /* If this is a rebuilt packet and we've seen this alert before, return
+ * that we have previously alerted on a non-rebuilt packet.
+ */
+ if ( (p->packet_flags & PKT_REBUILT_FRAG)
+ && ft->alert_gid[i] == gid && ft->alert_sid[i] == sid )
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
struct Fragment;
struct FragEngine;
+/* Only track a certain number of alerts per session */
+#define MAX_FRAG_ALERTS 8
+
/* tracker for a fragmented packet set */
struct FragTracker
{
Fragment *fraglist_tail; /* tail ptr for easy appending */
int fraglist_count; /* handy dandy counter */
+ uint32_t alert_gid[MAX_FRAG_ALERTS]; /* flag alerts seen in a frag list */
+ uint32_t alert_sid[MAX_FRAG_ALERTS]; /* flag alerts seen in a frag list */
+ uint8_t alert_count; /* count alerts seen in a frag list */
+
uint8_t ip_options_len; /* length of ip options for this set of frags */
uint8_t *ip_options_data; /* ip options from offset 0 packet */
uint8_t copied_ip_options_len; /* length of 'copied' ip options */
int process(Packet*) override;
void clear() override;
+ bool add_alert(Packet*, uint32_t gid, uint32_t sid) override;
+ bool check_alerted(Packet*, uint32_t gid, uint32_t sid) override;
+
public:
FragTracker tracker;
};
return 0;
}
-int Stream::add_session_alert(
+// return true if added
+bool Stream::add_session_alert(
Flow *flow, Packet *p, uint32_t gid, uint32_t sid)
{
if ( !flow )
- return 0;
-
- /* Don't need to do this for other protos because they don't
- do any reassembly. */
- if ( p->type() != PktType::TCP )
- return 0;
+ return false;
- return Stream5AddSessionAlertTcp(flow, p, gid, sid);
+ return flow->session->add_alert(p, gid, sid);
}
-/* return non-zero if gid/sid have already been seen */
-int Stream::check_session_alerted(
+// return true if gid/sid have already been seen
+bool Stream::check_session_alerted(
Flow *flow, Packet *p, uint32_t gid, uint32_t sid)
{
if ( !flow )
- return 0;
-
- /* Don't need to do this for other protos because they don't
- do any reassembly. */
- if ( p->type() != PktType::TCP )
- return 0;
+ return false;
- return Stream5CheckSessionAlertTcp(flow, p, gid, sid);
+ return flow->session->check_alerted(p, gid, sid);
}
int Stream::update_session_alert(
*/
static int traverse_stream_segments(Packet*, StreamSegmentIterator, void* userdata); // PKT
- /* Add session alert
+ /* Add session alert - true if added
*/
- static int add_session_alert(Flow*, Packet*, uint32_t gid, uint32_t sid);
+ static bool add_session_alert(Flow*, Packet*, uint32_t gid, uint32_t sid);
- /* Check session alert
- *
- * Returns
- * 0 if not previously alerted
- * !0 if previously alerted
+ /* Check session alert - true if previously alerted
*/
- static int check_session_alerted(Flow*, Packet *p, uint32_t gid, uint32_t sid);
+ static bool check_session_alerted(Flow*, Packet *p, uint32_t gid, uint32_t sid);
/* Set Extra Data Logging
*
st->alert_count++;
- return 0;
+ return 1;
}
int Stream5CheckSessionAlertTcp(Flow *lwssn, Packet *p, uint32_t gid, uint32_t sid)
return 0;
}
+bool TcpSession::add_alert(Packet* p, uint32_t gid, uint32_t sid)
+{
+ return Stream5AddSessionAlertTcp(p->flow, p, gid, sid) != 0;
+}
+
+bool TcpSession::check_alerted(Packet* p, uint32_t gid, uint32_t sid)
+{
+ return Stream5CheckSessionAlertTcp(p->flow, p, gid, sid) != 0;
+}
+
//-------------------------------------------------------------------------
// tcp module stuff
//-------------------------------------------------------------------------
void reset();
void restart(Packet*) override;
+ bool add_alert(Packet*, uint32_t gid, uint32_t sid) override;
+ bool check_alerted(Packet*, uint32_t gid, uint32_t sid) override;
+
public:
StreamTracker client;
StreamTracker server;