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