12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1999-2004 The tcpdump.org project 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.120.2.3 2005/10/16 06:05:46 guy Exp $ (LBL)"; 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h" 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h" 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_auth.h" 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_msg.h" 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nameser.h" 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <openssl/md5.h> 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SIGNATURE_VALID 0 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define SIGNATURE_INVALID 1 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define CANT_CHECK_SIGNATURE 2 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int tcp_verify_signature(const struct ip *ip, const struct tcphdr *tp, 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *data, int length, const u_char *rcvsig); 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void print_tcp_rst_data(register const u_char *sp, u_int length); 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAX_RST_DATA_LEN 30 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct tha { 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef INET6 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr src; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr dst; 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr src; 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr dst; 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int port; 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct tcp_seq_hash { 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tcp_seq_hash *nxt; 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tha addr; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcp_seq seq; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcp_seq ack; 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TSEQ_HASHSIZE 919 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* These tcp optinos do not have the size octet */ 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ZEROLENOPT(o) ((o) == TCPOPT_EOL || (o) == TCPOPT_NOP) 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tcp_seq_hash tcp_seq_hash[TSEQ_HASHSIZE]; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef TELNET_PORT 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TELNET_PORT 23 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef BGP_PORT 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BGP_PORT 179 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NETBIOS_SSN_PORT 139 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef PPTP_PORT 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PPTP_PORT 1723 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define BEEP_PORT 10288 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef NFS_PORT 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define NFS_PORT 2049 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MSDP_PORT 639 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LDP_PORT 646 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int tcp_cksum(register const struct ip *ip, 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct tcphdr *tp, 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int len) 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union phu { 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct phdr { 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t src; 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t dst; 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char mbz; 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char proto; 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t len; 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } ph; 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pa[6]; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } phu; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_int16_t *sp; 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* pseudo-header.. */ 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.len = htons((u_int16_t)len); 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.mbz = 0; 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.proto = IPPROTO_TCP; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t)); 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_HL(ip) == 5) 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t)); 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.dst = ip_finddst(ip); 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sp = &phu.pa[0]; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return in_cksum((u_short *)tp, len, 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]); 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int tcp6_cksum(const struct ip6_hdr *ip6, const struct tcphdr *tp, 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int len) 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t i; 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_int16_t *sp; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t sum; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct { 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr ph_src; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in6_addr ph_dst; 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ph_len; 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ph_zero[3]; 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ph_nxt; 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } ph; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t pa[20]; 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } phu; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* pseudo-header */ 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&phu, 0, sizeof(phu)); 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.ph_src = ip6->ip6_src; 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.ph_dst = ip6->ip6_dst; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.ph_len = htonl(len); 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project phu.ph.ph_nxt = IPPROTO_TCP; 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = 0; 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum += phu.pa[i]; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sp = (const u_int16_t *)tp; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < (len & ~1); i += 2) 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum += *sp++; 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len & 1) 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum += htons((*(const u_int8_t *)sp) << 8); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (sum > 0xffff) 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = (sum & 0xffff) + (sum >> 16); 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = ~sum & 0xffff; 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (sum); 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttcp_print(register const u_char *bp, register u_int length, 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *bp2, int fragmented) 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct tcphdr *tp; 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ip *ip; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_char flags; 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int hlen; 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register char ch; 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t sport, dport, win, urp; 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t seq, ack, thseq, thack; 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int threv; 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ip6_hdr *ip6; 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp = (struct tcphdr *)bp; 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip = (struct ip *)bp2; 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 6) 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = (struct ip6_hdr *)bp2; 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = NULL; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ch = '\0'; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST(tp->th_dport)) { 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: [|tcp]", 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_src), 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_dst)); 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sport = EXTRACT_16BITS(&tp->th_sport); 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dport = EXTRACT_16BITS(&tp->th_dport); 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen = TH_OFF(tp) * 4; 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If data present, header length valid, and NFS port used, 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * assume NFS. 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Pass offset of data plus 4 bytes for RPC TCP msg length 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to NFS print routines. 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!qflag && hlen >= sizeof(*tp) && hlen <= length) { 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((u_char *)tp + 4 + sizeof(struct sunrpc_msg) <= snapend && 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dport == NFS_PORT) { 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nfsreq_print((u_char *)tp + hlen + 4, length - hlen, 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_char *)ip); 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if ((u_char *)tp + 4 + sizeof(struct sunrpc_msg) 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project <= snapend && 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sport == NFS_PORT) { 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nfsreply_print((u_char *)tp + hlen + 4, length - hlen, 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (u_char *)ip); 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6) { 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6->ip6_nxt == IPPROTO_TCP) { 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s.%s > %s.%s: ", 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_src), 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6addr_string(&ip6->ip6_dst), 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(dport)); 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: ", 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), tcpport_string(dport)); 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/ 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip->ip_p == IPPROTO_TCP) { 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s.%s > %s.%s: ", 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_src), 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(&ip->ip_dst), 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(dport)); 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%s > %s: ", 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcpport_string(sport), tcpport_string(dport)); 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen < sizeof(*tp)) { 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" tcp %d [bad hdr length %u - too short, < %lu]", 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length - hlen, hlen, (unsigned long)sizeof(*tp)); 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*tp); 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq = EXTRACT_32BITS(&tp->th_seq); 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ack = EXTRACT_32BITS(&tp->th_ack); 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project win = EXTRACT_16BITS(&tp->th_win); 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project urp = EXTRACT_16BITS(&tp->th_urp); 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (qflag) { 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("tcp %d", length - hlen); 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen > length) { 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [bad hdr length %u - too long, > %u]", 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen, length); 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((flags = tp->th_flags) & (TH_SYN|TH_FIN|TH_RST|TH_PUSH| 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TH_ECNECHO|TH_CWR)) { 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_SYN) 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('S'); 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_FIN) 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('F'); 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_RST) 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('R'); 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_PUSH) 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('P'); 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_CWR) 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('W'); /* congestion _W_indow reduced (ECN) */ 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_ECNECHO) 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('E'); /* ecn _E_cho sent (ECN) */ 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('.'); 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!Sflag && (flags & TH_ACK)) { 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register struct tcp_seq_hash *th; 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const void *src, *dst; 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int rev; 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tha tha; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Find (or record) the initial sequence numbers for 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this conversation. (we pick an arbitrary 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * collating order so there's only one entry for 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * both directions). 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(&tha, 0, sizeof(tha)); 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 0; 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ip6) { 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project src = &ip6->ip6_src; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst = &ip6->ip6_dst; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sport > dport) 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == dport) { 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(src, dst, sizeof ip6->ip6_dst) > 0) 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rev) { 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, dst, sizeof ip6->ip6_dst); 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, src, sizeof ip6->ip6_src); 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = dport << 16 | sport; 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, dst, sizeof ip6->ip6_dst); 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, src, sizeof ip6->ip6_src); 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = sport << 16 | dport; 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project src = &ip->ip_src; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst = &ip->ip_dst; 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sport > dport) 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == dport) { 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(src, dst, sizeof ip->ip_dst) > 0) 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rev) { 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, dst, sizeof ip->ip_dst); 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, src, sizeof ip->ip_src); 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = dport << 16 | sport; 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, dst, sizeof ip->ip_dst); 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, src, sizeof ip->ip_src); 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = sport << 16 | dport; 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 0; 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project src = &ip->ip_src; 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project dst = &ip->ip_dst; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sport > dport) 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == dport) { 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(src, dst, sizeof ip->ip_dst) > 0) 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project rev = 1; 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rev) { 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, dst, sizeof ip->ip_dst); 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, src, sizeof ip->ip_src); 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = dport << 16 | sport; 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.dst, dst, sizeof ip->ip_dst); 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(&tha.src, src, sizeof ip->ip_src); 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tha.port = sport << 16 | dport; 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project threv = rev; 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE]; 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project th->nxt; th = th->nxt) 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp((char *)&tha, (char *)&th->addr, 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sizeof(th->addr)) == 0) 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!th->nxt || (flags & TH_SYN)) { 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* didn't find it or new conversation */ 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (th->nxt == NULL) { 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project th->nxt = (struct tcp_seq_hash *) 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project calloc(1, sizeof(*th)); 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (th->nxt == NULL) 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project error("tcp_print: calloc"); 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project th->addr = tha; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rev) 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project th->ack = seq, th->seq = ack - 1; 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project th->seq = seq, th->ack = ack - 1; 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (rev) 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq -= th->ack, ack -= th->seq; 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project seq -= th->seq, ack -= th->ack; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project thseq = th->seq; 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project thack = th->ack; 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /*fool gcc*/ 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project thseq = thack = threv = 0; 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen > length) { 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" [bad hdr length %u - too long, > %u]", 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen, length); 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 4 && vflag && !fragmented) { 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t sum, tcp_sum; 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(tp->th_sport, length)) { 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = tcp_cksum(ip, tp, length); 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum)); 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sum != 0) { 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcp_sum = EXTRACT_16BITS(&tp->th_sum); 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" (incorrect (-> 0x%04x),",in_cksum_shouldbe(tcp_sum, sum)); 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" (correct),"); 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !fragmented) { 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t sum,tcp_sum; 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(tp->th_sport, length)) { 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sum = tcp6_cksum(ip6, tp, length); 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum)); 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sum != 0) { 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tcp_sum = EXTRACT_16BITS(&tp->th_sum); 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" (incorrect (-> 0x%04x),",in_cksum_shouldbe(tcp_sum, sum)); 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" (correct),"); 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length -= hlen; 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u:%u(%u)", seq, seq + length, length); 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_ACK) 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" ack %u", ack); 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" win %d", win); 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_URG) 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" urg %d", urp); 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Handle any options. 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (hlen > sizeof(*tp)) { 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const u_char *cp; 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int i, opt, datalen; 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int len; 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen -= sizeof(*tp); 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp = (const u_char *)tp + sizeof(*tp); 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ch = '<'; 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (hlen > 0) { 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(ch); 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*cp); 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project opt = *cp++; 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ZEROLENOPT(opt)) 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = 1; 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(*cp); 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = *cp++; /* total including type, len */ 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (len < 2 || len > hlen) 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto bad; 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project --hlen; /* account for length byte */ 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project --hlen; /* account for type byte */ 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 0; 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Bail if "l" bytes of data are not left or were not captured */ 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LENCHECK(l) { if ((l) > hlen) goto bad; TCHECK2(*cp, l); } 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (opt) { 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_MAXSEG: 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("mss"); 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 2; 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_16BITS(cp)); 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_EOL: 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("eol"); 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_NOP: 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("nop"); 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_WSCALE: 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("wscale"); 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 1; 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", *cp); 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_SACKOK: 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("sackOK"); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_SACK: 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = len - 2; 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (datalen % 8 != 0) { 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("malformed sack"); 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t s, e; 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("sack %d ", datalen / 8); 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < datalen; i += 8) { 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(i + 4); 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s = EXTRACT_32BITS(cp + i); 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(i + 8); 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project e = EXTRACT_32BITS(cp + i + 4); 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (threv) { 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s -= thseq; 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project e -= thseq; 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project s -= thack; 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project e -= thack; 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("{%u:%u}", s, e); 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_ECHO: 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("echo"); 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 4; 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_ECHOREPLY: 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("echoreply"); 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 4; 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_TIMESTAMP: 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("timestamp"); 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 8; 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(4); 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp + 4)); 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_CC: 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("cc"); 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 4; 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_CCNEW: 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("ccnew"); 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 4; 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_CCECHO: 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("ccecho"); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = 4; 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf(" %u", EXTRACT_32BITS(cp)); 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case TCPOPT_SIGNATURE: 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("md5:"); 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = TCP_SIGLEN; 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(datalen); 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (tcp_verify_signature(ip, tp, 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp + TH_OFF(tp) * 4, length, cp)) { 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case SIGNATURE_VALID: 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("valid"); 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case SIGNATURE_INVALID: 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("invalid"); 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case CANT_CHECK_SIGNATURE: 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("can't check - "); 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < TCP_SIGLEN; ++i) 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%02x", cp[i]); 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < TCP_SIGLEN; ++i) 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%02x", cp[i]); 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("opt-%u:", opt); 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project datalen = len - 2; 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (i = 0; i < datalen; ++i) { 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LENCHECK(i); 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("%02x", cp[i]); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Account for data printed */ 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project cp += datalen; 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hlen -= datalen; 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Check specification against observed length */ 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++datalen; /* option octet */ 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!ZEROLENOPT(opt)) 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ++datalen; /* size octet */ 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (datalen != len) 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (void)printf("[len %d]", len); 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ch = ','; 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (opt == TCPOPT_EOL) 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('>'); 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length <= 0) 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Decode payload if necessary. 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp += TH_OFF(tp) * 4; 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_RST) { 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag) 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_tcp_rst_data(bp, length); 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sport == TELNET_PORT || dport == TELNET_PORT) { 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!qflag && vflag) 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project telnet_print(bp, length); 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (sport == BGP_PORT || dport == BGP_PORT) 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bgp_print(bp, length); 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == PPTP_PORT || dport == PPTP_PORT) 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pptp_print(bp); 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef TCPDUMP_DO_SMB 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT) 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nbt_tcp_print(bp, length); 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (sport == BEEP_PORT || dport == BEEP_PORT) 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project beep_print(bp, length); 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (length > 2 && 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT || 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) { 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * TCP DNS query has 2byte length at the head. 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * XXX packet could be unaligned, it can go strange 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ns_print(bp + 2, length - 2, 0); 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (sport == MSDP_PORT || dport == MSDP_PORT) { 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msdp_print(bp, length); 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) { 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ldp_print(bp, length); 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbad: 6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[bad opt]", stdout); 6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ch != '\0') 6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('>'); 6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("[|tcp]", stdout); 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ch != '\0') 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('>'); 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC1122 says the following on data in RST segments: 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4.2.2.12 RST Segment: RFC-793 Section 3.4 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * A TCP SHOULD allow a received RST segment to include data. 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DISCUSSION 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * It has been suggested that a RST segment could contain 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ASCII text that encoded and explained the cause of the 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RST. No standard has yet been established for such 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * data. 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_tcp_rst_data(register const u_char *sp, u_int length) 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int c; 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (TTEST2(*sp, length)) 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [RST"); 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(" [!RST"); 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length > MAX_RST_DATA_LEN) { 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length = MAX_RST_DATA_LEN; /* can use -X for longer */ 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('+'); /* indicate we truncate */ 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (length-- && sp <= snapend) { 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *sp++; 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project safeputchar(c); 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(']'); 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttcp_verify_signature(const struct ip *ip, const struct tcphdr *tp, 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *data, int length, const u_char *rcvsig) 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tcphdr tp1; 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_char sig[TCP_SIGLEN]; 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char zero_proto = 0; 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_CTX ctx; 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int16_t savecsum, tlen; 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct ip6_hdr *ip6; 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t len32; 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t nxt; 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp1 = *tp; 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tcpmd5secret == NULL) 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (CANT_CHECK_SIGNATURE); 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Init(&ctx); 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Step 1: Update MD5 hash with IP pseudo-header. 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IP_V(ip) == 4) { 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&ip->ip_src, sizeof(ip->ip_src)); 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&ip->ip_dst, sizeof(ip->ip_dst)); 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&zero_proto, sizeof(zero_proto)); 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&ip->ip_p, sizeof(ip->ip_p)); 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = EXTRACT_16BITS(&ip->ip_len) - IP_HL(ip) * 4; 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen = htons(tlen); 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&tlen, sizeof(tlen)); 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (IP_V(ip) == 6) { 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ip6 = (struct ip6_hdr *)ip; 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&ip6->ip6_src, sizeof(ip6->ip6_src)); 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst)); 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len32 = htonl(ntohs(ip6->ip6_plen)); 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&len32, sizeof(len32)); 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nxt = 0; 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&nxt, sizeof(nxt)); 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&nxt, sizeof(nxt)); 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&nxt, sizeof(nxt)); 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nxt = IPPROTO_TCP; 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&nxt, sizeof(nxt)); 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (CANT_CHECK_SIGNATURE); 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Step 2: Update MD5 hash with TCP header, excluding options. 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The TCP checksum must be set to zero. 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project savecsum = tp1.th_sum; 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp1.th_sum = 0; 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, (char *)&tp1, sizeof(struct tcphdr)); 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tp1.th_sum = savecsum; 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Step 3: Update MD5 hash with TCP segment data, if present. 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length > 0) 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, data, length); 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Step 4: Update MD5 hash with shared secret. 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Update(&ctx, tcpmd5secret, strlen(tcpmd5secret)); 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MD5_Final(sig, &ctx); 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (memcmp(rcvsig, sig, TCP_SIGLEN) == 0) 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (SIGNATURE_VALID); 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (SIGNATURE_INVALID); 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_LIBCRYPTO */ 808