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