mirror of
https://github.com/the-tcpdump-group/tcpdump.git
synced 2024-11-24 02:23:27 +08:00
Add support for VRRPv3 (IPv4 only).
This commit is contained in:
parent
32d5e449e6
commit
622daca204
@ -302,7 +302,7 @@ extern char *smb_errstr(int, int);
|
||||
extern const char *nt_errstr(u_int32_t);
|
||||
extern void print_data(const unsigned char *, int);
|
||||
extern void l2tp_print(const u_char *, u_int);
|
||||
extern void vrrp_print(const u_char *, u_int, int);
|
||||
extern void vrrp_print(const u_char *, u_int, const u_char *, int);
|
||||
extern void slow_print(const u_char *, u_int);
|
||||
extern void sflow_print(const u_char *, u_int);
|
||||
extern void mpcp_print(const u_char *, u_int);
|
||||
|
@ -470,7 +470,8 @@ again:
|
||||
(void)printf("vrrp %s > %s: ",
|
||||
ipaddr_string(&ipds->ip->ip_src),
|
||||
ipaddr_string(&ipds->ip->ip_dst));
|
||||
vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
|
||||
vrrp_print(ipds->cp, ipds->len,
|
||||
(const u_char *)ipds->ip, ipds->ip->ip_ttl);
|
||||
}
|
||||
break;
|
||||
|
||||
|
55
print-vrrp.c
55
print-vrrp.c
@ -36,8 +36,11 @@
|
||||
#include "extract.h"
|
||||
#include "addrtoname.h"
|
||||
|
||||
#include "ip.h"
|
||||
#include "ipproto.h"
|
||||
/*
|
||||
* RFC 2338:
|
||||
* RFC 2338 (VRRP v2):
|
||||
*
|
||||
* 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
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@ -57,6 +60,27 @@
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | Authentication Data (2) |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
*
|
||||
* RFC 5798 (VRRP v3):
|
||||
*
|
||||
* 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
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | IPv4 Fields or IPv6 Fields |
|
||||
* ... ...
|
||||
* | |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* |Version| Type | Virtual Rtr ID| Priority |Count IPvX Addr|
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* |(rsvd) | Max Adver Int | Checksum |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | |
|
||||
* + +
|
||||
* | IPvX Address(es) |
|
||||
* + +
|
||||
* | |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*/
|
||||
|
||||
/* Type */
|
||||
@ -80,7 +104,8 @@ static const struct tok auth2str[] = {
|
||||
};
|
||||
|
||||
void
|
||||
vrrp_print(register const u_char *bp, register u_int len, int ttl)
|
||||
vrrp_print(register const u_char *bp, register u_int len,
|
||||
register const u_char *bp2, int ttl)
|
||||
{
|
||||
int version, type, auth_type;
|
||||
const char *type_s;
|
||||
@ -92,20 +117,27 @@ vrrp_print(register const u_char *bp, register u_int len, int ttl)
|
||||
printf("VRRPv%u, %s", version, type_s);
|
||||
if (ttl != 255)
|
||||
printf(", (ttl %u)", ttl);
|
||||
if (version != 2 || type != VRRP_TYPE_ADVERTISEMENT)
|
||||
if (version < 2 || version > 3 || type != VRRP_TYPE_ADVERTISEMENT)
|
||||
return;
|
||||
TCHECK(bp[2]);
|
||||
printf(", vrid %u, prio %u", bp[1], bp[2]);
|
||||
TCHECK(bp[5]);
|
||||
auth_type = bp[4];
|
||||
printf(", authtype %s", tok2str(auth2str, NULL, auth_type));
|
||||
printf(", intvl %us, length %u", bp[5],len);
|
||||
|
||||
if (version == 2) {
|
||||
auth_type = bp[4];
|
||||
printf(", authtype %s", tok2str(auth2str, NULL, auth_type));
|
||||
printf(", intvl %us, length %u", bp[5], len);
|
||||
} else { /* version == 3 */
|
||||
u_int16_t intvl = (bp[4] & 0x0f) << 8 | bp[5];
|
||||
printf(", intvl %ucs, length %u", intvl, len);
|
||||
}
|
||||
|
||||
if (vflag) {
|
||||
int naddrs = bp[3];
|
||||
int i;
|
||||
char c;
|
||||
|
||||
if (TTEST2(bp[0], len)) {
|
||||
if (version == 2 && TTEST2(bp[0], len)) {
|
||||
struct cksum_vec vec[1];
|
||||
|
||||
vec[0].ptr = bp;
|
||||
@ -114,6 +146,15 @@ vrrp_print(register const u_char *bp, register u_int len, int ttl)
|
||||
printf(", (bad vrrp cksum %x)",
|
||||
EXTRACT_16BITS(&bp[6]));
|
||||
}
|
||||
|
||||
if (version == 3 && TTEST2(bp[0], len)) {
|
||||
u_int16_t cksum = nextproto4_cksum((struct ip *)bp2, bp,
|
||||
len, len, IPPROTO_VRRP);
|
||||
if (cksum)
|
||||
printf(", (bad vrrp cksum %x)",
|
||||
EXTRACT_16BITS(&bp[6]));
|
||||
}
|
||||
|
||||
printf(", addrs");
|
||||
if (naddrs > 1)
|
||||
printf("(%d)", naddrs);
|
||||
|
Loading…
Reference in New Issue
Block a user