diff options
author | ume <ume@FreeBSD.org> | 2001-06-11 12:39:29 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2001-06-11 12:39:29 +0000 |
commit | 832f8d224926758a9ae0b23a6b45353e44fbc87a (patch) | |
tree | a79fc7ad2b97862c4a404f352f0211ad93a7b5f1 /usr.sbin/rtsold/rtsold.c | |
parent | 2693854b01a52b0395a91322aa3edf926bddff38 (diff) | |
download | FreeBSD-src-832f8d224926758a9ae0b23a6b45353e44fbc87a.zip FreeBSD-src-832f8d224926758a9ae0b23a6b45353e44fbc87a.tar.gz |
Sync with recent KAME.
This work was based on kame-20010528-freebsd43-snap.tgz and some
critical problem after the snap was out were fixed.
There are many many changes since last KAME merge.
TODO:
- The definitions of SADB_* in sys/net/pfkeyv2.h are still different
from RFC2407/IANA assignment because of binary compatibility
issue. It should be fixed under 5-CURRENT.
- ip6po_m member of struct ip6_pktopts is no longer used. But, it
is still there because of binary compatibility issue. It should
be removed under 5-CURRENT.
Reviewed by: itojun
Obtained from: KAME
MFC after: 3 weeks
Diffstat (limited to 'usr.sbin/rtsold/rtsold.c')
-rw-r--r-- | usr.sbin/rtsold/rtsold.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/usr.sbin/rtsold/rtsold.c b/usr.sbin/rtsold/rtsold.c index a2e39df..a4bb0e4 100644 --- a/usr.sbin/rtsold/rtsold.c +++ b/usr.sbin/rtsold/rtsold.c @@ -1,4 +1,4 @@ -/* $KAME: rtsold.c,v 1.26 2000/08/13 18:17:15 itojun Exp $ */ +/* $KAME: rtsold.c,v 1.31 2001/05/22 06:03:06 jinmei Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -110,7 +110,7 @@ main(argc, argv) int argc; char *argv[]; { - int s, ch; + int s, rtsock, maxfd, ch; int once = 0; struct timeval *timeout; struct fd_set fdset; @@ -223,6 +223,13 @@ main(argc, argv) errx(1, "failed to open a socket"); /*NOTREACHED*/ } + maxfd = s; + if ((rtsock = rtsock_open()) < 0) { + errx(1, "failed to open a socket"); + /*NOTREACHED*/ + } + if (rtsock > maxfd) + maxfd = rtsock; /* configuration per interface */ if (ifinit()) { @@ -263,6 +270,7 @@ main(argc, argv) FD_ZERO(&fdset); FD_SET(s, &fdset); + FD_SET(rtsock, &fdset); while (1) { /* main loop */ int e; struct fd_set select_fd = fdset; @@ -289,8 +297,8 @@ main(argc, argv) if (ifi == NULL) break; } - - if ((e = select(s + 1, &select_fd, NULL, NULL, timeout)) < 1) { + e = select(maxfd + 1, &select_fd, NULL, NULL, timeout); + if (e < 1) { if (e < 0 && errno != EINTR) { warnmsg(LOG_ERR, __FUNCTION__, "select: %s", strerror(errno)); @@ -299,7 +307,9 @@ main(argc, argv) } /* packet reception */ - if (FD_ISSET(s, &fdset)) + if (FD_ISSET(rtsock, &select_fd)) + rtsock_input(rtsock); + if (FD_ISSET(s, &select_fd)) rtsol_input(s); } /* NOTREACHED */ @@ -597,7 +607,18 @@ rtsol_timer_update(struct ifinfo *ifinfo) ifinfo->timer.tv_usec = interval % MILLION; break; case IFS_PROBE: - ifinfo->timer.tv_sec = RTR_SOLICITATION_INTERVAL; + if (ifinfo->probes < MAX_RTR_SOLICITATIONS) + ifinfo->timer.tv_sec = RTR_SOLICITATION_INTERVAL; + else { + /* + * After sending MAX_RTR_SOLICITATIONS solicitations, + * we're just waiting for possible replies; there + * will be no more solicatation. Thus, we change + * the timer value to MAX_RTR_SOLICITATION_DELAY based + * on RFC 2461, Section 6.3.7. + */ + ifinfo->timer.tv_sec = MAX_RTR_SOLICITATION_DELAY; + } break; default: warnmsg(LOG_ERR, __FUNCTION__, |