]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
set SO_BROADCAST on the divert socket so that broadcast
authorNikolay Denev <ndenev@gmail.com>
Sat, 22 Dec 2012 11:00:13 +0000 (13:00 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 9 Jan 2013 11:26:13 +0000 (12:26 +0100)
 packets can be reinjected.

src/source-ipfw.c

index 4a1f5ffc335c26202f3f21e641be460dada11038..b42333756429573cf120e275775a5e768904e0bc 100644 (file)
@@ -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;