aboutsummaryrefslogtreecommitdiffstats
path: root/packet-vrrp.c
diff options
context:
space:
mode:
authorJun-ichiro itojun Hagino <itojun@itojun.org>2002-03-28 07:40:54 +0000
committerJun-ichiro itojun Hagino <itojun@itojun.org>2002-03-28 07:40:54 +0000
commite1eec942fdbe8ad80b4e9b4b4ac3135d10f46200 (patch)
treefb49bd00b43e1337f95420a459dfecad72e5d4fc /packet-vrrp.c
parentbacadc18cd5ad65463e4da03cb6732e281dc7274 (diff)
correct v3 checksum.
From: kazuyoshi.tomita@itg.hitachi.co.jp svn path=/trunk/; revision=5033
Diffstat (limited to 'packet-vrrp.c')
-rw-r--r--packet-vrrp.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/packet-vrrp.c b/packet-vrrp.c
index 9d49421bd4..e57c131b60 100644
--- a/packet-vrrp.c
+++ b/packet-vrrp.c
@@ -4,7 +4,7 @@
*
* Heikki Vatiainen <hessu@cs.tut.fi>
*
- * $Id: packet-vrrp.c,v 1.22 2002/03/06 06:33:37 itojun Exp $
+ * $Id: packet-vrrp.c,v 1.23 2002/03/28 07:40:54 itojun Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -96,7 +96,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");
@@ -166,9 +167,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] = htonl(vrrp_len);
+ phdr[1] = 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)",