1 /*
2 * decode_vrrp.c
3 *
4 * Virtual Router Redundancy Protocol.
5 *
6 * Copyright (c) 2000 Eric Jackson <ericj@monkey.org>
7 * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
8 *
9 * $Id: decode_vrrp.c,v 1.5 2001/03/15 08:33:03 dugsong Exp $
10 */
11
12 #include "config.h"
13
14 #include <sys/types.h>
15 #include <netinet/in.h>
16
17 #include <stdio.h>
18 #include <string.h>
19
20 #include "buf.h"
21 #include "decode.h"
22
23 struct vrrp_header {
24 u_char vr_vers; /* Version */
25 u_char vr_vrid; /* Virtual Router ID */
26 u_char vr_prio; /* Router Priority */
27 u_char vr_naddr; /* # of addresses */
28 u_char vr_auth; /* Type of Authentication */
29 u_char vr_advr; /* ADVERTISEMENT Interval */
30 u_short vr_cksum; /* Checksum */
31 /* vr_naddr * 4 # of addresses */
32 };
33 #define VRRP_AUTH_NONE 0
34 #define VRRP_AUTH_SIMPLE 1
35 #define VRRP_AUTH_AH 2
36
37 #define VRRP_AUTH_DATA_LEN 8
38
39 int
decode_vrrp(u_char * buf,int len,u_char * obuf,int olen)40 decode_vrrp(u_char *buf, int len, u_char *obuf, int olen)
41 {
42 struct buf *b, inbuf, outbuf;
43 struct vrrp_header *vrrp;
44
45 buf_init(&inbuf, buf, len);
46 buf_init(&outbuf, obuf, olen);
47
48 vrrp = (struct vrrp_header *)buf_ptr(&inbuf);
49
50 if (buf_len(&inbuf) < sizeof(*vrrp))
51 return (0);
52
53 /* We only care about VRRP_AUTH_SIMPLE */
54 if (ntohs(vrrp->vr_auth) != VRRP_AUTH_SIMPLE)
55 return (0);
56
57 /* XXX - probably want to verify checksum */
58
59 /* Forward to Authentication Data */
60 buf_skip(&inbuf, sizeof(*vrrp) + 8 + (vrrp->vr_naddr * 4));
61
62 if ((b = buf_tok(&inbuf, NULL, VRRP_AUTH_DATA_LEN)) == NULL)
63 return (0);
64
65 buf_put(&outbuf, buf_ptr(b), buf_len(b));
66 buf_put(&outbuf, "\n", 1);
67 buf_end(&outbuf);
68
69 return (buf_len(&outbuf));
70 }
71