summaryrefslogtreecommitdiff
path: root/print-dtp.c
diff options
context:
space:
mode:
authortaesub kim <taesub.kim@samsung.com>2018-05-25 18:41:28 +0900
committertaesub kim <taesub.kim@samsung.com>2018-05-25 18:41:46 +0900
commit68b0938829a42f1f5dbb099d79df2cae08bf9d73 (patch)
treeb533139096485b4fca980ba934021dd08cc31434 /print-dtp.c
parentbbace1d4c8912a4a02cc0322e2cbed1901c62d96 (diff)
downloadtcpdump-68b0938829a42f1f5dbb099d79df2cae08bf9d73.tar.gz
tcpdump-68b0938829a42f1f5dbb099d79df2cae08bf9d73.tar.bz2
tcpdump-68b0938829a42f1f5dbb099d79df2cae08bf9d73.zip
Imported Upstream version 4.9.2upstream/4.9.2
Change-Id: I490892f19c71ba126fa4e1d3d78e730429a3b454
Diffstat (limited to 'print-dtp.c')
-rw-r--r--print-dtp.c73
1 files changed, 39 insertions, 34 deletions
diff --git a/print-dtp.c b/print-dtp.c
index c358a89..1d8c66a 100644
--- a/print-dtp.c
+++ b/print-dtp.c
@@ -12,24 +12,22 @@
* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
- * Dynamic Trunk Protocol (DTP)
- *
* Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
*/
+/* \summary: Dynamic Trunking Protocol (DTP) printer */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "interface.h"
+#include "netdissect.h"
#include "addrtoname.h"
-#include "extract.h"
-#include "nlpid.h"
+#include "extract.h"
+
+static const char tstr[] = " [|dtp]";
#define DTP_HEADER_LEN 1
#define DTP_DOMAIN_TLV 0x0001
@@ -37,7 +35,7 @@
#define DTP_DTP_TYPE_TLV 0x0003
#define DTP_NEIGHBOR_TLV 0x0004
-static struct tok dtp_tlv_values[] = {
+static const struct tok dtp_tlv_values[] = {
{ DTP_DOMAIN_TLV, "Domain TLV"},
{ DTP_STATUS_TLV, "Status TLV"},
{ DTP_DTP_TYPE_TLV, "DTP type TLV"},
@@ -46,7 +44,7 @@ static struct tok dtp_tlv_values[] = {
};
void
-dtp_print (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;
@@ -54,19 +52,18 @@ dtp_print (const u_char *pptr, u_int length)
if (length < DTP_HEADER_LEN)
goto trunc;
- tptr = pptr;
+ tptr = pptr;
- if (!TTEST2(*tptr, DTP_HEADER_LEN))
- goto trunc;
+ ND_TCHECK2(*tptr, DTP_HEADER_LEN);
- printf("DTPv%u, length %u",
+ ND_PRINT((ndo, "DTPv%u, length %u",
(*tptr),
- length);
+ length));
/*
* In non-verbose mode, just print version.
*/
- if (vflag < 1) {
+ if (ndo->ndo_vflag < 1) {
return;
}
@@ -74,45 +71,53 @@ dtp_print (const u_char *pptr, u_int length)
while (tptr < (pptr+length)) {
- if (!TTEST2(*tptr, 4))
- goto trunc;
-
+ ND_TCHECK2(*tptr, 4);
type = EXTRACT_16BITS(tptr);
- len = EXTRACT_16BITS(tptr+2);
-
- /* infinite loop check */
- if (type == 0 || len == 0) {
+ len = EXTRACT_16BITS(tptr+2);
+ /* XXX: should not be but sometimes it is, see the test captures */
+ if (type == 0)
return;
- }
-
- printf("\n\t%s (0x%04x) TLV, length %u",
+ ND_PRINT((ndo, "\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_TCHECK2(*tptr, len);
switch (type) {
case DTP_DOMAIN_TLV:
- printf(", %s", tptr+4);
+ ND_PRINT((ndo, ", "));
+ fn_printzp(ndo, tptr+4, len-4, pptr+length);
break;
- case DTP_STATUS_TLV:
+ case DTP_STATUS_TLV:
case DTP_DTP_TYPE_TLV:
- printf(", 0x%x", *(tptr+4));
+ if (len < 5)
+ goto invalid;
+ ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
break;
case DTP_NEIGHBOR_TLV:
- printf(", %s", etheraddr_string(tptr+4));
+ if (len < 10)
+ goto invalid;
+ ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
break;
default:
break;
- }
+ }
tptr += len;
}
return;
+ invalid:
+ ND_PRINT((ndo, "%s", istr));
+ return;
trunc:
- printf("[|dtp]");
+ ND_PRINT((ndo, "%s", tstr));
}
/*