On 2006/10/27 14:03, Pete Vickers wrote: > A nice start could be to teach our tcpdump about RSTP. At present it > just pukes:
something like this? (coding style probably sucks, but I'm no coder :) Index: print-stp.c =================================================================== RCS file: /data/cvsroot/OpenBSD/src/usr.sbin/tcpdump/print-stp.c,v retrieving revision 1.4 diff -u -r1.4 print-stp.c --- print-stp.c 20 Dec 2004 08:30:40 -0000 1.4 +++ print-stp.c 29 Oct 2006 13:13:02 -0000 @@ -63,11 +63,22 @@ #include "llc.h" #define STP_MSGTYPE_CBPDU 0x00 +#define STP_MSGTYPE_RBPDU 0x02 /* 802.1W RSTP */ #define STP_MSGTYPE_TBPDU 0x80 #define STP_FLAGS_TC 0x01 /* Topology change */ #define STP_FLAGS_TCA 0x80 /* Topology change ack */ +#define RSTP_FLAGS_PROPOSAL 0x02 +#define RSTP_FLAGS_LEARNING 0x10 +#define RSTP_FLAGS_FORWARDING 0x20 +#define RSTP_FLAGS_AGREEMENT 0x40 + +#define RSTP_MASK_PORTROLE 0x0C +#define RSTP_ROLE_ALTERNATE 0x04 +#define RSTP_ROLE_ROOT 0x08 +#define RSTP_ROLE_DESIGNATED 0x0C + static void stp_print_cbpdu(const u_char *, u_int, int); static void stp_print_tbpdu(const u_char *, u_int); @@ -102,9 +113,13 @@ printf(" unknown protocol id(0x%x)", id); return; } - if (p[2] != 0) { - printf(" unknown protocol ver(0x%x)", p[2]); - return; + if (p[2] == 2 ) { + printf(" RSTP"); + } else { + if (p[2] != 0) { + printf(" unknown protocol ver(0x%x)", p[2]); + return; + } } p += 3; len -= 3; @@ -113,6 +128,7 @@ goto truncated; switch (*p) { case STP_MSGTYPE_CBPDU: + case STP_MSGTYPE_RBPDU: stp_print_cbpdu(p, len, cisco_sstp); break; case STP_MSGTYPE_TBPDU: @@ -154,6 +170,28 @@ printf("%stc", (x++ != 0) ? "," : ""); if ((*p) & STP_FLAGS_TCA) printf("%stcack", (x++ != 0) ? "," : ""); + if ((*p) & RSTP_FLAGS_PROPOSAL) + printf("%sproposal", (x++ != 0) ? "," : ""); + if ((*p) & RSTP_FLAGS_LEARNING) + printf("%slearn", (x++ != 0) ? "," : ""); + if ((*p) & RSTP_FLAGS_FORWARDING) + printf("%sfwd", (x++ != 0) ? "," : ""); + if ((*p) & RSTP_FLAGS_AGREEMENT) + printf("%sagree", (x++ != 0) ? "," : ""); + + t = ((*p) & RSTP_MASK_PORTROLE); + + switch (t) { + case RSTP_ROLE_ALTERNATE: + printf("%srole=alt", (x++ != 0) ? "," : ""); + break; + case RSTP_ROLE_ROOT: + printf("%srole=root", (x++ != 0) ? "," : ""); + break; + case RSTP_ROLE_DESIGNATED: + printf("%srole=desig", (x++ != 0) ? "," : ""); + break; + } putchar('>'); } p += 1;