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