diff options
author | Rui Paulo <rpaulo@FreeBSD.org> | 2010-10-28 19:06:17 +0000 |
---|---|---|
committer | Rui Paulo <rpaulo@FreeBSD.org> | 2010-10-28 19:06:17 +0000 |
commit | 27df3f5dddcc52e19be97c5e876161208987d4f1 (patch) | |
tree | df5e0d876c3ec2ff0e3d9c6795cb5c1e20b7d5c4 /contrib/tcpdump/print-sctp.c | |
parent | ba2a27351bcd9e7c4ba485cf914d9071eebc2c60 (diff) | |
parent | 6d59e2f382406def185ce5261b8723a174cd28a3 (diff) | |
download | src-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.c | 60 |
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 |