aboutsummaryrefslogtreecommitdiff
path: root/contrib/tcpdump/print-sctp.c
diff options
context:
space:
mode:
authorRui Paulo <rpaulo@FreeBSD.org>2010-10-28 19:06:17 +0000
committerRui Paulo <rpaulo@FreeBSD.org>2010-10-28 19:06:17 +0000
commit27df3f5dddcc52e19be97c5e876161208987d4f1 (patch)
treedf5e0d876c3ec2ff0e3d9c6795cb5c1e20b7d5c4 /contrib/tcpdump/print-sctp.c
parentba2a27351bcd9e7c4ba485cf914d9071eebc2c60 (diff)
parent6d59e2f382406def185ce5261b8723a174cd28a3 (diff)
downloadsrc-27df3f5dddcc52e19be97c5e876161208987d4f1.tar.gz
src-27df3f5dddcc52e19be97c5e876161208987d4f1.zip
Merge tcpdump-4.1.1.
Notes
Notes: svn path=/head/; revision=214478
Diffstat (limited to 'contrib/tcpdump/print-sctp.c')
-rw-r--r--contrib/tcpdump/print-sctp.c60
1 files changed, 54 insertions, 6 deletions
diff --git a/contrib/tcpdump/print-sctp.c b/contrib/tcpdump/print-sctp.c
index 05c753a52e6c..0229396de66d 100644
--- a/contrib/tcpdump/print-sctp.c
+++ b/contrib/tcpdump/print-sctp.c
@@ -59,6 +59,29 @@ static const char rcsid[] _U_ =
#include "ip6.h"
#endif
+#define CHAN_HP 6700
+#define CHAN_MP 6701
+#define CHAN_LP 6702
+
+struct tok ForCES_channels[] = {
+ { CHAN_HP, "ForCES HP" },
+ { CHAN_MP, "ForCES MP" },
+ { CHAN_LP, "ForCES LP" },
+ { 0, NULL }
+};
+
+static inline int isForCES_port(u_short Port)
+{
+ if (Port == CHAN_HP)
+ return 1;
+ if (Port == CHAN_MP)
+ return 1;
+ if (Port == CHAN_LP)
+ return 1;
+
+ return 0;
+}
+
void sctp_print(const u_char *bp, /* beginning of sctp packet */
const u_char *bp2, /* beginning of enclosing */
u_int sctpPacketLength) /* ip packet */
@@ -74,6 +97,8 @@ void sctp_print(const u_char *bp, /* beginning of sctp packet */
const struct sctpChunkDesc *chunkDescPtr;
const void *nextChunk;
const char *sep;
+ int isforces = 0;
+
sctpPktHdr = (const struct sctpHeader*) bp;
endPacketPtr = (const u_char*)sctpPktHdr+sctpPacketLength;
@@ -120,6 +145,15 @@ void sctp_print(const u_char *bp, /* beginning of sctp packet */
}
fflush(stdout);
+ if (isForCES_port(sourcePort)) {
+ printf("[%s]", tok2str(ForCES_channels, NULL, sourcePort));
+ isforces = 1;
+ }
+ if (isForCES_port(destPort)) {
+ printf("[%s]", tok2str(ForCES_channels, NULL, destPort));
+ isforces = 1;
+ }
+
if (vflag >= 2)
sep = "\n\t";
else
@@ -193,9 +227,23 @@ void sctp_print(const u_char *bp, /* beginning of sctp packet */
printf("[SSEQ %u] ", EXTRACT_16BITS(&dataHdrPtr->sequence));
printf("[PPID 0x%x] ", EXTRACT_32BITS(&dataHdrPtr->payloadtype));
fflush(stdout);
-
- if (vflag >= 2) /* if verbose output is specified */
- { /* at the command line */
+ if (isforces) {
+ const u_char *payloadPtr;
+ u_int chunksize = sizeof(struct sctpDataPart)+
+ sizeof(struct sctpChunkDesc);
+ payloadPtr = (const u_char *) (dataHdrPtr + 1);
+ if (EXTRACT_16BITS(&chunkDescPtr->chunkLength) <
+ sizeof(struct sctpDataPart)+
+ sizeof(struct sctpChunkDesc)+1) {
+ /* Less than 1 byte of chunk payload */
+ printf("bogus ForCES chunk length %u]",
+ EXTRACT_16BITS(&chunkDescPtr->chunkLength));
+ return;
+ }
+
+ forces_print(payloadPtr, EXTRACT_16BITS(&chunkDescPtr->chunkLength)- chunksize);
+ } else if (vflag >= 2) { /* if verbose output is specified */
+ /* at the command line */
const u_char *payloadPtr;
printf("[Payload");
@@ -203,16 +251,16 @@ void sctp_print(const u_char *bp, /* beginning of sctp packet */
if (!suppress_default_print) {
payloadPtr = (const u_char *) (++dataHdrPtr);
printf(":");
- if (htons(chunkDescPtr->chunkLength) <
+ if (EXTRACT_16BITS(&chunkDescPtr->chunkLength) <
sizeof(struct sctpDataPart)+
sizeof(struct sctpChunkDesc)+1) {
/* Less than 1 byte of chunk payload */
printf("bogus chunk length %u]",
- htons(chunkDescPtr->chunkLength));
+ EXTRACT_16BITS(&chunkDescPtr->chunkLength));
return;
}
default_print(payloadPtr,
- htons(chunkDescPtr->chunkLength) -
+ EXTRACT_16BITS(&chunkDescPtr->chunkLength) -
(sizeof(struct sctpDataPart)+
sizeof(struct sctpChunkDesc)));
} else