]> The Tcpdump Group git mirrors - tcpdump/commitdiff
add basic skeleton for printing olsr packets as per rfc3626
authorhannes <hannes>
Tue, 27 Mar 2007 10:44:09 +0000 (10:44 +0000)
committerhannes <hannes>
Tue, 27 Mar 2007 10:44:09 +0000 (10:44 +0000)
add a line break in verbose mode fro the ip printer.

FILES
Makefile.in
interface.h
print-ip.c
print-olsr.c [new file with mode: 0644]
print-udp.c
udp.h
win32/prj/GNUmakefile
win32/prj/WinDump.dsp

diff --git a/FILES b/FILES
index 14176745ead78526be5c3e70a0259b2f2779df7b..2402bbc44af3ec7043021871fbc32cf8bc183c69 100644 (file)
--- a/FILES
+++ b/FILES
@@ -177,6 +177,7 @@ print-netbios.c
 print-nfs.c
 print-ntp.c
 print-null.c
+print-olsr.c
 print-ospf.c
 print-ospf6.c
 print-pflog.c
index dd0a892ae53cc39f95cef4535e6e7b27131e4606..97fa7cddbf68de3413357abba2a69660a65d73d8 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.308 2007-03-23 08:12:00 hannes Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.309 2007-03-27 10:44:09 hannes Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -80,7 +80,7 @@ CSRC =        addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c
        print-l2tp.c print-lane.c print-ldp.c print-llc.c \
         print-lmp.c print-lspping.c \
        print-lwres.c print-mobile.c print-mpcp.c print-mpls.c print-msdp.c \
-       print-nfs.c print-ntp.c print-null.c print-ospf.c \
+       print-nfs.c print-ntp.c print-null.c print-olsr.c print-ospf.c \
        print-pflog.c print-pgm.c print-pim.c print-ppp.c print-pppoe.c \
        print-pptp.c print-radius.c print-raw.c print-rip.c \
        print-rsvp.c print-rx.c print-sctp.c print-sip.c print-sl.c print-sll.c \
index da54ef19ec0ee30dd161a2b11ff9fc4d722126e3..f196af5086b5352535126ef062720e8026e73429 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.274 2007-03-23 08:12:00 hannes Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.275 2007-03-27 10:44:09 hannes Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -108,6 +108,10 @@ extern char *strsep(char **, const char *);
 #endif
 #endif
 
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+
 extern char *program_name;     /* used to generate self-identifying messages */
 
 extern int32_t thiszone;       /* seconds offset from gmt to local time */
@@ -233,6 +237,7 @@ extern void ns_print(const u_char *, u_int, int);
 extern void ntp_print(const u_char *, u_int);
 extern u_int null_if_print(const struct pcap_pkthdr *, const u_char *);
 extern void ospf_print(const u_char *, u_int, const u_char *);
+extern void olsr_print (const u_char *, u_int);
 extern void pimv1_print(const u_char *, u_int);
 extern void cisco_autorp_print(const u_char *, u_int);
 extern void rsvp_print(const u_char *, u_int);
index e38195c0c35bc7adc58f145852dddf0793f0d479..3d08f553f1329c0998f1804c5ee4c7d7397d733d 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.157 2007-01-17 17:55:01 hannes Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.158 2007-03-27 10:44:09 hannes Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -665,7 +665,7 @@ ip_print(netdissect_options *ndo,
                }
            }
 
-            printf(") ");
+            printf(")\n    ");
        }
 
        /*
diff --git a/print-olsr.c b/print-olsr.c
new file mode 100644 (file)
index 0000000..7fe4fb3
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * 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.
+ *
+ * Optimized Link State Protocl (OLSR) as per rfc3626
+ *
+ * Original code by Hannes Gredler <[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"
+
+/*
+ * RFC 3626 common header
+ *
+ *  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
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |         Packet Length         |    Packet Sequence Number     |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  Message Type |     Vtime     |         Message Size          |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                      Originator Address                       |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  Time To Live |   Hop Count   |    Message Sequence Number    |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                                                               |
+ * :                            MESSAGE                            :
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  Message Type |     Vtime     |         Message Size          |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                      Originator Address                       |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  Time To Live |   Hop Count   |    Message Sequence Number    |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |                                                               |
+ * :                            MESSAGE                            :
+ * |                                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * :                                                               :
+ */
+
+struct olsr_common {
+    u_int8_t packet_len[2];
+    u_int8_t packet_seq[2];
+};
+
+#define OLSR_HELLO_MSG         1 /* rfc3626 */
+#define OLSR_TC_MSG            2 /* rfc3626 */
+#define OLSR_MID_MSG           3 /* rfc3626 */
+#define OLSR_HNA_MSG           4 /* rfc3626 */
+#define OLSR_POWERINFO_MSG   128
+#define OLSR_NAMESERVICE_MSG 130
+#define OLSR_HELLO_LQ_MSG    201 /* LQ extensions olsr.org */
+#define OLSR_TC_LQ_MSG       202 /* LQ extensions olsr.org */
+
+static struct tok olsr_msg_values[] = {
+    { OLSR_HELLO_MSG, "Hello" },
+    { OLSR_TC_MSG, "TC" },
+    { OLSR_MID_MSG, "MID" },
+    { OLSR_HNA_MSG, "HNA" },
+    { OLSR_POWERINFO_MSG, "Powerinfo" },
+    { OLSR_NAMESERVICE_MSG, "Nameservice" },
+    { OLSR_HELLO_LQ_MSG, "Hello-LQ" },
+    { OLSR_TC_LQ_MSG, "TC-LQ" },
+    { 0, NULL}
+};
+
+struct olsr_msg {
+    u_int8_t msg_type;
+    u_int8_t vtime;
+    u_int8_t msg_len[2];
+    u_int8_t originator[4];
+    u_int8_t ttl;
+    u_int8_t hopcount;
+    u_int8_t msg_seq[2];
+};
+
+struct olsr_hello_lq {
+    u_int8_t res[2];
+    u_int8_t htime;
+    u_int8_t will;
+};
+
+struct olsr_hello_lq_link {
+    u_int8_t link_code;
+    u_int8_t res;
+    u_int8_t len[2];
+};
+
+#define OLSR_EXTRACT_LINK_TYPE(link_code) (link_code & 0x3)
+#define OLSR_EXTRACT_NEIGHBOR_TYPE(link_code) (link_code >> 2)
+
+static struct tok olsr_link_type_values[] = {
+    { 0, "Unspecified" },
+    { 1, "Asymmetric" },
+    { 2, "Symmetric" },
+    { 3, "Lost" },
+    { 0, NULL}
+};
+
+static struct tok olsr_neighbor_type_values[] = {
+    { 0, "Not-Neighbor" },
+    { 1, "Symmetric" },
+    { 2, "Symmetric-MPR" },
+    { 0, NULL}
+};
+
+struct olsr_hello_lq_neighbor {
+    u_int8_t neighbor[4];
+    u_int8_t link_quality;
+    u_int8_t neighbor_link_quality;
+    u_int8_t res[2];
+};
+
+/*
+ * macro to convert the 8-bit mantissa/exponent to a double float
+ * taken from olsr.org code.
+ */
+#define VTIME_SCALE_FACTOR    0.0625
+#define ME_TO_DOUBLE(me) \
+  (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F)))
+
+void
+olsr_print (const u_char *pptr, u_int length)
+{
+    union {
+        const struct olsr_common *common;
+        const struct olsr_msg *msg;
+        const struct olsr_hello_lq *hello_lq;
+        const struct olsr_hello_lq_link *hello_lq_link;
+        const struct olsr_hello_lq_neighbor *hello_lq_neighbor;
+    } ptr;
+
+    u_int msg_type, msg_len, msg_tlen, hello_len;
+    u_int8_t link_type, neighbor_type;
+    const u_char *tptr, *msg_data;
+
+    tptr = pptr; 
+
+    if (length < sizeof(struct olsr_common)) {
+        goto trunc;
+    }
+
+    if (!TTEST2(*tptr, sizeof(struct olsr_common))) {
+       goto trunc;
+    }
+
+    ptr.common = (struct olsr_common *)tptr;
+    length = MIN(length, EXTRACT_16BITS(ptr.common->packet_len));
+
+    printf("OLSR, seq 0x%04x, length %u",
+           EXTRACT_16BITS(ptr.common->packet_seq),
+           length);
+
+    tptr += sizeof(struct olsr_common);
+
+    /*
+     * In non-verbose mode, just print version.
+     */
+    if (vflag < 1) {
+       return;
+    }
+
+    while (tptr < (pptr+length)) {
+
+        if (!TTEST2(*tptr, sizeof(struct olsr_msg)))   
+            goto trunc;
+
+        ptr.msg = (struct olsr_msg *)tptr;
+
+        msg_type = ptr.msg->msg_type;
+        msg_len = EXTRACT_16BITS(ptr.msg->msg_len);
+
+        /* infinite loop check */
+        if (msg_type == 0 || msg_len == 0) {
+            return;
+        }
+
+        printf("\n\t%s Message (%u), originator %s, ttl %u, hop %u"
+               "\n\t  vtime %.3lfs, msg-seq 0x%04x, length %u",
+               tok2str(olsr_msg_values, "Unknown", msg_type),
+               msg_type, ipaddr_string(ptr.msg->originator),
+               ptr.msg->ttl,
+               ptr.msg->hopcount,
+               ME_TO_DOUBLE(ptr.msg->vtime),
+               EXTRACT_16BITS(ptr.msg->msg_seq),
+               msg_len);
+
+        msg_tlen = msg_len - sizeof(struct olsr_msg);
+        msg_data = tptr + sizeof(struct olsr_msg);
+
+        switch (msg_type) {
+        case OLSR_HELLO_LQ_MSG:
+            ptr.hello_lq = (struct olsr_hello_lq *)msg_data;
+            printf("\n\t  hello-time %.3lfs, MPR willingness %u",
+                   ME_TO_DOUBLE(ptr.hello_lq->htime),
+                   ptr.hello_lq->will);
+            msg_data += sizeof(struct olsr_hello_lq);
+            msg_tlen -= sizeof(struct olsr_hello_lq);
+
+            while (msg_tlen >= sizeof(struct olsr_hello_lq_link)) {
+
+                /*
+                 * link-type.
+                 */
+                ptr.hello_lq_link = (struct olsr_hello_lq_link *)msg_data;
+
+                hello_len = EXTRACT_16BITS(ptr.hello_lq_link->len);
+                link_type = OLSR_EXTRACT_LINK_TYPE(ptr.hello_lq_link->link_code);
+                neighbor_type = OLSR_EXTRACT_NEIGHBOR_TYPE(ptr.hello_lq_link->link_code);
+
+                printf("\n\t    link-type %s, neighbor-type %s, len %u",
+                       tok2str(olsr_link_type_values, "Unknown", link_type),
+                       tok2str(olsr_neighbor_type_values, "Unknown", neighbor_type),
+                       hello_len);
+
+                msg_data += sizeof(struct olsr_hello_lq_link);
+                msg_tlen -= sizeof(struct olsr_hello_lq_link);
+
+                hello_len -= sizeof(struct olsr_hello_lq_link);
+                while (hello_len >= sizeof(struct olsr_hello_lq_neighbor)) {
+
+                    /*
+                     * neighbor.
+                     */
+                    ptr.hello_lq_neighbor =
+                        (struct olsr_hello_lq_neighbor *)msg_data;
+
+                    printf("\n\t      neighbor %s, link-quality %.2lf%%"
+                           ", neighbor-link-quality %.2lf%%",
+                           ipaddr_string(ptr.hello_lq_neighbor->neighbor),
+                           ((double)ptr.hello_lq_neighbor->link_quality/2.55),
+                           ((double)ptr.hello_lq_neighbor->neighbor_link_quality/2.55));
+
+                    msg_data += sizeof(struct olsr_hello_lq_neighbor);
+                    msg_tlen -= sizeof(struct olsr_hello_lq_neighbor);                
+                    hello_len -= sizeof(struct olsr_hello_lq_neighbor);
+                }
+            }
+            break;
+
+            /*
+             * FIXME those are the defined messages that lack a decoder
+             * you are welcome to contribute code ;-)
+             */
+
+        case OLSR_HELLO_MSG:
+        case OLSR_TC_MSG:
+        case OLSR_MID_MSG:
+        case OLSR_HNA_MSG:
+        case OLSR_POWERINFO_MSG:
+        case OLSR_NAMESERVICE_MSG:
+        case OLSR_TC_LQ_MSG:
+        default:
+           print_unknown_data(msg_data, "\n\t    ", msg_tlen);
+            break;
+        }      
+        tptr += msg_len;
+    }
+
+    return;
+
+ trunc:
+    printf("[|olsr]");
+}
+
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 4
+ * End:
+ */
index e8239fc1ecbb856b127eead99acc8ff443774235..2f7ffc771c8e0a8cb1c11e64dd4044577b574f5f 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.139 2006-03-03 22:31:16 hannes Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.140 2007-03-27 10:44:09 hannes Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -674,6 +674,8 @@ udp_print(register const u_char *bp, u_int length,
                        lwres_print((const u_char *)(up + 1), length);
                 else if (ISPORT(LDP_PORT))
                        ldp_print((const u_char *)(up + 1), length);
+                else if (ISPORT(OLSR_PORT))
+                       olsr_print((const u_char *)(up + 1), length);
                 else if (ISPORT(MPLS_LSP_PING_PORT))
                        lspping_print((const u_char *)(up + 1), length);
                else if (dport == BFD_CONTROL_PORT ||
diff --git a/udp.h b/udp.h
index 292ce9a40a0771cf3935ff40e2eecaed23b8e3c2..86f92f5bc948a9303f5a8567b2ebc347a0ce7f25 100644 (file)
--- a/udp.h
+++ b/udp.h
@@ -1,4 +1,4 @@
-/* @(#) $Header: /tcpdump/master/tcpdump/udp.h,v 1.10 2006-03-03 22:31:16 hannes Exp $ (LBL) */
+/* @(#) $Header: /tcpdump/master/tcpdump/udp.h,v 1.11 2007-03-27 10:44:09 hannes Exp $ (LBL) */
 /*
  * Copyright (c) 1982, 1986, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -57,6 +57,7 @@ struct udphdr {
 #define RIP_PORT 520           /*XXX*/
 #define LDP_PORT 646
 #define AODV_PORT 654          /*XXX*/
+#define OLSR_PORT 698           /* rfc3626 */
 #define KERBEROS_SEC_PORT 750  /*XXX*/
 #define L2TP_PORT 1701         /*XXX*/
 #define SIP_PORT 5060
index ba3cc9a41d2c4b418b2609f7af9e6db40fca9251..8b28336a6aa1c4c8b1c36c1f9e04b231e16dc6eb 100644 (file)
@@ -101,6 +101,7 @@ OBJS = \
        ../../print-nfs.o \
        ../../print-ntp.o \
        ../../print-null.o \
+       ../../print-olsr.o \
        ../../print-ospf.o \
        ../../print-ospf6.o \
        ../../print-pflog.o \
index f835fe59125882046b271b88c0ff4e253805ae43..c4e144f4532e3e3c98c1a6303479fc822fff367b 100644 (file)
@@ -421,6 +421,10 @@ SOURCE="..\..\print-null.c"
 # End Source File
 # Begin Source File
 
+SOURCE="..\..\print-olsr.c"
+# End Source File
+# Begin Source File
+
 SOURCE="..\..\print-ospf.c"
 # End Source File
 # Begin Source File