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_ =
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.61 2008-02-05 19:34:25 guy Exp $ (LBL)";
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define NETDISSECT_REWORKED
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* The functions from print-esp.c used in this file are only defined when both
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_OPENSSL_EVP_H
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#undef HAVE_LIBCRYPTO
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "isakmp.h"
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipsec_doi.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oakley.h"
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"                    /* must come after interface.h */
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_SOCKADDR_STORAGE
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define sockaddr_storage sockaddr
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		netdissect_options *ndo, u_char tpay,	              \
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,			      \
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len, \
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const u_char *end_pointer, \
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase,\
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t doi0, \
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto0, int depth)
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7953f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_sa);
8053f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_p);
8153f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_t);
8253f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_ke);
8353f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_id);
8453f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_cert);
8553f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_cr);
8653f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_sig);
8753f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_hash);
8853f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_nonce);
8953f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_n);
9053f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_d);
9153f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v1_vid);
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9353f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_sa);
9453f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_ke);
9553f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_ID);
9653f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_cert);
9753f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_cr);
9853f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_auth);
9953f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_nonce);
10053f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_n);
10153f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_d);
10253f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_vid);
10353f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_TS);
10453f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_cp);
10553f17a9db278d33517d9888dd77848f554522a38JP AbgrallDECLARE_PRINTER(v2_eap);
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *ikev2_e_print(netdissect_options *ndo,
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   struct isakmp *base,
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   u_char tpay,
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   const struct isakmp_gen *ext,
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   u_int item_len,
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   const u_char *end_pointer,
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   u_int32_t phase,
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   u_int32_t doi0,
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   u_int32_t proto0, int depth);
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *ike_sub0_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *,	u_int32_t, u_int32_t, u_int32_t, int);
12053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *ikev1_sub_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *ikev2_sub_print(netdissect_options *ndo,
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				     struct isakmp *base,
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				     u_char np, const struct isakmp_gen *ext,
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				     const u_char *ep, u_int32_t phase,
12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				     u_int32_t doi, u_int32_t proto,
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				     int depth);
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic char *numstr(int);
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_print(netdissect_options *ndo,
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp,  u_int length,
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp2, struct isakmp *base);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAXINITIATORS	20
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint ninitiator = 0;
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct {
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cookie_t initiator;
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage iaddr;
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage raddr;
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} cookiecache[MAXINITIATORS];
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* protocol id */
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *protoidstr[] = {
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *npstr[] = {
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"sig", "nonce", "n", "d", "vid",      /* 9 - 13 */
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"pay29", "pay30", "pay31", "pay32",          /* 29- 32 */
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"v2sa",  "v2ke",  "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"v2cr",  "v2auth","v2nonce", "v2n",   "v2d",   /* 38- 42 */
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"v2vid", "v2TSi", "v2TSr", "v2e",   "v2cp",  /* 43- 47 */
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"v2eap",                                     /* 48 */
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->np */
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *(*npfunc[])(netdissect_options *ndo, u_char tpay,
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 const struct isakmp_gen *ext,
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 u_int item_len,
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 const u_char *end_pointer,
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 u_int32_t phase,
17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 u_int32_t doi0,
17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 u_int32_t proto0, int depth) = {
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL,
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_sa_print,
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_p_print,
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_t_print,
17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_ke_print,
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_id_print,
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_cert_print,
18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_cr_print,
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_hash_print,
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_sig_print,
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_nonce_print,
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_n_print,
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_d_print,
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev1_vid_print,                  /* 13 */
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL,     /* 14- 18 */
18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL,     /* 19- 23 */
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL,     /* 24- 28 */
19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL,           /* 29- 32 */
19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_sa_print,                 /* 33 */
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_ke_print,                 /* 34 */
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_ID_print,                 /* 35 */
19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_ID_print,                 /* 36 */
19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_cert_print,               /* 37 */
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_cr_print,                 /* 38 */
19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_auth_print,               /* 39 */
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_nonce_print,              /* 40 */
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_n_print,                  /* 41 */
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_d_print,                  /* 42 */
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_vid_print,                /* 43 */
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_TS_print,                 /* 44 */
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_TS_print,                 /* 45 */
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, /* ikev2_e_print,*/       /* 46 - special */
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_cp_print,                 /* 47 */
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_eap_print,                /* 48 */
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* isakmp->etype */
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *etypestr[] = {
21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* IKEv1 exchange types */
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"none", "base", "ident", "auth", "agg", "inf", NULL, NULL,  /* 0-7 */
21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /*  8-15 */
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /* 16-23 */
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /* 24-31 */
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"oakley-quick", "oakley-newgroup",               /* 32-33 */
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* IKEv2 exchange types */
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"ikev2_init", "ikev2_auth", "child_sa", "inf2"   /* 34-37 */
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define STR_OR_ID(x, tab) \
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)])	? tab[(x)] : numstr(x))
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PROTOIDSTR(x)	STR_OR_ID(x, protoidstr)
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPSTR(x)	STR_OR_ID(x, npstr)
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ETYPESTR(x)	STR_OR_ID(x, etypestr)
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define CHECKLEN(p, np)							\
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ep < (u_char *)(p)) {				\
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," [|%s]", NPSTR(np)));		\
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto done;					\
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NPFUNC(x) \
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		? npfunc[(x)] : NULL)
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectiszero(u_char *p, size_t l)
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (l--) {
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*p++)
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 1;
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* find cookie from initiator cache */
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_find(cookie_t *in)
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < MAXINITIATORS; i++) {
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0)
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return i;
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return -1;
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* record initiator */
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_record(cookie_t *in, const u_char *bp2)
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip;
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in *sin;
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6;
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in6 *sin6;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = cookie_find(in);
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (0 <= i) {
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ninitiator = (i + 1) % MAXINITIATORS;
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)bp2;
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V(ip)) {
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].iaddr, 0,
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].iaddr));
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].raddr, 0,
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].raddr));
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr;
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst));
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].iaddr, 0,
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].iaddr));
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memset(&cookiecache[ninitiator].raddr, 0,
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sizeof(cookiecache[ninitiator].raddr));
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp2;
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr;
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr;
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&cookiecache[ninitiator].initiator, in, sizeof(*in));
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ninitiator = (ninitiator + 1) % MAXINITIATORS;
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isinitiator(x, y)	cookie_sidecheck((x), (y), 1)
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define cookie_isresponder(x, y)	cookie_sidecheck((x), (y), 0)
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcookie_sidecheck(int i, const u_char *bp2, int initiator)
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_storage ss;
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr *sa;
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in *sin;
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct sockaddr_in6 *sin6;
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int salen;
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memset(&ss, 0, sizeof(ss));
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)bp2;
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V(ip)) {
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin = (struct sockaddr_in *)&ss;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_len = sizeof(struct sockaddr_in);
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin->sin_family = AF_INET;
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp2;
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6 = (struct sockaddr_in6 *)&ss;
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_len = sizeof(struct sockaddr_in6);
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sin6->sin6_family = AF_INET6;
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa = (struct sockaddr *)&ss;
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (initiator) {
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family)
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sa->sa_len;
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family == AF_INET6)
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr_in6);
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr);
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sizeof(struct sockaddr);
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0)
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 1;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family)
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SOCKADDR_SA_LEN
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sa->sa_len;
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa->sa_family == AF_INET6)
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr_in6);
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			salen = sizeof(struct sockaddr);
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		salen = sizeof(struct sockaddr);
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0)
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 1;
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
41153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
41253f17a9db278d33517d9888dd77848f554522a38JP Abgrallhexprint(netdissect_options *ndo, caddr_t loc, size_t len)
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
41453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char *p;
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	size_t i;
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p = (u_char *)loc;
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < len; i++)
41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"%02x", p[i] & 0xff));
42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int
42353f17a9db278d33517d9888dd77848f554522a38JP Abgrallrawprint(netdissect_options *ndo, caddr_t loc, size_t len)
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK2(*loc, len);
42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	hexprint(ndo, loc, len);
42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return 1;
42953f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return 0;
43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * returns false if we run out of data buffer
43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
43753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int ike_show_somedata(struct netdissect_options *ndo,
43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			     const u_char *cp, const u_char *ep)
43953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* there is too much data, just show some of it */
44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *end = ep - 20;
44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int  elen = 20;
44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int   len = ep - cp;
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(len > 10) {
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		len = 10;
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* really shouldn't happen because of above */
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(end < cp + len) {
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		end = cp+len;
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		elen = ep - end;
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," data=("));
45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(!rawprint(ndo, (caddr_t)(cp), len)) goto trunc;
45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo, "..."));
45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(elen) {
45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(!rawprint(ndo, (caddr_t)(end), elen)) goto trunc;
45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,")"));
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 1;
46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct attrmap {
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *type;
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int nvalue;
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *value[30];	/*XXX*/
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
47453f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_attrmap_print(netdissect_options *ndo,
47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    const u_char *p, const u_char *ep,
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    const struct attrmap *map, size_t nmap)
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int totlen;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t t, v;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80)
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4;
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		totlen = 4 + EXTRACT_16BITS(&p[2]);
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < p + totlen) {
48653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"[|attr]"));
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return ep + 1;
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"("));
49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	t = EXTRACT_16BITS(&p[0]) & 0x7fff;
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (map && t < nmap && map[t].type)
49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"type=%s ", map[t].type));
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"type=#%d ", t));
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80) {
49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"value="));
49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		v = EXTRACT_16BITS(&p[2]);
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (map && t < nmap && v < map[t].nvalue && map[t].value[v])
50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo,"%s", map[t].value[v]));
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			rawprint(ndo, (caddr_t)&p[2], 2);
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"len=%d value=", EXTRACT_16BITS(&p[2])));
50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		rawprint(ndo, (caddr_t)&p[4], EXTRACT_16BITS(&p[2]));
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,")"));
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p + totlen;
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
51253f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_attr_print(netdissect_options *ndo, const u_char *p, const u_char *ep)
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int totlen;
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t t;
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80)
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		totlen = 4;
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		totlen = 4 + EXTRACT_16BITS(&p[2]);
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < p + totlen) {
52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"[|attr]"));
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return ep + 1;
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"("));
52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	t = EXTRACT_16BITS(&p[0]) & 0x7fff;
52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"type=#%d ", t));
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (p[0] & 0x80) {
53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"value="));
53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		t = p[2];
53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		rawprint(ndo, (caddr_t)&p[2], 2);
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
53453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"len=%d value=", EXTRACT_16BITS(&p[2])));
53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		rawprint(ndo, (caddr_t)&p[4], EXTRACT_16BITS(&p[2]));
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,")"));
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return p + totlen;
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
54253f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_sa_print(netdissect_options *ndo, u_char tpay _U_,
54353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const struct isakmp_gen *ext,
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int item_len _U_,
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t proto0, int depth)
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_sa *p;
54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_sa sa;
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi, sit, ident;
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp, *np;
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int t;
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
55453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SA)));
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_sa *)ext;
55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&sa, ext, sizeof(sa));
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(sa.doi);
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sit = ntohl(sa.sit);
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," doi=%d", doi));
56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," situation=%u", (u_int32_t)ntohl(sa.sit)));
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (u_char *)(p + 1);
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," doi=ipsec"));
56853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," situation="));
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = 0;
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x01) {
57153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"identity"));
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		t++;
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x02) {
57553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"%ssecrecy", t ? "+" : ""));
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		t++;
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit & 0x04)
57953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"%sintegrity", t ? "+" : ""));
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	np = (u_char *)ext + sizeof(sa);
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sit != 0x01) {
58353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK2(*(ext + 1), sizeof(ident));
58453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&ident, ext + 1, sizeof(ident));
58553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," ident=%u", (u_int32_t)ntohl(ident)));
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		np += sizeof(ident);
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ext = (struct isakmp_gen *)np;
59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
59253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		depth);
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SA)));
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
60253f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_p_print(netdissect_options *ndo, u_char tpay _U_,
60353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len _U_,
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       const u_char *ep, u_int32_t phase, u_int32_t doi0,
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       u_int32_t proto0 _U_, int depth)
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_p *p;
60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_p prop;
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_P)));
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_p *)ext;
61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," #%d protoid=%s transform=%d",
61753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t));
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (prop.spi_size) {
61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," spi="));
62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(p + 1), prop.spi_size))
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
62853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			     prop.prot_id, depth);
62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
63653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *ikev1_p_map[] = {
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "ike",
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
64053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *ikev2_t_type_map[]={
64153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, "encr", "prf", "integ", "dh", "esn"
64253f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
64353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ah_p_map[] = {
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "(reserved)", "md5", "sha", "1des",
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"sha2-256", "sha2-384", "sha2-512",
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
64953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *prf_p_map[] = {
65053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, "hmac-md5", "hmac-sha", "hmac-tiger",
65153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"aes128_xcbc"
65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
65353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *integ_p_map[] = {
65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, "hmac-md5", "hmac-sha", "dec-mac",
65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"kpdk-md5", "aes-xcbc"
65753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *esn_p_map[] = {
66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"no-esn", "esn"
66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
66253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
66353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const char *dh_p_map[] = {
66453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	NULL, "modp768",
66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp1024",    /* group 2 */
66653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"EC2N 2^155",  /* group 3 */
66753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"EC2N 2^185",  /* group 4 */
66853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp1536",    /* group 5 */
66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"iana-grp06", "iana-grp07", /* reserved */
67053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"iana-grp08", "iana-grp09",
67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"iana-grp10", "iana-grp11",
67253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"iana-grp12", "iana-grp13",
67353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp2048",    /* group 14 */
67453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp3072",    /* group 15 */
67553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp4096",    /* group 16 */
67653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp6144",    /* group 17 */
67753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	"modp8192",    /* group 18 */
67853f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
67953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *esp_p_map[] = {
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *ipcomp_p_map[] = {
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NULL, "oui", "deflate", "lzs",
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap ipsec_t_map[] = {
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,	0, { NULL } },
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifetype", 3, { NULL, "sec", "kb", }, },
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "life", 0, { NULL } },
69353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ "group desc", 18,	{ NULL, "modp768",
69453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp1024",    /* group 2 */
69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "EC2N 2^155",  /* group 3 */
69653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "EC2N 2^185",  /* group 4 */
69753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp1536",    /* group 5 */
69853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp06", "iana-grp07", /* reserved */
69953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp08", "iana-grp09",
70053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp10", "iana-grp11",
70153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp12", "iana-grp13",
70253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp2048",    /* group 14 */
70353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp3072",    /* group 15 */
70453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp4096",    /* group 16 */
70553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp6144",    /* group 17 */
70653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp8192",    /* group 18 */
70753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}, },
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "enc mode", 3, { NULL, "tunnel", "transport", }, },
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "keylen", 0, { NULL } },
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "rounds", 0, { NULL } },
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "dictsize", 0, { NULL } },
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "privalg", 0, { NULL } },
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
71653f17a9db278d33517d9888dd77848f554522a38JP Abgrallconst struct attrmap encr_t_map[] = {
71753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } }, 	{ NULL,	0, { NULL } },  /* 0, 1 */
71853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 2, 3 */
71953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 4, 5 */
72053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 6, 7 */
72153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 8, 9 */
72253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 10,11*/
72353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 12,13*/
72453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ "keylen", 14, { NULL }},
72553f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
72653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectconst struct attrmap oakley_t_map[] = {
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,	0, { NULL } },
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "enc", 8,	{ NULL, "1des", "idea", "blowfish", "rc5",
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 	  "3des", "cast", "aes", }, },
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "hash", 7,	{ NULL, "md5", "sha1", "tiger",
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  "sha2-256", "sha2-384", "sha2-512", }, },
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "auth", 6,	{ NULL, "preshared", "dss", "rsa sig", "rsa enc",
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  "rsa enc revised", }, },
73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ "group desc", 18,	{ NULL, "modp768",
73653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp1024",    /* group 2 */
73753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "EC2N 2^155",  /* group 3 */
73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "EC2N 2^185",  /* group 4 */
73953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp1536",    /* group 5 */
74053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp06", "iana-grp07", /* reserved */
74153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp08", "iana-grp09",
74253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp10", "iana-grp11",
74353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "iana-grp12", "iana-grp13",
74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp2048",    /* group 14 */
74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp3072",    /* group 15 */
74653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp4096",    /* group 16 */
74753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp6144",    /* group 17 */
74853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  "modp8192",    /* group 18 */
74953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}, },
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group type", 4,	{ NULL, "MODP", "ECP", "EC2N", }, },
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group prime", 0, { NULL } },
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group gen1", 0, { NULL } },
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group gen2", 0, { NULL } },
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group curve A", 0, { NULL } },
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "group curve B", 0, { NULL } },
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifetype", 3,	{ NULL, "sec", "kb", }, },
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "lifeduration", 0, { NULL } },
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "prf", 0, { NULL } },
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "keylen", 0, { NULL } },
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "field", 0, { NULL } },
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ "order", 0, { NULL } },
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
76553f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_t_print(netdissect_options *ndo, u_char tpay _U_,
76653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len,
76753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_,
76853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t proto, int depth _U_)
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
77053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_t *p;
77153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_t t;
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *idstr;
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct attrmap *map;
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	size_t nmap;
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *ep2;
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
77853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_T)));
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
78053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_t *)ext;
78153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
78253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&t, ext, sizeof(t));
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (proto) {
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
78653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t.t_id, ikev1_p_map);
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = oakley_t_map;
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, ah_p_map);
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3:
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, esp_p_map);
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = STR_OR_ID(t.t_id, ipcomp_p_map);
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = ipsec_t_map;
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		idstr = NULL;
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		map = NULL;
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nmap = 0;
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (idstr)
81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," #%d id=%s ", t.t_no, idstr));
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
81553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," #%d id=%d ", t.t_no, t.t_id));
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)(p + 1);
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep2 = (u_char *)p + item_len;
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (cp < ep && cp < ep2) {
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (map && nmap) {
82053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = ikev1_attrmap_print(ndo, cp, (ep < ep2) ? ep : ep2,
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				map, nmap);
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = ikev1_attr_print(ndo, cp, (ep < ep2) ? ep : ep2);
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ep < ep2)
82653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"..."));
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
82953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
83453f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_ke_print(netdissect_options *ndo, u_char tpay _U_,
83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const struct isakmp_gen *ext, u_int item_len _U_,
83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       u_int32_t proto _U_, int depth _U_)
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_KE)));
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
84353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," key len=%d", ntohs(e.len) - 4));
84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_KE)));
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
85853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_id_print(netdissect_options *ndo, u_char tpay _U_,
85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const struct isakmp_gen *ext, u_int item_len _U_,
86053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const u_char *ep _U_, u_int32_t phase, u_int32_t doi _U_,
86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       u_int32_t proto _U_, int depth _U_)
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define USE_IPSECDOI_IN_PHASE1	1
86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_id *p;
86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_id id;
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *idtypestr[] = {
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"IPv4", "IPv4net", "IPv6", "IPv6net",
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsecidtypestr[] = {
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"keyid",
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int len;
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *data;
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_ID)));
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_id *)ext;
88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&id, ext, sizeof(id));
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sizeof(*p) < item_len) {
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = (u_char *)(p + 1);
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = item_len - sizeof(*p);
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		data = NULL;
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = 0;
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 /*debug*/
89153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [phase=%d doi=%d proto=%d]", phase, doi, proto));
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (phase) {
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef USE_IPSECDOI_IN_PHASE1
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
89853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," idtype=%s", STR_OR_ID(id.d.id_type, idtypestr)));
89953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," doi_data=%u",
90053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  (u_int32_t)(ntohl(id.d.doi_data) & 0xffffff)));
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_IPSECDOI_IN_PHASE1
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    {
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct ipsecdoi_id *p;
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct ipsecdoi_id id;
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct protoent *pe;
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p = (struct ipsecdoi_id *)ext;
91353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(*p);
91453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&id, ext, sizeof(id));
91553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," idtype=%s", STR_OR_ID(id.type, ipsecidtypestr)));
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (id.proto_id) {
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
91853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			setprotoent(1);
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pe = getprotobynumber(id.proto_id);
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pe)
92253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," protoid=%s", pe->p_name));
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
92453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			endprotoent();
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* it DOES NOT mean IPPROTO_IP! */
92853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," protoid=%s", "0"));
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
93053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," port=%d", ntohs(id.port)));
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!len)
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (data == NULL)
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
93553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK2(*data, len);
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (id.type) {
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR:
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 4)
93953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 4]", len));
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
94153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s", len, ipaddr_string(data)));
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_FQDN:
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_USER_FQDN:
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int i;
94853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," len=%d ", len));
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < len; i++)
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				safeputchar(data[i]);
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const u_char *mask;
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 8)
95853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 8]", len));
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				mask = data + sizeof(struct in_addr);
96153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s/%u.%u.%u.%u", len,
96253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ipaddr_string(data),
96353f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  mask[0], mask[1], mask[2], mask[3]));
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR:
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 16)
97153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 16]", len));
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
97353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s", len, ip6addr_string(data)));
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
97853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			const u_char *mask;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 20)
98053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 20]", len));
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				mask = (u_char *)(data + sizeof(struct in6_addr));
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*XXX*/
98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len,
98553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ip6addr_string(data),
98653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  mask[0], mask[1], mask[2], mask[3],
98753f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  mask[4], mask[5], mask[6], mask[7],
98853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  mask[8], mask[9], mask[10], mask[11],
98953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  mask[12], mask[13], mask[14], mask[15]));
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV4_ADDR_RANGE:
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 8)
99753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 8]", len));
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
99953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s-%s", len,
100053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ipaddr_string(data),
100153f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ipaddr_string(data + sizeof(struct in_addr))));
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_IPV6_ADDR_RANGE:
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (len < 32)
100853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d [bad: < 32]", len));
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
101053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo," len=%d %s-%s", len,
101153f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ip6addr_string(data),
101253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					  ip6addr_string(data + sizeof(struct in6_addr))));
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			len = 0;
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_DER_ASN1_DN:
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_DER_ASN1_GN:
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_ID_KEY_ID:
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    }
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (data && len) {
102653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," len=%d", len));
102753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (2 < ndo->ndo_vflag) {
102853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," "));
102953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (!rawprint(ndo, (caddr_t)data, len))
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
103553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_ID)));
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
104053f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_cert_print(netdissect_options *ndo, u_char tpay _U_,
104153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 const struct isakmp_gen *ext, u_int item_len _U_,
104253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 const u_char *ep _U_, u_int32_t phase _U_,
104353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_int32_t doi0 _U_,
104453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_int32_t proto0 _U_, int depth _U_)
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
104653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_cert *p;
104753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_cert cert;
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *certstr[] = {
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"none",	"pkcs7", "pgp", "dns",
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"x509sign", "x509ke", "kerberos", "crl",
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"arl", "spki", "x509attr",
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
105453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CERT)));
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
105653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_cert *)ext;
105753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
105853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
105953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", item_len - 4));
106053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
106153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < item_len) {
106253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
106353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), item_len - 4))
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
106853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CERT)));
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
107353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_cr_print(netdissect_options *ndo, u_char tpay _U_,
107453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const struct isakmp_gen *ext, u_int item_len _U_,
107553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
107653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       u_int32_t proto0 _U_, int depth _U_)
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
107853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_cert *p;
107953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_cert cert;
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *certstr[] = {
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"none",	"pkcs7", "pgp", "dns",
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"x509sign", "x509ke", "kerberos", "crl",
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"arl", "spki", "x509attr",
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
108653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CR)));
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
108853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_cert *)ext;
108953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
109053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
109153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", item_len - 4));
109253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
109353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < item_len) {
109453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
109553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), item_len - 4))
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
110053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CR)));
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
110553f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_hash_print(netdissect_options *ndo, u_char tpay _U_,
110653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 const struct isakmp_gen *ext, u_int item_len _U_,
110753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
110853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_int32_t proto _U_, int depth _U_)
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
111253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_HASH)));
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
111453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
111553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
111653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
111753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
111853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
111953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
112453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_HASH)));
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
112953f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_sig_print(netdissect_options *ndo, u_char tpay _U_,
113053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext, u_int item_len _U_,
113153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi _U_,
113253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
113653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SIG)));
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
113853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
113953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
114053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
114153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
114253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
114353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
114853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SIG)));
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
115353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_nonce_print(netdissect_options *ndo, u_char tpay _U_,
115453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  const struct isakmp_gen *ext,
115553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  u_int item_len _U_,
115653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  const u_char *ep _U_,
115753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  u_int32_t phase _U_, u_int32_t doi _U_,
115853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  u_int32_t proto _U_, int depth _U_)
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
116253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_NONCE)));
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
116453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
116553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
116653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," n len=%d", ntohs(e.len) - 4));
116753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
116853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
116953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
117053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
117153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
117253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
117353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!ike_show_somedata(ndo, (u_char *)(caddr_t)(ext + 1), ep))
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
117853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE)));
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
118353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_n_print(netdissect_options *ndo, u_char tpay _U_,
118453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len,
118553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const u_char *ep, u_int32_t phase, u_int32_t doi0 _U_,
118653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t proto0 _U_, int depth)
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
118853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_n *p, n;
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char *ep2;
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi;
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto;
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *notify_error_str[] = {
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		NULL,				"INVALID-PAYLOAD-TYPE",
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"DOI-NOT-SUPPORTED",		"SITUATION-NOT-SUPPORTED",
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-COOKIE",		"INVALID-MAJOR-VERSION",
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-MINOR-VERSION",	"INVALID-EXCHANGE-TYPE",
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-FLAGS",		"INVALID-MESSAGE-ID",
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-PROTOCOL-ID",		"INVALID-SPI",
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-TRANSFORM-ID",		"ATTRIBUTES-NOT-SUPPORTED",
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"NO-PROPOSAL-CHOSEN",		"BAD-PROPOSAL-SYNTAX",
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"PAYLOAD-MALFORMED",		"INVALID-KEY-INFORMATION",
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-ID-INFORMATION",	"INVALID-CERT-ENCODING",
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-CERTIFICATE",		"CERT-TYPE-UNSUPPORTED",
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INVALID-CERT-AUTHORITY",	"INVALID-HASH-INFORMATION",
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"AUTHENTICATION-FAILED",	"INVALID-SIGNATURE",
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"ADDRESS-NOTIFICATION",		"NOTIFY-SA-LIFETIME",
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"CERTIFICATE-UNAVAILABLE",	"UNSUPPORTED-EXCHANGE-TYPE",
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"UNEQUAL-PAYLOAD-LENGTHS",
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsec_notify_error_str[] = {
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"RESERVED",
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *notify_status_str[] = {
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"CONNECTED",
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static const char *ipsec_notify_status_str[] = {
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"RESPONDER-LIFETIME",		"REPLAY-STATUS",
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		"INITIAL-CONTACT",
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	};
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* NOTE: these macro must be called with x in proper range */
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 0 - 8191 */
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_ERROR_STR(x) \
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((x), notify_error_str)
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 8192 - 16383 */
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_ERROR_STR(x) \
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 16384 - 24575 */
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NOTIFY_STATUS_STR(x) \
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 16384), notify_status_str)
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 24576 - 32767 */
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define IPSEC_NOTIFY_STATUS_STR(x) \
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
123953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_N)));
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
124153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_n *)ext;
124253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
124353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&n, ext, sizeof(n));
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(n.doi);
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	proto = n.prot_id;
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
124753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," doi=%d", doi));
124853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," proto=%d", proto));
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ntohs(n.type) < 8192)
125053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (ntohs(n.type) < 16384)
125253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (ntohs(n.type) < 24576)
125453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
125653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (n.spi_size) {
125853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," spi="));
125953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				goto trunc;
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (u_char *)(p + 1) + n.spi_size;
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
126553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," doi=ipsec"));
126653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ntohs(n.type) < 8192)
126853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 16384)
127053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type))));
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 24576)
127253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ntohs(n.type) < 32768)
127453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type))));
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
127653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (n.spi_size) {
127853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," spi="));
127953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)(p + 1) + n.spi_size;
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep2 = (u_char *)p + item_len;
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cp < ep) {
128753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," orig=("));
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (ntohs(n.type)) {
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_NTYPE_RESPONDER_LIFETIME:
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    {
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			const struct attrmap *map = oakley_t_map;
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			while (cp < ep && cp < ep2) {
129453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				cp = ikev1_attrmap_print(ndo, cp,
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					(ep < ep2) ? ep : ep2, map, nmap);
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    }
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case IPSECDOI_NTYPE_REPLAY_STATUS:
130053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo,"replay detection %sabled",
130153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  EXTRACT_32BITS(cp) ? "en" : "dis"));
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN:
130453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (ikev1_sub_print(ndo, ISAKMP_NPTYPE_SA,
130553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					    (struct isakmp_gen *)cp, ep, phase, doi, proto,
130653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					    depth) == NULL)
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return NULL;
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* NULL is dummy */
131153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			isakmp_print(ndo, cp,
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     item_len - sizeof(*p) - n.spi_size,
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				     NULL);
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
131553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,")"));
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + item_len;
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
131953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
132453f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_d_print(netdissect_options *ndo, u_char tpay _U_,
132553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len _U_,
132653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const u_char *ep _U_, u_int32_t phase _U_, u_int32_t doi0 _U_,
132753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t proto0 _U_, int depth _U_)
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
132953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev1_pl_d *p;
133053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev1_pl_d d;
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_int8_t *q;
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t doi;
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proto;
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
133653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_D)));
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
133853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev1_pl_d *)ext;
133953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
134053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&d, ext, sizeof(d));
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	doi = ntohl(d.doi);
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	proto = d.prot_id;
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (doi != 1) {
134453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," doi=%u", doi));
134553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," proto=%u", proto));
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
134753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," doi=ipsec"));
134853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
135053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," spilen=%u", d.spi_size));
135153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," nspi=%u", ntohs(d.num_spi)));
135253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," spi="));
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	q = (u_int8_t *)(p + 1);
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (i = 0; i < ntohs(d.num_spi); i++) {
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (i != 0)
135653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo,","));
135753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)q, d.spi_size))
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		q += d.spi_size;
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return q;
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
136353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_D)));
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
136853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_vid_print(netdissect_options *ndo, u_char tpay _U_,
136953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
137053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
137153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
137253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
137653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_VID)));
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
137853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
137953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
138053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
138153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
138253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
138353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto trunc;
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (u_char *)ext + ntohs(e.len);
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
138853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_VID)));
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
139253f17a9db278d33517d9888dd77848f554522a38JP Abgrall/************************************************************/
139353f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*                                                          */
139453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*              IKE v2 - rfc4306 - dissector                */
139553f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*                                                          */
139653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/************************************************************/
139753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
139853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
139953f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_pay_print(netdissect_options *ndo, const char *payname, int critical)
140053f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
140153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"%s%s:", payname, critical&0x80 ? "[C]" : ""));
140253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
140353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
140553f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_gen_print(netdissect_options *ndo, u_char tpay,
140653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext)
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct isakmp_gen e;
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
141053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
141153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
141253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
141453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
141553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
141653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
141753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
141853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
142053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + ntohs(e.len);
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
142253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
142753f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_t_print(netdissect_options *ndo, u_char tpay _U_, int pcount,
142853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len,
142953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const u_char *ep, u_int32_t phase _U_, u_int32_t doi _U_,
143053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t proto _U_, int depth _U_)
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
143253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev2_t *p;
143353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_t t;
143453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int16_t  t_id;
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
143653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *idstr;
143753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct attrmap *map;
143853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	size_t nmap;
143953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *ep2;
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
144153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev2_t *)ext;
144253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
144353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&t, ext, sizeof(t));
144453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_T), t.h.critical);
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
144653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	t_id = ntohs(t.t_id);
144753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
144853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	map = NULL;
144953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	nmap = 0;
145053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
145153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch (t.t_type) {
145253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_T_ENCR:
145353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t_id, esp_p_map);
145453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		map = encr_t_map;
145553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		nmap = sizeof(encr_t_map)/sizeof(encr_t_map[0]);
145653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
145853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_T_PRF:
145953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t_id, prf_p_map);
146053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
146253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_T_INTEG:
146353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t_id, integ_p_map);
146453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
146653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_T_DH:
146753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t_id, dh_p_map);
146853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
147053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_T_ESN:
147153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = STR_OR_ID(t_id, esn_p_map);
147253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
147353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	default:
147553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		idstr = NULL;
147653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
147753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
147853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (idstr)
148053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," #%u type=%s id=%s ", pcount,
148153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  STR_OR_ID(t.t_type, ikev2_t_type_map),
148253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  idstr));
148353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else
148453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," #%u type=%s id=%u ", pcount,
148553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  STR_OR_ID(t.t_type, ikev2_t_type_map),
148653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  t.t_id));
148753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (u_char *)(p + 1);
148853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ep2 = (u_char *)p + item_len;
148953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	while (cp < ep && cp < ep2) {
149053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (map && nmap) {
149153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = ikev1_attrmap_print(ndo, cp, (ep < ep2) ? ep : ep2,
149253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				map, nmap);
149353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else
149453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = ikev1_attr_print(ndo, cp, (ep < ep2) ? ep : ep2);
14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
149653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ep < ep2)
149753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"..."));
14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return cp;
14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
150053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
150453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
150553f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_p_print(netdissect_options *ndo, u_char tpay _U_, int pcount _U_,
150653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext, u_int item_len _U_,
150753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       const u_char *ep, u_int32_t phase, u_int32_t doi0,
150853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       u_int32_t proto0 _U_, int depth)
15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
151053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct ikev2_p *p;
151153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_p prop;
151253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
151453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev2_p *)ext;
151553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
151653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
151753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_P), prop.h.critical);
15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
151953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," #%u protoid=%s transform=%d len=%u",
152053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  prop.p_no,  PROTOIDSTR(prop.prot_id),
152153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  prop.num_t, ntohs(prop.h.len)));
152253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (prop.spi_size) {
152353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," spi="));
152453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(p + 1), prop.spi_size))
152553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
152853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
152953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
153153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = ikev2_sub_print(ndo, NULL, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
153253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			     prop.prot_id, depth);
153353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
153453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return cp;
153553f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
153653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
153753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
153853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
154053f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
154153f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_sa_print(netdissect_options *ndo, u_char tpay,
154253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext1,
154353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
154453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
154553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
154653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
154753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
154853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int    osa_length, sa_length;
15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
155053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext1);
155153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext1, sizeof(e));
155253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, "sa", e.critical);
15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
155453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	osa_length= ntohs(e.len);
155553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	sa_length = osa_length - 4;
155653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", sa_length));
15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
155853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_sub_print(ndo, NULL, ISAKMP_NPTYPE_P,
155953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ext1+1, ep,
156053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			0, 0, 0, depth);
156153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
156253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext1 + osa_length;
156353f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
156453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
156553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
156653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
156853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
156953f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_ke_print(netdissect_options *ndo, u_char tpay,
157053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
157153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
157253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
157353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
157453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
157553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_ke ke;
157653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_ke *k;
157753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
157853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	k = (struct ikev2_ke *)ext;
157953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
158053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&ke, ext, sizeof(ke));
158153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), ke.h.critical);
158253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
158353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%u group=%s", ntohs(ke.h.len) - 8,
158453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  STR_OR_ID(ntohs(ke.ke_group), dh_p_map)));
158553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
158653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 8 < ntohs(ke.h.len)) {
158753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
158853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(k + 1), ntohs(ke.h.len) - 8))
158953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
159153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + ntohs(ke.h.len);
159253f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
159353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
159453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
159553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
159753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
159853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_ID_print(netdissect_options *ndo, u_char tpay,
159953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
160053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
160153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
160253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
160353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
160453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_id id;
160553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int id_len, idtype_len, i;
160653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	unsigned int dumpascii, dumphex;
160753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	unsigned char *typedata;
16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
160953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
161053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&id, ext, sizeof(id));
161153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), id.h.critical);
16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
161353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	id_len = ntohs(id.h.len);
16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
161553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", id_len - 4));
161653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < id_len) {
161753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
161853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), id_len - 4))
161953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
162053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
162253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	idtype_len =id_len - sizeof(struct ikev2_id);
162353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dumpascii = 0;
162453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dumphex   = 0;
162553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	typedata  = (unsigned char *)(ext)+sizeof(struct ikev2_id);
16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
162753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch(id.type) {
162853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_IPV4_ADDR:
162953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " ipv4:"));
163053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumphex=1;
163153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
163253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_FQDN:
163353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " fqdn:"));
163453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumpascii=1;
163553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
163653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_RFC822_ADDR:
163753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " rfc822:"));
163853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumpascii=1;
163953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
164053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_IPV6_ADDR:
164153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " ipv6:"));
164253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumphex=1;
164353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
164453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_DER_ASN1_DN:
164553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " dn:"));
164653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumphex=1;
164753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
164853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_DER_ASN1_GN:
164953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " gn:"));
165053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumphex=1;
165153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
165253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case ID_KEY_ID:
165353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " keyid:"));
165453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumphex=1;
165553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
165853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(dumpascii) {
165953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK2(*typedata, idtype_len);
166053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		for(i=0; i<idtype_len; i++) {
166153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if(ND_ISPRINT(typedata[i])) {
166253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo, "%c", typedata[i]));
166353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			} else {
166453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				ND_PRINT((ndo, "."));
166553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
166853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(dumphex) {
166953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)typedata, idtype_len))
167053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
167153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
167253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
167353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + id_len;
167453f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
167553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
167653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
167953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
168053f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_cert_print(netdissect_options *ndo, u_char tpay,
168153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
168253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
168353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
168453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
168653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
168753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
168953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
169053f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_cr_print(netdissect_options *ndo, u_char tpay,
169153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
169253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
169353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
169453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
169553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
169653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
169753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
169853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
169953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
170053f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_auth_print(netdissect_options *ndo, u_char tpay,
170153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
170253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
170353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
170453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
170553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
170653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_auth a;
170753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *v2_auth[]={ "invalid", "rsasig",
170853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				"shared-secret", "dsssig" };
170953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char *authdata = (u_char*)ext + sizeof(a);
171053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	unsigned int len;
171153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
171253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
171353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&a, ext, sizeof(a));
171453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), a.h.critical);
171553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	len = ntohs(a.h.len);
171653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
171753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d method=%s", len-4,
171853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  STR_OR_ID(a.auth_method, v2_auth)));
171953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
172053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (1 < ndo->ndo_vflag && 4 < len) {
172153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," authdata=("));
172253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)authdata, len - sizeof(a)))
172353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
172453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,") "));
172553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if(ndo->ndo_vflag && 4 < len) {
172653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(!ike_show_somedata(ndo, authdata, ep)) goto trunc;
172753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
172853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
172953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + len;
173053f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
173153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
173253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
173353f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
173453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
173553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
173653f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_nonce_print(netdissect_options *ndo, u_char tpay,
173753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
173853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
173953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
174053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
174153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
174253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
174353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
174453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
174553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
174653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, "nonce", e.critical);
174753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
174853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
174953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
175053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," nonce=("));
175153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
175253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
175353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,") "));
175453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if(ndo->ndo_vflag && 4 < ntohs(e.len)) {
175553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;
175653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
175753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
175853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + ntohs(e.len);
175953f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
176053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
176153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
176253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
176353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
176453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* notify payloads */
176553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
176653f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_n_print(netdissect_options *ndo, u_char tpay _U_,
176753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
176853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
176953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
177053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
177153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
177253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ikev2_n *p, n;
177353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
177453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char showspi, showdata, showsomedata;
177553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *notify_name;
177653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int32_t type;
177753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
177853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (struct ikev2_n *)ext;
177953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*p);
178053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&n, ext, sizeof(n));
178153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_N), n.h.critical);
178253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
178353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	showspi = 1;
178453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	showdata = 0;
178553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	showsomedata=0;
178653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	notify_name=NULL;
178753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
178853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," prot_id=%s", PROTOIDSTR(n.prot_id)));
178953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
179053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	type = ntohs(n.type);
179153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
179253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* notify space is annoying sparse */
179353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch(type) {
179453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD:
179553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "unsupported_critical_payload";
179653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
179753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
179853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
179953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_IKE_SPI:
180053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_ike_spi";
180153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
180253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
180353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
180453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_MAJOR_VERSION:
180553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_major_version";
180653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
180753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
180853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
180953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_SYNTAX:
181053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_syntax";
181153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
181253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
181353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
181453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_MESSAGE_ID:
181553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_message_id";
181653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
181753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
181853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
181953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_SPI:
182053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_spi";
182153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
182253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
182353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
182453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_NO_PROPOSAL_CHOSEN:
182553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "no_protocol_chosen";
182653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
182753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
182853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
182953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_KE_PAYLOAD:
183053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_ke_payload";
183153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
183253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
183353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
183453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_AUTHENTICATION_FAILED:
183553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "authentication_failed";
183653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
183753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
183853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
183953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_SINGLE_PAIR_REQUIRED:
184053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "single_pair_required";
184153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
184253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
184353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
184453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_NO_ADDITIONAL_SAS:
184553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "no_additional_sas";
184653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
184753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
184853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
184953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE:
185053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "internal_address_failure";
185153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
185253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
185353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
185453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_FAILED_CP_REQUIRED:
185553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "failed:cp_required";
185653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
185753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
185853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
185953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INVALID_SELECTORS:
186053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "invalid_selectors";
186153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
186253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
186353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
186453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_INITIAL_CONTACT:
186553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "initial_contact";
186653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
186753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
186853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
186953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_SET_WINDOW_SIZE:
187053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "set_window_size";
187153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
187253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
187353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
187453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE:
187553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "additional_ts_possible";
187653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
187753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
187853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
187953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_IPCOMP_SUPPORTED:
188053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "ipcomp_supported";
188153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
188253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
188353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
188453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP:
188553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "nat_detection_source_ip";
188653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
188753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
188853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
188953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP:
189053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "nat_detection_destination_ip";
189153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
189253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
189353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
189453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_COOKIE:
189553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "cookie";
189653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
189753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showsomedata= 1;
189853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showdata= 0;
189953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
190053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
190153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_USE_TRANSPORT_MODE:
190253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "use_transport_mode";
190353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
190453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
190553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
190653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED:
190753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "http_cert_lookup_supported";
190853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
190953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
191053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
191153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_REKEY_SA:
191253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "rekey_sa";
191353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 1;
191453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
191553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
191653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED:
191753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "tfc_padding_not_supported";
191853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
191953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
192053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
192153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO:
192253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		notify_name = "non_first_fragment_also";
192353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showspi = 0;
192453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
192553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
192653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	default:
192753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (type < 8192) {
192853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			notify_name="error";
192953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else if(type < 16384) {
193053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			notify_name="private-error";
193153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else if(type < 40960) {
193253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			notify_name="status";
193353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else {
193453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			notify_name="private-status";
193553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
193653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
193753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
193853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(notify_name) {
193953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," type=%u(%s)", type, notify_name));
194053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
194153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
194253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
194353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (showspi && n.spi_size) {
194453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," spi="));
194553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(p + 1), n.spi_size))
194653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
194753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
194853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
194953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (u_char *)(p + 1) + n.spi_size;
195053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
195153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(3 < ndo->ndo_vflag) {
195253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		showdata = 1;
195353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
195453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
195553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if ((showdata || (showsomedata && ep-cp < 30)) && cp < ep) {
195653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," data=("));
195753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(cp), ep - cp))
195853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
195953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
196053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,")"));
196153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
196253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if(showsomedata && cp < ep) {
196353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(!ike_show_somedata(ndo, cp, ep)) goto trunc;
196453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
196553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
196653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + item_len;
196753f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
196853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
196953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
197053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
197153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
197253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
197353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_d_print(netdissect_options *ndo, u_char tpay,
197453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
197553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
197653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
197753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
197853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
197953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
198053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
198153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
198253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
198353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_vid_print(netdissect_options *ndo, u_char tpay,
198453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
198553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
198653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
198753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
198853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
198953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
199053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *vid;
199153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int i, len;
199253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
199353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
199453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
199553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
199653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d vid=", ntohs(e.len) - 4));
199753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
199853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	vid = (const u_char *)(ext+1);
199953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	len = ntohs(e.len) - 4;
200053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK2(*vid, len);
200153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	for(i=0; i<len; i++) {
200253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(ND_ISPRINT(vid[i])) ND_PRINT((ndo, "%c", vid[i]));
200353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else ND_PRINT((ndo, "."));
200453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
200553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < len) {
200653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
200753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), ntohs(e.len) - 4))
200853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
200953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
201053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (u_char *)ext + ntohs(e.len);
201153f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
201253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
201353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
201453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
201553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
201653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
201753f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_TS_print(netdissect_options *ndo, u_char tpay,
201853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
201953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
202053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
202153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
202253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
202353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
202453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
202553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
202653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
202753f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_e_print(netdissect_options *ndo,
202853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_LIBCRYPTO
202953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      _U_
203053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
203153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      struct isakmp *base,
203253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_char tpay,
203353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      const struct isakmp_gen *ext,
203453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int item_len _U_, const u_char *ep _U_,
203553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_LIBCRYPTO
203653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      _U_
203753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
203853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t phase,
203953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_LIBCRYPTO
204053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      _U_
204153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
204253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t doi,
204353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_LIBCRYPTO
204453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      _U_
204553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
204653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      u_int32_t proto,
204753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef HAVE_LIBCRYPTO
204853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      _U_
204953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
205053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	      int depth)
205153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
205253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
205353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char *dat;
205453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	volatile int dlen;
205553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
205653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
205753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
205853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
205953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
206053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dlen = ntohs(e.len)-4;
206153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
206253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," len=%d", dlen));
206353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (2 < ndo->ndo_vflag && 4 < dlen) {
206453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," "));
206553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!rawprint(ndo, (caddr_t)(ext + 1), dlen))
206653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto trunc;
206753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
206853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
206953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dat = (u_char *)(ext+1);
207053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK2(*dat, dlen);
207153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
207253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_LIBCRYPTO
207353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* try to decypt it! */
207453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(esp_print_decrypt_buffer_by_ikev2(ndo,
207553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					     base->flags & ISAKMP_FLAG_I,
207653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					     base->i_ck, base->r_ck,
207753f17a9db278d33517d9888dd77848f554522a38JP Abgrall					     dat, dat+dlen)) {
207853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
207953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ext = (const struct isakmp_gen *)ndo->ndo_packetp;
208053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
208153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* got it decrypted, print stuff inside. */
208253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ikev2_sub_print(ndo, base, e.np, ext, ndo->ndo_snapend,
208353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				phase, doi, proto, depth+1);
208453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
208553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
208653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
208753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
208853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* always return NULL, because E must be at end, and NP refers
208953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * to what was inside.
209053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
209153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
209253f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
209353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
209453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
209553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
209653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
209753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
209853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_cp_print(netdissect_options *ndo, u_char tpay,
209953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
210053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
210153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
210253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
210353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
210453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
210553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
210653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
210753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
210853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_eap_print(netdissect_options *ndo, u_char tpay,
210953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext,
211053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int item_len _U_, const u_char *ep _U_,
211153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase _U_, u_int32_t doi _U_,
211253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t proto _U_, int depth _U_)
211353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
211453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ikev2_gen_print(ndo, tpay, ext);
211553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
211653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
211753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
211853f17a9db278d33517d9888dd77848f554522a38JP Abgrallike_sub0_print(netdissect_options *ndo,
211953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_char np, const struct isakmp_gen *ext, const u_char *ep,
212053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
212153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	       u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
212253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
212353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
212453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
212553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int item_len;
212653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
212753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (u_char *)ext;
212853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
212953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
213053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
213153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
213253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Since we can't have a payload length of less than 4 bytes,
213353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * we need to bail out here if the generic header is nonsensical
213453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * or truncated, otherwise we could loop forever processing
213553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * zero-length items or otherwise misdissect the packet.
213653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
213753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	item_len = ntohs(e.len);
213853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (item_len <= 4)
213953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return NULL;
214053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
214153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (NPFUNC(np)) {
214253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
214353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * XXX - what if item_len is too short, or too long,
214453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * for this payload type?
214553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
214653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = (*npfunc[np])(ndo, np, ext, item_len, ep, phase, doi, proto, depth);
214753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else {
214853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"%s", NPSTR(np)));
214953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp += item_len;
215053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
215153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
215253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return cp;
215353f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
215453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|isakmp]"));
215553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
215653f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
215753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
215853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
215953f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_sub_print(netdissect_options *ndo,
216053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_char np, const struct isakmp_gen *ext, const u_char *ep,
216153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
216253f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
216353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
216453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int i;
216553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
216653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
216753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (const u_char *)ext;
216853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
216953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	while (np) {
217053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(*ext);
217153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
217253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
217353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
217453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK2(*ext, ntohs(e.len));
217553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
217653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		depth++;
217753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"\n"));
217853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		for (i = 0; i < depth; i++)
217953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo,"    "));
218053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"("));
218153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = ike_sub0_print(ndo, np, ext, ep, phase, doi, proto, depth);
218253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,")"));
218353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		depth--;
218453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
218553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (cp == NULL) {
218653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Zero-length subitem */
218753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return NULL;
218853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
218953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
219053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		np = e.np;
219153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ext = (struct isakmp_gen *)cp;
219253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
219353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return cp;
219453f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
219553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(np)));
219653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
219753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
219853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
219953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char *
220053f17a9db278d33517d9888dd77848f554522a38JP Abgrallnumstr(int x)
220153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
220253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	static char buf[20];
220353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	snprintf(buf, sizeof(buf), "#%d", x);
220453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return buf;
220553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
220653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
220753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
220853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev1_print(netdissect_options *ndo,
220953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp,  u_int length,
221053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp2, struct isakmp *base)
221153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
221253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct isakmp *p;
221353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *ep;
221453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char np;
221553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int i;
221653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int phase;
221753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
221853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (const struct isakmp *)bp;
221953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ep = ndo->ndo_snapend;
222053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
222153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
222253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (phase == 1)
222353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," phase %d", phase));
222453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else
222553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," phase %d/others", phase));
222653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
222753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	i = cookie_find(&base->i_ck);
222853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (i < 0) {
222953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (iszero((u_char *)&base->r_ck, sizeof(base->r_ck))) {
223053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* the first packet */
223153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," I"));
223253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (bp2)
223353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				cookie_record(&base->i_ck, bp2);
223453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else
223553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," ?"));
223653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else {
223753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (bp2 && cookie_isinitiator(i, bp2))
223853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," I"));
223953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else if (bp2 && cookie_isresponder(i, bp2))
224053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," R"));
224153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
224253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," ?"));
224353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
224453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
224553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," %s", ETYPESTR(base->etype)));
224653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (base->flags) {
224753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"[%s%s]", base->flags & ISAKMP_FLAG_E ? "E" : "",
224853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  base->flags & ISAKMP_FLAG_C ? "C" : ""));
224953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
225053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
225153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
225253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext;
225353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
225453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,":"));
225553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
225653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* regardless of phase... */
225753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (base->flags & ISAKMP_FLAG_E) {
225853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
225953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * encrypted, nothing we can do right now.
226053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * we hope to decrypt the packet in the future...
226153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
226253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," [encrypted %s]", NPSTR(base->np)));
226353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto done;
226453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
226553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
226653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		CHECKLEN(p + 1, base->np);
226753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		np = base->np;
226853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ext = (struct isakmp_gen *)(p + 1);
226953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ikev1_sub_print(ndo, np, ext, ep, phase, 0, 0, 0);
227053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
227153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
227253f17a9db278d33517d9888dd77848f554522a38JP Abgralldone:
227353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
227453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ntohl(base->len) != length) {
227553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo," (len mismatch: isakmp %u/ip %u)",
227653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  (u_int32_t)ntohl(base->len), length));
227753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
227853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
227953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
228053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
228153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
228253f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_sub0_print(netdissect_options *ndo, struct isakmp *base,
228353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_char np, int pcount,
228453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 const struct isakmp_gen *ext, const u_char *ep,
228553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
228653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
228753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
228853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
228953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int item_len;
229053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
229153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (u_char *)ext;
229253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(*ext);
229353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
229453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
229553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
229653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Since we can't have a payload length of less than 4 bytes,
229753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * we need to bail out here if the generic header is nonsensical
229853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * or truncated, otherwise we could loop forever processing
229953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * zero-length items or otherwise misdissect the packet.
230053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
230153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	item_len = ntohs(e.len);
230253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (item_len <= 4)
230353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return NULL;
230453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
230553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(np == ISAKMP_NPTYPE_P) {
230653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = ikev2_p_print(ndo, np, pcount, ext, item_len,
230753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   ep, phase, doi, proto, depth);
230853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if(np == ISAKMP_NPTYPE_T) {
230953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = ikev2_t_print(ndo, np, pcount, ext, item_len,
231053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   ep, phase, doi, proto, depth);
231153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if(np == ISAKMP_NPTYPE_v2E) {
231253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = ikev2_e_print(ndo, base, np, ext, item_len,
231353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   ep, phase, doi, proto, depth);
231453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else if (NPFUNC(np)) {
231553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
231653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * XXX - what if item_len is too short, or too long,
231753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * for this payload type?
231853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
231953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = (*npfunc[np])(ndo, np, /*pcount,*/ ext, item_len,
232053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				   ep, phase, doi, proto, depth);
232153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else {
232253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"%s", NPSTR(np)));
232353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp += item_len;
232453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
232553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
232653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return cp;
232753f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
232853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|isakmp]"));
232953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
233053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
233153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
233253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const u_char *
233353f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_sub_print(netdissect_options *ndo,
233453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		struct isakmp *base,
233553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_char np, const struct isakmp_gen *ext, const u_char *ep,
233653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
233753f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
233853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *cp;
233953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int i;
234053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int pcount;
234153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp_gen e;
234253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
234353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cp = (const u_char *)ext;
234453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	pcount = 0;
234553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	while (np) {
234653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		pcount++;
234753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(*ext);
234853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
234953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
235053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
235153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK2(*ext, ntohs(e.len));
235253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
235353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		depth++;
235453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"\n"));
235553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		for (i = 0; i < depth; i++)
235653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo,"    "));
235753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"("));
235853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		cp = ikev2_sub0_print(ndo, base, np, pcount,
235953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				      ext, ep, phase, doi, proto, depth);
236053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,")"));
236153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		depth--;
236253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
236353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (cp == NULL) {
236453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Zero-length subitem */
236553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return NULL;
236653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
236753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
236853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		np = e.np;
236953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ext = (struct isakmp_gen *)cp;
237053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
237153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return cp;
237253f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
237353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo," [|%s]", NPSTR(np)));
237453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
237553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
237653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
237753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
237853f17a9db278d33517d9888dd77848f554522a38JP Abgrallikev2_print(netdissect_options *ndo,
237953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp,  u_int length,
238053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    const u_char *bp2 _U_, struct isakmp *base)
238153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
238253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct isakmp *p;
238353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *ep;
238453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_char np;
238553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int phase;
238653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
238753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (const struct isakmp *)bp;
238853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ep = ndo->ndo_snapend;
238953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
239053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
239153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (phase == 1)
239253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " parent_sa"));
239353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else
239453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, " child_sa "));
239553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
239653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo, " %s", ETYPESTR(base->etype)));
239753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (base->flags) {
239853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, "[%s%s%s]",
239953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  base->flags & ISAKMP_FLAG_I ? "I" : "",
240053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  base->flags & ISAKMP_FLAG_V ? "V" : "",
240153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			  base->flags & ISAKMP_FLAG_R ? "R" : ""));
240253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
240353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
240453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
240553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const struct isakmp_gen *ext;
240653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
240753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, ":"));
240853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
240953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* regardless of phase... */
241053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (base->flags & ISAKMP_FLAG_E) {
241153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
241253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * encrypted, nothing we can do right now.
241353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * we hope to decrypt the packet in the future...
241453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
241553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo, " [encrypted %s]", NPSTR(base->np)));
241653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			goto done;
241753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
241853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
241953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		CHECKLEN(p + 1, base->np)
242053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
242153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		np = base->np;
242253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ext = (struct isakmp_gen *)(p + 1);
242353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ikev2_sub_print(ndo, base, np, ext, ep, phase, 0, 0, 0);
242453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
242553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
242653f17a9db278d33517d9888dd77848f554522a38JP Abgralldone:
242753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
242853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ntohl(base->len) != length) {
242953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo, " (len mismatch: isakmp %u/ip %u)",
243053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  (u_int32_t)ntohl(base->len), length));
243153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
243253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
243353f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
243453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
243553f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
243653f17a9db278d33517d9888dd77848f554522a38JP Abgrallisakmp_print(netdissect_options *ndo,
243753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     const u_char *bp, u_int length,
243853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	     const u_char *bp2)
243953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
244053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct isakmp *p;
244153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct isakmp base;
244253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const u_char *ep;
244353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int major, minor;
244453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
244553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_LIBCRYPTO
244653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* initialize SAs */
244753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_sa_list_head == NULL) {
244853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ndo->ndo_espsecret)
244953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			esp_print_decodesecret(ndo);
245053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
245153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
245253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
245353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	p = (const struct isakmp *)bp;
245453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ep = ndo->ndo_snapend;
245553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
245653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if ((struct isakmp *)ep < p + 1) {
245753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"[|isakmp]"));
245853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return;
245953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
246053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
246153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	UNALIGNED_MEMCPY(&base, p, sizeof(base));
246253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
246353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"isakmp"));
246453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	major = (base.vers & ISAKMP_VERS_MAJOR)
246553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		>> ISAKMP_VERS_MAJOR_SHIFT;
246653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	minor = (base.vers & ISAKMP_VERS_MINOR)
246753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		>> ISAKMP_VERS_MINOR_SHIFT;
246853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
246953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
247053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," %d.%d", major, minor));
247153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
247253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
247353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
247453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," msgid "));
247553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		hexprint(ndo, (caddr_t)&base.msgid, sizeof(base.msgid));
247653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
247753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
247853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (1 < ndo->ndo_vflag) {
247953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo," cookie "));
248053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		hexprint(ndo, (caddr_t)&base.i_ck, sizeof(base.i_ck));
248153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo,"->"));
248253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		hexprint(ndo, (caddr_t)&base.r_ck, sizeof(base.r_ck));
248353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
248453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,":"));
248553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
248653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch(major) {
248753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IKEv1_MAJOR_VERSION:
248853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ikev1_print(ndo, bp, length, bp2, &base);
248953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
249053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
249153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	case IKEv2_MAJOR_VERSION:
249253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ikev2_print(ndo, bp, length, bp2, &base);
249353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		break;
249453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
249553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
249653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
249753f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
249853f17a9db278d33517d9888dd77848f554522a38JP Abgrallisakmp_rfc3948_print(netdissect_options *ndo,
249953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		     const u_char *bp, u_int length,
250053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		     const u_char *bp2)
250153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
250253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
250353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if(length == 1 && bp[0]==0xff) {
250453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, "isakmp-nat-keep-alive"));
250553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return;
250653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
25072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(length < 4) {
25092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
25102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
251153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
25122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
25132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * see if this is an IKE packet
25142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
25152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) {
25162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ND_PRINT((ndo, "NONESP-encap: "));
25172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		isakmp_print(ndo, bp+4, length-4, bp2);
25182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
25192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
25202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* must be an ESP packet */
25222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
25232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int nh, enh, padlen;
25242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int advance;
25252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ND_PRINT((ndo, "UDP-encap: "));
25272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		advance = esp_print(ndo, bp, length, bp2, &enh, &padlen);
25292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if(advance <= 0)
25302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
25312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bp += advance;
25332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length -= advance + padlen;
25342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nh = enh & 0xff;
25352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip_print_inner(ndo, bp, length, nh, bp2);
25372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
25382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
25392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
254153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo,"[|isakmp]"));
25422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
25432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
25442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
25452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
25462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
25472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
25482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
25492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
25502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
255153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
255253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
255353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
255453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2555