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