|
|
|
@ -326,6 +326,7 @@ TmEcode ReceiveIPFWLoop(ThreadVars *tv, void *data, void *slot)
|
|
|
|
|
TmEcode ReceiveIPFWThreadInit(ThreadVars *tv, void *initdata, void **data)
|
|
|
|
|
{
|
|
|
|
|
struct timeval timev;
|
|
|
|
|
int flag;
|
|
|
|
|
IPFWThreadVars *ntv = (IPFWThreadVars *) initdata;
|
|
|
|
|
IPFWQueueVars *nq = IPFWGetQueue(ntv->ipfw_index);
|
|
|
|
|
|
|
|
|
@ -352,6 +353,15 @@ TmEcode ReceiveIPFWThreadInit(ThreadVars *tv, void *initdata, void **data)
|
|
|
|
|
SCReturnInt(TM_ECODE_FAILED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* set SO_BROADCAST on the divert socket, otherwise sendto()
|
|
|
|
|
* returns EACCES when reinjecting broadcast packets. */
|
|
|
|
|
flag = 1;
|
|
|
|
|
|
|
|
|
|
if (setsockopt(nq->fd, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag)) == -1) {
|
|
|
|
|
SCLogWarning(SC_WARN_IPFW_SETSOCKOPT,"Can't set IPFW divert socket broadcast flag: %s", strerror(errno));
|
|
|
|
|
SCReturnInt(TM_ECODE_FAILED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nq->ipfw_sinlen=sizeof(nq->ipfw_sin);
|
|
|
|
|
memset(&nq->ipfw_sin, 0, nq->ipfw_sinlen);
|
|
|
|
|
nq->ipfw_sin.sin_family = PF_INET;
|
|
|
|
|