diff options
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 05c753a..0229396 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 |