12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Copyright (c) 2001 NETLAB, Temple University
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2001 Protocol Engineering Lab, University of Delaware
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Jerry Heinz <gheinz@astro.temple.edu>
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * John Fiore <jfiore@joda.cis.temple.edu>
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Armando L. Caro Jr. <acaro@cis.udel.edu>
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the University nor of the Laboratory may be used
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    to endorse or promote products derived from this software without
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    specific prior written permission.
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE.
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall"@(#) $Header: /tcpdump/master/tcpdump/print-sctp.c,v 1.21 2007-09-13 18:03:49 guy Exp $ (NETLAB/PEL)";
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "sctpHeader.h"
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "sctpConstants.h"
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <assert.h>
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define CHAN_HP 6704
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define CHAN_MP 6705
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define CHAN_LP 6706
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ForCES_channels[] = {
6753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ CHAN_HP, "ForCES HP" },
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ CHAN_MP, "ForCES MP" },
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ CHAN_LP, "ForCES LP" },
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ 0, NULL }
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic inline int isForCES_port(u_short Port)
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (Port == CHAN_HP)
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return 1;
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (Port == CHAN_MP)
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return 1;
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (Port == CHAN_LP)
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return 1;
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return 0;
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid sctp_print(const u_char *bp,        /* beginning of sctp packet */
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *bp2,       /* beginning of enclosing */
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int sctpPacketLength)  /* ip packet */
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const struct sctpHeader *sctpPktHdr;
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const struct ip *ip;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const struct ip6_hdr *ip6;
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const void *endPacketPtr;
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  u_short sourcePort, destPort;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  int chunkCount;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const struct sctpChunkDesc *chunkDescPtr;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const void *nextChunk;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  const char *sep;
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall  int isforces = 0;
10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  sctpPktHdr = (const struct sctpHeader*) bp;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  endPacketPtr = (const u_char*)sctpPktHdr+sctpPacketLength;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if( (u_long) endPacketPtr > (u_long) snapend)
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    endPacketPtr = (const void *) snapend;
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  ip = (struct ip *)bp2;
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (IP_V(ip) == 6)
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    ip6 = (const struct ip6_hdr *)bp2;
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  else
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    ip6 = NULL;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  TCHECK(*sctpPktHdr);
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (sctpPacketLength < sizeof(struct sctpHeader))
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      (void)printf("truncated-sctp - %ld bytes missing!",
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   (long)sctpPacketLength-sizeof(struct sctpHeader));
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      return;
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /*    sctpPacketLength -= sizeof(struct sctpHeader);  packet length  */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /*  			      is now only as long as the payload  */
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  sourcePort = EXTRACT_16BITS(&sctpPktHdr->source);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  destPort = EXTRACT_16BITS(&sctpPktHdr->destination);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (ip6) {
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    (void)printf("%s.%d > %s.%d: sctp",
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      ip6addr_string(&ip6->ip6_src),
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      sourcePort,
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      ip6addr_string(&ip6->ip6_dst),
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      destPort);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  } else
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /*INET6*/
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  {
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    (void)printf("%s.%d > %s.%d: sctp",
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      ipaddr_string(&ip->ip_src),
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      sourcePort,
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      ipaddr_string(&ip->ip_dst),
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      destPort);
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  }
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  fflush(stdout);
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14853f17a9db278d33517d9888dd77848f554522a38JP Abgrall  if (isForCES_port(sourcePort)) {
14953f17a9db278d33517d9888dd77848f554522a38JP Abgrall         printf("[%s]", tok2str(ForCES_channels, NULL, sourcePort));
15053f17a9db278d33517d9888dd77848f554522a38JP Abgrall         isforces = 1;
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall  }
15253f17a9db278d33517d9888dd77848f554522a38JP Abgrall  if (isForCES_port(destPort)) {
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall         printf("[%s]", tok2str(ForCES_channels, NULL, destPort));
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall         isforces = 1;
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall  }
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  if (vflag >= 2)
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    sep = "\n\t";
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  else
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    sep = " (";
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  /* cycle through all chunks, printing information on each one */
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  for (chunkCount = 0,
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 chunkDescPtr = (const struct sctpChunkDesc *)
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ((const u_char*) sctpPktHdr + sizeof(struct sctpHeader));
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project       chunkDescPtr != NULL &&
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 ( (const void *)
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    ((const u_char *) chunkDescPtr + sizeof(struct sctpChunkDesc))
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   <= endPacketPtr);
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project       chunkDescPtr = (const struct sctpChunkDesc *) nextChunk, chunkCount++)
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    {
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      u_int16_t chunkLength;
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      const u_char *chunkEnd;
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      u_int16_t align;
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      TCHECK(*chunkDescPtr);
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      chunkLength = EXTRACT_16BITS(&chunkDescPtr->chunkLength);
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (chunkLength < sizeof(*chunkDescPtr)) {
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      	printf("%s%d) [Bad chunk length %u]", sep, chunkCount+1, chunkLength);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      	break;
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      }
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      TCHECK2(*((u_int8_t *)chunkDescPtr), chunkLength);
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      chunkEnd = ((const u_char*)chunkDescPtr + chunkLength);
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      align=chunkLength % 4;
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      if (align != 0)
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	align = 4 - align;
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      nextChunk = (const void *) (chunkEnd + align);
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      printf("%s%d) ", sep, chunkCount+1);
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project      switch (chunkDescPtr->chunkID)
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_DATA :
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const struct sctpDataPart *dataHdrPtr;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[DATA] ");
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if ((chunkDescPtr->chunkFlg & SCTP_DATA_UNORDERED)
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		== SCTP_DATA_UNORDERED)
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf("(U)");
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if ((chunkDescPtr->chunkFlg & SCTP_DATA_FIRST_FRAG)
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		== SCTP_DATA_FIRST_FRAG)
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf("(B)");
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if ((chunkDescPtr->chunkFlg & SCTP_DATA_LAST_FRAG)
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		== SCTP_DATA_LAST_FRAG)
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf("(E)");
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if( ((chunkDescPtr->chunkFlg & SCTP_DATA_UNORDERED)
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 == SCTP_DATA_UNORDERED)
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		||
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		((chunkDescPtr->chunkFlg & SCTP_DATA_FIRST_FRAG)
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 == SCTP_DATA_FIRST_FRAG)
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		||
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		((chunkDescPtr->chunkFlg & SCTP_DATA_LAST_FRAG)
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 == SCTP_DATA_LAST_FRAG) )
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf(" ");
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    dataHdrPtr=(const struct sctpDataPart*)(chunkDescPtr+1);
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[TSN: %u] ", EXTRACT_32BITS(&dataHdrPtr->TSN));
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[SID: %u] ", EXTRACT_16BITS(&dataHdrPtr->streamId));
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[SSEQ %u] ", EXTRACT_16BITS(&dataHdrPtr->sequence));
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[PPID 0x%x] ", EXTRACT_32BITS(&dataHdrPtr->payloadtype));
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    fflush(stdout);
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    if (isforces) {
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		const u_char *payloadPtr;
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		u_int chunksize = sizeof(struct sctpDataPart)+
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			          sizeof(struct sctpChunkDesc);
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		payloadPtr = (const u_char *) (dataHdrPtr + 1);
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (EXTRACT_16BITS(&chunkDescPtr->chunkLength) <
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			sizeof(struct sctpDataPart)+
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			sizeof(struct sctpChunkDesc)+1) {
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* Less than 1 byte of chunk payload */
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("bogus ForCES chunk length %u]",
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    EXTRACT_16BITS(&chunkDescPtr->chunkLength));
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return;
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		forces_print(payloadPtr, EXTRACT_16BITS(&chunkDescPtr->chunkLength)- chunksize);
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	   } else if (vflag >= 2) {	/* if verbose output is specified */
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					/* at the command line */
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const u_char *payloadPtr;
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[Payload");
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!suppress_default_print) {
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			payloadPtr = (const u_char *) (++dataHdrPtr);
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(":");
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (EXTRACT_16BITS(&chunkDescPtr->chunkLength) <
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(struct sctpDataPart)+
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    sizeof(struct sctpChunkDesc)+1) {
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* Less than 1 byte of chunk payload */
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("bogus chunk length %u]",
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    EXTRACT_16BITS(&chunkDescPtr->chunkLength));
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(payloadPtr,
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			      EXTRACT_16BITS(&chunkDescPtr->chunkLength) -
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			      (sizeof(struct sctpDataPart)+
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			      sizeof(struct sctpChunkDesc)));
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("]");
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      }
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_INITIATION :
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const struct sctpInitiation *init;
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[INIT] ");
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    init=(const struct sctpInitiation*)(chunkDescPtr+1);
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[init tag: %u] ", EXTRACT_32BITS(&init->initTag));
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[rwnd: %u] ", EXTRACT_32BITS(&init->rcvWindowCredit));
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[OS: %u] ", EXTRACT_16BITS(&init->NumPreopenStreams));
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[MIS: %u] ", EXTRACT_16BITS(&init->MaxInboundStreams));
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[init TSN: %u] ", EXTRACT_32BITS(&init->initialTSN));
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if(0) /* ALC you can add code for optional params here */
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if( (init+1) < chunkEnd )
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf(" @@@@@ UNFINISHED @@@@@@%s\n",
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     "Optional params present, but not printed.");
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_INITIATION_ACK :
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const struct sctpInitiation *init;
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[INIT ACK] ");
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    init=(const struct sctpInitiation*)(chunkDescPtr+1);
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[init tag: %u] ", EXTRACT_32BITS(&init->initTag));
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[rwnd: %u] ", EXTRACT_32BITS(&init->rcvWindowCredit));
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[OS: %u] ", EXTRACT_16BITS(&init->NumPreopenStreams));
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[MIS: %u] ", EXTRACT_16BITS(&init->MaxInboundStreams));
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[init TSN: %u] ", EXTRACT_32BITS(&init->initialTSN));
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if(0) /* ALC you can add code for optional params here */
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    if( (init+1) < chunkEnd )
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf(" @@@@@ UNFINISHED @@@@@@%s\n",
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     "Optional params present, but not printed.");
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_SELECTIVE_ACK:
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  {
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const struct sctpSelectiveAck *sack;
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const struct sctpSelectiveFrag *frag;
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    int fragNo, tsnNo;
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    const u_char *dupTSN;
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[SACK] ");
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    sack=(const struct sctpSelectiveAck*)(chunkDescPtr+1);
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[cum ack %u] ", EXTRACT_32BITS(&sack->highestConseqTSN));
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[a_rwnd %u] ", EXTRACT_32BITS(&sack->updatedRwnd));
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[#gap acks %u] ", EXTRACT_16BITS(&sack->numberOfdesc));
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    printf("[#dup tsns %u] ", EXTRACT_16BITS(&sack->numDupTsns));
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    /* print gaps */
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    for (frag = ( (const struct sctpSelectiveFrag *)
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  ((const struct sctpSelectiveAck *) sack+1)),
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		   fragNo=0;
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 (const void *)frag < nextChunk && fragNo < EXTRACT_16BITS(&sack->numberOfdesc);
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 frag++, fragNo++)
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf("\n\t\t[gap ack block #%d: start = %u, end = %u] ",
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     fragNo+1,
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     EXTRACT_32BITS(&sack->highestConseqTSN) + EXTRACT_16BITS(&frag->fragmentStart),
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     EXTRACT_32BITS(&sack->highestConseqTSN) + EXTRACT_16BITS(&frag->fragmentEnd));
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    /* print duplicate TSNs */
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    for (dupTSN = (const u_char *)frag, tsnNo=0;
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 (const void *) dupTSN < nextChunk && tsnNo<EXTRACT_16BITS(&sack->numDupTsns);
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 dupTSN += 4, tsnNo++)
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	      printf("\n\t\t[dup TSN #%u: %u] ", tsnNo+1,
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	          EXTRACT_32BITS(dupTSN));
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    break;
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  }
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_HEARTBEAT_REQUEST :
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	  printf("[HB REQ] ");
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	  break;
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_HEARTBEAT_ACK :
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[HB ACK] ");
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_ABORT_ASSOCIATION :
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[ABORT] ");
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_SHUTDOWN :
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[SHUTDOWN] ");
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_SHUTDOWN_ACK :
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[SHUTDOWN ACK] ");
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_OPERATION_ERR :
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[OP ERR] ");
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_COOKIE_ECHO :
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[COOKIE ECHO] ");
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_COOKIE_ACK :
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[COOKIE ACK] ");
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_ECN_ECHO :
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[ECN ECHO] ");
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_ECN_CWR :
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[ECN CWR] ");
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_SHUTDOWN_COMPLETE :
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[SHUTDOWN COMPLETE] ");
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_FORWARD_CUM_TSN :
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[FOR CUM TSN] ");
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_RELIABLE_CNTL :
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[REL CTRL] ");
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SCTP_RELIABLE_CNTL_ACK :
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[REL CTRL ACK] ");
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  break;
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default :
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  printf("[Unknown chunk type: 0x%x]", chunkDescPtr->chunkID);
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  return;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag < 2)
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  sep = ", (";
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    }
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    printf("[|sctp]");
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    return;
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
401