set SO_BROADCAST on the divert socket so that broadcast

packets can be reinjected.
pull/249/merge
Nikolay Denev 13 years ago committed by Victor Julien
parent 6783463eee
commit 29b69fb026

@ -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;

Loading…
Cancel
Save