12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) 1995, 1996, 1997, and 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
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.51 2005/04/07 00:28:17 mcr Exp $ (LBL)";
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "isakmp.h"
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipsec_doi.h"
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oakley.h"
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"                    /* must come after interface.h */
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_SOCKADDR_STORAGE
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define sockaddr_storage sockaddr
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sa_print(const struct isakmp_gen *,
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_p_print(const struct isakmp_gen *,
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_t_print(const struct isakmp_gen *,
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_ke_print(const struct isakmp_gen *,
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_id_print(const struct isakmp_gen *,
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_cert_print(const struct isakmp_gen *,
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_cr_print(const struct isakmp_gen *,
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sig_print(const struct isakmp_gen *,
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_hash_print(const struct isakmp_gen *,
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_nonce_print(const struct isakmp_gen *,
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_n_print(const struct isakmp_gen *,
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_d_print(const struct isakmp_gen *,
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_vid_print(const struct isakmp_gen *,
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int, const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sub0_print(u_char, const struct isakmp_gen *,
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *,	u_int32_t, u_int32_t, u_int32_t, int);
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *isakmp_sub_print(u_char, const struct isakmp_gen *,
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *numstr(int);
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void safememcpy(void *, const void *, size_t);
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAXINITIATORS	20
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ninitiator = 0;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct {
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cookie_t initiator;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage iaddr;
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage raddr;
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} cookiecache[MAXINITIATORS];
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* protocol id */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *protoidstr[] = {
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *npstr[] = {
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash",
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"sig", "nonce", "n", "d", "vid"
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *(*npfunc[])(const struct isakmp_gen *, u_int,
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *, u_int32_t, u_int32_t, u_int32_t, int) = {
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL,
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_sa_print,
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_p_print,
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_t_print,
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_ke_print,
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_id_print,
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_cert_print,
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_cr_print,
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_hash_print,
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_sig_print,
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_nonce_print,
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_n_print,
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_d_print,
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	isakmp_vid_print,
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->etype */
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *etypestr[] = {
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"none", "base", "ident", "auth", "agg", "inf", NULL, NULL,
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"oakley-quick", "oakley-newgroup",
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define STR_OR_ID(x, tab) \
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)])	? tab[(x)] : numstr(x))
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PROTOIDSTR(x)	STR_OR_ID(x, protoidstr)
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPSTR(x)	STR_OR_ID(x, npstr)
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ETYPESTR(x)	STR_OR_ID(x, etypestr)
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPFUNC(x) \
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		? npfunc[(x)] : NULL)
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectiszero(u_char *p, size_t l)
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (l--) {
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*p++)
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 1;
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* find cookie from initiator cache */
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_find(cookie_t *in)
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < MAXINITIATORS; i++) {
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0)
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return i;
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* record initiator */
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_record(cookie_t *in, const u_char *bp2)
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip;
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in *sin;
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6;
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in6 *sin6;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = cookie_find(in);
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (0 <= i) {
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ninitiator = (i + 1) % MAXINITIATORS;
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)bp2;
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V(ip)) {
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].iaddr, 0,
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].iaddr));
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].raddr, 0,
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].raddr));
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr;
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr;
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst));
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].iaddr, 0,
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].iaddr));
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].raddr, 0,
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].raddr));
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp2;
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr;
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr;
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memcpy(&cookiecache[ninitiator].initiator, in, sizeof(*in));
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ninitiator = (ninitiator + 1) % MAXINITIATORS;
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isinitiator(x, y)	cookie_sidecheck((x), (y), 1)
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isresponder(x, y)	cookie_sidecheck((x), (y), 0)
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_sidecheck(int i, const u_char *bp2, int initiator)
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage ss;
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr *sa;
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in *sin;
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6;
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in6 *sin6;
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int salen;
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memset(&ss, 0, sizeof(ss));
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)bp2;
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V(ip)) {
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&ss;
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp2;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&ss;
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa = (struct sockaddr *)&ss;
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (initiator) {
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family)
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sa->sa_len;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family == AF_INET6)
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr_in6);
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr);
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sizeof(struct sockaddr);
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0)
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 1;
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family)
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sa->sa_len;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family == AF_INET6)
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr_in6);
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr);
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sizeof(struct sockaddr);
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0)
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 1;
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectrawprint(caddr_t loc, size_t len)
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static u_char *p;
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	size_t i;
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*loc, len);
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (u_char *)loc;
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < len; i++)
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%02x", p[i] & 0xff);
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 1;
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct attrmap {
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *type;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int nvalue;
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *value[30];	/*XXX*/
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_attrmap_print(const u_char *p, const u_char *ep,
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct attrmap *map, size_t nmap)
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t *q;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int totlen;
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t t, v;
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	q = (u_int16_t *)p;
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80)
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4;
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4 + EXTRACT_16BITS(&q[1]);
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < p + totlen) {
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|attr]");
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return ep + 1;
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("(");
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = EXTRACT_16BITS(&q[0]) & 0x7fff;
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (map && t < nmap && map[t].type)
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("type=%s ", map[t].type);
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("type=#%d ", t);
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80) {
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("value=");
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		v = EXTRACT_16BITS(&q[1]);
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (map && t < nmap && v < map[t].nvalue && map[t].value[v])
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s", map[t].value[v]);
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rawprint((caddr_t)&q[1], 2);
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("len=%d value=", EXTRACT_16BITS(&q[1]));
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&p[4], EXTRACT_16BITS(&q[1]));
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(")");
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p + totlen;
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_attr_print(const u_char *p, const u_char *ep)
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t *q;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int totlen;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t t;
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	q = (u_int16_t *)p;
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80)
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4;
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4 + EXTRACT_16BITS(&q[1]);
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < p + totlen) {
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|attr]");
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return ep + 1;
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("(");
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = EXTRACT_16BITS(&q[0]) & 0x7fff;
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("type=#%d ", t);
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80) {
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("value=");
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		t = q[1];
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&q[1], 2);
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("len=%d value=", EXTRACT_16BITS(&q[1]));
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&p[2], EXTRACT_16BITS(&q[1]));
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(")");
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p + totlen;
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sa_print(const struct isakmp_gen *ext,
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int item_len _U_,
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t proto0, int depth)
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_sa *p;
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_sa sa;
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_int32_t *q;
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi, sit, ident;
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp, *np;
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int t;
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_SA));
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_sa *)ext;
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&sa, ext, sizeof(sa));
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(sa.doi);
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sit = ntohl(sa.sit);
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" doi=%d", doi);
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" situation=%u", (u_int32_t)ntohl(sa.sit));
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (u_char *)(p + 1);
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" doi=ipsec");
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	q = (u_int32_t *)&sa.sit;
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" situation=");
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = 0;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x01) {
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("identity");
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		t++;
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x02) {
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%ssecrecy", t ? "+" : "");
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		t++;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x04)
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%sintegrity", t ? "+" : "");
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	np = (u_char *)ext + sizeof(sa);
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit != 0x01) {
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*(ext + 1), sizeof(ident));
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		safememcpy(&ident, ext + 1, sizeof(ident));
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ident=%u", (u_int32_t)ntohl(ident));
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		np += sizeof(ident);
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ext = (struct isakmp_gen *)np;
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = isakmp_sub_print(ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		depth);
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA));
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_p_print(const struct isakmp_gen *ext, u_int item_len _U_,
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       const u_char *ep, u_int32_t phase, u_int32_t doi0,
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       u_int32_t proto0 _U_, int depth)
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_p *p;
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_p prop;
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_P));
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_p *)ext;
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&prop, ext, sizeof(prop));
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" #%d protoid=%s transform=%d",
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t);
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (prop.spi_size) {
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" spi=");
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(p + 1), prop.spi_size))
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		prop.prot_id, depth);
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_P));
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *isakmp_p_map[] = {
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "ike",
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ah_p_map[] = {
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "(reserved)", "md5", "sha", "1des",
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"sha2-256", "sha2-384", "sha2-512",
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *esp_p_map[] = {
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ipcomp_p_map[] = {
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "oui", "deflate", "lzs",
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap ipsec_t_map[] = {
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,	0, { NULL } },
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifetype", 3, { NULL, "sec", "kb", }, },
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "life", 0, { NULL } },
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group desc", 5,	{ NULL, "modp768", "modp1024", "EC2N 2^155",
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				  "EC2N 2^185", }, },
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "enc mode", 3, { NULL, "tunnel", "transport", }, },
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "keylen", 0, { NULL } },
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "rounds", 0, { NULL } },
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "dictsize", 0, { NULL } },
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "privalg", 0, { NULL } },
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap oakley_t_map[] = {
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,	0, { NULL } },
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "enc", 8,	{ NULL, "1des", "idea", "blowfish", "rc5",
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 	  "3des", "cast", "aes", }, },
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "hash", 7,	{ NULL, "md5", "sha1", "tiger",
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  "sha2-256", "sha2-384", "sha2-512", }, },
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "auth", 6,	{ NULL, "preshared", "dss", "rsa sig", "rsa enc",
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  "rsa enc revised", }, },
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group desc", 5,	{ NULL, "modp768", "modp1024", "EC2N 2^155",
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				  "EC2N 2^185", }, },
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group type", 4,	{ NULL, "MODP", "ECP", "EC2N", }, },
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group prime", 0, { NULL } },
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group gen1", 0, { NULL } },
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group gen2", 0, { NULL } },
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group curve A", 0, { NULL } },
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group curve B", 0, { NULL } },
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifetype", 3,	{ NULL, "sec", "kb", }, },
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifeduration", 0, { NULL } },
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "prf", 0, { NULL } },
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "keylen", 0, { NULL } },
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "field", 0, { NULL } },
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "order", 0, { NULL } },
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_t_print(const struct isakmp_gen *ext, u_int item_len,
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_,
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto, int depth _U_)
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_t *p;
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_t t;
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *idstr;
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct attrmap *map;
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	size_t nmap;
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep2;
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_T));
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_t *)ext;
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&t, ext, sizeof(t));
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (proto) {
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, isakmp_p_map);
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = oakley_t_map;
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, ah_p_map);
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, esp_p_map);
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, ipcomp_p_map);
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = NULL;
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = NULL;
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = 0;
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (idstr)
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" #%d id=%s ", t.t_no, idstr);
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" #%d id=%d ", t.t_no, t.t_id);
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)(p + 1);
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep2 = (u_char *)p + item_len;
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (cp < ep && cp < ep2) {
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (map && nmap) {
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = isakmp_attrmap_print(cp, (ep < ep2) ? ep : ep2,
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				map, nmap);
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = isakmp_attr_print(cp, (ep < ep2) ? ep : ep2);
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < ep2)
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("...");
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_T));
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_ke_print(const struct isakmp_gen *ext, u_int item_len _U_,
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t proto _U_, int depth _U_)
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_KE));
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" key len=%d", ntohs(e.len) - 4);
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < ntohs(e.len)) {
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE));
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_id_print(const struct isakmp_gen *ext, u_int item_len _U_,
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *ep _U_, u_int32_t phase, u_int32_t doi _U_,
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t proto _U_, int depth _U_)
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define USE_IPSECDOI_IN_PHASE1	1
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_id *p;
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_id id;
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *idtypestr[] = {
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"IPv4", "IPv4net", "IPv6", "IPv6net",
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsecidtypestr[] = {
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"keyid",
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int len;
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *data;
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_ID));
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_id *)ext;
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&id, ext, sizeof(id));
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sizeof(*p) < item_len) {
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = (u_char *)(p + 1);
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = item_len - sizeof(*p);
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = NULL;
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = 0;
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 /*debug*/
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [phase=%d doi=%d proto=%d]", phase, doi, proto);
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (phase) {
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef USE_IPSECDOI_IN_PHASE1
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" idtype=%s", STR_OR_ID(id.d.id_type, idtypestr));
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" doi_data=%u",
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(u_int32_t)(ntohl(id.d.doi_data) & 0xffffff));
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_IPSECDOI_IN_PHASE1
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct ipsecdoi_id *p;
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct ipsecdoi_id id;
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct protoent *pe;
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p = (struct ipsecdoi_id *)ext;
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*p);
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		safememcpy(&id, ext, sizeof(id));
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" idtype=%s", STR_OR_ID(id.type, ipsecidtypestr));
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (id.proto_id) {
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        // not supported on android
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			//setprotoent(1);
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pe = getprotobynumber(id.proto_id);
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pe)
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" protoid=%s", pe->p_name);
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        // not supported on android
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			//endprotoent();
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* it DOES NOT mean IPPROTO_IP! */
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" protoid=%s", "0");
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" port=%d", ntohs(id.port));
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!len)
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (data == NULL)
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*data, len);
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (id.type) {
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR:
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 4)
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 4]", len);
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s", len, ipaddr_string(data));
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_FQDN:
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_USER_FQDN:
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int i;
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" len=%d ", len);
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < len; i++)
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				safeputchar(data[i]);
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const u_char *mask;
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 8)
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 8]", len);
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				mask = data + sizeof(struct in_addr);
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s/%u.%u.%u.%u", len,
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ipaddr_string(data),
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					mask[0], mask[1], mask[2], mask[3]);
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR:
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 16)
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 16]", len);
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s", len, ip6addr_string(data));
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const u_int32_t *mask;
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 20)
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 20]", len);
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				mask = (u_int32_t *)(data + sizeof(struct in6_addr));
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*XXX*/
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s/0x%08x%08x%08x%08x", len,
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ip6addr_string(data),
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					mask[0], mask[1], mask[2], mask[3]);
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR_RANGE:
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 8)
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 8]", len);
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s-%s", len,
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ipaddr_string(data),
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ipaddr_string(data + sizeof(struct in_addr)));
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR_RANGE:
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 32)
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d [bad: < 32]", len);
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" len=%d %s-%s", len,
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ip6addr_string(data),
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					ip6addr_string(data + sizeof(struct in6_addr)));
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_DER_ASN1_DN:
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_DER_ASN1_GN:
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_KEY_ID:
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (data && len) {
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" len=%d", len);
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (2 < vflag) {
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ");
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!rawprint((caddr_t)data, len))
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID));
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_cert_print(const struct isakmp_gen *ext, u_int item_len _U_,
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		  const u_char *ep _U_, u_int32_t phase _U_,
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		  u_int32_t doi0 _U_,
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		  u_int32_t proto0 _U_, int depth _U_)
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_cert *p;
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_cert cert;
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *certstr[] = {
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"none",	"pkcs7", "pgp", "dns",
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"x509sign", "x509ke", "kerberos", "crl",
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"arl", "spki", "x509attr",
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_CERT));
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_cert *)ext;
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&cert, ext, sizeof(cert));
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" len=%d", item_len - 4);
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" type=%s", STR_OR_ID((cert.encode), certstr));
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < item_len) {
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), item_len - 4))
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT));
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_cr_print(const struct isakmp_gen *ext, u_int item_len _U_,
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t proto0 _U_, int depth _U_)
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_cert *p;
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_cert cert;
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *certstr[] = {
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"none",	"pkcs7", "pgp", "dns",
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"x509sign", "x509ke", "kerberos", "crl",
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"arl", "spki", "x509attr",
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_CR));
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_cert *)ext;
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&cert, ext, sizeof(cert));
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" len=%d", item_len - 4);
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" type=%s", STR_OR_ID((cert.encode), certstr));
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < item_len) {
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), item_len - 4))
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR));
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_hash_print(const struct isakmp_gen *ext, u_int item_len _U_,
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		  const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		  u_int32_t proto _U_, int depth _U_)
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_HASH));
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" len=%d", ntohs(e.len) - 4);
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < ntohs(e.len)) {
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH));
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sig_print(const struct isakmp_gen *ext, u_int item_len _U_,
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 u_int32_t proto _U_, int depth _U_)
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_SIG));
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" len=%d", ntohs(e.len) - 4);
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < ntohs(e.len)) {
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG));
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_nonce_print(const struct isakmp_gen *ext,
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   u_int item_len _U_,
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   const u_char *ep _U_,
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   u_int32_t phase _U_, u_int32_t doi _U_,
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   u_int32_t proto _U_, int depth _U_)
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_NONCE));
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" n len=%d", ntohs(e.len) - 4);
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < ntohs(e.len)) {
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE));
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_n_print(const struct isakmp_gen *ext, u_int item_len,
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto0 _U_, int depth)
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_n *p, n;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char *ep2;
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi;
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto;
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *notify_error_str[] = {
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		NULL,				"INVALID-PAYLOAD-TYPE",
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"DOI-NOT-SUPPORTED",		"SITUATION-NOT-SUPPORTED",
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-COOKIE",		"INVALID-MAJOR-VERSION",
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-MINOR-VERSION",	"INVALID-EXCHANGE-TYPE",
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-FLAGS",		"INVALID-MESSAGE-ID",
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-PROTOCOL-ID",		"INVALID-SPI",
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-TRANSFORM-ID",		"ATTRIBUTES-NOT-SUPPORTED",
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"NO-PROPOSAL-CHOSEN",		"BAD-PROPOSAL-SYNTAX",
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"PAYLOAD-MALFORMED",		"INVALID-KEY-INFORMATION",
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-ID-INFORMATION",	"INVALID-CERT-ENCODING",
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-CERTIFICATE",		"CERT-TYPE-UNSUPPORTED",
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-CERT-AUTHORITY",	"INVALID-HASH-INFORMATION",
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"AUTHENTICATION-FAILED",	"INVALID-SIGNATURE",
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"ADDRESS-NOTIFICATION",		"NOTIFY-SA-LIFETIME",
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"CERTIFICATE-UNAVAILABLE",	"UNSUPPORTED-EXCHANGE-TYPE",
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"UNEQUAL-PAYLOAD-LENGTHS",
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsec_notify_error_str[] = {
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"RESERVED",
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *notify_status_str[] = {
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"CONNECTED",
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsec_notify_status_str[] = {
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"RESPONDER-LIFETIME",		"REPLAY-STATUS",
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INITIAL-CONTACT",
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* NOTE: these macro must be called with x in proper range */
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 0 - 8191 */
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_ERROR_STR(x) \
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((x), notify_error_str)
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8192 - 16383 */
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_ERROR_STR(x) \
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 16384 - 24575 */
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_STATUS_STR(x) \
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 16384), notify_status_str)
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 24576 - 32767 */
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_STATUS_STR(x) \
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_N));
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_n *)ext;
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&n, ext, sizeof(n));
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(n.doi);
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	proto = n.prot_id;
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" doi=%d", doi);
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" proto=%d", proto);
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ntohs(n.type) < 8192)
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type)));
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (ntohs(n.type) < 16384)
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" type=%s", numstr(ntohs(n.type)));
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (ntohs(n.type) < 24576)
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type)));
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" type=%s", numstr(ntohs(n.type)));
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (n.spi_size) {
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" spi=");
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!rawprint((caddr_t)(p + 1), n.spi_size))
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (u_char *)(p + 1) + n.spi_size;
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" doi=ipsec");
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" proto=%s", PROTOIDSTR(proto));
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ntohs(n.type) < 8192)
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type)));
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 16384)
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type)));
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 24576)
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type)));
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 32768)
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type)));
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" type=%s", numstr(ntohs(n.type)));
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (n.spi_size) {
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" spi=");
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(p + 1), n.spi_size))
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)(p + 1) + n.spi_size;
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep2 = (u_char *)p + item_len;
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cp < ep) {
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" orig=(");
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (ntohs(n.type)) {
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_NTYPE_RESPONDER_LIFETIME:
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const struct attrmap *map = oakley_t_map;
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (cp < ep && cp < ep2) {
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cp = isakmp_attrmap_print(cp,
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(ep < ep2) ? ep : ep2, map, nmap);
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_NTYPE_REPLAY_STATUS:
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("replay detection %sabled",
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(*(u_int32_t *)cp) ? "en" : "dis");
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN:
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (isakmp_sub_print(ISAKMP_NPTYPE_SA,
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (struct isakmp_gen *)cp, ep, phase, doi, proto,
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    depth) == NULL)
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return NULL;
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* NULL is dummy */
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			isakmp_print(gndo, cp,
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     item_len - sizeof(*p) - n.spi_size,
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     NULL);
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(")");
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_N));
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_d_print(const struct isakmp_gen *ext, u_int item_len _U_,
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       u_int32_t proto0 _U_, int depth _U_)
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp_pl_d *p;
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_pl_d d;
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_int8_t *q;
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi;
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto;
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_D));
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (struct isakmp_pl_d *)ext;
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*p);
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&d, ext, sizeof(d));
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(d.doi);
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	proto = d.prot_id;
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" doi=%u", doi);
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" proto=%u", proto);
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" doi=ipsec");
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" proto=%s", PROTOIDSTR(proto));
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" spilen=%u", d.spi_size);
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" nspi=%u", ntohs(d.num_spi));
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" spi=");
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	q = (u_int8_t *)(p + 1);
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < ntohs(d.num_spi); i++) {
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (i != 0)
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(",");
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)q, d.spi_size))
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		q += d.spi_size;
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return q;
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_D));
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_vid_print(const struct isakmp_gen *ext,
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 u_int item_len _U_, const u_char *ep _U_,
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 u_int32_t phase _U_, u_int32_t doi _U_,
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 u_int32_t proto _U_, int depth _U_)
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("%s:", NPSTR(ISAKMP_NPTYPE_VID));
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" len=%d", ntohs(e.len) - 4);
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (2 < vflag && 4 < ntohs(e.len)) {
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ");
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID));
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sub0_print(u_char np, const struct isakmp_gen *ext, const u_char *ep,
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int item_len;
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)ext;
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*ext);
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&e, ext, sizeof(e));
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Since we can't have a payload length of less than 4 bytes,
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * we need to bail out here if the generic header is nonsensical
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * or truncated, otherwise we could loop forever processing
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * zero-length items or otherwise misdissect the packet.
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	item_len = ntohs(e.len);
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (item_len <= 4)
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return NULL;
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (NPFUNC(np)) {
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - what if item_len is too short, or too long,
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * for this payload type?
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp = (*npfunc[np])(ext, item_len, ep, phase, doi, proto, depth);
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%s", NPSTR(np));
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp += item_len;
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|isakmp]");
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_sub_print(u_char np, const struct isakmp_gen *ext, const u_char *ep,
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (const u_char *)ext;
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (np) {
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*ext);
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		safememcpy(&e, ext, sizeof(e));
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*ext, ntohs(e.len));
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		depth++;
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("\n");
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < depth; i++)
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("    ");
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("(");
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp = isakmp_sub0_print(np, ext, ep, phase, doi, proto, depth);
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(")");
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		depth--;
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (cp == NULL) {
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Zero-length subitem */
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return NULL;
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		np = e.np;
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ext = (struct isakmp_gen *)cp;
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" [|%s]", NPSTR(np));
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnumstr(int x)
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static char buf[20];
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	snprintf(buf, sizeof(buf), "#%d", x);
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return buf;
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * some compiler tries to optimize memcpy(), using the alignment constraint
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * on the argument pointer type.  by using this function, we try to avoid the
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * optimization.
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsafememcpy(void *p, const void *q, size_t l)
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memcpy(p, q, l);
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_print(netdissect_options *ndo,
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	     const u_char *bp, u_int length,
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	     const u_char *bp2)
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct isakmp *p;
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp base;
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep;
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char np;
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int phase;
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int major, minor;
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (const struct isakmp *)bp;
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = ndo->ndo_snapend;
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((struct isakmp *)ep < p + 1) {
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|isakmp]");
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	safememcpy(&base, p, sizeof(base));
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("isakmp");
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		major = (base.vers & ISAKMP_VERS_MAJOR)
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				>> ISAKMP_VERS_MAJOR_SHIFT;
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		minor = (base.vers & ISAKMP_VERS_MINOR)
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				>> ISAKMP_VERS_MINOR_SHIFT;
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %d.%d", major, minor);
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" msgid ");
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&base.msgid, sizeof(base.msgid));
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (1 < vflag) {
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" cookie ");
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&base.i_ck, sizeof(base.i_ck));
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("->");
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rawprint((caddr_t)&base.r_ck, sizeof(base.r_ck));
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(":");
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	phase = (*(u_int32_t *)base.msgid == 0) ? 1 : 2;
13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (phase == 1)
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" phase %d", phase);
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" phase %d/others", phase);
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = cookie_find(&base.i_ck);
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i < 0) {
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (iszero((u_char *)&base.r_ck, sizeof(base.r_ck))) {
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* the first packet */
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" I");
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (bp2)
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cookie_record(&base.i_ck, bp2);
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ?");
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (bp2 && cookie_isinitiator(i, bp2))
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" I");
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (bp2 && cookie_isresponder(i, bp2))
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" R");
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ?");
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %s", ETYPESTR(base.etype));
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (base.flags) {
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[%s%s]", base.flags & ISAKMP_FLAG_E ? "E" : "",
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			base.flags & ISAKMP_FLAG_C ? "C" : "");
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct isakmp_gen *ext;
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int nparen;
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CHECKLEN(p, np) \
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ep < (u_char *)(p)) {				\
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [|%s]", NPSTR(np));			\
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto done;					\
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(":");
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* regardless of phase... */
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (base.flags & ISAKMP_FLAG_E) {
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * encrypted, nothing we can do right now.
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we hope to decrypt the packet in the future...
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" [encrypted %s]", NPSTR(base.np));
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto done;
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nparen = 0;
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		CHECKLEN(p + 1, base.np)
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		np = base.np;
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ext = (struct isakmp_gen *)(p + 1);
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		isakmp_sub_print(np, ext, ep, phase, 0, 0, 0);
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdone:
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ntohl(base.len) != length) {
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" (len mismatch: isakmp %u/ip %u)",
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(u_int32_t)ntohl(base.len), length);
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectisakmp_rfc3948_print(netdissect_options *ndo,
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     const u_char *bp, u_int length,
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     const u_char *bp2)
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep;
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = ndo->ndo_snapend;
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(length == 1 && bp[0]==0xff) {
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ND_PRINT((ndo, "isakmp-nat-keep-alive"));
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(length < 4) {
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * see if this is an IKE packet
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) {
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ND_PRINT((ndo, "NONESP-encap: "));
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		isakmp_print(ndo, bp+4, length-4, bp2);
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* must be an ESP packet */
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int nh, enh, padlen;
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int advance;
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ND_PRINT((ndo, "UDP-encap: "));
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		advance = esp_print(ndo, bp, length, bp2, &enh, &padlen);
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if(advance <= 0)
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length -= advance + padlen;
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nh = enh & 0xff;
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip_print_inner(ndo, bp, length, nh, bp2);
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("[|isakmp]");
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1448