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