]> The Tcpdump Group git mirrors - tcpdump/commitdiff
From Carles Kishimoto <[email protected]>:
authorhannes <hannes>
Mon, 19 Mar 2007 15:14:14 +0000 (15:14 +0000)
committerhannes <hannes>
Mon, 19 Mar 2007 15:14:14 +0000 (15:14 +0000)
add support for unidirectional link detection as per
http://www.ietf.org/internet-drafts/draft-foschiano-udld-02.txt

FILES
llc.h
print-llc.c
print-udld.c [new file with mode: 0644]
win32/prj/GNUmakefile
win32/prj/WinDump.dsp

diff --git a/FILES b/FILES
index 4faaa4b20ce2fc367183b75a69302b6b4e477f42..295ca801bffc60e324c8395c2da63452a51a2102 100644 (file)
--- a/FILES
+++ b/FILES
@@ -208,6 +208,7 @@ print-telnet.c
 print-tftp.c
 print-timed.c
 print-token.c
+print-udld.c
 print-udp.c
 print-vjc.c
 print-vqp.c
diff --git a/llc.h b/llc.h
index 146f3714f21eee01090cb7af5e1eaf59d84bd33f..882b80cea67f91cab9151eda1db2e9a52d93fa0f 100644 (file)
--- a/llc.h
+++ b/llc.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/tcpdump/llc.h,v 1.21 2007-02-08 07:06:54 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/llc.h,v 1.22 2007-03-19 15:14:14 hannes Exp $ (LBL)
  */
 
 /*
 #define        PID_CISCO_CDP           0x2000  /* Cisco Discovery Protocol */
 #define        PID_CISCO_VTP           0x2003  /* Cisco VLAN Trunk Protocol */
 #define        PID_CISCO_DTP           0x2004  /* Cisco Dynamic Trunk Protocol */
+#define        PID_CISCO_UDLD          0x0111  /* Unidirectional Link Detection */
 
 /*
  * PIDs for use with OUI_RFC2684.
index 2cb81f457dda3d1176b3f7794bdea55618af3166..f4ddf2ce63f99810848c9d10f0b254bb2f3ce43c 100644 (file)
@@ -24,7 +24,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-llc.c,v 1.71 2007-02-08 07:06:54 guy Exp $";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-llc.c,v 1.72 2007-03-19 15:14:14 hannes Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -105,6 +105,7 @@ static const struct tok cisco_values[] = {
        { PID_CISCO_CDP, "CDP" },
        { PID_CISCO_VTP, "VTP" },
        { PID_CISCO_DTP, "DTP" },
+       { PID_CISCO_UDLD, "UDLD" },
        { 0,             NULL }
 };
 
@@ -441,11 +442,16 @@ snap_print(const u_char *p, u_int length, u_int caplen,
                break;
 
        case OUI_CISCO:
-               if (et == PID_CISCO_CDP) {
-                       cdp_print(p, length, caplen);
-                       return (1);
-               }
-               break;
+                switch (et) {
+                case PID_CISCO_CDP:
+                        cdp_print(p, length, caplen);
+                        return (1);
+                case PID_CISCO_UDLD:
+                        udld_print(p, length);
+                        return (1);
+                default:
+                        break;
+                }
 
        case OUI_RFC2684:
                switch (et) {
diff --git a/print-udld.c b/print-udld.c
new file mode 100644 (file)
index 0000000..a5488dd
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 1998-2007 The TCPDUMP project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ *
+ * UNIDIRECTIONAL LINK DETECTION (UDLD) as per 
+ * http://www.ietf.org/internet-drafts/draft-foschiano-udld-02.txt
+ *
+ * Original code by Carles Kishimoto <[email protected]>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <tcpdump-stdinc.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"           
+#include "nlpid.h"
+
+#define UDLD_HEADER_LEN                        4
+#define UDLD_DEVICE_ID_TLV             0x0001
+#define UDLD_PORT_ID_TLV               0x0002
+#define UDLD_ECHO_TLV                  0x0003
+#define UDLD_MESSAGE_INTERVAL_TLV      0x0004
+#define UDLD_TIMEOUT_INTERVAL_TLV      0x0005
+#define UDLD_DEVICE_NAME_TLV           0x0006
+#define UDLD_SEQ_NUMBER_TLV            0x0007
+
+static struct tok udld_tlv_values[] = {
+    { UDLD_DEVICE_ID_TLV, "Device-ID TLV"},
+    { UDLD_PORT_ID_TLV, "Port-ID TLV"},
+    { UDLD_ECHO_TLV, "Echo TLV"},
+    { UDLD_MESSAGE_INTERVAL_TLV, "Message Interval TLV"},
+    { UDLD_TIMEOUT_INTERVAL_TLV, "Timeout Interval TLV"},
+    { UDLD_DEVICE_NAME_TLV, "Device Name TLV"},
+    { UDLD_SEQ_NUMBER_TLV,"Sequence Number TLV"},
+    { 0, NULL}
+};
+
+static struct tok udld_code_values[] = {
+    { 0x00, "Reserved"},
+    { 0x01, "Probe message"},
+    { 0x02, "Echo message"},
+    { 0x03, "Flush message"},
+    { 0, NULL}
+};
+
+static struct tok udld_flags_values[] = {
+    { 0x00, "RT"},
+    { 0x01, "RSY"},
+    { 0, NULL}
+};
+
+/*
+ *
+ * 0                   1                   2                   3 
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
+ * | Ver | Opcode  |     Flags     |           Checksum            | 
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
+ * |               List of TLVs (variable length list)             | 
+ * |                              ...                              | 
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
+ *
+ */
+
+#define        UDLD_EXTRACT_VERSION(x) (((x)&0xe0)>>5) 
+#define        UDLD_EXTRACT_OPCODE(x) ((x)&0x1f) 
+
+void
+udld_print (const u_char *pptr, u_int length)
+{
+    int code, type, len;
+    const u_char *tptr;
+
+    if (length < UDLD_HEADER_LEN)
+        goto trunc;
+
+    tptr = pptr; 
+
+    if (!TTEST2(*tptr, UDLD_HEADER_LEN))       
+       goto trunc;
+
+    code = UDLD_EXTRACT_OPCODE(*tptr);
+
+    printf("UDLDv%u, Code %s (%x), Flags [%s] (0x%02x), length %u", 
+           UDLD_EXTRACT_VERSION(*tptr),
+           tok2str(udld_code_values, "Reserved", code),
+           code,
+           bittok2str(udld_flags_values, "none", *(tptr+1)),
+           *(tptr+1),
+           length);
+
+    /*
+     * In non-verbose mode, just print version and opcode type
+     */
+    if (vflag < 1) {
+       return;
+    }
+
+    printf("\n\tChecksum 0x%04x (unverified)", EXTRACT_16BITS(tptr+2));
+
+    tptr += UDLD_HEADER_LEN;
+
+    while (tptr < (pptr+length)) {
+
+        if (!TTEST2(*tptr, 4)) 
+            goto trunc;
+
+       type = EXTRACT_16BITS(tptr);
+        len  = EXTRACT_16BITS(tptr+2); 
+        len -= 4;
+        tptr += 4;
+
+        /* infinite loop check */
+        if (type == 0 || len == 0) {
+            return;
+        }
+
+        printf("\n\t%s (0x%04x) TLV, length %u",
+               tok2str(udld_tlv_values, "Unknown", type),
+               type, len);
+
+        switch (type) {
+        case UDLD_DEVICE_ID_TLV:
+        case UDLD_PORT_ID_TLV:
+        case UDLD_ECHO_TLV:
+        case UDLD_DEVICE_NAME_TLV: 
+            printf(", %s", tptr);
+            break;
+
+        case UDLD_MESSAGE_INTERVAL_TLV: 
+        case UDLD_TIMEOUT_INTERVAL_TLV:
+            printf(", %us", (*tptr));
+            break;
+
+        case UDLD_SEQ_NUMBER_TLV:
+            printf(", %u", EXTRACT_32BITS(tptr));
+            break;
+
+        default:
+            break;
+        }      
+        tptr += len;
+    }
+
+    return;
+
+ trunc:
+    printf("[|udld]");
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
index 7cd03efc5cb2a411b63463b6f54952d50cfaa5a2..45d2c59d3675f25308511492c2d17edb7198ecdf 100644 (file)
@@ -130,6 +130,7 @@ OBJS = \
        ../../print-tftp.o \
        ../../print-timed.o \
        ../../print-token.o \
+       ../../print-udlp.o \
        ../../print-udp.o \
        ../../print-vjc.o \
        ../../print-vqp.o \
index a8e0fa13514e0a1aec8e92716a9ea5f5e732cc63..1208dabe624ff5806d11b0e2f26a93eb93d9640f 100644 (file)
@@ -545,6 +545,10 @@ SOURCE="..\..\print-token.c"
 # End Source File
 # Begin Source File
 
+SOURCE="..\..\print-udld.c"
+# End Source File
+# Begin Source File
+
 SOURCE="..\..\print-udp.c"
 # End Source File
 # Begin Source File