1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Copyright (c) 1988, 1989, 1990, 1991, 1993, 1994
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *	The Regents of the University of California.  All rights reserved.
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Redistribution and use in source and binary forms, with or without
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * modification, are permitted provided that: (1) source code distributions
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * retain the above copyright notice and this paragraph in its entirety, (2)
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * distributions including binary code include the above copyright notice and
9ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * this paragraph in its entirety in the documentation or other materials
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * provided with the distribution, and (3) all advertising materials mentioning
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * features or use of this software display the following acknowledgement:
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * ``This product includes software developed by the University of California,
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com * the University nor the names of its contributors may be used to endorse
15629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com * or promote products derived from this software without specific prior
16629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com * written permission.
17629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18629ab540667422d3edcb97c51e9628b7051e1ba4robertphillips@google.com * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
22fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#ifndef lint
23fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comstatic const char rcsid[] _U_ =
24fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com    "@(#) $Header: /tcpdump/master/tcpdump/print-frag6.c,v 1.20 2005-04-20 22:33:06 guy Exp $";
25fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#endif
26fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
27fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#ifdef HAVE_CONFIG_H
28fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "config.h"
29fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#endif
30fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
31fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#ifdef INET6
32fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
33fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include <tcpdump-stdinc.h>
34fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
35fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include <stdio.h>
36fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
37fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "ip6.h"
38fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
39fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "interface.h"
40fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "addrtoname.h"
41fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#include "extract.h"
42fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
43fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comint
44fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comfrag6_print(register const u_char *bp, register const u_char *bp2)
45fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com{
46fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	register const struct ip6_frag *dp;
47fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	register const struct ip6_hdr *ip6;
48fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
49fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com	dp = (const struct ip6_frag *)bp;
50fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	ip6 = (const struct ip6_hdr *)bp2;
51fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
52fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	TCHECK(dp->ip6f_offlg);
53fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
548b06f1a7ff6d5a59387a90433064550de20787eereed@google.com	if (vflag) {
558b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		printf("frag (0x%08x:%d|%ld)",
568b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		       EXTRACT_32BITS(&dp->ip6f_ident),
578b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		       EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
588b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		       sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
598b06f1a7ff6d5a59387a90433064550de20787eereed@google.com			       (long)(bp - bp2) - sizeof(struct ip6_frag));
608b06f1a7ff6d5a59387a90433064550de20787eereed@google.com	} else {
618b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		printf("frag (%d|%ld)",
628b06f1a7ff6d5a59387a90433064550de20787eereed@google.com		       EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK,
63fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com		       sizeof(struct ip6_hdr) + EXTRACT_16BITS(&ip6->ip6_plen) -
64fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com			       (long)(bp - bp2) - sizeof(struct ip6_frag));
65fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	}
66fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com
67fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#if 1
68fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	/* it is meaningless to decode non-first fragment */
69fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	if ((EXTRACT_16BITS(&dp->ip6f_offlg) & IP6F_OFF_MASK) != 0)
70fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com		return -1;
71fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	else
72fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#endif
73fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	{
74fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com		fputs(" ", stdout);
75fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com		return sizeof(struct ip6_frag);
76fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	}
77fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.comtrunc:
78fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	fputs("[|frag]", stdout);
79fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com	return -1;
80fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#undef TCHECK
81fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com}
82fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com#endif /* INET6 */
83fd4be26c4202ae91f0f7cf2c03e44b5169d885ebreed@google.com