153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*	$NetBSD: print-tcp.c,v 1.9 2007/07/26 18:15:12 plunky Exp $	*/
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1999-2004 The tcpdump.org project
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall__RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $");
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
31892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h"
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h"
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_auth.h"
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_msg.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nameser.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <openssl/md5.h>
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <signature.h>
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
61892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic int tcp_verify_signature(netdissect_options *ndo,
62892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                const struct ip *ip, const struct tcphdr *tp,
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                const u_char *data, int length, const u_char *rcvsig);
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
66892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void print_tcp_rst_data(netdissect_options *, 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 {
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct in_addr src;
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct in_addr dst;
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        u_int port;
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct tcp_seq_hash {
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct tcp_seq_hash *nxt;
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct tha addr;
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tcp_seq seq;
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tcp_seq ack;
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct tha6 {
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct in6_addr src;
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct in6_addr dst;
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        u_int port;
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct tcp_seq_hash6 {
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct tcp_seq_hash6 *nxt;
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct tha6 addr;
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tcp_seq seq;
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tcp_seq ack;
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TSEQ_HASHSIZE 919
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* These tcp optinos do not have the size octet */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ZEROLENOPT(o) ((o) == TCPOPT_EOL || (o) == TCPOPT_NOP)
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct tcp_seq_hash tcp_seq_hash4[TSEQ_HASHSIZE];
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct tcp_seq_hash6 tcp_seq_hash6[TSEQ_HASHSIZE];
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok tcp_flag_values[] = {
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_FIN, "F" },
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_SYN, "S" },
11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_RST, "R" },
11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_PUSH, "P" },
11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_ACK, "." },
11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_URG, "U" },
11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_ECNECHO, "E" },
11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TH_CWR, "W" },
11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { 0, NULL }
11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok tcp_option_values[] = {
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_EOL, "eol" },
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_NOP, "nop" },
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_MAXSEG, "mss" },
12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_WSCALE, "wscale" },
12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_SACKOK, "sackOK" },
12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_SACK, "sack" },
12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_ECHO, "echo" },
12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_ECHOREPLY, "echoreply" },
13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_TIMESTAMP, "TS" },
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_CC, "cc" },
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_CCNEW, "ccnew" },
13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_CCECHO, "" },
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_SIGNATURE, "md5" },
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_AUTH, "enhanced auth" },
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_UTO, "uto" },
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_MPTCP, "mptcp" },
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { TCPOPT_EXPERIMENT2, "exp" },
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        { 0, NULL }
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
142892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic int
143892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestcp_cksum(netdissect_options *ndo,
144892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes          register const struct ip *ip,
145892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes          register const struct tcphdr *tp,
146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes          register u_int len)
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return nextproto4_cksum(ndo, ip, (const uint8_t *)tp, len, len,
149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				IPPROTO_TCP);
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
153892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestcp_print(netdissect_options *ndo,
154892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes          register const u_char *bp, register u_int length,
155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes          register const u_char *bp2, int fragmented)
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register const struct tcphdr *tp;
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register const struct ip *ip;
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register u_char flags;
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register u_int hlen;
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register char ch;
162892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint16_t sport, dport, win, urp;
163892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint32_t seq, ack, thseq, thack;
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        u_int utoval;
165892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint16_t magic;
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register int rev;
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        register const struct ip6_hdr *ip6;
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tp = (struct tcphdr *)bp;
17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        ip = (struct ip *)bp2;
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (IP_V(ip) == 6)
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                ip6 = (struct ip6_hdr *)bp2;
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                ip6 = NULL;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        ch = '\0';
180892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (!ND_TTEST(tp->th_dport)) {
181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, "%s > %s: [|tcp]",
182892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                             ipaddr_string(ndo, &ip->ip_src),
183892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                             ipaddr_string(ndo, &ip->ip_dst)));
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        sport = EXTRACT_16BITS(&tp->th_sport);
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        dport = EXTRACT_16BITS(&tp->th_dport);
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        hlen = TH_OFF(tp) * 4;
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (ip6) {
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ip6->ip6_nxt == IPPROTO_TCP) {
195892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, "%s.%s > %s.%s: ",
196892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     ip6addr_string(ndo, &ip6->ip6_src),
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                     tcpport_string(sport),
198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     ip6addr_string(ndo, &ip6->ip6_dst),
199892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     tcpport_string(dport)));
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                } else {
201892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, "%s > %s: ",
202892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     tcpport_string(sport), tcpport_string(dport)));
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /*INET6*/
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        {
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ip->ip_p == IPPROTO_TCP) {
208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, "%s.%s > %s.%s: ",
209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     ipaddr_string(ndo, &ip->ip_src),
21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                     tcpport_string(sport),
211892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     ipaddr_string(ndo, &ip->ip_dst),
212892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     tcpport_string(dport)));
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                } else {
214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, "%s > %s: ",
215892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     tcpport_string(sport), tcpport_string(dport)));
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
21953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (hlen < sizeof(*tp)) {
220892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, " tcp %d [bad hdr length %u - too short, < %lu]",
221892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                             length - hlen, hlen, (unsigned long)sizeof(*tp)));
22253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
22353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
225892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_TCHECK(*tp);
22653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        seq = EXTRACT_32BITS(&tp->th_seq);
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        ack = EXTRACT_32BITS(&tp->th_ack);
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        win = EXTRACT_16BITS(&tp->th_win);
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        urp = EXTRACT_16BITS(&tp->th_urp);
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
232892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (ndo->ndo_qflag) {
233892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, "tcp %d", length - hlen));
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (hlen > length) {
235892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, " [bad hdr length %u - too long, > %u]",
236892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                     hlen, length));
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        flags = tp->th_flags;
242892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, "Flags [%s]", bittok2str_nosep(tcp_flag_values, "none", flags)));
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
244892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (!ndo->ndo_Sflag && (flags & TH_ACK)) {
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /*
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * Find (or record) the initial sequence numbers for
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * this conversation.  (we pick an arbitrary
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * collating order so there's only one entry for
24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * both directions).
25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 */
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                rev = 0;
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (ip6) {
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        register struct tcp_seq_hash6 *th;
25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        struct tcp_seq_hash6 *tcp_seq_hash;
25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        const struct in6_addr *src, *dst;
25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        struct tha6 tha;
25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        tcp_seq_hash = tcp_seq_hash6;
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        src = &ip6->ip6_src;
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        dst = &ip6->ip6_dst;
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (sport > dport)
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                rev = 1;
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        else if (sport == dport) {
26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (UNALIGNED_MEMCMP(src, dst, sizeof ip6->ip6_dst) > 0)
26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        rev = 1;
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (rev) {
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip6->ip6_dst);
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip6->ip6_src);
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tha.port = dport << 16 | sport;
27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        } else {
27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip6->ip6_dst);
27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.src, src, sizeof ip6->ip6_src);
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tha.port = sport << 16 | dport;
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                             th->nxt; th = th->nxt)
28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (memcmp((char *)&tha, (char *)&th->addr,
28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                           sizeof(th->addr)) == 0)
28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (!th->nxt || (flags & TH_SYN)) {
28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                /* didn't find it or new conversation */
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (th->nxt == NULL) {
28753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->nxt = (struct tcp_seq_hash6 *)
28853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                calloc(1, sizeof(*th));
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        if (th->nxt == NULL)
29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                error("tcp_print: calloc");
29153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                th->addr = tha;
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (rev)
29453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->ack = seq, th->seq = ack - 1;
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->seq = seq, th->ack = ack - 1;
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        } else {
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (rev)
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        seq -= th->ack, ack -= th->seq;
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        seq -= th->seq, ack -= th->ack;
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        thseq = th->seq;
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        thack = th->ack;
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                } else {
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else  /*INET6*/
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                {
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /*INET6*/
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        register struct tcp_seq_hash *th;
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        struct tcp_seq_hash *tcp_seq_hash;
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        const struct in_addr *src, *dst;
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        struct tha tha;
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        tcp_seq_hash = tcp_seq_hash4;
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        src = &ip->ip_src;
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        dst = &ip->ip_dst;
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (sport > dport)
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                rev = 1;
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        else if (sport == dport) {
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (UNALIGNED_MEMCMP(src, dst, sizeof ip->ip_dst) > 0)
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        rev = 1;
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (rev) {
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip->ip_dst);
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip->ip_src);
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tha.port = dport << 16 | sport;
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        } else {
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip->ip_dst);
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                UNALIGNED_MEMCPY(&tha.src, src, sizeof ip->ip_src);
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tha.port = sport << 16 | dport;
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        for (th = &tcp_seq_hash[tha.port % TSEQ_HASHSIZE];
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                             th->nxt; th = th->nxt)
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (memcmp((char *)&tha, (char *)&th->addr,
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                           sizeof(th->addr)) == 0)
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (!th->nxt || (flags & TH_SYN)) {
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                /* didn't find it or new conversation */
34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (th->nxt == NULL) {
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->nxt = (struct tcp_seq_hash *)
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                calloc(1, sizeof(*th));
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        if (th->nxt == NULL)
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                error("tcp_print: calloc");
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                th->addr = tha;
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (rev)
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->ack = seq, th->seq = ack - 1;
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        th->seq = seq, th->ack = ack - 1;
35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        } else {
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (rev)
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        seq -= th->ack, ack -= th->seq;
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        seq -= th->seq, ack -= th->ack;
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        thseq = th->seq;
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        thack = th->ack;
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /*fool gcc*/
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                thseq = thack = rev = 0;
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (hlen > length) {
368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, " [bad hdr length %u - too long, > %u]",
369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                             hlen, length));
37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /* Check the checksum, if possible. */
375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                uint16_t sum, tcp_sum;
37653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
37753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (IP_V(ip) == 4) {
378892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        if (ND_TTEST2(tp->th_sport, length)) {
379892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                sum = tcp_cksum(ndo, ip, tp, length);
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tcp_sum = EXTRACT_16BITS(&tp->th_sum);
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
382892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, ", cksum 0x%04x", tcp_sum));
38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (sum != 0)
384892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " (incorrect -> 0x%04x)",
385892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                            in_cksum_shouldbe(tcp_sum, sum)));
38653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " (correct)"));
38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
38953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
39053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
39153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                else if (IP_V(ip) == 6 && ip6->ip6_plen) {
392892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        if (ND_TTEST2(tp->th_sport, length)) {
393892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                sum = nextproto6_cksum(ip6, (const uint8_t *)tp,
394892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes							length, length, IPPROTO_TCP);
39553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                tcp_sum = EXTRACT_16BITS(&tp->th_sum);
39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
397892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, ", cksum 0x%04x", tcp_sum));
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (sum != 0)
399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " (incorrect -> 0x%04x)",
400892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                            in_cksum_shouldbe(tcp_sum, sum)));
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
402892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " (correct)"));
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        length -= hlen;
410892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (ndo->ndo_vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) {
411892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ", seq %u", seq));
41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
41353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (length > 0) {
414892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, ":%u", seq + length));
41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (flags & TH_ACK) {
419892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ", ack %u", ack));
42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
422892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, ", win %d", win));
42353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (flags & TH_URG)
425892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ", urg %d", urp));
42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Handle any options.
42853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
42953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (hlen > sizeof(*tp)) {
43053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                register const u_char *cp;
43153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                register u_int i, opt, datalen;
43253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                register u_int len;
43353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
43453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                hlen -= sizeof(*tp);
43553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                cp = (const u_char *)tp + sizeof(*tp);
436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ", options ["));
43753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                while (hlen > 0) {
43853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (ch != '\0')
439892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, "%c", ch));
440892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_TCHECK(*cp);
44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        opt = *cp++;
44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (ZEROLENOPT(opt))
44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                len = 1;
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        else {
445892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_TCHECK(*cp);
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                len = *cp++;	/* total including type, len */
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (len < 2 || len > hlen)
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        goto bad;
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                --hlen;		/* account for length byte */
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        --hlen;			/* account for type byte */
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        datalen = 0;
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Bail if "l" bytes of data are not left or were not captured  */
455892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define LENCHECK(l) { if ((l) > hlen) goto bad; ND_TCHECK2(*cp, l); }
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
458892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        ND_PRINT((ndo, "%s", tok2str(tcp_option_values, "unknown-%u", opt)));
45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        switch (opt) {
46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_MAXSEG:
46353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = 2;
46453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
465892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, " %u", EXTRACT_16BITS(cp)));
46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_WSCALE:
46953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = 1;
47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
471892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, " %u", *cp));
47253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
47353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
47453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_SACK:
47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = len - 2;
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (datalen % 8 != 0) {
477892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "malformed sack"));
47853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                } else {
479892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        uint32_t s, e;
48053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
481892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " %d ", datalen / 8));
48253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        for (i = 0; i < datalen; i += 8) {
48353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                LENCHECK(i + 4);
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                s = EXTRACT_32BITS(cp + i);
48553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                LENCHECK(i + 8);
48653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                e = EXTRACT_32BITS(cp + i + 4);
48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                if (rev) {
48853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                        s -= thseq;
48953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                        e -= thseq;
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                } else {
49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                        s -= thack;
49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                        e -= thack;
49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                }
494892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                ND_PRINT((ndo, "{%u:%u}", s, e));
49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        }
49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
49953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_CC:
50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_CCNEW:
50153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_CCECHO:
50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_ECHO:
50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_ECHOREPLY:
50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                /*
50653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 * those options share their semantics.
50753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 * fall through
50853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 */
50953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = 4;
51053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
511892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, " %u", EXTRACT_32BITS(cp)));
51253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
51353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
51453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_TIMESTAMP:
51553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = 8;
51653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
517892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, " val %u ecr %u",
51853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                             EXTRACT_32BITS(cp),
519892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                             EXTRACT_32BITS(cp + 4)));
52053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
52153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
52253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_SIGNATURE:
52353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = TCP_SIGLEN;
52453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO
526892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                switch (tcp_verify_signature(ndo, ip, tp,
52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                             bp + TH_OFF(tp) * 4, length, cp)) {
52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                case SIGNATURE_VALID:
530892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "valid"));
53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                case SIGNATURE_INVALID:
534892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "invalid"));
53553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
53653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
53753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                case CANT_CHECK_SIGNATURE:
538892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "can't check - "));
53953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        for (i = 0; i < TCP_SIGLEN; ++i)
540892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                ND_PRINT((ndo, "%02x", cp[i]));
54153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
54253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
54453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                for (i = 0; i < TCP_SIGLEN; ++i)
545892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "%02x", cp[i]));
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
54753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
54853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
54953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_AUTH:
550892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, "keyid %d", *cp++));
55153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = len - 3;
55253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                for (i = 0; i < datalen; ++i) {
55353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        LENCHECK(i);
554892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "%02x", cp[i]));
55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_EOL:
56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_NOP:
56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_SACKOK:
56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                /*
56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 * Nothing interesting.
56453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 * fall through
56553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                 */
56653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
56853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_UTO:
56953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = 2;
57053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
57153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                utoval = EXTRACT_16BITS(cp);
572892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, "0x%x", utoval));
57353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (utoval & 0x0001)
57453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        utoval = (utoval >> 1) * 60;
57553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                else
57653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        utoval >>= 1;
577892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, " %u", utoval));
57853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
57953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
58053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_MPTCP:
58153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = len - 2;
58253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
583892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                if (!mptcp_print(ndo, cp-2, len, flags))
58453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        goto bad;
58553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
58653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
58753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        case TCPOPT_EXPERIMENT2:
58853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = len - 2;
58953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                LENCHECK(datalen);
59053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (datalen < 2)
59153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        goto bad;
59253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                /* RFC6994 */
59353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                magic = EXTRACT_16BITS(cp);
594892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, "-"));
59553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
59653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                switch(magic) {
59753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
59853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                case 0xf989:
599892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        /* TCP Fast Open: RFC 7413 */
60053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        if (datalen == 2) {
60153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                /* Fast Open Cookie Request */
602892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                ND_PRINT((ndo, "tfo cookiereq"));
60353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        } else {
60453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                /* Fast Open Cookie */
60553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                if (datalen % 2 != 0 || datalen < 6 || datalen > 18) {
606892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                        ND_PRINT((ndo, "tfo malformed"));
60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                } else {
608892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                        ND_PRINT((ndo, "tfo cookie "));
60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                        for (i = 2; i < datalen; ++i)
610892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                                                ND_PRINT((ndo, "%02x", cp[i]));
61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                                }
61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        }
61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                default:
61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        /* Unknown magic number */
617892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "%04x", magic));
61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        break;
61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        default:
62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                datalen = len - 2;
62453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                if (datalen)
625892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, " 0x"));
62653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                for (i = 0; i < datalen; ++i) {
62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                        LENCHECK(i);
628892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                        ND_PRINT((ndo, "%02x", cp[i]));
62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                }
63053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
63153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
63353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        /* Account for data printed */
63453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        cp += datalen;
63553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        hlen -= datalen;
63653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
63753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        /* Check specification against observed length */
63853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        ++datalen;			/* option octet */
63953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (!ZEROLENOPT(opt))
64053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                ++datalen;		/* size octet */
64153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (datalen != len)
642892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, "[len %d]", len));
64353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        ch = ',';
64453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (opt == TCPOPT_EOL)
64553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                break;
64653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
647892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, "]"));
64853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
64953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
65153f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Print length field before crawling down the stack.
65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
653892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, ", length %u", length));
65453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (length <= 0)
65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
65753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
65953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Decode payload if necessary.
66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        bp += TH_OFF(tp) * 4;
662892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if ((flags & TH_RST) && ndo->ndo_vflag) {
663892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                print_tcp_rst_data(ndo, bp, length);
66453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
665892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        }
66653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
667892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (ndo->ndo_packettype) {
668892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                switch (ndo->ndo_packettype) {
66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PT_ZMTP1:
670892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                        zmtp1_print(ndo, bp, length);
67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        break;
67253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
67353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return;
67453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
67553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
67653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (sport == TELNET_PORT || dport == TELNET_PORT) {
677892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                telnet_print(ndo, bp, length);
678892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        } else if (sport == SMTP_PORT || dport == SMTP_PORT) {
679892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ": "));
680892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                smtp_print(ndo, bp, length);
68153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else if (sport == BGP_PORT || dport == BGP_PORT)
682892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                bgp_print(ndo, bp, length);
68353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else if (sport == PPTP_PORT || dport == PPTP_PORT)
684892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                pptp_print(ndo, bp);
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef TCPDUMP_DO_SMB
68653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT)
687892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                nbt_tcp_print(ndo, bp, length);
68853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else if (sport == SMB_PORT || dport == SMB_PORT)
689892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		smb_tcp_print(ndo, bp, length);
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else if (sport == BEEP_PORT || dport == BEEP_PORT)
692892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                beep_print(ndo, bp, length);
693892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        else if (sport == OPENFLOW_PORT_OLD || dport == OPENFLOW_PORT_OLD ||
694892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                 sport == OPENFLOW_PORT_IANA || dport == OPENFLOW_PORT_IANA)
695892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                openflow_print(ndo, bp, length);
696892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        else if (sport == FTP_PORT || dport == FTP_PORT) {
697892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ": "));
698892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ftp_print(ndo, bp, length);
699892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        } else if (sport == HTTP_PORT || dport == HTTP_PORT ||
700892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes            sport == HTTP_PORT_ALT || dport == HTTP_PORT_ALT) {
701892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ": "));
702892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                http_print(ndo, bp, length);
703892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        } else if (sport == RTSP_PORT || dport == RTSP_PORT ||
704892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes            sport == RTSP_PORT_ALT || dport == RTSP_PORT_ALT) {
705892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ": "));
706892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                rtsp_print(ndo, bp, length);
707892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        } else if (length > 2 &&
70853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT ||
70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                  sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) {
71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /*
71153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * TCP DNS query has 2byte length at the head.
71253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * XXX packet could be unaligned, it can go strange
71353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 */
714892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ns_print(ndo, bp + 2, length - 2, 0);
71553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else if (sport == MSDP_PORT || dport == MSDP_PORT) {
716892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                msdp_print(ndo, bp, length);
71753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) {
718892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                rpki_rtr_print(ndo, bp, length);
71953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
72053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) {
721892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ldp_print(ndo, bp, length);
72253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
72353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else if ((sport == NFS_PORT || dport == NFS_PORT) &&
724892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                 length >= 4 && ND_TTEST2(*bp, 4)) {
72553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                /*
72653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * If data present, header length valid, and NFS port used,
72753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * assume NFS.
72853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * Pass offset of data plus 4 bytes for RPC TCP msg length
72953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 * to NFS print routines.
73053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                 */
731892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                uint32_t fraglen;
73253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                register struct sunrpc_msg *rp;
73353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                enum sunrpc_msg_type direction;
73453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                fraglen = EXTRACT_32BITS(bp) & 0x7FFFFFFF;
73653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (fraglen > (length) - 4)
73753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        fraglen = (length) - 4;
73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                rp = (struct sunrpc_msg *)(bp + 4);
739892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                if (ND_TTEST(rp->rm_direction)) {
74053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
74153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (dport == NFS_PORT && direction == SUNRPC_CALL) {
742892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, ": NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
743892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                nfsreq_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
74453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                return;
74553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
74653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
747892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                ND_PRINT((ndo, ": NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid)));
748892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                                nfsreply_print_noaddr(ndo, (u_char *)rp, fraglen, (u_char *)ip);
74953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                                return;
75053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        }
75153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
75353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
75453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return;
75553f17a9db278d33517d9888dd77848f554522a38JP Abgrall bad:
756892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, "[bad opt]"));
75753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (ch != '\0')
758892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ">"));
75953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        return;
76053f17a9db278d33517d9888dd77848f554522a38JP Abgrall trunc:
761892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, "[|tcp]"));
76253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (ch != '\0')
763892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, ">"));
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC1122 says the following on data in RST segments:
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *         4.2.2.12  RST Segment: RFC-793 Section 3.4
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *            A TCP SHOULD allow a received RST segment to include data.
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *            DISCUSSION
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *                 It has been suggested that a RST segment could contain
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *                 ASCII text that encoded and explained the cause of the
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *                 RST.  No standard has yet been established for such
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *                 data.
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
782892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesprint_tcp_rst_data(netdissect_options *ndo,
783892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                   register const u_char *sp, u_int length)
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
78553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        int c;
78653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
787892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, ND_TTEST2(*sp, length) ? " [RST" : " [!RST"));
78853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (length > MAX_RST_DATA_LEN) {
78953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                length = MAX_RST_DATA_LEN;	/* can use -X for longer */
790892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                ND_PRINT((ndo, "+"));			/* indicate we truncate */
79153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
792892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, " "));
793892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        while (length-- && sp <= ndo->ndo_snapend) {
79453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                c = *sp++;
795892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                safeputchar(ndo, c);
79653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
797892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        ND_PRINT((ndo, "]"));
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_LIBCRYPTO
80153f17a9db278d33517d9888dd77848f554522a38JP AbgrallUSES_APPLE_DEPRECATED_API
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
803892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestcp_verify_signature(netdissect_options *ndo,
804892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes                     const struct ip *ip, const struct tcphdr *tp,
80553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                     const u_char *data, int length, const u_char *rcvsig)
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        struct tcphdr tp1;
80853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        u_char sig[TCP_SIGLEN];
80953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        char zero_proto = 0;
81053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        MD5_CTX ctx;
811892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint16_t savecsum, tlen;
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
81353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        struct ip6_hdr *ip6;
814892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint32_t len32;
815892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        uint8_t nxt;
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
818892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	if (data + length > ndo->ndo_snapend) {
819892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "snaplen too short, "));
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (CANT_CHECK_SIGNATURE);
82153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
82353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tp1 = *tp;
82453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
825892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        if (ndo->ndo_sigsecret == NULL) {
826892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "shared secret not supplied with -M, "));
82753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return (CANT_CHECK_SIGNATURE);
82853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
82953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        MD5_Init(&ctx);
83153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Step 1: Update MD5 hash with IP pseudo-header.
83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
83453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (IP_V(ip) == 4) {
83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&ip->ip_src, sizeof(ip->ip_src));
83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&ip->ip_dst, sizeof(ip->ip_dst));
83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&zero_proto, sizeof(zero_proto));
83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&ip->ip_p, sizeof(ip->ip_p));
83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                tlen = EXTRACT_16BITS(&ip->ip_len) - IP_HL(ip) * 4;
84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                tlen = htons(tlen);
84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&tlen, sizeof(tlen));
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
84353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else if (IP_V(ip) == 6) {
84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                ip6 = (struct ip6_hdr *)ip;
84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&ip6->ip6_src, sizeof(ip6->ip6_src));
84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&ip6->ip6_dst, sizeof(ip6->ip6_dst));
84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                len32 = htonl(EXTRACT_16BITS(&ip6->ip6_plen));
84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&len32, sizeof(len32));
84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                nxt = 0;
85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
85353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                nxt = IPPROTO_TCP;
85453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, (char *)&nxt, sizeof(nxt));
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
85653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
85753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef INET6
858892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "IP version not 4 or 6, "));
85953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
860892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "IP version not 4, "));
86153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
86253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return (CANT_CHECK_SIGNATURE);
86353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
86453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
86553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
86653f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Step 2: Update MD5 hash with TCP header, excluding options.
86753f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * The TCP checksum must be set to zero.
86853f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        savecsum = tp1.th_sum;
87053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tp1.th_sum = 0;
87153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        MD5_Update(&ctx, (char *)&tp1, sizeof(struct tcphdr));
87253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        tp1.th_sum = savecsum;
87353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
87453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Step 3: Update MD5 hash with TCP segment data, if present.
87553f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (length > 0)
87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                MD5_Update(&ctx, data, length);
87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /*
87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         * Step 4: Update MD5 hash with shared secret.
88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         */
881892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes        MD5_Update(&ctx, ndo->ndo_sigsecret, strlen(ndo->ndo_sigsecret));
88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        MD5_Final(sig, &ctx);
88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
88453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (memcmp(rcvsig, sig, TCP_SIGLEN) == 0)
88553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return (SIGNATURE_VALID);
88653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        else
88753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                return (SIGNATURE_INVALID);
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
88953f17a9db278d33517d9888dd77848f554522a38JP AbgrallUSES_APPLE_RST
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_LIBCRYPTO */
89153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
89253f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
89353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Local Variables:
89453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-style: whitesmith
89553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-basic-offset: 8
89653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * End:
89753f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
898