Removed trailing whitespaces from .h and .c files using the
[obnox/wireshark/wip.git] / packet-vrrp.c
index ac5cca5ae2e699574037b7cd068af16da17ee568..1b500dca04fdc95bc3601eda2e449a42231bf01c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * 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"
 
@@ -56,6 +48,7 @@ static gint hf_vrrp_count_ip = -1;
 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
@@ -95,7 +88,8 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         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");
@@ -111,12 +105,11 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         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,
@@ -140,9 +133,19 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                            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);
@@ -156,9 +159,28 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                 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)",
@@ -175,12 +197,21 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                 }
                 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 */
 
@@ -242,6 +273,10 @@ void proto_register_vrrp(void)
                    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[] = {