X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/7885cfa165458a05ef818c34ee03affc79f03725..c39d40a767a1ae36171e5bcbf6f157ff3e80fb6c:/print-atm.c diff --git a/print-atm.c b/print-atm.c index e6b7caa3..904fc479 100644 --- a/print-atm.c +++ b/print-atm.c @@ -27,6 +27,7 @@ #include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" #include "addrtoname.h" @@ -113,13 +114,15 @@ #define PROTO_POS 0 /* offset of protocol discriminator */ #define CALL_REF_POS 2 /* offset of call reference value */ #define MSG_TYPE_POS 5 /* offset of message type */ -#define MSG_LEN_POS 7 /* offset of mesage length */ +#if 0 +#define MSG_LEN_POS 7 /* offset of message length */ #define IE_BEGIN_POS 9 /* offset of first information element */ /* format of signalling messages */ #define TYPE_POS 0 #define LEN_POS 2 #define FIELD_BEGIN_POS 4 +#endif /* end of the original atmuni31.h */ @@ -193,23 +196,11 @@ static const struct tok oam_fm_loopback_indicator_values[] = { { 0, NULL } }; -static const struct tok *oam_functype_values[16] = { - NULL, - oam_fm_functype_values, /* 1 */ - oam_pm_functype_values, /* 2 */ - NULL, - NULL, - NULL, - NULL, - NULL, - oam_ad_functype_values, /* 8 */ - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL +static const struct uint_tokary oam_celltype2tokary[] = { + { OAM_CELLTYPE_FM, oam_fm_functype_values }, + { OAM_CELLTYPE_PM, oam_pm_functype_values }, + { OAM_CELLTYPE_AD, oam_ad_functype_values }, + /* uint2tokary() does not use array termination. */ }; /* @@ -243,7 +234,7 @@ atm_llc_print(netdissect_options *ndo, * 'h->len' is the length of the packet off the wire, and 'h->caplen' * is the number of bytes actually captured. */ -u_int +void atm_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p) { @@ -252,28 +243,21 @@ atm_if_print(netdissect_options *ndo, uint32_t llchdr; u_int hdrlen = 0; - ndo->ndo_protocol = "atm_if"; - if (caplen < 1) { - nd_print_trunc(ndo); - return (caplen); - } + ndo->ndo_protocol = "atm"; /* Cisco Style NLPID ? */ if (GET_U_1(p) == LLC_UI) { if (ndo->ndo_eflag) ND_PRINT("CNLPID "); + ndo->ndo_ll_hdr_len += 1; isoclns_print(ndo, p + 1, length - 1); - return hdrlen; + return; } /* * Must have at least a DSAP, an SSAP, and the first byte of the * control field. */ - if (caplen < 3) { - nd_print_trunc(ndo); - return (caplen); - } /* * Extract the presumed LLC header into a variable, for quick @@ -302,23 +286,21 @@ atm_if_print(netdissect_options *ndo, * packets? If so, could it be changed to use a * new DLT_IEEE802_6 value if we added it? */ - if (caplen < 20) { - nd_print_trunc(ndo); - return (caplen); - } if (ndo->ndo_eflag) ND_PRINT("%08x%08x %08x%08x ", GET_BE_U_4(p), GET_BE_U_4(p + 4), GET_BE_U_4(p + 8), GET_BE_U_4(p + 12)); + /* Always cover the full header. */ + ND_TCHECK_LEN(p, 20); p += 20; length -= 20; caplen -= 20; hdrlen += 20; } - hdrlen += atm_llc_print(ndo, p, length, caplen); - return (hdrlen); + ndo->ndo_ll_hdr_len += hdrlen; + ndo->ndo_ll_hdr_len += atm_llc_print(ndo, p, length, caplen); } /* @@ -349,14 +331,12 @@ sig_print(netdissect_options *ndo, { uint32_t call_ref; - ND_TCHECK_1(p + PROTO_POS); if (GET_U_1(p + PROTO_POS) == Q2931) { /* * protocol:Q.2931 for User to Network Interface * (UNI 3.1) signalling */ ND_PRINT("Q.2931"); - ND_TCHECK_1(p + MSG_TYPE_POS); ND_PRINT(":%s ", tok2str(msgtype2str, "msgtype#%u", GET_U_1(p + MSG_TYPE_POS))); @@ -372,10 +352,6 @@ sig_print(netdissect_options *ndo, /* SSCOP with some unknown protocol atop it */ ND_PRINT("SSCOP, proto %u ", GET_U_1(p + PROTO_POS)); } - return; - -trunc: - nd_print_trunc(ndo); } /* @@ -454,6 +430,7 @@ oam_print(netdissect_options *ndo, uint32_t cell_header; uint16_t vpi, vci, cksum, cksum_shouldbe, idx; uint8_t cell_type, func_type, payload, clp; + const struct tok *oam_functype_str; union { const struct oam_fm_loopback_t *oam_fm_loopback; @@ -461,7 +438,6 @@ oam_print(netdissect_options *ndo, } oam_ptr; ndo->ndo_protocol = "oam"; - ND_TCHECK_1(p + ATM_HDR_LEN_NOHEC + hec); cell_header = GET_BE_U_4(p + hec); cell_type = (GET_U_1((p + ATM_HDR_LEN_NOHEC + hec)) >> 4) & 0x0f; func_type = GET_U_1((p + ATM_HDR_LEN_NOHEC + hec)) & 0x0f; @@ -485,11 +461,12 @@ oam_print(netdissect_options *ndo, tok2str(oam_celltype_values, "unknown", cell_type), cell_type); - if (oam_functype_values[cell_type] == NULL) + oam_functype_str = uint2tokary(oam_celltype2tokary, cell_type); + if (oam_functype_str == NULL) ND_PRINT(", func-type unknown (%u)", func_type); else ND_PRINT(", func-type %s (%u)", - tok2str(oam_functype_values[cell_type],"none",func_type), + tok2str(oam_functype_str, "none", func_type), func_type); p += ATM_HDR_LEN_NOHEC + hec; @@ -543,7 +520,6 @@ oam_print(netdissect_options *ndo, } /* crc10 checksum verification */ - ND_TCHECK_2(p + OAM_CELLTYPE_FUNCTYPE_LEN + OAM_FUNCTION_SPECIFIC_LEN); cksum = GET_BE_U_2(p + OAM_CELLTYPE_FUNCTYPE_LEN + OAM_FUNCTION_SPECIFIC_LEN) & OAM_CRC10_MASK; cksum_shouldbe = verify_crc10_cksum(0, p, OAM_PAYLOAD_LEN); @@ -551,10 +527,4 @@ oam_print(netdissect_options *ndo, ND_PRINT("\n\tcksum 0x%03x (%scorrect)", cksum, cksum_shouldbe == 0 ? "" : "in"); - - return; - -trunc: - nd_print_trunc(ndo); - return; }