aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAndersBroman <anders.broman@ericsson.com>2014-04-09 15:56:06 +0200
committerAnders Broman <a.broman58@gmail.com>2014-04-09 14:00:12 +0000
commita653014e69a4f0e0b59393ddc03871006057b36a (patch)
tree825c04e8c9d1da81c9af047f1a74aea583794c06 /epan
parentdae96ca72bf3bd24e040cb957f5b84092966566b (diff)
There seems to be some ambigiousy on how to calculate V3 checksums for
IPv4. Introduce a preference to use the same metod as for VRRP V2. http://ask.wireshark.org/questions/15291/does-wireshark-uses-a-pseudo-header-for-vrrpv3-ipv4-checksum-calculation Change-Id: I14bf279b0c85405c1963784737add9321d5cb7c4 Reviewed-on: https://code.wireshark.org/review/1040 Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-vrrp.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/epan/dissectors/packet-vrrp.c b/epan/dissectors/packet-vrrp.c
index 64855cfeab..462ab292ac 100644
--- a/epan/dissectors/packet-vrrp.c
+++ b/epan/dissectors/packet-vrrp.c
@@ -32,6 +32,7 @@
#include <epan/ipproto.h>
#include <epan/in_cksum.h>
#include <epan/expert.h>
+#include <epan/prefs.h>
void proto_register_vrrp(void);
void proto_reg_handoff_vrrp(void);
@@ -56,6 +57,8 @@ static gint hf_vrrp_ip = -1;
static gint hf_vrrp_ip6 = -1;
static gint hf_vrrp_auth_string = -1;
+static gboolean g_vrrp_v3_checksum_as_in_v2 = FALSE;
+
static expert_field ei_vrrp_checksum = EI_INIT;
#define VRRP_VERSION_MASK 0xf0
@@ -176,19 +179,21 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
and isn't truncated, so we can checksum it. */
switch(hi_nibble(ver_type)) {
case 3:
- /* Set up the fields of the pseudo-header. */
- cksum_vec[0].ptr = (const guint8 *)pinfo->src.data;
- cksum_vec[0].len = pinfo->src.len;
- cksum_vec[1].ptr = (const guint8 *)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;
+ if(g_vrrp_v3_checksum_as_in_v2 == FALSE){
+ /* Set up the fields of the pseudo-header. */
+ cksum_vec[0].ptr = (const guint8 *)pinfo->src.data;
+ cksum_vec[0].len = pinfo->src.len;
+ cksum_vec[1].ptr = (const guint8 *)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);
@@ -321,7 +326,7 @@ void proto_register_vrrp(void)
};
expert_module_t* expert_vrrp;
-
+ module_t *vrrp_module;
proto_vrrp = proto_register_protocol("Virtual Router Redundancy Protocol",
"VRRP", "vrrp");
@@ -331,6 +336,15 @@ void proto_register_vrrp(void)
expert_vrrp = expert_register_protocol(proto_vrrp);
expert_register_field_array(expert_vrrp, ei, array_length(ei));
+ vrrp_module = prefs_register_protocol(proto_vrrp, NULL);
+
+ prefs_register_bool_preference(vrrp_module, "v3_checksum_as_in_v2",
+ "Calculate V3 checksum as in V2",
+ "There is some ambigiousy on how to calculate V3 checksums"
+ "As in V3 will use a pseudo header(which may only be implemented for IPv6 by some manufacturer)",
+ &g_vrrp_v3_checksum_as_in_v2);
+
+
}
void