#include "netdissect-stdinc.h"
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
ndo->ndo_protocol = "sctp";
if (sctpPacketLength < sizeof(struct sctpHeader))
{
- ND_PRINT("truncated-sctp - %ld bytes missing!",
- (long)(sizeof(struct sctpHeader) - sctpPacketLength));
- return;
+ ND_PRINT("truncated-sctp - %zu bytes missing!",
+ sizeof(struct sctpHeader) - sctpPacketLength);
+ goto invalid;
}
sctpPktHdr = (const struct sctpHeader*) bp;
ND_TCHECK_SIZE(sctpPktHdr);
if (ip6) {
ND_PRINT("%s.%u > %s.%u: sctp",
- ip6addr_string(ndo, ip6->ip6_src),
+ GET_IP6ADDR_STRING(ip6->ip6_src),
sourcePort,
- ip6addr_string(ndo, ip6->ip6_dst),
+ GET_IP6ADDR_STRING(ip6->ip6_dst),
destPort);
- } else
- {
+ } else {
ND_PRINT("%s.%u > %s.%u: sctp",
- ipaddr_string(ndo, ip->ip_src),
+ GET_IPADDR_STRING(ip->ip_src),
sourcePort,
- ipaddr_string(ndo, ip->ip_dst),
+ GET_IPADDR_STRING(ip->ip_dst),
destPort);
}
if (chunkLengthRemaining < sizeof(*dataHdrPtr)) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
dataHdrPtr=(const struct sctpDataPart*)bp;
payload_size = chunkLengthRemaining;
if (payload_size == 0) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
if (isforces) {
if (chunkLengthRemaining < sizeof(*init)) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
init=(const struct sctpInitiation*)bp;
ND_PRINT("[init tag: %u] ", GET_BE_U_4(init->initTag));
if (chunkLengthRemaining < sizeof(*init)) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
init=(const struct sctpInitiation*)bp;
ND_PRINT("[init tag: %u] ", GET_BE_U_4(init->initTag));
if (chunkLengthRemaining < sizeof(*sack)) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
sack=(const struct sctpSelectiveAck*)bp;
ND_PRINT("[cum ack %u] ", GET_BE_U_4(sack->highestConseqTSN));
bp += sizeof(*frag), sctpPacketLengthRemaining -= sizeof(*frag), chunkLengthRemaining -= sizeof(*frag), fragNo++) {
if (chunkLengthRemaining < sizeof(*frag)) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
frag = (const struct sctpSelectiveFrag *)bp;
ND_PRINT("\n\t\t[gap ack block #%u: start = %u, end = %u] ",
bp += 4, sctpPacketLengthRemaining -= 4, chunkLengthRemaining -= 4, tsnNo++) {
if (chunkLengthRemaining < 4) {
ND_PRINT("bogus chunk length %u]", chunkLength);
- return;
+ goto invalid;
}
dupTSN = (const u_char *)bp;
ND_PRINT("\n\t\t[dup TSN #%u: %u] ", tsnNo+1,
}
}
return;
-
-trunc:
- nd_print_trunc(ndo);
+invalid:
+ nd_print_invalid(ndo);
}