12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 2002 WIDE Project.
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 the following conditions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the project nor the names of its contributors
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    may be used to endorse or promote products derived from this software
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    without specific prior written permission.
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE.
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project     "@(#) $Header: /tcpdump/master/tcpdump/print-mobility.c,v 1.11.2.1 2005/04/20 22:21:16 guy Exp $";
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"		/* must come after interface.h */
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Mobility header */
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct ip6_mobility {
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t ip6m_pproto;	/* following payload protocol (for PG) */
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t ip6m_len;	/* length in units of 8 octets */
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t ip6m_type;	/* message type */
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t reserved;	/* reserved */
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t ip6m_cksum;	/* sum of IPv6 pseudo-header and MH */
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	union {
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int16_t	ip6m_un_data16[1]; /* type-specific field */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int8_t	ip6m_un_data8[2];  /* type-specific fiedl */
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} ip6m_dataun;
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ip6m_data16	ip6m_dataun.ip6m_un_data16
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ip6m_data8	ip6m_dataun.ip6m_un_data8
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_MINLEN	8
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* message type */
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_BINDING_REQUEST	0	/* Binding Refresh Request */
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_HOME_TEST_INIT	1	/* Home Test Init */
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_CAREOF_TEST_INIT	2	/* Care-of Test Init */
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_HOME_TEST		3	/* Home Test */
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_CAREOF_TEST	4	/* Care-of Test */
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_BINDING_UPDATE	5	/* Binding Update */
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_BINDING_ACK	6	/* Binding Acknowledgement */
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6M_BINDING_ERROR	7	/* Binding Error */
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Mobility Header Options */
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_MINLEN		2
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_PAD1          0x0	/* Pad1 */
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_PADN          0x1	/* PadN */
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_REFRESH	      0x2	/* Binding Refresh Advice */
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_REFRESH_MINLEN  4
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_ALTCOA        0x3	/* Alternate Care-of Address */
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_ALTCOA_MINLEN  18
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_NONCEID       0x4	/* Nonce Indices */
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_NONCEID_MINLEN  6
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_AUTH          0x5	/* Binding Authorization Data */
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6MOPT_AUTH_MINLEN    12
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmobility_opt_print(const u_char *bp, int len)
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int optlen;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < len; i += optlen) {
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[i] == IP6MOPT_PAD1)
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			optlen = 1;
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else {
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (i + 1 < len)
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				optlen = bp[i + 1] + 2;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (i + optlen > len)
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (bp[i]) {
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_PAD1:
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(pad1)");
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_PADN:
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_MINLEN) {
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(padn: trunc)");
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(padn)");
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_REFRESH:
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_REFRESH_MINLEN) {
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(refresh: trunc)");
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* units of 4 secs */
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(refresh: %d)",
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_16BITS(&bp[i+2]) << 2);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_ALTCOA:
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_ALTCOA_MINLEN) {
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(altcoa: trunc)");
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(alt-CoA: %s)", ip6addr_string(&bp[i+2]));
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_NONCEID:
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_NONCEID_MINLEN) {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(ni: trunc)");
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(ni: ho=0x%04x co=0x%04x)",
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_16BITS(&bp[i+2]),
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_16BITS(&bp[i+4]));
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IP6MOPT_AUTH:
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_AUTH_MINLEN) {
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(auth: trunc)");
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(auth)");
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len - i < IP6MOPT_MINLEN) {
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(sopt_type %d: trunc)", bp[i]);
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("(type-0x%02x: len=%d)", bp[i], bp[i + 1]);
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("[trunc] ");
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Mobility Header
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmobility_print(const u_char *bp, const u_char *bp2 _U_)
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct ip6_mobility *mh;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep;
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int mhlen, hlen, type;
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	mh = (struct ip6_mobility *)bp;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* 'ep' points to the end of available data. */
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = snapend;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!TTEST(mh->ip6m_len)) {
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * There's not enough captured data to include the
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * mobility header length.
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Our caller expects us to return the length, however,
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * so return a value that will run to the end of the
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * captured data.
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - "ip6_print()" doesn't do anything with the
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * returned length, however, as it breaks out of the
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * header-processing loop.
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		mhlen = ep - bp;
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	mhlen = (int)((mh->ip6m_len + 1) << 3);
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* XXX ip6m_cksum */
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(mh->ip6m_type);
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	type = mh->ip6m_type;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (type) {
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_BINDING_REQUEST:
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: BRR");
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_HOME_TEST_INIT:
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_CAREOF_TEST_INIT:
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: %soTI",
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			type == IP6M_HOME_TEST_INIT ? "H" : "C");
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    		if (vflag) {
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*mh, hlen + 8);
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s Init Cookie=%08x:%08x",
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       type == IP6M_HOME_TEST_INIT ? "Home" : "Care-of",
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen]),
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen + 4]));
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 8;
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_HOME_TEST:
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_CAREOF_TEST:
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: %soT",
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			type == IP6M_HOME_TEST ? "H" : "C");
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(mh->ip6m_data16[0]);
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" nonce id=0x%x", EXTRACT_16BITS(&mh->ip6m_data16[0]));
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    		if (vflag) {
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*mh, hlen + 8);
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s Init Cookie=%08x:%08x",
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       type == IP6M_HOME_TEST ? "Home" : "Care-of",
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen]),
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen + 4]));
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 8;
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    		if (vflag) {
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*mh, hlen + 8);
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s Keygen Token=%08x:%08x",
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       type == IP6M_HOME_TEST ? "Home" : "Care-of",
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen]),
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&bp[hlen + 4]));
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 8;
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_BINDING_UPDATE:
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: BU");
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(mh->ip6m_data16[0]);
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" seq#=%d", EXTRACT_16BITS(&mh->ip6m_data16[0]));
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*mh, hlen + 1);
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[hlen] & 0xf0)
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ");
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[hlen] & 0x80)
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("A");
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[hlen] & 0x40)
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("H");
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[hlen] & 0x20)
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("L");
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp[hlen] & 0x10)
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("K");
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Reserved (4bits) */
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 1;
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Reserved (8bits) */
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 1;
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*mh, hlen + 2);
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* units of 4 secs */
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" lifetime=%d", EXTRACT_16BITS(&bp[hlen]) << 2);
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 2;
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_BINDING_ACK:
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: BA");
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(mh->ip6m_data8[0]);
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" status=%d", mh->ip6m_data8[0]);
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (mh->ip6m_data8[1] & 0x80)
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" K");
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Reserved (7bits) */
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*mh, hlen + 2);
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" seq#=%d", EXTRACT_16BITS(&bp[hlen]));
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 2;
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*mh, hlen + 2);
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* units of 4 secs */
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" lifetime=%d", EXTRACT_16BITS(&bp[hlen]) << 2);
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 2;
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case IP6M_BINDING_ERROR:
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: BE");
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(mh->ip6m_data8[0]);
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" status=%d", mh->ip6m_data8[0]);
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Reserved */
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP6M_MINLEN;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*mh, hlen + 16);
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" homeaddr %s", ip6addr_string(&bp[hlen]));
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += 16;
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mobility: type-#%d len=%d", type, mh->ip6m_len);
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(mhlen);
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    	if (vflag)
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		mobility_opt_print(&bp[hlen], mhlen - hlen);
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(mhlen);
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc:
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fputs("[|MOBILITY]", stdout);
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(mhlen);
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */
313