12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-frag6.c,v 1.19.2.1 2005/04/20 22:33:21 guy Exp $";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectfrag6_print(register const u_char *bp, register const u_char *bp2)
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ip6_frag *dp;
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ip6_hdr *ip6;
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = (const struct ip6_frag *)bp;
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip6 = (const struct ip6_hdr *)bp2;
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp->ip6f_offlg);
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("frag (0x%08x:%d|%ld)",
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&dp->ip6f_ident),
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       (long)(bp - bp2) - sizeof(struct ip6_frag));
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("frag (%d|%ld)",
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       (long)(bp - bp2) - sizeof(struct ip6_frag));
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 1
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* it is meaningless to decode non-first fragment */
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK) != 0)
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return -1;
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(" ", stdout);
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return sizeof(struct ip6_frag);
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs("[|frag]", stdout);
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef TCHECK
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */
83