From 29b69fb026a9dd06951c94b28d7bd38539e30fe9 Mon Sep 17 00:00:00 2001 From: Nikolay Denev Date: Sat, 22 Dec 2012 13:00:13 +0200 Subject: [PATCH] set SO_BROADCAST on the divert socket so that broadcast packets can be reinjected. --- src/source-ipfw.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/source-ipfw.c b/src/source-ipfw.c index 4a1f5ffc33..b423337564 100644 --- a/src/source-ipfw.c +++ b/src/source-ipfw.c @@ -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;