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