]> The Tcpdump Group git mirrors - tcpdump/commitdiff
Add MSDP printer.
authorfenner <fenner>
Mon, 17 Sep 2001 20:06:17 +0000 (20:06 +0000)
committerfenner <fenner>
Mon, 17 Sep 2001 20:06:17 +0000 (20:06 +0000)
Makefile.in
interface.h
print-msdp.c [new file with mode: 0644]
print-tcp.c

index dd77f805db9825b2fd7ab59b05637a806b5f7760..b3375b19488dc641756229ca9e7af645c22d3cb6 100644 (file)
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.254 2001-09-17 06:22:32 guy Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.255 2001-09-17 20:06:17 fenner Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -75,11 +75,12 @@ CSRC =      addrtoname.c gmt2local.c machdep.c parsenfsfh.c \
        print-igmp.c print-igrp.c print-ip.c print-ipcomp.c \
        print-ipx.c print-isakmp.c print-isoclns.c print-krb.c \
        print-l2tp.c print-lane.c print-lcp.c print-llc.c print-lwres.c \
-       print-mobile.c print-mpls.c print-nfs.c print-ntp.c print-null.c \
-       print-ospf.c print-pim.c print-ppp.c print-pppoe.c \
-       print-pptp.c print-radius.c print-raw.c print-rip.c \
-       print-rx.c print-sctp.c print-sl.c print-sll.c print-smb.c \
-       print-snmp.c print-stp.c print-sunrpc.c print-tcp.c \
+       print-msdp.c print-mobile.c print-mpls.c print-nfs.c \
+       print-ntp.c print-null.c print-ospf.c print-pim.c \
+       print-ppp.c print-pppoe.c print-pptp.c print-radius.c \
+       print-raw.c print-rip.c print-rx.c print-sctp.c \
+       print-sl.c print-sll.c print-smb.c print-snmp.c \
+       print-stp.c print-sunrpc.c print-tcp.c \
        print-telnet.c print-tftp.c print-timed.c print-token.c \
        print-udp.c print-vjc.c print-vrrp.c print-wb.c print-zephyr.c \
        setsignal.c smbutil.c tcpdump.c util.c
index 62a13d59795ab0c4d9f309076f0080ffee4ad62b..6eb19db5b73a11009b597c826c3e06840356e3d1 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.169 2001-09-17 06:22:32 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.170 2001-09-17 20:06:17 fenner Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -220,6 +220,7 @@ extern void krb_print(const u_char *, u_int);
 extern void llap_print(const u_char *, u_int);
 extern void ltalk_if_print(u_char *, const struct pcap_pkthdr *,
        const u_char *);
+extern void msdp_print(const unsigned char *, u_int);
 extern void nfsreply_print(const u_char *, u_int, const u_char *);
 extern void nfsreq_print(const u_char *, u_int, const u_char *);
 extern void ns_print(const u_char *, u_int);
diff --git a/print-msdp.c b/print-msdp.c
new file mode 100644 (file)
index 0000000..62cb1bf
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2001 William C. Fenner.
+ *                All rights reserved.
+ *
+ * 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.
+ * The name of William C. Fenner may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.  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.
+ */
+#ifndef lint
+static const char rcsid[] =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-msdp.c,v 1.1 2001-09-17 20:06:18 fenner Exp $";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#define MSDP_TYPE_MAX  7
+
+void
+msdp_print(const unsigned char *sp, u_int length)
+{
+       unsigned int type, len;
+
+       TCHECK2(*sp, 3);
+       /* See if we think we're at the beginning of a compound packet */
+       type = *sp;
+       len = EXTRACT_16BITS(sp + 1);
+       if (len > 1500 || len < 3 || type == 0 || type > MSDP_TYPE_MAX)
+               goto trunc;     /* not really truncated, but still not decodable */
+       (void)printf(" msdp:");
+       while (length > 0) {
+               TCHECK2(*sp, 3);
+               type = *sp;
+               len = EXTRACT_16BITS(sp + 1);
+               if (len > 1400 || vflag)
+                       printf(" [len %d]", len);
+               if (len < 3)
+                       goto trunc;
+               sp += 3;
+               length -= 3;
+               switch (type) {
+               case 1: /* IPv4 Source-Active */
+               case 3: /* IPv4 Source-Active Response */
+                       if (type == 1)
+                               (void)printf(" SA");
+                       else
+                               (void)printf(" SA-Response");
+                       TCHECK(*sp);
+                       (void)printf(" %d entries", *sp);
+                       if (*sp * 12 + 8 < len) {
+                               (void)printf(" [w/data]");
+                               if (vflag > 1) {
+                                       (void)printf(" ");
+                                       ip_print(sp + *sp * 12 + 8 - 3,
+                                                len - (*sp * 12 + 8));
+                               }
+                       }
+                       break;
+               case 2:
+                       (void)printf(" SA-Request");
+                       TCHECK2(*sp, 5);
+                       (void)printf(" for %s", ipaddr_string(sp + 1));
+                       break;
+               case 4:
+                       (void)printf(" Keepalive");
+                       if (len != 3)
+                               (void)printf("[len=%d] ", len);
+                       break;
+               case 5:
+                       (void)printf(" Notification");
+                       break;
+               default:
+                       (void)printf(" [type=%d len=%d]", type, len);
+                       break;
+               }
+               sp += (len - 3);
+               length -= (len - 3);
+       }
+       return;
+trunc:
+       (void)printf(" [|msdp]");
+}
index 54ae3d5571c6d7dff716625f0188baab98d009a5..241d5b0f30b4af45379b59d8e6a8b5516f5ae785 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.88 2001-08-20 17:53:53 fenner Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.89 2001-09-17 20:06:18 fenner Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -99,6 +99,7 @@ static struct tcp_seq_hash tcp_seq_hash[TSEQ_HASHSIZE];
 #ifndef NFS_PORT
 #define NFS_PORT       2049
 #endif
+#define MSDP_PORT      639
 
 static int tcp_cksum(register const struct ip *ip,
                     register const struct tcphdr *tp,
@@ -607,6 +608,8 @@ tcp_print(register const u_char *bp, register u_int length,
                    (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT)) {
                        /* TCP DNS query has 2byte length at the head */
                        ns_print(bp + 2, length - 2);
+               } else if (sport == MSDP_PORT || dport == MSDP_PORT) {
+                       msdp_print(bp, length);
                }
        }
        return;