diff options
author | David Lamparter <equinox@opensourcerouting.org> | 2012-07-13 14:05:36 +0200 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2012-07-13 14:05:40 +0200 |
commit | 18a4e3715f89337ac8b70f6f63cc131c3218c82c (patch) | |
tree | 1b38b2eae4e1cee042f96a42217b14647159bf0f /lib/thread.c | |
parent | a47c5838e9f445ab887ad927706b11ccbb181364 (diff) | |
parent | 8046ba6ec4d6e87bf8da6563c0f3e5e66c4652b3 (diff) |
Merge remote branch 'vincentbernat/feature/agentx'
Diffstat (limited to 'lib/thread.c')
-rw-r--r-- | lib/thread.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/thread.c b/lib/thread.c index 86d0ff8c..6341dfd7 100644 --- a/lib/thread.c +++ b/lib/thread.c @@ -29,6 +29,16 @@ #include "hash.h" #include "command.h" #include "sigevent.h" + +#if defined HAVE_SNMP && defined SNMP_AGENTX +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include <net-snmp/agent/snmp_vars.h> + +extern int agentx_enabled; +#endif + /* Recent absolute time of day */ struct timeval recent_time; @@ -1030,6 +1040,11 @@ thread_fetch (struct thread_master *m, struct thread *fetch) while (1) { int num = 0; +#if defined HAVE_SNMP && defined SNMP_AGENTX + struct timeval snmp_timer_wait; + int snmpblock = 0; + int fdsetsize; +#endif /* Signals pre-empt everything */ quagga_sigevent_process (); @@ -1065,6 +1080,26 @@ thread_fetch (struct thread_master *m, struct thread *fetch) timer_wait = timer_wait_bg; } +#if defined HAVE_SNMP && defined SNMP_AGENTX + /* When SNMP is enabled, we may have to select() on additional + FD. snmp_select_info() will add them to `readfd'. The trick + with this function is its last argument. We need to set it to + 0 if timer_wait is not NULL and we need to use the provided + new timer only if it is still set to 0. */ + if (agentx_enabled) + { + fdsetsize = FD_SETSIZE; + snmpblock = 1; + if (timer_wait) + { + snmpblock = 0; + memcpy(&snmp_timer_wait, timer_wait, sizeof(struct timeval)); + } + snmp_select_info(&fdsetsize, &readfd, &snmp_timer_wait, &snmpblock); + if (snmpblock == 0) + timer_wait = &snmp_timer_wait; + } +#endif num = select (FD_SETSIZE, &readfd, &writefd, &exceptfd, timer_wait); /* Signals should get quick treatment */ @@ -1076,6 +1111,20 @@ thread_fetch (struct thread_master *m, struct thread *fetch) return NULL; } +#if defined HAVE_SNMP && defined SNMP_AGENTX + if (agentx_enabled) + { + if (num > 0) + snmp_read(&readfd); + else if (num == 0) + { + snmp_timeout(); + run_alarms(); + } + netsnmp_check_outstanding_agent_requests(); + } +#endif + /* Check foreground timers. Historically, they have had higher priority than I/O threads, so let's push them onto the ready list in front of the I/O threads. */ |