* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
- * Dynamic Trunk Protocol (DTP)
- *
*/
+/* \summary: Dynamic Trunking Protocol (DTP) printer */
+
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
-#include <tcpdump-stdinc.h>
+#include "netdissect-stdinc.h"
-#include "interface.h"
+#include "netdissect.h"
#include "addrtoname.h"
#include "extract.h"
+
#define DTP_HEADER_LEN 1
#define DTP_DOMAIN_TLV 0x0001
#define DTP_STATUS_TLV 0x0002
};
void
-dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
+dtp_print(netdissect_options *ndo, const u_char *pptr, u_int length)
{
int type, len;
const u_char *tptr;
+ ndo->ndo_protocol = "dtp";
if (length < DTP_HEADER_LEN)
goto trunc;
tptr = pptr;
- ND_TCHECK2(*tptr, DTP_HEADER_LEN);
+ ND_TCHECK_LEN(tptr, DTP_HEADER_LEN);
- ND_PRINT((ndo, "DTPv%u, length %u",
- (*tptr),
- length));
+ ND_PRINT("DTPv%u, length %u",
+ GET_U_1(tptr),
+ length);
/*
* In non-verbose mode, just print version.
while (tptr < (pptr+length)) {
- ND_TCHECK2(*tptr, 4);
-
- type = EXTRACT_16BITS(tptr);
- len = EXTRACT_16BITS(tptr+2);
-
- /* infinite loop check */
- if (type == 0 || len == 0) {
+ ND_TCHECK_4(tptr);
+ type = GET_BE_U_2(tptr);
+ len = GET_BE_U_2(tptr + 2);
+ /* XXX: should not be but sometimes it is, see the test captures */
+ if (type == 0)
return;
- }
-
- ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
+ ND_PRINT("\n\t%s (0x%04x) TLV, length %u",
tok2str(dtp_tlv_values, "Unknown", type),
- type, len));
+ type, len);
+
+ /* infinite loop check */
+ if (len < 4)
+ goto invalid;
+ ND_TCHECK_LEN(tptr, len);
switch (type) {
case DTP_DOMAIN_TLV:
- ND_PRINT((ndo, ", %s", tptr+4));
+ ND_PRINT(", ");
+ nd_printzp(ndo, tptr+4, len-4, pptr+length);
break;
case DTP_STATUS_TLV:
case DTP_DTP_TYPE_TLV:
- ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
+ if (len < 5)
+ goto invalid;
+ ND_PRINT(", 0x%x", GET_U_1(tptr + 4));
break;
case DTP_NEIGHBOR_TLV:
- ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
+ if (len < 10)
+ goto invalid;
+ ND_PRINT(", %s", GET_ETHERADDR_STRING(tptr+4));
break;
default:
return;
+ invalid:
+ nd_print_invalid(ndo);
+ return;
trunc:
- ND_PRINT((ndo, "[|dtp]"));
+ nd_print_trunc(ndo);
}
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 4
- * End:
- */