12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Arnaldo Carvalho de Melo 2004
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Ian McDonald 2005
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (C) Yoshifumi Nishida 2005
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This software may be distributed either under the terms of the
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * BSD-style license that accompanies tcpdump or the GNU GPL version 2
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-dccp.c,v 1.8 2007-11-09 00:44:09 guy Exp $ (LBL)";
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "dccp.h"
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h"
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *dccp_reset_codes[] = {
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"unspecified",
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"closed",
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"aborted",
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"no_connection",
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"packet_error",
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"option_error",
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"mandatory_error",
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"connection_refused",
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"bad_service_code",
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"too_busy",
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"bad_init_cookie",
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"aggression_penalty",
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *dccp_feature_nums[] = {
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"reserved",
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"ccid",
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"allow_short_seqno",
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"sequence_window",
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"ecn_incapable",
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"ack_ratio",
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"send_ack_vector",
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"send_ndp_count",
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"minimum checksum coverage",
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"check data checksum",
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic inline u_int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len)
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int cov;
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (DCCPH_CSCOV(dh) == 0)
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return len;
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	cov = (dh->dccph_doff + DCCPH_CSCOV(dh) - 1) * sizeof(u_int32_t);
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (cov > len)? len : cov;
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int dccp_cksum(const struct ip *ip,
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct dccp_hdr *dh, u_int len)
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return nextproto4_cksum(ip, (const u_int8_t *)(void *)dh,
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    dccp_csum_coverage(dh, len), IPPROTO_DCCP);
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int dccp6_cksum(const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len)
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return nextproto6_cksum(ip6, (const u_int8_t *)(void *)dh,
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    dccp_csum_coverage(dh, len), IPPROTO_DCCP);
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *dccp_reset_code(u_int8_t code)
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (code >= __DCCP_RESET_CODE_LAST)
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return "invalid";
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return dccp_reset_codes[code];
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int64_t dccp_seqno(const struct dccp_hdr *dh)
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t seq_high = DCCPH_SEQ(dh);
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int64_t seqno = EXTRACT_24BITS(&seq_high) & 0xFFFFFF;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (DCCPH_X(dh) != 0) {
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct dccp_hdr_ext *dhx = (void *)(dh + 1);
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t seq_low = dhx->dccph_seq_low;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		seqno &= 0x00FFFF;  /* clear reserved field */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		seqno = (seqno << 32) + EXTRACT_32BITS(&seq_low);
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return seqno;
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline unsigned int dccp_basic_hdr_len(const struct dccp_hdr *dh)
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return sizeof(*dh) + (DCCPH_X(dh) ? sizeof(struct dccp_hdr_ext) : 0);
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void dccp_print_ack_no(const u_char *bp)
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct dccp_hdr *dh = (const struct dccp_hdr *)bp;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct dccp_hdr_ack_bits *dh_ack =
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(struct dccp_hdr_ack_bits *)(bp + dccp_basic_hdr_len(dh));
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t ack_high;
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int64_t ackno;
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*dh_ack,4);
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ack_high = DCCPH_ACK(dh_ack);
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ackno = EXTRACT_24BITS(&ack_high) & 0xFFFFFF;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (DCCPH_X(dh) != 0) {
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int32_t ack_low;
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK2(*dh_ack,8);
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ack_low = dh_ack->dccph_ack_nr_low;
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ackno &= 0x00FFFF;  /* clear reserved field */
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ackno = (ackno << 32) + EXTRACT_32BITS(&ack_low);
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("(ack=%" PRIu64 ") ", ackno);
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline unsigned int dccp_packet_hdr_len(const u_int8_t type)
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (type == DCCP_PKT_DATA)
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return 0;
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (type == DCCP_PKT_DATAACK	||
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    type == DCCP_PKT_ACK	||
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    type == DCCP_PKT_SYNC	||
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    type == DCCP_PKT_SYNCACK	||
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    type == DCCP_PKT_CLOSE	||
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    type == DCCP_PKT_CLOSEREQ)
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return sizeof(struct dccp_hdr_ack_bits);
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (type == DCCP_PKT_REQUEST)
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return sizeof(struct dccp_hdr_request);
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (type == DCCP_PKT_RESPONSE)
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return sizeof(struct dccp_hdr_response);
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return sizeof(struct dccp_hdr_reset);
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int dccp_print_option(const u_char *option);
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/**
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * dccp_print - show dccp packet
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @bp - beginning of dccp packet
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @data2 - beginning of enclosing
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * @len - lenght of ip packet
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid dccp_print(const u_char *bp, const u_char *data2, u_int len)
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct dccp_hdr *dh;
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct ip *ip;
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct ip6_hdr *ip6;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const u_char *cp;
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short sport, dport;
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int hlen;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int extlen = 0;
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dh = (const struct dccp_hdr *)bp;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)data2;
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (IP_V(ip) == 6)
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (const struct ip6_hdr *)data2;
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = NULL;
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (const u_char *)(dh + 1);
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cp > snapend) {
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[Invalid packet|dccp]");
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (len < sizeof(struct dccp_hdr)) {
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("truncated-dccp - %ld bytes missing!",
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     (long)len - sizeof(struct dccp_hdr));
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sport = EXTRACT_16BITS(&dh->dccph_sport);
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dport = EXTRACT_16BITS(&dh->dccph_dport);
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hlen = dh->dccph_doff * 4;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ip6) {
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s.%d > %s.%d: ",
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     ip6addr_string(&ip6->ip6_src), sport,
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     ip6addr_string(&ip6->ip6_dst), dport);
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s.%d > %s.%d: ",
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     ipaddr_string(&ip->ip_src), sport,
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     ipaddr_string(&ip->ip_dst), dport);
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fflush(stdout);
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (qflag) {
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" %d", len - hlen);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (hlen > len) {
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("dccp [bad hdr length %u - too long, > %u]",
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    hlen, len);
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* other variables in generic header */
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("CCVal %d, CsCov %d, ", DCCPH_CCVAL(dh), DCCPH_CSCOV(dh));
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* checksum calculation */
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (vflag && TTEST2(bp[0], len)) {
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int16_t sum = 0, dccp_sum;
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dccp_sum = EXTRACT_16BITS(&dh->dccph_checksum);
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(void)printf("cksum 0x%04x ", dccp_sum);
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (IP_V(ip) == 4)
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			sum = dccp_cksum(ip, dh, len);
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else if (IP_V(ip) == 6)
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sum = dccp6_cksum(ip6, dh, len);
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (sum != 0)
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void)printf("(incorrect -> 0x%04x), ",in_cksum_shouldbe(dccp_sum, sum));
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void)printf("(correct), ");
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (DCCPH_TYPE(dh)) {
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_REQUEST: {
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct dccp_hdr_request *dhr =
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(struct dccp_hdr_request *)(bp + dccp_basic_hdr_len(dh));
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*dhr);
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("request (service=%d) ",
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     EXTRACT_32BITS(&dhr->dccph_req_service));
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 4;
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_RESPONSE: {
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct dccp_hdr_response *dhr =
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(struct dccp_hdr_response *)(bp + dccp_basic_hdr_len(dh));
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*dhr);
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("response (service=%d) ",
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     EXTRACT_32BITS(&dhr->dccph_resp_service));
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 12;
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_DATA:
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("data ");
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_ACK: {
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("ack ");
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_DATAACK: {
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("dataack ");
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_CLOSEREQ:
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("closereq ");
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_CLOSE:
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("close ");
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_RESET: {
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		struct dccp_hdr_reset *dhr =
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(struct dccp_hdr_reset *)(bp + dccp_basic_hdr_len(dh));
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*dhr);
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("reset (code=%s) ",
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     dccp_reset_code(dhr->dccph_reset_code));
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 12;
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_SYNC:
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("sync ");
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case DCCP_PKT_SYNCACK:
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("syncack ");
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		extlen += 8;
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("invalid ");
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((DCCPH_TYPE(dh) != DCCP_PKT_DATA) &&
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(DCCPH_TYPE(dh) != DCCP_PKT_REQUEST))
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dccp_print_ack_no(bp);
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("seq %" PRIu64, dccp_seqno(dh));
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* process options */
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (hlen > dccp_basic_hdr_len(dh) + extlen){
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *cp;
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int optlen;
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp = bp + dccp_basic_hdr_len(dh) + extlen;
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" <");
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen -= dccp_basic_hdr_len(dh) + extlen;
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		while(1){
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*cp);
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			optlen = dccp_print_option(cp);
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!optlen) goto trunc2;
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (hlen <= optlen) break;
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			hlen -= optlen;
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp += optlen;
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", ");
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(">");
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("[|dccp]");
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc2:
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return;
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int dccp_print_option(const u_char *option)
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t optlen, i;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*option);
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*option >= 32) {
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(*(option+1));
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		optlen = *(option +1);
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (optlen < 2) {
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("Option %d optlen too short",*option);
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 1;
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else optlen = 1;
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*option,optlen);
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (*option){
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0:
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("nop");
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1:
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("mandatory");
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2:
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("slowreceiver");
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 32:
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("change_l");
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*(option +2) < 10){
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", dccp_feature_nums[*(option +2)]);
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < optlen -3; i ++) printf(" %d", *(option +3 + i));
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 33:
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("confirm_l");
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*(option +2) < 10){
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", dccp_feature_nums[*(option +2)]);
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < optlen -3; i ++) printf(" %d", *(option +3 + i));
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 34:
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        printf("change_r");
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*(option +2) < 10){
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", dccp_feature_nums[*(option +2)]);
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < optlen -3; i ++) printf(" %d", *(option +3 + i));
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 35:
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("confirm_r");
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*(option +2) < 10){
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", dccp_feature_nums[*(option +2)]);
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (i = 0; i < optlen -3; i ++) printf(" %d", *(option +3 + i));
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 36:
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("initcookie 0x");
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf("%02x", *(option +2 + i));
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 37:
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ndp_count");
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf(" %d", *(option +2 + i));
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 38:
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ack_vector0 0x");
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf("%02x", *(option +2 + i));
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 39:
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ack_vector1 0x");
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf("%02x", *(option +2 + i));
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 40:
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("data_dropped 0x");
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf("%02x", *(option +2 + i));
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 41:
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("timestamp %u", EXTRACT_32BITS(option + 2));
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 42:
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printf("timestamp_echo %u", EXTRACT_32BITS(option + 2));
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 43:
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("elapsed_time ");
43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (optlen == 6)
43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("%u", EXTRACT_32BITS(option + 2));
43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("%u", EXTRACT_16BITS(option + 2));
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 44:
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("data_checksum ");
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = 0; i < optlen -2; i ++) printf("%02x", *(option +2 + i));
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default :
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (*option >= 128) {
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("CCID option %d",*option);
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (optlen) {
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				case 4:
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					printf(" %u", EXTRACT_16BITS(option + 2));
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				case 6:
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					printf(" %u", EXTRACT_32BITS(option + 2));
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				default:
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("unknown_opt %d", *option);
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return optlen;
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf("[|dccp]");
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return 0;
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
465