In the last episode (Oct 19), George Neville-Neil said:
> I've been trying to debug CARP problems of late. I noticed that our
> tcpdump didn't have CARP support.  I took and fixed some code from OpenBSD
> so that our tcpdump can work with CARP.  Unlike OpenBSD you have to
> specify -T carp to read carp packets.  In their version you specify -T
> VRRP, because they don't like VRRP.  I decided that we should go with what
> most of the industry cares about rather than what OpenBSD cares about.
> 
> Patch is here: http://people.freebsd.org/~gnn/tcpdump-carp.diff
> 
> Technical comments welcome.

Here's the patch I've been using.  I include a rendering of the packet
format in the comments (since the CARP packet is otherwise completely
undocumented), and also examine the packet to decide whether to print it as
CARP or VRRP.  CARP hardcodes a 7 in the AuthLen field, so it'll get the
packet type right unless you happen to use VRRP with 7 IP addresses.

-- 
        Dan Nelson
        dnel...@allantgroup.com
Index: print-vrrp.c
===================================================================
--- print-vrrp.c	(revision 226523)
+++ print-vrrp.c	(working copy)
@@ -62,6 +62,33 @@ static const char rcsid[] _U_ =
  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  *    |                     Authentication Data (2)                   |
  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * The CARP header layout is as follows.  The distinguishing feature
+ * seems to be that the AuthLen field is always 7:
+ *
+ *     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
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |Version| Type  | VirtualHostID |    AdvSkew    | AuthLen == 7  |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |    Demote     |     AdvBase   |          Checksum             |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                         Counter (1)                           |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                         Counter (2)                           |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                        SHA-1 HMAC (1)                         |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                        SHA-1 HMAC (2)                         |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                        SHA-1 HMAC (3)                         |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                        SHA-1 HMAC (4)                         |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *    |                        SHA-1 HMAC (5)                         |
+ *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
  */
 
 /* Type */
@@ -85,6 +112,9 @@ static const struct tok auth2str[] = {
 };
 
 void
+carp_print(register const u_char *bp, register u_int len, int ttl);
+
+void
 vrrp_print(register const u_char *bp, register u_int len, int ttl)
 {
 	int version, type, auth_type;
@@ -93,6 +123,13 @@ vrrp_print(register const u_char *bp, register u_i
 	TCHECK(bp[0]);
 	version = (bp[0] & 0xf0) >> 4;
 	type = bp[0] & 0x0f;
+
+	if ((bp[3] == 7) && (version == 2) && (type == 1))
+	{
+		carp_print(bp, len, ttl);
+		return;
+	}
+
 	type_s = tok2str(type2str, "unknown type (%u)", type);
 	printf("VRRPv%u, %s", version, type_s);
 	if (ttl != 255)
@@ -139,3 +176,30 @@ vrrp_print(register const u_char *bp, register u_i
 trunc:
 	printf("[|vrrp]");
 }
+
+void
+carp_print(register const u_char *bp, register u_int len, int ttl)
+{
+	int version, type, auth_type;
+	const char *type_s;
+
+	TCHECK(bp[0]);
+	version = (bp[0] & 0xf0) >> 4;
+	type = bp[0] & 0x0f;
+	type_s = tok2str(type2str, "unknown type (%u)", type);
+	printf("CARPv%u, %s", version, type_s);
+	if (ttl != 255)
+		printf(", (ttl %u)", ttl);
+	if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT)
+		return;
+	TCHECK(bp[2]);
+	printf(", vhid %u, advskew %u", bp[1], bp[2]);
+	TCHECK(bp[5]);
+	printf(", advbase %us", bp[5]);
+	TCHECK(bp[15]);
+	printf(", counter %llu", EXTRACT_64BITS(&bp[8]));
+
+	return;
+trunc:
+	printf("[|carp]");
+}
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to