Bug #81 ยป 0001-Bug-81-properly-usage-of-the-logging-API-at-source-p.patch
src/source-pcap-file.c | ||
---|---|---|
#include "source-pcap-file.h"
|
||
#include "util-time.h"
|
||
#include "util-debug.h"
|
||
#include "util-error.h"
|
||
typedef struct PcapFileGlobalVars_ {
|
||
pcap_t *pcap_handle;
|
||
... | ... | |
}
|
||
void PcapFileCallback(char *user, struct pcap_pkthdr *h, u_char *pkt) {
|
||
//printf("PcapFileCallback: user %p, h %p, pkt %p\n", user, h, pkt);
|
||
SCEnter();
|
||
//SCLogDebug("user %p, h %p, pkt %p", user, h, pkt);
|
||
PcapFileThreadVars *ptv = (PcapFileThreadVars *)user;
|
||
//ThreadVars *tv = ptv->tv;
|
||
... | ... | |
}
|
||
TmEcode ReceivePcapFile(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) {
|
||
SCEnter();
|
||
PcapFileThreadVars *ptv = (PcapFileThreadVars *)data;
|
||
ptv->in_p = p;
|
||
... | ... | |
/// Right now we just support reading packets one at a time.
|
||
int r = pcap_dispatch(pcap_g.pcap_handle, 1, (pcap_handler)PcapFileCallback, (u_char *)ptv);
|
||
if (r <= 0) {
|
||
printf("ReceivePcap: code %" PRId32 " error %s\n", r, pcap_geterr(pcap_g.pcap_handle));
|
||
SCLogError(SC_ERR_PCAP_DISPATCH, "Error dispatching pcap file or end of pcap file, code %" PRId32 " error %s", r, pcap_geterr(pcap_g.pcap_handle));
|
||
EngineStop();
|
||
return TM_ECODE_FAILED;
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
TmEcode ReceivePcapFileThreadInit(ThreadVars *tv, void *initdata, void **data) {
|
||
SCEnter();
|
||
if (initdata == NULL) {
|
||
printf("ReceivePcapFileThreadInit error: initdata == NULL\n");
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_INVALID_ARGUMENT, "error: initdata == NULL");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
PcapFileThreadVars *ptv = malloc(sizeof(PcapFileThreadVars));
|
||
if (ptv == NULL) {
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_ERR_MEM_ALLOC, "Error allocating memory for PcapFileThreadVars");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
memset(ptv, 0, sizeof(PcapFileThreadVars));
|
||
char errbuf[PCAP_ERRBUF_SIZE] = "";
|
||
pcap_g.pcap_handle = pcap_open_offline((char *)initdata, errbuf);
|
||
if (pcap_g.pcap_handle == NULL) {
|
||
printf("error %s\n", errbuf);
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_OPEN_OFFLINE, "error %s", errbuf);
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
pcap_g.datalink = pcap_datalink(pcap_g.pcap_handle);
|
||
printf("TmModuleReceivePcapFileRegister: datalink %" PRId32 "\n", pcap_g.datalink);
|
||
SCLogDebug("TmModuleReceivePcapFileRegister: datalink %" PRId32, pcap_g.datalink);
|
||
switch(pcap_g.datalink) {
|
||
case LINKTYPE_LINUX_SLL:
|
||
pcap_g.Decoder = DecodeSll;
|
||
... | ... | |
break;
|
||
default:
|
||
printf("Error: datalink type %" PRId32 " not yet supported in module PcapFile.\n", pcap_g.datalink);
|
||
SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, "Error: datalink type %" PRId32 " not yet supported in module PcapFile", pcap_g.datalink);
|
||
free(ptv);
|
||
return TM_ECODE_FAILED;
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
ptv->tv = tv;
|
||
*data = (void *)ptv;
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
void ReceivePcapFileThreadExitStats(ThreadVars *tv, void *data) {
|
||
SCEnter();
|
||
PcapFileThreadVars *ptv = (PcapFileThreadVars *)data;
|
||
printf(" - (%s) Packets %" PRIu32 ", bytes %" PRIu64 ".\n", tv->name, ptv->pkts, ptv->bytes);
|
||
SCLogInfo(" - (%s) Packets %" PRIu32 ", bytes %" PRIu64 ".", tv->name, ptv->pkts, ptv->bytes);
|
||
return;
|
||
}
|
||
TmEcode ReceivePcapFileThreadDeinit(ThreadVars *tv, void *data) {
|
||
return TM_ECODE_OK;
|
||
SCEnter();
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
TmEcode DecodePcapFile(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq)
|
||
{
|
||
SCEnter();
|
||
DecodeThreadVars *dtv = (DecodeThreadVars *)data;
|
||
/* update counters */
|
||
... | ... | |
/* call the decoder */
|
||
pcap_g.Decoder(tv, dtv, p, p->pkt, p->pktlen, pq);
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
TmEcode DecodePcapFileThreadInit(ThreadVars *tv, void *initdata, void **data)
|
||
{
|
||
SCEnter();
|
||
DecodeThreadVars *dtv = NULL;
|
||
if ( (dtv = malloc(sizeof(DecodeThreadVars))) == NULL) {
|
||
printf("Error Allocating memory\n");
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_ERR_MEM_ALLOC, "Error Allocating memory for DecodeThreadVars");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
memset(dtv, 0, sizeof(DecodeThreadVars));
|
||
... | ... | |
*data = (void *)dtv;
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
/* eof */
|
src/source-pcap.c | ||
---|---|---|
#include "tm-threads.h"
|
||
#include "source-pcap.h"
|
||
#include "util-debug.h"
|
||
#include "util-error.h"
|
||
/**
|
||
* \brief Structure to hold thread specific variables.
|
||
... | ... | |
* \param pkt pointer to raw packet data
|
||
*/
|
||
void PcapCallback(char *user, struct pcap_pkthdr *h, u_char *pkt) {
|
||
//printf("PcapCallback: user %p, h %p, pkt %p\n", user, h, pkt);
|
||
SCLogDebug("user %p, h %p, pkt %p", user, h, pkt);
|
||
PcapThreadVars *ptv = (PcapThreadVars *)user;
|
||
ThreadVars *tv = ptv->tv;
|
||
... | ... | |
p->datalink = ptv->datalink;
|
||
p->pktlen = h->caplen;
|
||
memcpy(p->pkt, pkt, p->pktlen);
|
||
//printf("PcapCallback: p->pktlen: %" PRIu32 " (pkt %02x, p->pkt %02x)\n", p->pktlen, *pkt, *p->pkt);
|
||
SCLogDebug("p->pktlen: %" PRIu32 " (pkt %02x, p->pkt %02x)", p->pktlen, *pkt, *p->pkt);
|
||
/* pass on... */
|
||
tv->tmqh_out(tv, p);
|
||
... | ... | |
* \retval TM_ECODE_FAILED on failure and TM_ECODE_OK on success
|
||
*/
|
||
TmEcode ReceivePcap(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq) {
|
||
SCEnter();
|
||
PcapThreadVars *ptv = (PcapThreadVars *)data;
|
||
/// Just read one packet at a time for now.
|
||
int r = 0;
|
||
while (r == 0) {
|
||
//printf("ReceivePcap: call pcap_dispatch %" PRIu32 "\n", tv->flags);
|
||
SCLogDebug(" call pcap_dispatch %" PRIu32, tv->flags);
|
||
r = pcap_dispatch(ptv->pcap_handle, 1, (pcap_handler)PcapCallback, (u_char *)ptv);
|
||
if (r < 0) {
|
||
printf("ReceivePcap: error %s\n", pcap_geterr(ptv->pcap_handle));
|
||
SCLogError(SC_ERR_PCAP_DISPATCH, "ReceivePcap: error %s", pcap_geterr(ptv->pcap_handle));
|
||
break;
|
||
}
|
||
if (TmThreadsCheckFlag(tv, THV_KILL) || TmThreadsCheckFlag(tv, THV_PAUSE)) {
|
||
SCLogInfo("pcap packet reading interrupted");
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
}
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
/**
|
||
... | ... | |
*/
|
||
#if LIBPCAP_VERSION_MAJOR == 1
|
||
TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data) {
|
||
SCEnter();
|
||
if (initdata == NULL) {
|
||
printf("ReceivePcapThreadInit error: initdata == NULL\n");
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_INVALID_ARGUMENT, "initdata == NULL");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
PcapThreadVars *ptv = malloc(sizeof(PcapThreadVars));
|
||
if (ptv == NULL) {
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_ERR_MEM_ALLOC, "Couldn't allocate PcapThreadVars");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
memset(ptv, 0, sizeof(PcapThreadVars));
|
||
... | ... | |
char errbuf[PCAP_ERRBUF_SIZE];
|
||
ptv->pcap_handle = pcap_create((char *)initdata, errbuf);
|
||
if (ptv->pcap_handle == NULL) {
|
||
printf("error %s\n", pcap_geterr(ptv->pcap_handle));
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_CREATE, "Coudn't create a new pcap handler, error %s", pcap_geterr(ptv->pcap_handle));
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
/* set Snaplen, Promisc, and Timeout. Must be called before pcap_activate */
|
||
int pcap_set_snaplen_r = pcap_set_snaplen(ptv->pcap_handle,LIBPCAP_SNAPLEN);
|
||
//printf("ReceivePcapThreadInit: pcap_set_snaplen(%p) returned %" PRId32 "\n", ptv->pcap_handle, pcap_set_snaplen_r);
|
||
if (pcap_set_snaplen_r != 0) {
|
||
printf("ReceivePcapThreadInit: error is %s\n", pcap_geterr(ptv->pcap_handle));
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_SET_SNAPLEN, "Couldn't set snaplen, error: %s", pcap_geterr(ptv->pcap_handle));
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
int pcap_set_promisc_r = pcap_set_promisc(ptv->pcap_handle,LIBPCAP_PROMISC);
|
||
//printf("ReceivePcapThreadInit: pcap_set_promisc(%p) returned %" PRId32 "\n", ptv->pcap_handle, pcap_set_promisc_r);
|
||
if (pcap_set_promisc_r != 0) {
|
||
printf("ReceivePcapThreadInit: error is %s\n", pcap_geterr(ptv->pcap_handle));
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_SET_PROMISC, "Couldn't set promisc mode, error %s", pcap_geterr(ptv->pcap_handle));
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
int pcap_set_timeout_r = pcap_set_timeout(ptv->pcap_handle,LIBPCAP_COPYWAIT);
|
||
//printf("ReceivePcapThreadInit: pcap_set_timeout(%p) returned %" PRId32 "\n", ptv->pcap_handle, pcap_set_timeout_r);
|
||
if (pcap_set_timeout_r != 0) {
|
||
printf("ReceivePcapThreadInit: error is %s\n", pcap_geterr(ptv->pcap_handle));
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_SET_TIMEOUT, "Problems setting timeout, error %s", pcap_geterr(ptv->pcap_handle));
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
/* activate the handle */
|
||
int pcap_activate_r = pcap_activate(ptv->pcap_handle);
|
||
//printf("ReceivePcapThreadInit: pcap_activate(%p) returned %" PRId32 "\n", ptv->pcap_handle, pcap_activate_r);
|
||
if (pcap_activate_r != 0) {
|
||
printf("ReceivePcapThreadInit: error is %s\n", pcap_geterr(ptv->pcap_handle));
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_ACTIVATE_HANDLE, "Couldn't activate the pcap handler, error %s", pcap_geterr(ptv->pcap_handle));
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
ptv->datalink = pcap_datalink(ptv->pcap_handle);
|
||
*data = (void *)ptv;
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
#else /* implied LIBPCAP_VERSION_MAJOR == 0 */
|
||
TmEcode ReceivePcapThreadInit(ThreadVars *tv, void *initdata, void **data) {
|
||
SCEnter();
|
||
if (initdata == NULL) {
|
||
printf("ReceivePcapThreadInit error: initdata == NULL\n");
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_INVALID_ARGUMENT, "initdata == NULL");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
PcapThreadVars *ptv = malloc(sizeof(PcapThreadVars));
|
||
if (ptv == NULL) {
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_ERR_MEM_ALLOC, "Couldn't allocate PcapThreadVars");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
memset(ptv, 0, sizeof(PcapThreadVars));
|
||
... | ... | |
ptv->pcap_handle = pcap_open_live((char *)initdata, LIBPCAP_SNAPLEN,
|
||
LIBPCAP_PROMISC, LIBPCAP_COPYWAIT, errbuf);
|
||
if (ptv->pcap_handle == NULL) {
|
||
printf("error %s\n", errbuf);
|
||
exit(1);
|
||
SCLogError(SC_ERR_PCAP_OPEN_LIVE, "Problem creating pcap handler for live mode, error %s", errbuf);
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
ptv->datalink = pcap_datalink(ptv->pcap_handle);
|
||
*data = (void *)ptv;
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
#endif /* LIBPCAP_VERSION_MAJOR */
|
||
... | ... | |
* \param data pointer that gets cast into PcapThreadVars for ptv
|
||
*/
|
||
void ReceivePcapThreadExitStats(ThreadVars *tv, void *data) {
|
||
SCEnter();
|
||
PcapThreadVars *ptv = (PcapThreadVars *)data;
|
||
SCLogInfo("(%s) Packets %" PRIu32 ", bytes %" PRIu64 "", tv->name, ptv->pkts, ptv->bytes);
|
||
... | ... | |
PcapThreadVars *ptv = (PcapThreadVars *)data;
|
||
pcap_close(ptv->pcap_handle);
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
/**
|
||
... | ... | |
*/
|
||
TmEcode DecodePcap(ThreadVars *tv, Packet *p, void *data, PacketQueue *pq)
|
||
{
|
||
SCEnter();
|
||
DecodeThreadVars *dtv = (DecodeThreadVars *)data;
|
||
/* update counters */
|
||
... | ... | |
DecodeRaw(tv, dtv, p, p->pkt, p->pktlen, pq);
|
||
break;
|
||
default:
|
||
printf("Error: datalink type %" PRId32 " not yet supported in module DecodePcap.\n", p->datalink);
|
||
SCLogError(SC_ERR_DATALINK_UNIMPLEMENTED, "Error: datalink type %" PRId32 " not yet supported in module DecodePcap", p->datalink);
|
||
break;
|
||
}
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
TmEcode DecodePcapThreadInit(ThreadVars *tv, void *initdata, void **data)
|
||
{
|
||
SCEnter();
|
||
DecodeThreadVars *dtv = NULL;
|
||
if ( (dtv = malloc(sizeof(DecodeThreadVars))) == NULL) {
|
||
printf("Error Allocating memory\n");
|
||
return TM_ECODE_FAILED;
|
||
SCLogError(SC_ERR_MEM_ALLOC, "Error Allocating memory");
|
||
SCReturnInt(TM_ECODE_FAILED);
|
||
}
|
||
memset(dtv, 0, sizeof(DecodeThreadVars));
|
||
... | ... | |
*data = (void *)dtv;
|
||
return TM_ECODE_OK;
|
||
SCReturnInt(TM_ECODE_OK);
|
||
}
|
||
/* eof */
|
src/util-error.c | ||
---|---|---|
CASE_CODE (SC_ERR_MEM_ALLOC);
|
||
CASE_CODE (SC_PCRE_MATCH_FAILED);
|
||
CASE_CODE (SC_PCRE_GET_SUBSTRING_FAILED);
|
||
CASE_CODE (SC_ERR_PCAP_DISPATCH);
|
||
CASE_CODE (SC_ERR_PCAP_CREATE);
|
||
CASE_CODE (SC_ERR_PCAP_SET_SNAPLEN);
|
||
CASE_CODE (SC_ERR_PCAP_SET_PROMISC);
|
||
CASE_CODE (SC_ERR_PCAP_SET_TIMEOUT);
|
||
CASE_CODE (SC_ERR_PCAP_OPEN_LIVE);
|
||
CASE_CODE (SC_ERR_PCAP_OPEN_OFFLINE);
|
||
CASE_CODE (SC_ERR_PCAP_ACTIVATE_HANDLE);
|
||
CASE_CODE (SC_ERR_DATALINK_UNIMPLEMENTED);
|
||
CASE_CODE (SC_PCRE_COMPILE_FAILED);
|
||
CASE_CODE (SC_PCRE_STUDY_FAILED);
|
||
CASE_CODE (SC_PCRE_PARSE_FAILED);
|
src/util-error.h | ||
---|---|---|
typedef enum {
|
||
SC_OK,
|
||
SC_ERR_MEM_ALLOC,
|
||
SC_ERR_PCAP_DISPATCH,
|
||
SC_ERR_PCAP_CREATE,
|
||
SC_ERR_PCAP_SET_SNAPLEN,
|
||
SC_ERR_PCAP_SET_PROMISC,
|
||
SC_ERR_PCAP_SET_TIMEOUT,
|
||
SC_ERR_PCAP_OPEN_LIVE,
|
||
SC_ERR_PCAP_OPEN_OFFLINE,
|
||
SC_ERR_PCAP_ACTIVATE_HANDLE,
|
||
SC_ERR_DATALINK_UNIMPLEMENTED,
|
||
SC_PCRE_MATCH_FAILED,
|
||
SC_PCRE_GET_SUBSTRING_FAILED,
|
||
SC_PCRE_COMPILE_FAILED,
|