* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ripng.c,v 1.7 2000-10-07 05:46:21 itojun Exp $";
-#endif
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef INET6
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
-
-#include <errno.h>
+#include <tcpdump-stdinc.h>
#include <stdio.h>
-#include "route6d.h"
#include "interface.h"
#include "addrtoname.h"
+#include "extract.h"
+
+/*
+ * Copyright (C) 1995, 1996, 1997 and 1998 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.
+ */
+#define RIP6_VERSION 1
+
+#define RIP6_REQUEST 1
+#define RIP6_RESPONSE 2
+
+struct netinfo6 {
+ struct in6_addr rip6_dest;
+ u_int16_t rip6_tag;
+ u_int8_t rip6_plen;
+ u_int8_t rip6_metric;
+};
+
+struct rip6 {
+ u_int8_t rip6_cmd;
+ u_int8_t rip6_vers;
+ u_int8_t rip6_res1[2];
+ union {
+ struct netinfo6 ru6_nets[1];
+ char ru6_tracefile[1];
+ } rip6un;
+#define rip6_nets rip6un.ru6_nets
+#define rip6_tracefile rip6un.ru6_tracefile
+};
+
+#define HOPCNT_INFINITY6 16
+
+#define RIP6_PORT 521
+
+#if !defined(IN6_IS_ADDR_UNSPECIFIED) && !defined(_MSC_VER) /* MSVC inline */
+static int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *addr)
+{
+ static const struct in6_addr in6addr_any; /* :: */
+ return (memcmp(addr, &in6addr_any, sizeof(*addr)) == 0);
+}
+#endif
static int
rip6_entry_print(register const struct netinfo6 *ni, int metric)
int l;
l = printf("%s/%d", ip6addr_string(&ni->rip6_dest), ni->rip6_plen);
if (ni->rip6_tag)
- l += printf(" [%d]", ntohs(ni->rip6_tag));
+ l += printf(" [%d]", EXTRACT_16BITS(&ni->rip6_tag));
if (metric)
l += printf(" (%d)", ni->rip6_metric);
return l;
}
void
-ripng_print(const u_char *dat, int length)
+ripng_print(const u_char *dat, unsigned int length)
{
register const struct rip6 *rp = (struct rip6 *)dat;
register const struct netinfo6 *ni;
- register int amt = snapend - dat;
- register int i = min(length, amt) -
- (sizeof(struct rip6) - sizeof(struct netinfo6));
+ register u_int amt;
+ register u_int i;
int j;
int trunc;
- if (i < 0)
+ if (snapend < dat)
+ return;
+ amt = snapend - dat;
+ i = min(length, amt);
+ if (i < (sizeof(struct rip6) - sizeof(struct netinfo6)))
return;
+ i -= (sizeof(struct rip6) - sizeof(struct netinfo6));
switch (rp->rip6_cmd) {
break;
}
if (j * sizeof(*ni) != length - 4)
- printf(" ripng-req %d[%d]:", j, length);
+ printf(" ripng-req %d[%u]:", j, length);
else
printf(" ripng-req %d:", j);
trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
- for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
- if (vflag)
+ for (ni = rp->rip6_nets; i >= sizeof(*ni);
+ i -= sizeof(*ni), ++ni) {
+ if (vflag > 1)
printf("\n\t");
else
printf(" ");
case RIP6_RESPONSE:
j = length / sizeof(*ni);
if (j * sizeof(*ni) != length - 4)
- printf(" ripng-resp %d[%d]:", j, length);
+ printf(" ripng-resp %d[%u]:", j, length);
else
printf(" ripng-resp %d:", j);
trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
- for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
- if (vflag)
+ for (ni = rp->rip6_nets; i >= sizeof(*ni);
+ i -= sizeof(*ni), ++ni) {
+ if (vflag > 1)
printf("\n\t");
else
printf(" ");
rip6_entry_print(ni, ni->rip6_metric);
}
if (trunc)
- printf("[|rip]");
+ printf("[|ripng]");
break;
default:
- printf(" ripng-%d ?? %d", rp->rip6_cmd, length);
+ printf(" ripng-%d ?? %u", rp->rip6_cmd, length);
break;
}
if (rp->rip6_vers != RIP6_VERSION)