From a653014e69a4f0e0b59393ddc03871006057b36a Mon Sep 17 00:00:00 2001 From: AndersBroman Date: Wed, 9 Apr 2014 15:56:06 +0200 Subject: 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 --- epan/dissectors/packet-vrrp.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'epan') 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 #include #include +#include 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 -- cgit v1.2.3