From: hannes Date: Tue, 27 Mar 2007 10:44:09 +0000 (+0000) Subject: add basic skeleton for printing olsr packets as per rfc3626 X-Git-Tag: tcpdump-4.0.0~143 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/cb08bf9e3e26325e4fb28ba49efa1cb05b7db6e4 add basic skeleton for printing olsr packets as per rfc3626 add a line break in verbose mode fro the ip printer. --- diff --git a/FILES b/FILES index 14176745..2402bbc4 100644 --- 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 diff --git a/Makefile.in b/Makefile.in index dd0a892a..97fa7cdd 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 \ diff --git a/interface.h b/interface.h index da54ef19..f196af50 100644 --- a/interface.h +++ b/interface.h @@ -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); diff --git a/print-ip.c b/print-ip.c index e38195c0..3d08f553 100644 --- a/print-ip.c +++ b/print-ip.c @@ -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 index 00000000..7fe4fb3d --- /dev/null +++ b/print-olsr.c @@ -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 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#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: + */ diff --git a/print-udp.c b/print-udp.c index e8239fc1..2f7ffc77 100644 --- a/print-udp.c +++ b/print-udp.c @@ -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 292ce9a4..86f92f5b 100644 --- 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 diff --git a/win32/prj/GNUmakefile b/win32/prj/GNUmakefile index ba3cc9a4..8b28336a 100644 --- a/win32/prj/GNUmakefile +++ b/win32/prj/GNUmakefile @@ -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 \ diff --git a/win32/prj/WinDump.dsp b/win32/prj/WinDump.dsp index f835fe59..c4e144f4 100644 --- a/win32/prj/WinDump.dsp +++ b/win32/prj/WinDump.dsp @@ -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