Home | History | Annotate | Download | only in tcpdump
      1 /*
      2  * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
      3  *	The Regents of the University of California.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that: (1) source code distributions
      7  * retain the above copyright notice and this paragraph in its entirety, (2)
      8  * distributions including binary code include the above copyright notice and
      9  * this paragraph in its entirety in the documentation or other materials
     10  * provided with the distribution, and (3) all advertising materials mentioning
     11  * features or use of this software display the following acknowledgement:
     12  * ``This product includes software developed by the University of California,
     13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
     14  * the University nor the names of its contributors may be used to endorse
     15  * or promote products derived from this software without specific prior
     16  * written permission.
     17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     20  */
     21 
     22 #ifndef lint
     23 static const char rcsid[] _U_ =
     24     "@(#) $Header: /tcpdump/master/tcpdump/print-rt6.c,v 1.26.2.1 2005/04/20 22:35:11 guy Exp $";
     25 #endif
     26 
     27 #ifdef HAVE_CONFIG_H
     28 #include "config.h"
     29 #endif
     30 
     31 #ifdef INET6
     32 
     33 #include <tcpdump-stdinc.h>
     34 
     35 #include <stdio.h>
     36 
     37 #include "ip6.h"
     38 
     39 #include "interface.h"
     40 #include "addrtoname.h"
     41 #include "extract.h"
     42 
     43 int
     44 rt6_print(register const u_char *bp, const u_char *bp2 _U_)
     45 {
     46 	register const struct ip6_rthdr *dp;
     47 	register const struct ip6_rthdr0 *dp0;
     48 	register const u_char *ep;
     49 	int i, len;
     50 	register const struct in6_addr *addr;
     51 
     52 	dp = (struct ip6_rthdr *)bp;
     53 	len = dp->ip6r_len;
     54 
     55 	/* 'ep' points to the end of available data. */
     56 	ep = snapend;
     57 
     58 	TCHECK(dp->ip6r_segleft);
     59 
     60 	printf("srcrt (len=%d", dp->ip6r_len);	/*)*/
     61 	printf(", type=%d", dp->ip6r_type);
     62 	printf(", segleft=%d", dp->ip6r_segleft);
     63 
     64 	switch (dp->ip6r_type) {
     65 #ifndef IPV6_RTHDR_TYPE_0
     66 #define IPV6_RTHDR_TYPE_0 0
     67 #endif
     68 #ifndef IPV6_RTHDR_TYPE_2
     69 #define IPV6_RTHDR_TYPE_2 2
     70 #endif
     71 	case IPV6_RTHDR_TYPE_0:
     72 	case IPV6_RTHDR_TYPE_2:			/* Mobile IPv6 ID-20 */
     73 		dp0 = (struct ip6_rthdr0 *)dp;
     74 
     75 		TCHECK(dp0->ip6r0_reserved);
     76 		if (dp0->ip6r0_reserved || vflag) {
     77 			printf(", rsv=0x%0x",
     78 			    EXTRACT_32BITS(&dp0->ip6r0_reserved));
     79 		}
     80 
     81 		if (len % 2 == 1)
     82 			goto trunc;
     83 		len >>= 1;
     84 		addr = &dp0->ip6r0_addr[0];
     85 		for (i = 0; i < len; i++) {
     86 			if ((u_char *)(addr + 1) > ep)
     87 				goto trunc;
     88 
     89 			printf(", [%d]%s", i, ip6addr_string(addr));
     90 			addr++;
     91 		}
     92 		/*(*/
     93 		printf(") ");
     94 		return((dp0->ip6r0_len + 1) << 3);
     95 		break;
     96 	default:
     97 		goto trunc;
     98 		break;
     99 	}
    100 
    101  trunc:
    102 	fputs("[|srcrt]", stdout);
    103 	return -1;
    104 }
    105 #endif /* INET6 */
    106