xref: /openbsd-src/usr.sbin/tcpdump/print-carp.c (revision 0d5f83f3cbd785d623193c56655baaf031e239a1)
1*0d5f83f3Smmcc /*	$OpenBSD: print-carp.c,v 1.7 2015/11/15 20:35:36 mmcc Exp $	*/
205c07c46Smcbride 
305c07c46Smcbride /*
405c07c46Smcbride  * Copyright (c) 2000 William C. Fenner.
505c07c46Smcbride  *                All rights reserved.
605c07c46Smcbride  *
705c07c46Smcbride  * Kevin Steves <ks@hp.se> July 2000
805c07c46Smcbride  * Modified to:
905c07c46Smcbride  * - print version, type string and packet length
1005c07c46Smcbride  * - print IP address count if > 1 (-v)
1105c07c46Smcbride  * - verify checksum (-v)
1205c07c46Smcbride  * - print authentication string (-v)
1305c07c46Smcbride  *
1405c07c46Smcbride  * Redistribution and use in source and binary forms, with or without
1505c07c46Smcbride  * modification, are permitted provided that: (1) source code
1605c07c46Smcbride  * distributions retain the above copyright notice and this paragraph
1705c07c46Smcbride  * in its entirety, and (2) distributions including binary code include
1805c07c46Smcbride  * the above copyright notice and this paragraph in its entirety in
1905c07c46Smcbride  * the documentation or other materials provided with the distribution.
2005c07c46Smcbride  * The name of William C. Fenner may not be used to endorse or
2105c07c46Smcbride  * promote products derived from this software without specific prior
2205c07c46Smcbride  * written permission.  THIS SOFTWARE IS PROVIDED ``AS IS'' AND
2305c07c46Smcbride  * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
2405c07c46Smcbride  * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2505c07c46Smcbride  * FOR A PARTICULAR PURPOSE.
2605c07c46Smcbride  *
2705c07c46Smcbride  * from tcpdump.org:
2805c07c46Smcbride  * Header: /tcpdump/master/tcpdump/print-vrrp.c,v 1.3 2000/10/10 05:05:08 guy Exp
2905c07c46Smcbride  */
3005c07c46Smcbride 
3105c07c46Smcbride #ifdef HAVE_CONFIG_H
3205c07c46Smcbride #include "config.h"
3305c07c46Smcbride #endif
3405c07c46Smcbride 
3505c07c46Smcbride #include <stdio.h>
3605c07c46Smcbride #include <stdlib.h>
3705c07c46Smcbride #include <unistd.h>
3805c07c46Smcbride 
3905c07c46Smcbride #include <netinet/in.h>
4005c07c46Smcbride 
4105c07c46Smcbride #include "interface.h"
4205c07c46Smcbride #include "extract.h"
4305c07c46Smcbride #include "addrtoname.h"
4405c07c46Smcbride 
4505c07c46Smcbride void
carp_print(const u_char * bp,u_int len,int ttl)46*0d5f83f3Smmcc carp_print(const u_char *bp, u_int len, int ttl)
4705c07c46Smcbride {
48f4370547Sderaadt 	int version, type;
4905c07c46Smcbride 	char *type_s;
5005c07c46Smcbride 
5105c07c46Smcbride 	TCHECK(bp[0]);
5205c07c46Smcbride 	version = (bp[0] & 0xf0) >> 4;
5305c07c46Smcbride 	type = bp[0] & 0x0f;
5405c07c46Smcbride 	if (type == 1)
5505c07c46Smcbride 		type_s = "advertise";
5605c07c46Smcbride 	else
5705c07c46Smcbride 		type_s = "unknown";
5805c07c46Smcbride 	printf("CARPv%d-%s %d: ", version, type_s, len);
5905c07c46Smcbride 	if (ttl != 255)
6005c07c46Smcbride 		printf("[ttl=%d!] ", ttl);
6105c07c46Smcbride 	if (version != 2 || type != 1)
6205c07c46Smcbride 		return;
6305c07c46Smcbride 	TCHECK(bp[2]);
6405c07c46Smcbride 	TCHECK(bp[5]);
6568b35d40Smcbride 	printf("vhid=%d advbase=%d advskew=%d demote=%d",
6668b35d40Smcbride 	    bp[1], bp[5], bp[2], bp[4]);
6705c07c46Smcbride 	if (vflag) {
6805c07c46Smcbride 		if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0))
6905c07c46Smcbride 			printf(" (bad carp cksum %x!)",
7005c07c46Smcbride 				EXTRACT_16BITS(&bp[6]));
7105c07c46Smcbride 	}
7205c07c46Smcbride 	return;
7305c07c46Smcbride trunc:
7405c07c46Smcbride 	printf("[|carp]");
7505c07c46Smcbride }
76