12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 1998 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-ip6opts.c,v 1.17.2.1 2005/04/20 22:19:06 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" 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* items outside of rfc2292bis */ 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef IP6OPT_MINLEN 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_MINLEN 2 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef IP6OPT_RTALERT_LEN 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_RTALERT_LEN 4 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef IP6OPT_JUMBO_LEN 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_JUMBO_LEN 6 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_HOMEADDR_MINLEN 18 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_BU_MINLEN 10 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_BA_MINLEN 13 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6OPT_BR_MINLEN 2 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_UI 0x2 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_UI_MINLEN 4 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_ALTCOA 0x3 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_ALTCOA_MINLEN 18 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_AUTH 0x4 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IP6SOPT_AUTH_MINLEN 6 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ip6_sopt_print(const u_char *, int); 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectip6_sopt_print(const u_char *bp, int len) 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int optlen; 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < len; i += optlen) { 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i] == IP6OPT_PAD1) 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project optlen = 1; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i + 1 < len) 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project optlen = bp[i + 1] + 2; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i + optlen > len) 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bp[i]) { 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_PAD1: 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", pad1"); 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_PADN: 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_MINLEN) { 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", padn: trunc"); 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", padn"); 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6SOPT_UI: 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6SOPT_UI_MINLEN) { 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", ui: trunc"); 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", ui: 0x%04x ", EXTRACT_16BITS(&bp[i + 2])); 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6SOPT_ALTCOA: 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6SOPT_ALTCOA_MINLEN) { 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", altcoa: trunc"); 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", alt-CoA: %s", ip6addr_string(&bp[i+2])); 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6SOPT_AUTH: 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6SOPT_AUTH_MINLEN) { 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", auth: trunc"); 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", auth spi: 0x%08x", EXTRACT_32BITS(&bp[i + 2])); 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_MINLEN) { 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", sopt_type %d: trunc)", bp[i]); 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", sopt_type 0x%02x: len=%d", bp[i], bp[i + 1]); 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[trunc] "); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectip6_opt_print(const u_char *bp, int len) 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int optlen = 0; 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < len; i += optlen) { 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i] == IP6OPT_PAD1) 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project optlen = 1; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i + 1 < len) 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project optlen = bp[i + 1] + 2; 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i + optlen > len) 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bp[i]) { 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_PAD1: 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(pad1)"); 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_PADN: 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_MINLEN) { 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(padn: trunc)"); 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(padn)"); 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_ROUTER_ALERT: 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_RTALERT_LEN) { 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(rtalert: trunc)"); 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] != IP6OPT_RTALERT_LEN - 2) { 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(rtalert: invalid len %d)", bp[i + 1]); 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(rtalert: 0x%04x) ", EXTRACT_16BITS(&bp[i + 2])); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_JUMBO: 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_JUMBO_LEN) { 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(jumbo: trunc)"); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] != IP6OPT_JUMBO_LEN - 2) { 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(jumbo: invalid len %d)", bp[i + 1]); 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(jumbo: %u) ", EXTRACT_32BITS(&bp[i + 2])); 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_HOME_ADDRESS: 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_HOMEADDR_MINLEN) { 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(homeaddr: trunc)"); 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] < IP6OPT_HOMEADDR_MINLEN - 2) { 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(homeaddr: invalid len %d)", bp[i + 1]); 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(homeaddr: %s", ip6addr_string(&bp[i + 2])); 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] > IP6OPT_HOMEADDR_MINLEN - 2) { 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_sopt_print(&bp[i + IP6OPT_HOMEADDR_MINLEN], 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (optlen - IP6OPT_HOMEADDR_MINLEN)); 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_BINDING_UPDATE: 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_BU_MINLEN) { 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(bu: trunc)"); 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] < IP6OPT_BU_MINLEN - 2) { 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(bu: invalid len %d)", bp[i + 1]); 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(bu: "); 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 2] & 0x80) 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("A"); 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 2] & 0x40) 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("H"); 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 2] & 0x20) 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("S"); 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 2] & 0x10) 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("D"); 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((bp[i + 2] & 0x0f) || bp[i + 3] || bp[i + 4]) 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("res"); 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", sequence: %u", bp[i + 5]); 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", lifetime: %u", EXTRACT_32BITS(&bp[i + 6])); 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] > IP6OPT_BU_MINLEN - 2) { 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_sopt_print(&bp[i + IP6OPT_BU_MINLEN], 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (optlen - IP6OPT_BU_MINLEN)); 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_BINDING_ACK: 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_BA_MINLEN) { 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(ba: trunc)"); 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] < IP6OPT_BA_MINLEN - 2) { 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(ba: invalid len %d)", bp[i + 1]); 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(ba: "); 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("status: %u", bp[i + 2]); 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 3]) 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("res"); 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", sequence: %u", bp[i + 4]); 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", lifetime: %u", EXTRACT_32BITS(&bp[i + 5])); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", refresh: %u", EXTRACT_32BITS(&bp[i + 9])); 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] > IP6OPT_BA_MINLEN - 2) { 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_sopt_print(&bp[i + IP6OPT_BA_MINLEN], 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (optlen - IP6OPT_BA_MINLEN)); 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case IP6OPT_BINDING_REQ: 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_BR_MINLEN) { 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(br: trunc)"); 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(br"); 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bp[i + 1] > IP6OPT_BR_MINLEN - 2) { 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_sopt_print(&bp[i + IP6OPT_BR_MINLEN], 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (optlen - IP6OPT_BR_MINLEN)); 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(")"); 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len - i < IP6OPT_MINLEN) { 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(type %d: trunc)", bp[i]); 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(opt_type 0x%02x: len=%d) ", bp[i], bp[i + 1]); 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectend: 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[trunc] "); 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecthbhopt_print(register const u_char *bp) 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ip6_hbh *dp = (struct ip6_hbh *)bp; 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int hbhlen = 0; 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->ip6h_len); 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hbhlen = (int)((dp->ip6h_len + 1) << 3); 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*dp, hbhlen); 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("HBH "); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_opt_print((const u_char *)dp + sizeof(*dp), hbhlen - sizeof(*dp)); 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(hbhlen); 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc: 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[|HBH]", stdout); 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdstopt_print(register const u_char *bp) 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct ip6_dest *dp = (struct ip6_dest *)bp; 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int dstoptlen = 0; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(dp->ip6d_len); 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dstoptlen = (int)((dp->ip6d_len + 1) << 3); 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(*dp, dstoptlen); 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("DSTOPT "); 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) { 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6_opt_print((const u_char *)dp + sizeof(*dp), 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dstoptlen - sizeof(*dp)); 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(dstoptlen); 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc: 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[|DSTOPT]", stdout); 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return(-1); 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* INET6 */ 330