print-ripng.c revision 56893
156893Sfenner/*
256893Sfenner * Copyright (c) 1989, 1990, 1991, 1993, 1994
356893Sfenner *	The Regents of the University of California.  All rights reserved.
456893Sfenner *
556893Sfenner * Redistribution and use in source and binary forms, with or without
656893Sfenner * modification, are permitted provided that: (1) source code distributions
756893Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
856893Sfenner * distributions including binary code include the above copyright notice and
956893Sfenner * this paragraph in its entirety in the documentation or other materials
1056893Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1156893Sfenner * features or use of this software display the following acknowledgement:
1256893Sfenner * ``This product includes software developed by the University of California,
1356893Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1456893Sfenner * the University nor the names of its contributors may be used to endorse
1556893Sfenner * or promote products derived from this software without specific prior
1656893Sfenner * written permission.
1756893Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1856893Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1956893Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2056893Sfenner */
2156893Sfenner
2256893Sfenner#ifndef lint
2356893Sfennerstatic const char rcsid[] =
2456893Sfenner    "@(#) $Header: /tcpdump/master/tcpdump/print-ripng.c,v 1.2.2.1 2000/01/11 06:58:26 fenner Exp $";
2556893Sfenner#endif
2656893Sfenner
2756893Sfenner#ifdef HAVE_CONFIG_H
2856893Sfenner#include "config.h"
2956893Sfenner#endif
3056893Sfenner
3156893Sfenner#ifdef INET6
3256893Sfenner
3356893Sfenner#include <sys/param.h>
3456893Sfenner#include <sys/time.h>
3556893Sfenner#include <sys/types.h>
3656893Sfenner#include <sys/socket.h>
3756893Sfenner
3856893Sfenner#include <netinet/in.h>
3956893Sfenner#include <netinet/in_systm.h>
4056893Sfenner#include <netinet/ip.h>
4156893Sfenner#include <netinet/ip_var.h>
4256893Sfenner#include <netinet/udp.h>
4356893Sfenner#include <netinet/udp_var.h>
4456893Sfenner
4556893Sfenner#include <errno.h>
4656893Sfenner#include <stdio.h>
4756893Sfenner
4856893Sfenner#include <netinet/ip6.h>
4956893Sfenner
5056893Sfenner#include "route6d.h"
5156893Sfenner#include "interface.h"
5256893Sfenner#include "addrtoname.h"
5356893Sfenner
5456893Sfennerstatic int
5556893Sfennerrip6_entry_print(register const struct netinfo6 *ni, int metric)
5656893Sfenner{
5756893Sfenner	int l;
5856893Sfenner	l = printf("%s/%d", ip6addr_string(&ni->rip6_dest), ni->rip6_plen);
5956893Sfenner	if (ni->rip6_tag)
6056893Sfenner		l += printf(" [%d]", ntohs(ni->rip6_tag));
6156893Sfenner	if (metric)
6256893Sfenner		l += printf(" (%d)", ni->rip6_metric);
6356893Sfenner	return l;
6456893Sfenner}
6556893Sfenner
6656893Sfennervoid
6756893Sfennerripng_print(const u_char *dat, int length)
6856893Sfenner{
6956893Sfenner	register const struct rip6 *rp = (struct rip6 *)dat;
7056893Sfenner	register const struct netinfo6 *ni;
7156893Sfenner	register int amt = snapend - dat;
7256893Sfenner	register int i = min(length, amt) -
7356893Sfenner			 (sizeof(struct rip6) - sizeof(struct netinfo6));
7456893Sfenner	int j;
7556893Sfenner	int trunc;
7656893Sfenner
7756893Sfenner	if (i < 0)
7856893Sfenner		return;
7956893Sfenner
8056893Sfenner	switch (rp->rip6_cmd) {
8156893Sfenner
8256893Sfenner	case RIP6_REQUEST:
8356893Sfenner		j = length / sizeof(*ni);
8456893Sfenner		if (j == 1
8556893Sfenner		    &&  rp->rip6_nets->rip6_metric == HOPCNT_INFINITY6
8656893Sfenner		    &&  IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
8756893Sfenner			printf(" ripng-req dump");
8856893Sfenner			break;
8956893Sfenner		}
9056893Sfenner		if (j * sizeof(*ni) != length - 4)
9156893Sfenner			printf(" ripng-req %d[%d]:", j, length);
9256893Sfenner		else
9356893Sfenner			printf(" ripng-req %d:", j);
9456893Sfenner		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
9556893Sfenner		for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
9656893Sfenner			if (vflag)
9756893Sfenner				printf("\n\t");
9856893Sfenner			else
9956893Sfenner				printf(" ");
10056893Sfenner			rip6_entry_print(ni, 0);
10156893Sfenner		}
10256893Sfenner		break;
10356893Sfenner	case RIP6_RESPONSE:
10456893Sfenner		j = length / sizeof(*ni);
10556893Sfenner		if (j * sizeof(*ni) != length - 4)
10656893Sfenner			printf(" ripng-resp %d[%d]:", j, length);
10756893Sfenner		else
10856893Sfenner			printf(" ripng-resp %d:", j);
10956893Sfenner		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
11056893Sfenner		for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
11156893Sfenner			if (vflag)
11256893Sfenner				printf("\n\t");
11356893Sfenner			else
11456893Sfenner				printf(" ");
11556893Sfenner			rip6_entry_print(ni, ni->rip6_metric);
11656893Sfenner		}
11756893Sfenner		if (trunc)
11856893Sfenner			printf("[|rip]");
11956893Sfenner		break;
12056893Sfenner	default:
12156893Sfenner		printf(" ripng-%d ?? %d", rp->rip6_cmd, length);
12256893Sfenner		break;
12356893Sfenner	}
12456893Sfenner	if (rp->rip6_vers != RIP6_VERSION)
12556893Sfenner		printf(" [vers %d]", rp->rip6_vers);
12656893Sfenner}
12756893Sfenner#endif /* INET6 */
128