]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-sctp.c
From Albert Chin:
[tcpdump] / print-sctp.c
index 6606dbad6be505e1683565faec6cadb3fd12ce0d..7091a916d6ed48dfbd93fbaa5cd806e3e6557e6a 100644 (file)
@@ -34,8 +34,8 @@
  */
 
 #ifndef lint
-static const char rcsid[] =
-"@(#) $Header: /tcpdump/master/tcpdump/print-sctp.c,v 1.11 2002-12-11 07:14:08 guy Exp $ (NETLAB/PEL)";
+static const char rcsid[] _U_ =
+"@(#) $Header: /tcpdump/master/tcpdump/print-sctp.c,v 1.16.2.1 2005-04-13 08:37:08 guy Exp $ (NETLAB/PEL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -74,6 +74,7 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
   int chunkCount;
   const struct sctpChunkDesc *chunkDescPtr;
   const void *nextChunk;
+  const char *sep;
 
   sctpPktHdr = (const struct sctpHeader*) bp;
   endPacketPtr = (const u_char*)sctpPktHdr+sctpPacketLength;
@@ -109,35 +110,26 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
 
 #ifdef INET6
   if (ip6) {
-    if (ip6->ip6_nxt == IPPROTO_SCTP) {
-      (void)printf("%s.%d > %s.%d: sctp",
-        ip6addr_string(&ip6->ip6_src),
-        sourcePort,
-        ip6addr_string(&ip6->ip6_dst),
-        destPort);
-    } else {
-      (void)printf("%d > %d: sctp",
-        sourcePort, destPort);
-    }
+    (void)printf("%s.%d > %s.%d: sctp",
+      ip6addr_string(&ip6->ip6_src),
+      sourcePort,
+      ip6addr_string(&ip6->ip6_dst),
+      destPort);
   } else
 #endif /*INET6*/
   {
-    if (ip->ip_p == IPPROTO_SCTP) {
-      (void)printf("%s.%d > %s.%d: sctp",
-        ipaddr_string(&ip->ip_src),
-        sourcePort,
-        ipaddr_string(&ip->ip_dst),
-        destPort);
-    } else {
-      (void)printf("%d > %d: sctp",
-        sourcePort, destPort);
-    }
+    (void)printf("%s.%d > %s.%d: sctp",
+      ipaddr_string(&ip->ip_src),
+      sourcePort,
+      ipaddr_string(&ip->ip_dst),
+      destPort);
   }
   fflush(stdout);
 
-  if (vflag < 2)
-       return;
-
+  if (vflag >= 2)
+    sep = "\n\t";
+  else
+    sep = " (";
   /* cycle through all chunks, printing information on each one */
   for (chunkCount = 0,
         chunkDescPtr = (const struct sctpChunkDesc *)
@@ -160,7 +152,7 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
 
       nextChunk = (const void *) (chunkEnd + align);
 
-      printf("\n\t%d) ", chunkCount+1);
+      printf("%s%d) ", sep, chunkCount+1);
       switch (chunkDescPtr->chunkID)
        {
        case SCTP_DATA :
@@ -199,7 +191,7 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
            printf("[PPID 0x%x] ", EXTRACT_32BITS(&dataHdrPtr->payloadtype));
            fflush(stdout);
 
-           if (vflag)          /* if verbose output is specified */
+           if (vflag >= 2)        /* if verbose output is specified */
              {                    /* at the command line */
                const u_char *payloadPtr;
 
@@ -208,9 +200,17 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
                if (!xflag && !qflag) {
                        payloadPtr = (const u_char *) (++dataHdrPtr);
                        printf(":");
+                       if (htons(chunkDescPtr->chunkLength) <
+                           sizeof(struct sctpDataPart)+
+                           sizeof(struct sctpChunkDesc)+1) {
+                               printf("bogus chunk length %u]",
+                                   htons(chunkDescPtr->chunkLength));
+                               return;
+                       }
                        default_print(payloadPtr,
-                             htons(chunkDescPtr->chunkLength)-1 -
-                             sizeof(struct sctpDataPart)-sizeof(struct sctpChunkDesc));
+                             htons(chunkDescPtr->chunkLength) -
+                             (sizeof(struct sctpDataPart)+
+                             sizeof(struct sctpChunkDesc)+1));
                } else
                        printf("]");
              }
@@ -259,7 +259,7 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
            const struct sctpSelectiveAck *sack;
            const struct sctpSelectiveFrag *frag;
            int fragNo, tsnNo;
-           const u_long *dupTSN;
+           const u_char *dupTSN;
 
            printf("[SACK] ");
            sack=(const struct sctpSelectiveAck*)(chunkDescPtr+1);
@@ -282,9 +282,9 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
 
 
            /* print duplicate TSNs */
-           for (dupTSN = (const u_long*)frag, tsnNo=0;
+           for (dupTSN = (const u_char *)frag, tsnNo=0;
                 (const void *) dupTSN < nextChunk && tsnNo<EXTRACT_16BITS(&sack->numDupTsns);
-                dupTSN++, tsnNo++)
+                dupTSN += 4, tsnNo++)
              printf("\n\t\t[dup TSN #%u: %u] ", tsnNo+1,
                  EXTRACT_32BITS(dupTSN));
 
@@ -343,5 +343,8 @@ void sctp_print(const u_char *bp,        /* beginning of sctp packet */
          printf("[Unknown chunk type: 0x%x]", chunkDescPtr->chunkID);
          return;
        }
+
+       if (vflag < 2)
+         sep = ", (";
     }
 }