aboutsummaryrefslogtreecommitdiffstats
path: root/packet-ip.c
diff options
context:
space:
mode:
Diffstat (limited to 'packet-ip.c')
-rw-r--r--packet-ip.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/packet-ip.c b/packet-ip.c
index 5d23b671e9..518ccaa617 100644
--- a/packet-ip.c
+++ b/packet-ip.c
@@ -1,7 +1,7 @@
/* packet-ip.c
* Routines for IP and miscellaneous IP protocol packet disassembly
*
- * $Id: packet-ip.c,v 1.37 1999/08/17 03:09:39 gram Exp $
+ * $Id: packet-ip.c,v 1.38 1999/08/18 00:57:50 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -46,8 +46,6 @@
#include "packet-ip.h"
#endif
-extern packet_info pi;
-
static int proto_ip = -1;
static int hf_ip_version = -1;
static int hf_ip_hdr_len = -1;
@@ -627,10 +625,10 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
proto_tree *ip_tree, *field_tree;
proto_item *ti, *tf;
gchar tos_str[32];
- guint hlen, optlen;
+ guint hlen, optlen, len;
guint16 flags;
- int advance;
- guint8 nxt;
+ int advance;
+ guint8 nxt;
/* To do: check for runts, errs, etc. */
/* Avoids alignment problems on many architectures. */
@@ -640,6 +638,17 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
iph.ip_off = ntohs(iph.ip_off);
iph.ip_sum = ntohs(iph.ip_sum);
+ /* Length of IP datagram plus headers above it. */
+ len = iph.ip_len + offset;
+
+ /* Set the payload and captured-payload lengths to the minima of (the
+ IP length plus the length of the headers above it) and the frame
+ lengths. */
+ if (pi.len > len)
+ pi.len = len;
+ if (pi.captured_len > len)
+ pi.captured_len = len;
+
hlen = lo_nibble(iph.ip_v_hl) * 4; /* IP header length, in bytes */
switch (iph.ip_p) {
@@ -768,8 +777,8 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
pi.iphdrlen = lo_nibble(iph.ip_v_hl);
pi.ip_src = iph.ip_src;
pi.ip_dst = iph.ip_dst;
- pi.payload = pi.iplen - hlen;
+ /* Skip over header + options */
offset += hlen;
nxt = iph.ip_p;
if (iph.ip_off & IP_OFFSET) {