12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1989, 1990, 1991, 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 * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-sl.c,v 1.65 2005/04/06 21:32:42 mcr Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "slip.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "slcompress.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int lastlen[2][256];
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int lastconn = 255;
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void sliplink_print(const u_char *, const struct ip *, u_int);
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void compressed_sl_print(const u_char *, const struct ip *, u_int, int);
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsl_if_print(const struct pcap_pkthdr *h, const u_char *p)
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int caplen = h->caplen;
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int length = h->len;
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ip *ip;
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < SLIP_HDRLEN) {
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|slip]");
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (caplen);
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= SLIP_HDRLEN;
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)(p + SLIP_HDRLEN);
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag)
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sliplink_print(p, ip, length);
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V(ip)) {
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        ip_print(gndo, (u_char *)ip, length);
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6_print((u_char *)ip, length);
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf ("ip v%d", IP_V(ip));
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (SLIP_HDRLEN);
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsl_bsdos_if_print(const struct pcap_pkthdr *h, const u_char *p)
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int caplen = h->caplen;
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int length = h->len;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct ip *ip;
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < SLIP_HDRLEN) {
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|slip]");
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (caplen);
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= SLIP_HDRLEN;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip = (struct ip *)(p + SLIP_HDRLEN);
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef notdef
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag)
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sliplink_print(p, ip, length);
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ip_print(gndo, (u_char *)ip, length);
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (SLIP_HDRLEN);
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsliplink_print(register const u_char *p, register const struct ip *ip,
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       register u_int length)
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int dir;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int hlen;
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dir = p[SLX_DIR];
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar(dir == SLIPDIR_IN ? 'I' : 'O');
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar(' ');
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (nflag) {
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* XXX just dump the header */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		register int i;
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i = SLX_CHDR; i < SLX_CHDR + CHDR_LEN - 1; ++i)
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%02x.", p[i]);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%02x: ", p[SLX_CHDR + CHDR_LEN - 1]);
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (p[SLX_CHDR] & 0xf0) {
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case TYPE_IP:
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ip %d: ", length + SLIP_HDRLEN);
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case TYPE_UNCOMPRESSED_TCP:
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * The connection id is stored in the IP protocol field.
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Get it from the link layer since sl_uncompress_tcp()
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * has restored the IP header copy to IPPROTO_TCP.
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lastconn = ((struct ip *)&p[SLX_CHDR])->ip_p;
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen = IP_HL(ip);
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		hlen += TH_OFF((struct tcphdr *)&((int *)ip)[hlen]);
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lastlen[dir][lastconn] = length - (hlen << 2);
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("utcp %d: ", lastconn);
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (p[SLX_CHDR] & TYPE_COMPRESSED_TCP) {
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			compressed_sl_print(&p[SLX_CHDR], ip,
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    length, dir);
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(": ");
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("slip-%d!: ", p[SLX_CHDR]);
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_sl_change(const char *str, register const u_char *cp)
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int i;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((i = *cp++) == 0) {
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = EXTRACT_16BITS(cp);
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp += 2;
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %s%d", str, i);
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (cp);
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_char *
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_sl_winchange(register const u_char *cp)
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register short i;
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((i = *cp++) == 0) {
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = EXTRACT_16BITS(cp);
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp += 2;
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (i >= 0)
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" W+%d", i);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" W%d", i);
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (cp);
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcompressed_sl_print(const u_char *chdr, const struct ip *ip,
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    u_int length, int dir)
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *cp = chdr;
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int flags, hlen;
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	flags = *cp++;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (flags & NEW_C) {
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lastconn = *cp++;
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ctcp %d", lastconn);
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("ctcp *");
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* skip tcp checksum */
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp += 2;
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (flags & SPECIALS_MASK) {
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SPECIAL_I:
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" *SA+%d", lastlen[dir][lastconn]);
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SPECIAL_D:
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" *S+%d", lastlen[dir][lastconn]);
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (flags & NEW_U)
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = print_sl_change("U=", cp);
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (flags & NEW_W)
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = print_sl_winchange(cp);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (flags & NEW_A)
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = print_sl_change("A+", cp);
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (flags & NEW_S)
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cp = print_sl_change("S+", cp);
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (flags & NEW_I)
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cp = print_sl_change("I+", cp);
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 'hlen' is the length of the uncompressed TCP/IP header (in words).
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 'cp - chdr' is the length of the compressed header.
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 'length - hlen' is the amount of data in the packet.
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hlen = IP_HL(ip);
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hlen += TH_OFF((struct tcphdr *)&((int32_t *)ip)[hlen]);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lastlen[dir][lastconn] = length - (hlen << 2);
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" %d (%ld)", lastlen[dir][lastconn], (long)(cp - chdr));
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
240