00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifdef HAVE_CONFIG_H
00014 #include "config.h"
00015 #endif
00016
00017 #include "fpcreate.h"
00018 #include "fpdetect.h"
00019 #include "util.h"
00020 #include "sfeventq.h"
00021 #include "event_wrapper.h"
00022 #include "event_queue.h"
00023 #include "sfthreshold.h"
00024
00025
00026
00027
00028 SNORT_EVENT_QUEUE g_event_queue = {8,3,SNORT_EVENTQ_CONTENT_LEN};
00029
00030 int SnortEventqAdd(unsigned int gid,
00031 unsigned int sid,
00032 unsigned int rev,
00033 unsigned int classification,
00034 unsigned int pri,
00035 char *msg,
00036 void *rule_info)
00037 {
00038 EventNode *en;
00039
00040 en = (EventNode *)sfeventq_event_alloc();
00041 if(!en)
00042 return -1;
00043
00044 en->gid = gid;
00045 en->sid = sid;
00046 en->rev = rev;
00047 en->classification = classification;
00048 en->priority = pri;
00049 en->msg = msg;
00050 en->rule_info = rule_info;
00051
00052 if(sfeventq_add((void *)en))
00053 return -1;
00054
00055 return 0;
00056 }
00057
00058 static int OrderPriority(void *event1, void *event2)
00059 {
00060 EventNode *e1;
00061 EventNode *e2;
00062
00063 if(!event1 || !event2)
00064 return 0;
00065
00066 e1 = (EventNode *)event1;
00067 e2 = (EventNode *)event2;
00068
00069 if(e1->priority < e2->priority)
00070 return 1;
00071
00072 return 0;
00073 }
00074
00075 static int OrderContentLength(void *event1, void *event2)
00076 {
00077 EventNode *e1;
00078 EventNode *e2;
00079 OTNX *o1;
00080 OTNX *o2;
00081
00082 if(!event1 || !event2)
00083 return 0;
00084
00085 e1 = (EventNode *)event1;
00086 e2 = (EventNode *)event2;
00087
00088 if(!e1->rule_info && e2->rule_info)
00089 {
00090
00091
00092
00093
00094 return 0;
00095 }
00096 else if(e1->rule_info && !e2->rule_info)
00097 {
00098
00099
00100
00101
00102 return 1;
00103 }
00104 else if(!e1->rule_info && !e2->rule_info)
00105 {
00106
00107
00108
00109
00110
00111 return 0;
00112 }
00113
00114
00115
00116
00117
00118 o1 = (OTNX *)e1->rule_info;
00119 o2 = (OTNX *)e2->rule_info;
00120
00121 if(o1->content_length > o2->content_length)
00122 return 1;
00123
00124 return 0;
00125 }
00126
00127 int SnortEventqInit(void)
00128 {
00129 int (*sort)(void *, void*) = NULL;
00130
00131 if(g_event_queue.order == SNORT_EVENTQ_PRIORITY)
00132 {
00133 sort = OrderPriority;
00134 }
00135 else if(g_event_queue.order == SNORT_EVENTQ_CONTENT_LEN)
00136 {
00137 sort = OrderContentLength;
00138 }
00139 else
00140 {
00141 FatalError("Order function for event queue is invalid.\n");
00142 }
00143
00144 if(sfeventq_init(g_event_queue.max_events, g_event_queue.log_events,
00145 sizeof(EventNode), sort))
00146 {
00147 FatalError("Failed to initialize Snort event queue.\n");
00148 }
00149
00150 return 0;
00151 }
00152
00153 static int LogSnortEvents(void *event, void *user)
00154 {
00155 Packet *p;
00156 EventNode *en;
00157 OTNX *otnx;
00158 SNORT_EVENTQ_USER *snort_user;
00159
00160 if(!event || !user)
00161 return 0;
00162
00163 en = (EventNode *)event;
00164 snort_user = (SNORT_EVENTQ_USER *)user;
00165 p = (Packet *)snort_user->pkt;
00166
00167
00168
00169
00170 if(en->rule_info)
00171 {
00172 otnx = (OTNX *)en->rule_info;
00173 if(!otnx->rtn || !otnx->otn)
00174 return 0;
00175
00176 snort_user->rule_alert = 1;
00177
00178 fpLogEvent(otnx->rtn, otnx->otn, p);
00179 }
00180 else
00181 {
00182 GenerateSnortEvent(p, en->gid, en->sid, en->rev,
00183 en->classification, en->priority, en->msg);
00184 }
00185
00186 sfthreshold_reset();
00187
00188 return 0;
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 int SnortEventqLog(Packet *p)
00206 {
00207 static SNORT_EVENTQ_USER user;
00208
00209 user.rule_alert = 0x00;
00210 user.pkt = (void *)p;
00211
00212 if(sfeventq_action(LogSnortEvents, (void *)&user) > 0)
00213 {
00214 if(user.rule_alert)
00215 return 1;
00216 }
00217
00218 return 0;
00219 }
00220
00221 void SnortEventqReset(void)
00222 {
00223 sfeventq_reset();
00224 return;
00225 }