? .msg ? ChangeLog ? alpine-config ? commiters.txt ? fd-priorities-2.patch ? fd-priorities.patch ? ipsec-tools-0.8-alpha20090820.tar.bz2 ? ipsec-tools-0.8-alpha20090903.tar.bz2 ? local-changes.diff ? patch-to-support-cast128-cbc-algorithm.patch ? racoon.txt ? rpm/Makefile ? rpm/Makefile.in ? rpm/ipsec-tools.spec ? rpm/suse/Makefile ? rpm/suse/Makefile.in ? rpm/suse/ipsec-tools.spec ? src/Makefile ? src/Makefile.in ? src/include-glibc/.includes ? src/include-glibc/Makefile ? src/include-glibc/Makefile.in ? src/libipsec/.deps ? src/libipsec/.libs ? src/libipsec/Makefile ? src/libipsec/Makefile.in ? src/libipsec/ipsec_dump_policy.lo ? src/libipsec/ipsec_get_policylen.lo ? src/libipsec/ipsec_strerror.lo ? src/libipsec/key_debug.lo ? src/libipsec/libipsec.la ? src/libipsec/pfkey.lo ? src/libipsec/pfkey_dump.lo ? src/libipsec/policy_parse.c ? src/libipsec/policy_parse.h ? src/libipsec/policy_parse.lo ? src/libipsec/policy_token.c ? src/libipsec/policy_token.lo ? src/racoon/.deps ? src/racoon/.libs ? src/racoon/Makefile ? src/racoon/Makefile.in ? src/racoon/cfparse.c ? src/racoon/cfparse.h ? src/racoon/cftoken.c ? src/racoon/eaytest ? src/racoon/libracoon.la ? src/racoon/libracoon_la-kmpstat.lo ? src/racoon/libracoon_la-misc.lo ? src/racoon/libracoon_la-sockmisc.lo ? src/racoon/libracoon_la-vmbuf.lo ? src/racoon/plainrsa-gen ? src/racoon/prsa_par.c ? src/racoon/prsa_par.h ? src/racoon/prsa_tok.c ? src/racoon/racoon ? src/racoon/racoonctl ? src/racoon/samples/psk.txt ? src/racoon/samples/racoon.conf ? src/setkey/.deps ? src/setkey/.libs ? src/setkey/Makefile ? src/setkey/Makefile.in ? src/setkey/parse.c ? src/setkey/parse.h ? src/setkey/setkey ? src/setkey/token.c Index: src/racoon/admin.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/admin.c,v retrieving revision 1.32 diff -u -r1.32 admin.c --- a/src/racoon/admin.c 3 Sep 2009 09:29:07 -0000 1.32 +++ b/src/racoon/admin.c 9 Mar 2010 07:50:46 -0000 @@ -734,7 +734,7 @@ return -1; } - monitor_fd(lcconf->sock_admin, admin_handler, NULL); + monitor_fd(lcconf->sock_admin, admin_handler, NULL, 0); plog(LLV_DEBUG, LOCATION, NULL, "open %s as racoon management.\n", sunaddr.sun_path); Index: src/racoon/evt.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/evt.c,v retrieving revision 1.9 diff -u -r1.9 evt.c --- a/src/racoon/evt.c 23 Jan 2009 08:05:58 -0000 1.9 +++ b/src/racoon/evt.c 9 Mar 2010 07:50:46 -0000 @@ -373,7 +373,7 @@ LIST_INSERT_HEAD(list, l, ll_chain); l->fd = fd; - monitor_fd(l->fd, evt_unsubscribe_cb, l); + monitor_fd(l->fd, evt_unsubscribe_cb, l, 0); plog(LLV_DEBUG, LOCATION, NULL, "[%d] admin connection is polling events\n", fd); Index: src/racoon/grabmyaddr.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/grabmyaddr.c,v retrieving revision 1.23 diff -u -r1.23 grabmyaddr.c --- a/src/racoon/grabmyaddr.c 3 Jul 2009 06:41:46 -0000 1.23 +++ b/src/racoon/grabmyaddr.c 9 Mar 2010 07:50:46 -0000 @@ -296,7 +296,7 @@ lcconf->rtsock = kernel_open_socket(); if (lcconf->rtsock < 0) return -1; - monitor_fd(lcconf->rtsock, kernel_receive, NULL); + monitor_fd(lcconf->rtsock, kernel_receive, NULL, 0); } else { lcconf->rtsock = -1; if (!myaddr_open_all_configured(NULL)) Index: src/racoon/isakmp.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/isakmp.c,v retrieving revision 1.60 diff -u -r1.60 isakmp.c --- a/src/racoon/isakmp.c 3 Sep 2009 09:29:07 -0000 1.60 +++ b/src/racoon/isakmp.c 9 Mar 2010 07:50:48 -0000 @@ -1720,7 +1720,7 @@ "%s used as isakmp port (fd=%d)\n", saddr2str(addr), fd); - monitor_fd(fd, isakmp_handler, NULL); + monitor_fd(fd, isakmp_handler, NULL, 1); return fd; err: Index: src/racoon/pfkey.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/pfkey.c,v retrieving revision 1.52 diff -u -r1.52 pfkey.c --- a/src/racoon/pfkey.c 9 Feb 2010 23:05:16 -0000 1.52 +++ b/src/racoon/pfkey.c 9 Mar 2010 07:50:49 -0000 @@ -487,7 +487,7 @@ return -1; } #endif - monitor_fd(lcconf->sock_pfkey, pfkey_handler, NULL); + monitor_fd(lcconf->sock_pfkey, pfkey_handler, NULL, 0); return 0; } Index: src/racoon/session.c =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/session.c,v retrieving revision 1.27 diff -u -r1.27 session.c --- a/src/racoon/session.c 4 Mar 2010 15:13:53 -0000 1.27 +++ b/src/racoon/session.c 9 Mar 2010 07:50:50 -0000 @@ -103,8 +103,13 @@ struct fd_monitor { int (*callback)(void *ctx, int fd); void *ctx; + int prio; + int fd; + TAILQ_ENTRY(fd_monitor) chain; }; +#define NUM_PRIORITIES 2 + static void close_session __P((void)); static void initfds __P((void)); static void init_signal __P((void)); @@ -115,13 +120,14 @@ static fd_set preset_mask, active_mask; static struct fd_monitor fd_monitors[FD_SETSIZE]; +static TAILQ_HEAD(fd_monitor_list, fd_monitor) fd_monitor_tree[NUM_PRIORITIES]; static int nfds = 0; static volatile sig_atomic_t sigreq[NSIG + 1]; static struct sched scflushsa = SCHED_INITIALIZER(); void -monitor_fd(int fd, int (*callback)(void *, int), void *ctx) +monitor_fd(int fd, int (*callback)(void *, int), void *ctx, int priority) { if (fd < 0 || fd >= FD_SETSIZE) { plog(LLV_ERROR, LOCATION, NULL, "fd_set overrun"); @@ -131,9 +137,17 @@ FD_SET(fd, &preset_mask); if (fd > nfds) nfds = fd; + if (priority <= 0) + priority = 0; + if (priority >= NUM_PRIORITIES) + priority = NUM_PRIORITIES - 1; fd_monitors[fd].callback = callback; fd_monitors[fd].ctx = ctx; + fd_monitors[fd].prio = priority; + fd_monitors[fd].fd = fd; + TAILQ_INSERT_TAIL(&fd_monitor_tree[priority], + &fd_monitors[fd], chain); } void @@ -144,10 +158,15 @@ exit(1); } + if (fd_monitors[fd].callback == NULL) + return; + FD_CLR(fd, &preset_mask); FD_CLR(fd, &active_mask); fd_monitors[fd].callback = NULL; fd_monitors[fd].ctx = NULL; + TAILQ_REMOVE(&fd_monitor_tree[fd_monitors[fd].prio], + &fd_monitors[fd], chain); } int @@ -158,11 +177,15 @@ char pid_file[MAXPATHLEN]; FILE *fp; pid_t racoon_pid = 0; - int i; + int i, count; + struct fd_monitor *fdm; nfds = 0; FD_ZERO(&preset_mask); + for (i = 0; i < NUM_PRIORITIES; i++) + TAILQ_INIT(&fd_monitor_tree[i]); + /* initialize schedular */ sched_init(); init_signal(); @@ -291,16 +314,24 @@ /*NOTREACHED*/ } - for (i = 0; i <= nfds; i++) { - if (!FD_ISSET(i, &active_mask)) - continue; - - if (fd_monitors[i].callback != NULL) - fd_monitors[i].callback(fd_monitors[i].ctx, i); - else - plog(LLV_ERROR, LOCATION, NULL, - "fd %d set, but no active callback\n", i); + count = 0; + for (i = 0; i < NUM_PRIORITIES; i++) { + TAILQ_FOREACH(fdm, &fd_monitor_tree[i], chain) { + if (!FD_ISSET(fdm->fd, &active_mask)) + continue; + + FD_CLR(fdm->fd, &active_mask); + if (fdm->callback != NULL) { + fdm->callback(fdm->ctx, fdm->fd); + count++; + } else + plog(LLV_ERROR, LOCATION, NULL, + "fd %d set, but no active callback\n", i); + } + if (count != 0) + break; } + } } Index: src/racoon/session.h =================================================================== RCS file: /cvsroot/src/crypto/dist/ipsec-tools/src/racoon/session.h,v retrieving revision 1.8 diff -u -r1.8 session.h --- a/src/racoon/session.h 23 Jan 2009 08:05:58 -0000 1.8 +++ b/src/racoon/session.h 9 Mar 2010 07:50:50 -0000 @@ -37,7 +37,7 @@ extern int session __P((void)); extern RETSIGTYPE signal_handler __P((int)); -extern void monitor_fd __P((int fd, int (*callback)(void *, int), void *ctx)); +extern void monitor_fd __P((int fd, int (*callback)(void *, int), void *ctx, int priority)); extern void unmonitor_fd __P((int fd)); #endif /* _SESSION_H */