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