*
* Heikki Vatiainen <hessu@cs.tut.fi>
*
- * $Id: packet-vrrp.c,v 1.19 2001/12/10 00:25:41 guy Exp $
+ * $Id: packet-vrrp.c,v 1.24 2002/08/02 23:36:04 jmayer Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
# include "config.h"
#endif
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_NETINET_IN_H
-#include <netinet/in.h>
-#endif
-
#include <string.h>
#include <glib.h>
-#include "packet.h"
+#include <epan/packet.h>
#include "ipproto.h"
#include "in_cksum.h"
static gint hf_vrrp_auth_type = -1;
static gint hf_vrrp_adver_int = -1;
static gint hf_vrrp_ip = -1;
+static gint hf_vrrp_ip6 = -1;
#define VRRP_VERSION_MASK 0xf0
#define VRRP_TYPE_MASK 0x0f
int offset = 0;
gint vrrp_len;
guint8 ver_type;
- vec_t cksum_vec[1];
+ vec_t cksum_vec[4];
+ guint32 phdr[2];
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "VRRP");
if (tree) {
proto_item *ti, *tv;
proto_tree *vrrp_tree, *ver_type_tree;
- guint8 priority, ip_count, auth_type;
+ guint8 priority, ip_count = 0, auth_type;
guint16 cksum, computed_cksum;
guint8 auth_buf[VRRP_AUTH_DATA_LEN+1];
- ti = proto_tree_add_item(tree, proto_vrrp, tvb, 0,
- tvb_length(tvb), FALSE);
+ ti = proto_tree_add_item(tree, proto_vrrp, tvb, 0, -1, FALSE);
vrrp_tree = proto_item_add_subtree(ti, ett_vrrp);
tv = proto_tree_add_uint_format(vrrp_tree, hf_vrrp_ver_type,
val_to_str(priority, vrrp_prio_vals, "Non-default backup priority"));
offset++;
- ip_count = tvb_get_guint8(tvb, offset);
- proto_tree_add_uint(vrrp_tree, hf_vrrp_count_ip, tvb, offset, 1, ip_count);
- offset++;
+ switch(hi_nibble(ver_type)) {
+ case 3:
+ /* Skip reserve field */
+ offset++;
+ break;
+ case 2:
+ default:
+ ip_count = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint(vrrp_tree, hf_vrrp_count_ip, tvb,
+ offset, 1, ip_count);
+ offset++;
+ break;
+ }
auth_type = tvb_get_guint8(tvb, offset);
proto_tree_add_item(vrrp_tree, hf_vrrp_auth_type, tvb, offset, 1, FALSE);
if (!pinfo->fragmented && (gint)tvb_length(tvb) >= vrrp_len) {
/* The packet isn't part of a fragmented datagram
and isn't truncated, so we can checksum it. */
- cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, vrrp_len);
- cksum_vec[0].len = vrrp_len;
- computed_cksum = in_cksum(&cksum_vec[0], 1);
+ switch(hi_nibble(ver_type)) {
+ case 3:
+ /* Set up the fields of the pseudo-header. */
+ cksum_vec[0].ptr = pinfo->src.data;
+ cksum_vec[0].len = pinfo->src.len;
+ cksum_vec[1].ptr = pinfo->dst.data;
+ cksum_vec[1].len = pinfo->dst.len;
+ cksum_vec[2].ptr = (const guint8 *)&phdr;
+ phdr[0] = g_htonl(vrrp_len);
+ phdr[1] = g_htonl(IP_PROTO_VRRP);
+ cksum_vec[2].len = 8;
+ cksum_vec[3].ptr = tvb_get_ptr(tvb, 0, vrrp_len);
+ cksum_vec[3].len = vrrp_len;
+ computed_cksum = in_cksum(cksum_vec, 4);
+ break;
+ case 2:
+ default:
+ cksum_vec[0].ptr = tvb_get_ptr(tvb, 0, vrrp_len);
+ cksum_vec[0].len = vrrp_len;
+ computed_cksum = in_cksum(&cksum_vec[0], 1);
+ break;
+ }
if (computed_cksum == 0) {
proto_tree_add_text(vrrp_tree, tvb, offset, 2,
"Checksum: 0x%04x (correct)",
}
offset+=2;
- while (ip_count > 0) {
- proto_tree_add_item(vrrp_tree, hf_vrrp_ip, tvb, offset, 4, FALSE);
- offset+=4;
- ip_count--;
- }
-
+ switch(hi_nibble(ver_type)) {
+ case 3:
+ proto_tree_add_item(vrrp_tree, hf_vrrp_ip6, tvb, offset, 16, FALSE);
+ offset+=16;
+ break;
+ case 2:
+ default:
+ while (ip_count > 0) {
+ proto_tree_add_item(vrrp_tree, hf_vrrp_ip, tvb,
+ offset, 4, FALSE);
+ offset+=4;
+ ip_count--;
+ }
+ break;
+ }
if (auth_type != VRRP_AUTH_TYPE_SIMPLE_TEXT)
return; /* Contents of the authentication data is undefined */
FT_IPv4, 0, NULL, 0x0,
"IP address associated with the virtual router", HFILL }},
+ { &hf_vrrp_ip6,
+ {"IPv6 Address", "vrrp.ipv6_addr",
+ FT_IPv6, 0, NULL, 0x0,
+ "IPv6 address associated with the virtual router", HFILL }},
};
static gint *ett[] = {