Commit 835caf4a authored by Mike Hibler's avatar Mike Hibler
Browse files

Urk. The pcap_breakloop trick for getting a thread out of the pcap dispatch

only works for FC4 (not RHL7 or RHL9) because that function only exists in
the libpcap on FC.  Fortunately, I don't think RHL7 and RHL9 exhibit the
problem in the first place.
parent 4947d608
...@@ -9,6 +9,7 @@ TESTBED_SRCDIR = @top_srcdir@ ...@@ -9,6 +9,7 @@ TESTBED_SRCDIR = @top_srcdir@
OBJDIR = ../.. OBJDIR = ../..
SUBDIR = tools/pcapper SUBDIR = tools/pcapper
SYSTEM := $(shell uname -s) SYSTEM := $(shell uname -s)
RHLVERSION := $(shell cat /etc/redhat-release | sed -e 's/Red Hat Linux release \([0-9]\).*/Linux\1/' | sed -e 's/Fedora Core release \([0-9]\).*/FC\1/')
include $(OBJDIR)/Makeconf include $(OBJDIR)/Makeconf
...@@ -38,6 +39,10 @@ LDFLAGS = -static ...@@ -38,6 +39,10 @@ LDFLAGS = -static
CFLAGS_FBSD = $(CFLAGS) $(TBCFLAGS) CFLAGS_FBSD = $(CFLAGS) $(TBCFLAGS)
CFLAGS_FBSD_NE = $(CFLAGS) CFLAGS_FBSD_NE = $(CFLAGS)
CFLAGS_LINUX = $(CFLAGS) -I/usr/include/pcap $(TBCFLAGS) CFLAGS_LINUX = $(CFLAGS) -I/usr/include/pcap $(TBCFLAGS)
ifneq (,$(findstring FC, $(RHLVERSION)))
# XXX should be configed
CFLAGS_LINUX += -DHAVE_PCAP_BREAKLOOP
endif
LIBS_FBSD = $(PTHREADLIBS) $(TBLIBS) $(PCAPLIBS) LIBS_FBSD = $(PTHREADLIBS) $(TBLIBS) $(PCAPLIBS)
LIBS_FBSD_NE = $(PTHREADLIBS) $(PCAPLIBS) LIBS_FBSD_NE = $(PTHREADLIBS) $(PCAPLIBS)
......
...@@ -67,6 +67,20 @@ ...@@ -67,6 +67,20 @@
#define MAX_FILES 16 #define MAX_FILES 16
#define MAX_CLIENTS 8 #define MAX_CLIENTS 8
/*
* What a hoot. The Linux (at least Fedora) version of pcapper
* will not timeout in the dispatch routine. It apparently will stay
* in recvfrom() til it gets a packet. So we blast all the pthreads
* out of recvfrom with a signal after setting the flag to force them
* to return from dispatch (pcap_breakloop).
*
* XXX we can only do this if pcap_breakloop exists, which apparently
* it doesn't on older Linux releases.
*/
#if defined(EVENTSYS) && defined(HAVE_PCAP_BREAKLOOP)
#define MUST_WAKEUP_PCAP
#endif
/* /*
* Program run to determine the control interface. * Program run to determine the control interface.
*/ */
...@@ -189,7 +203,7 @@ void got_packet(u_char *args, const struct pcap_pkthdr *header, ...@@ -189,7 +203,7 @@ void got_packet(u_char *args, const struct pcap_pkthdr *header,
const u_char *packet); const u_char *packet);
int getaddr(char *dev, struct in_addr *addr); int getaddr(char *dev, struct in_addr *addr);
#ifdef EVENTSYS #ifdef EVENTSYS
#ifdef __linux__ #ifdef MUST_WAKEUP_PCAP
static void onusr1(int); static void onusr1(int);
static void pthread_WAKEUPDAMIT(void); static void pthread_WAKEUPDAMIT(void);
#endif #endif
...@@ -366,11 +380,9 @@ void usage(char *progname) { ...@@ -366,11 +380,9 @@ void usage(char *progname) {
static void cleanup(int sig) static void cleanup(int sig)
{ {
killme = 1; killme = 1;
#ifdef EVENTSYS #ifdef MUST_WAKEUP_PCAP
#ifdef __linux__
pthread_WAKEUPDAMIT(); pthread_WAKEUPDAMIT();
#endif #endif
#endif
} }
/* /*
...@@ -962,15 +974,13 @@ int main (int argc, char **argv) { ...@@ -962,15 +974,13 @@ int main (int argc, char **argv) {
action.sa_handler = cleanup; action.sa_handler = cleanup;
sigaction(SIGTERM, &action, NULL); sigaction(SIGTERM, &action, NULL);
sigaction(SIGINT, &action, NULL); sigaction(SIGINT, &action, NULL);
#ifdef EVENTSYS #ifdef MUST_WAKEUP_PCAP
#ifdef __linux__
/* /*
* XXX serious hack. Need to catch SIGUSR1 in all threads * XXX serious hack. Need to catch SIGUSR1 in all threads
* so they can be signal()ed out of libpcap. * so they can be signal()ed out of libpcap.
*/ */
action.sa_handler = onusr1; action.sa_handler = onusr1;
sigaction(SIGUSR1, &action, NULL); sigaction(SIGUSR1, &action, NULL);
#endif
#endif #endif
} }
...@@ -1739,7 +1749,7 @@ int getaddr(char *dev, struct in_addr *addr) { ...@@ -1739,7 +1749,7 @@ int getaddr(char *dev, struct in_addr *addr) {
* out of recvfrom with a signal after setting the flag to force them * out of recvfrom with a signal after setting the flag to force them
* to return from dispatch (pcap_breakloop). * to return from dispatch (pcap_breakloop).
*/ */
#ifdef __linux__ #ifdef MUST_WAKEUP_PCAP
static void static void
onusr1(int sig) onusr1(int sig)
{ {
...@@ -1857,7 +1867,7 @@ callback(event_handle_t handle, ...@@ -1857,7 +1867,7 @@ callback(event_handle_t handle,
pthread_self(), reload); pthread_self(), reload);
fflush(stderr); fflush(stderr);
#ifdef __linux__ #ifdef MUST_WAKEUP_PCAP
pthread_WAKEUPDAMIT(); pthread_WAKEUPDAMIT();
#endif #endif
while (reload) while (reload)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment