Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.sbin/rtsold sync with kame.
details: https://anonhg.NetBSD.org/src/rev/dec71caa8b22
branches: trunk
changeset: 512301:dec71caa8b22
user: itojun <itojun%NetBSD.org@localhost>
date: Mon Jul 09 06:04:28 2001 +0000
description:
sync with kame.
KAME rtsold.c 1.28
watch routing socket, and check for pcmcia card removal.
if pcmcia card gets removed, bring the interface state into IFS_DOWN.
KAME rtsold.c 1.29
changed the timeout period after sending MAX_RTR_SOLICITATIONS solicitation
from RTR_SOLICITATION_INTERVAL to MAX_RTR_SOLICITATION_DELAY according to
the last paragraph of RFC 2461 Section 6.3.7.
in response to a comment from Pekka Savola <pekkas%netcore.fi@localhost>
diffstat:
usr.sbin/rtsold/Makefile | 4 +-
usr.sbin/rtsold/if.c | 11 ++-
usr.sbin/rtsold/rtsock.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++
usr.sbin/rtsold/rtsold.c | 35 +++++++-
usr.sbin/rtsold/rtsold.h | 8 +-
5 files changed, 224 insertions(+), 13 deletions(-)
diffs (truncated from 338 to 300 lines):
diff -r 82ec6d558aca -r dec71caa8b22 usr.sbin/rtsold/Makefile
--- a/usr.sbin/rtsold/Makefile Mon Jul 09 05:19:05 2001 +0000
+++ b/usr.sbin/rtsold/Makefile Mon Jul 09 06:04:28 2001 +0000
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.5 2000/02/25 09:19:07 itojun Exp $
+# $NetBSD: Makefile,v 1.6 2001/07/09 06:04:28 itojun Exp $
PROG= rtsold
-SRCS= rtsold.c rtsol.c if.c probe.c dump.c
+SRCS= rtsold.c rtsol.c if.c probe.c dump.c rtsock.c
CPPFLAGS+=-DINET6 -DHAVE_GETIFADDRS
diff -r 82ec6d558aca -r dec71caa8b22 usr.sbin/rtsold/if.c
--- a/usr.sbin/rtsold/if.c Mon Jul 09 05:19:05 2001 +0000
+++ b/usr.sbin/rtsold/if.c Mon Jul 09 06:04:28 2001 +0000
@@ -1,5 +1,5 @@
-/* $NetBSD: if.c,v 1.6 2000/08/13 06:20:02 itojun Exp $ */
-/* $KAME: if.c,v 1.13 2000/08/13 06:14:59 itojun Exp $ */
+/* $NetBSD: if.c,v 1.7 2001/07/09 06:04:28 itojun Exp $ */
+/* $KAME: if.c,v 1.15 2001/05/22 06:04:17 jinmei Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -217,6 +217,9 @@
{
switch(sdl->sdl_type) {
case IFT_ETHER:
+#ifdef IFT_IEEE80211
+ case IFT_IEEE80211:
+#endif
return(ROUNDUP8(ETHER_ADDR_LEN + 2));
default:
return(0);
@@ -232,6 +235,9 @@
switch(sdl->sdl_type) {
case IFT_ETHER:
+#ifdef IFT_IEEE80211
+ case IFT_IEEE80211:
+#endif
ndopt->nd_opt_len = (ROUNDUP8(ETHER_ADDR_LEN + 2)) >> 3;
addr = (char *)(ndopt + 1);
memcpy(addr, LLADDR(sdl), ETHER_ADDR_LEN);
@@ -294,6 +300,7 @@
return(NULL);
memcpy((caddr_t)ret_sdl, (caddr_t)sdl, sdl->sdl_len);
+ free(buf);
return(ret_sdl);
}
diff -r 82ec6d558aca -r dec71caa8b22 usr.sbin/rtsold/rtsock.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/rtsold/rtsock.c Mon Jul 09 06:04:28 2001 +0000
@@ -0,0 +1,179 @@
+/* $NetBSD: rtsock.c,v 1.1 2001/07/09 06:04:28 itojun Exp $ */
+/* $KAME: rtsock.c,v 1.3 2000/10/10 08:46:45 itojun Exp $ */
+
+/*
+ * Copyright (C) 2000 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <sys/time.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <net/route.h>
+#include <net/if_dl.h>
+
+#include <netinet/in.h>
+#include <netinet/ip6.h>
+#include <netinet/icmp6.h>
+
+#include <time.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <err.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include "rtsold.h"
+
+#define ROUNDUP(a, size) \
+ (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))
+
+#define NEXT_SA(ap) (ap) = (struct sockaddr *) \
+ ((caddr_t)(ap) + \
+ ((ap)->sa_len ? ROUNDUP((ap)->sa_len, sizeof(u_long)) \
+ : sizeof(u_long)))
+
+#ifdef RTM_IFANNOUNCE /*NetBSD 1.5 or later*/
+static int rtsock_input_ifannounce __P((int, struct rt_msghdr *, char *));
+#endif
+
+static struct {
+ u_char type;
+ size_t minlen;
+ int (*func) __P((int, struct rt_msghdr *, char *));
+} rtsock_dispatch[] = {
+#ifdef RTM_IFANNOUNCE /*NetBSD 1.5 or later*/
+ { RTM_IFANNOUNCE, sizeof(struct if_announcemsghdr),
+ rtsock_input_ifannounce },
+#endif
+ { 0, NULL },
+};
+
+int
+rtsock_open()
+{
+
+ return socket(PF_ROUTE, SOCK_RAW, 0);
+}
+
+int
+rtsock_input(s)
+ int s;
+{
+ ssize_t n;
+ char msg[2048];
+ char *lim, *next;
+ struct rt_msghdr *rtm;
+ int idx;
+ size_t len;
+ int ret = 0;
+ const size_t lenlim =
+ offsetof(struct rt_msghdr, rtm_msglen) + sizeof(rtm->rtm_msglen);
+
+ n = read(s, msg, sizeof(msg));
+
+ lim = msg + n;
+ for (next = msg; next < lim; next += len) {
+ rtm = (struct rt_msghdr *)next;
+ if (lim - next < lenlim)
+ break;
+ len = rtm->rtm_msglen;
+ if (len < lenlim)
+ break;
+
+ if (dflag > 1) {
+ warnmsg(LOG_INFO, __FUNCTION__,
+ "rtmsg type %d, len=%lu", rtm->rtm_type,
+ (u_long)len);
+ }
+
+ for (idx = 0; rtsock_dispatch[idx].func; idx++) {
+ if (rtm->rtm_type != rtsock_dispatch[idx].type)
+ continue;
+ if (rtm->rtm_msglen < rtsock_dispatch[idx].minlen) {
+ warnmsg(LOG_INFO, __FUNCTION__,
+ "rtmsg type %d too short!", rtm->rtm_type);
+ continue;
+ }
+
+ ret = (*rtsock_dispatch[idx].func)(s, rtm, lim);
+ break;
+ }
+ }
+
+ return ret;
+}
+
+#ifdef RTM_IFANNOUNCE /*NetBSD 1.5 or later*/
+static int
+rtsock_input_ifannounce(s, rtm, lim)
+ int s;
+ struct rt_msghdr *rtm;
+ char *lim;
+{
+ struct if_announcemsghdr *ifan;
+ struct ifinfo *ifinfo;
+
+ ifan = (struct if_announcemsghdr *)rtm;
+ if ((char *)(ifan + 1) > lim)
+ return -1;
+
+ switch (ifan->ifan_what) {
+ case IFAN_ARRIVAL:
+ /*
+ * XXX for NetBSD 1.5, interface index will monotonically be
+ * increased as new pcmcia card gets inserted.
+ * we may be able to do a name-based interface match,
+ * and call ifreconfig() to enable the interface again.
+ */
+ warnmsg(LOG_INFO, __FUNCTION__,
+ "interface %s inserted", ifan->ifan_name);
+ break;
+ case IFAN_DEPARTURE:
+ warnmsg(LOG_WARNING, __FUNCTION__,
+ "interface %s removed", ifan->ifan_name);
+ ifinfo = find_ifinfo(ifan->ifan_index);
+ if (ifinfo) {
+ if (dflag > 1) {
+ warnmsg(LOG_INFO, __FUNCTION__,
+ "bring interface %s to DOWN state",
+ ifan->ifan_name);
+ }
+ ifinfo->state = IFS_DOWN;
+ }
+ break;
+ }
+
+ return 0;
+}
+#endif
diff -r 82ec6d558aca -r dec71caa8b22 usr.sbin/rtsold/rtsold.c
--- a/usr.sbin/rtsold/rtsold.c Mon Jul 09 05:19:05 2001 +0000
+++ b/usr.sbin/rtsold/rtsold.c Mon Jul 09 06:04:28 2001 +0000
@@ -1,5 +1,5 @@
-/* $NetBSD: rtsold.c,v 1.9 2000/10/06 00:13:02 itojun Exp $ */
-/* $KAME: rtsold.c,v 1.27 2000/10/05 22:20:39 itojun Exp $ */
+/* $NetBSD: rtsold.c,v 1.10 2001/07/09 06:04:29 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.
@@ -109,7 +109,7 @@
int argc;
char *argv[];
{
- int s, ch;
+ int s, rtsock, maxfd, ch;
int once = 0;
struct timeval *timeout;
struct fd_set fdset;
@@ -222,6 +222,13 @@
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()) {
@@ -262,6 +269,7 @@
FD_ZERO(&fdset);
FD_SET(s, &fdset);
+ FD_SET(rtsock, &fdset);
while (1) { /* main loop */
int e;
struct fd_set select_fd = fdset;
@@ -288,8 +296,8 @@
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));
@@ -298,7 +306,9 @@
}
/* 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 */
@@ -596,7 +606,18 @@
Home |
Main Index |
Thread Index |
Old Index