aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2005-10-22 05:27:48 +0000
committerGuy Harris <guy@alum.mit.edu>2005-10-22 05:27:48 +0000
commite857b4feb42fa5de2734e0216c8ea59e94788ec1 (patch)
treefb43e32e3ff13a23fd0d407768265670b6fda12f
parent67d94f37a4f41a6ed49e88863ae1f2fb20dbf16e (diff)
Use the somewhat-misnamed "ipv4_addr_and_mask()" and
"ipv6_addr_and_mask()" to handle address+prefix bit length combinations. svn path=/trunk/; revision=16286
-rw-r--r--epan/dissectors/packet-isis-lsp.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/epan/dissectors/packet-isis-lsp.c b/epan/dissectors/packet-isis-lsp.c
index 0008c6f77f..164818de5a 100644
--- a/epan/dissectors/packet-isis-lsp.c
+++ b/epan/dissectors/packet-isis-lsp.c
@@ -39,6 +39,7 @@
#include "packet-isis-clv.h"
#include "packet-isis-lsp.h"
#include <epan/addr_resolv.h>
+#include <epan/addr_and_mask.h>
/* lsp packets */
static int hf_isis_lsp_pdu_length = -1;
@@ -689,7 +690,8 @@ dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, proto_tree *tree,
proto_tree *subtree = NULL;
proto_tree *subtree2 = NULL;
guint8 ctrl_info;
- guint bit_length, byte_length;
+ guint bit_length;
+ int byte_length;
guint8 prefix [4];
guint32 metric;
guint len,i;
@@ -699,16 +701,14 @@ dissect_lsp_ext_ip_reachability_clv(tvbuff_t *tvb, proto_tree *tree,
if (!tree) return;
while (length > 0) {
- memset (prefix, 0, 4);
ctrl_info = tvb_get_guint8(tvb, offset+4);
bit_length = ctrl_info & 0x3f;
- byte_length = (bit_length + 7) / 8;
- if (byte_length > sizeof(prefix)) {
+ byte_length = ipv4_addr_and_mask(tvb, offset+5, prefix, bit_length);
+ if (byte_length == -1) {
isis_dissect_unknown(tvb, tree, offset,
- "IPv4 prefix has an invalid length: %d bytes", byte_length );
+ "IPv4 prefix has an invalid length: %d bits", bit_length );
return;
}
- tvb_memcpy (tvb, prefix, offset+5, byte_length);
metric = tvb_get_ntohl(tvb, offset);
subclvs_len = 0;
if ((ctrl_info & 0x40) != 0)
@@ -792,7 +792,8 @@ dissect_lsp_ipv6_reachability_clv(tvbuff_t *tvb, proto_tree *tree, int offset,
proto_tree *subtree = NULL;
proto_tree *subtree2 = NULL;
guint8 ctrl_info;
- guint bit_length, byte_length;
+ guint bit_length;
+ int byte_length;
struct e_in6_addr prefix;
guint32 metric;
guint len,i;
@@ -802,16 +803,14 @@ dissect_lsp_ipv6_reachability_clv(tvbuff_t *tvb, proto_tree *tree, int offset,
if (!tree) return;
while (length > 0) {
- memset (prefix.bytes, 0, 16);
ctrl_info = tvb_get_guint8(tvb, offset+4);
bit_length = tvb_get_guint8(tvb, offset+5);
- byte_length = (bit_length + 7) / 8;
- if (byte_length > sizeof(prefix)) {
+ byte_length = ipv6_addr_and_mask(tvb, offset+6, &prefix, bit_length);
+ if (byte_length == -1) {
isis_dissect_unknown(tvb, tree, offset,
- "IPv6 prefix has an invalid length: %d bytes", byte_length );
+ "IPv6 prefix has an invalid length: %d bits", bit_length );
return;
}
- tvb_memcpy (tvb, prefix.bytes, offset+6, byte_length);
metric = tvb_get_ntohl(tvb, offset);
subclvs_len = 0;
if ((ctrl_info & 0x20) != 0)