aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorsfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>2007-03-23 18:08:17 +0000
committersfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7>2007-03-23 18:08:17 +0000
commitee2cc676a11553dc899953a0a074b07ba3812f3c (patch)
tree49c7db39b4c44d02429daa16149f2ba63678af4e /epan
parent4a0cba066a6021188a8c8c3b8b00d5b6e3ae67fc (diff)
From Sake Blok:
Fix for bug #491: Unexpected frame.time_delta behavior This patch ... fixes bug 491. It does this by changing the behaviour of the frame.time_delta field so it reflects the delta time between captured packets (tshark already did this). To keep the delta time between displayed packets, the field frame.time_delta_displayed is created. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@21154 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan')
-rw-r--r--epan/column-utils.c68
-rw-r--r--epan/column.c10
-rw-r--r--epan/column_info.h1
-rw-r--r--epan/dissectors/packet-frame.c16
-rw-r--r--epan/frame_data.h3
-rw-r--r--epan/timestamp.h3
-rw-r--r--epan/wslua/wslua_pinfo.c9
7 files changed, 97 insertions, 13 deletions
diff --git a/epan/column-utils.c b/epan/column-utils.c
index 3aa5acd81a..2793119609 100644
--- a/epan/column-utils.c
+++ b/epan/column-utils.c
@@ -666,32 +666,32 @@ col_set_delta_time(frame_data *fd, column_info *cinfo, int col)
case(TS_PREC_FIXED_SEC):
case(TS_PREC_AUTO_SEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs / 1000000000, SECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs / 1000000000, SECS);
break;
case(TS_PREC_FIXED_DSEC):
case(TS_PREC_AUTO_DSEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs / 100000000, DSECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs / 100000000, DSECS);
break;
case(TS_PREC_FIXED_CSEC):
case(TS_PREC_AUTO_CSEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs / 10000000, CSECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs / 10000000, CSECS);
break;
case(TS_PREC_FIXED_MSEC):
case(TS_PREC_AUTO_MSEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs / 1000000, MSECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs / 1000000, MSECS);
break;
case(TS_PREC_FIXED_USEC):
case(TS_PREC_AUTO_USEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs / 1000, USECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs / 1000, USECS);
break;
case(TS_PREC_FIXED_NSEC):
case(TS_PREC_AUTO_NSEC):
display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
- (gint32) fd->del_ts.secs, fd->del_ts.nsecs, NSECS);
+ (gint32) fd->del_cap_ts.secs, fd->del_cap_ts.nsecs, NSECS);
break;
default:
g_assert_not_reached();
@@ -701,6 +701,50 @@ col_set_delta_time(frame_data *fd, column_info *cinfo, int col)
strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
}
+static void
+col_set_delta_time_dis(frame_data *fd, column_info *cinfo, int col)
+{
+ COL_CHECK_REF_TIME(fd, cinfo, col);
+
+ switch(timestamp_get_precision()) {
+ case(TS_PREC_FIXED_SEC):
+ case(TS_PREC_AUTO_SEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs / 1000000000, SECS);
+ break;
+ case(TS_PREC_FIXED_DSEC):
+ case(TS_PREC_AUTO_DSEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs / 100000000, DSECS);
+ break;
+ case(TS_PREC_FIXED_CSEC):
+ case(TS_PREC_AUTO_CSEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs / 10000000, CSECS);
+ break;
+ case(TS_PREC_FIXED_MSEC):
+ case(TS_PREC_AUTO_MSEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs / 1000000, MSECS);
+ break;
+ case(TS_PREC_FIXED_USEC):
+ case(TS_PREC_AUTO_USEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs / 1000, USECS);
+ break;
+ case(TS_PREC_FIXED_NSEC):
+ case(TS_PREC_AUTO_NSEC):
+ display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
+ fd->del_dis_ts.secs, fd->del_dis_ts.nsecs, NSECS);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ cinfo->col_data[col] = cinfo->col_buf[col];
+ strcpy(cinfo->col_expr[col],"frame.time_delta_displayed");
+ strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
+}
+
/* To do: Add check_col checks to the col_add* routines */
static void
@@ -849,10 +893,16 @@ col_set_cls_time(frame_data *fd, column_info *cinfo, gint col)
case TS_DELTA:
col_set_delta_time(fd, cinfo, col);
break;
+
+ case TS_DELTA_DIS:
+ col_set_delta_time_dis(fd, cinfo, col);
+ break;
+
case TS_EPOCH:
col_set_epoch_time(fd, cinfo, col);
break;
- case TS_NOT_SET:
+
+ case TS_NOT_SET:
/* code is missing for this case, but I don't know which [jmayer20051219] */
g_assert(FALSE);
break;
@@ -1151,6 +1201,10 @@ col_fill_in(packet_info *pinfo)
col_set_delta_time(pinfo->fd, pinfo->cinfo, i);
break;
+ case COL_DELTA_TIME_DIS:
+ col_set_delta_time_dis(pinfo->fd, pinfo->cinfo, i);
+ break;
+
case COL_DEF_SRC:
case COL_RES_SRC: /* COL_DEF_SRC is currently just like COL_RES_SRC */
col_set_addr(pinfo, i, &pinfo->src, TRUE, TRUE);
diff --git a/epan/column.c b/epan/column.c
index f84b338933..135b57e8e0 100644
--- a/epan/column.c
+++ b/epan/column.c
@@ -51,6 +51,7 @@ col_format_to_string(gint fmt) {
"%At",
"%Yt",
"%Tt",
+ "%Gt",
"%s",
"%rs",
"%us",
@@ -116,6 +117,7 @@ static const gchar *dlist[NUM_COL_FMTS] = {
"Absolute time", /* COL_ABS_TIME */
"Absolute date and time", /* COL_ABS_DATE_TIME */
"Delta time", /* COL_DELTA_TIME */
+ "Delta time displayed", /* COL_DELTA_TIME_DIS */
"Source address", /* COL_DEF_SRC */
"Src addr (resolved)", /* COL_RES_SRC */
"Src addr (unresolved)", /* COL_UNRES_SRC */
@@ -355,6 +357,7 @@ get_timestamp_column_longest_string(gint type, gint precision)
break;
case(TS_RELATIVE): /* fallthrough */
case(TS_DELTA):
+ case(TS_DELTA_DIS):
switch(precision) {
case(TS_PREC_AUTO_SEC):
case(TS_PREC_FIXED_SEC):
@@ -472,6 +475,9 @@ get_column_longest_string(gint format)
case COL_DELTA_TIME:
return get_timestamp_column_longest_string(TS_DELTA, timestamp_get_precision());
break;
+ case COL_DELTA_TIME_DIS:
+ return get_timestamp_column_longest_string(TS_DELTA_DIS, timestamp_get_precision());
+ break;
case COL_DEF_SRC:
case COL_RES_SRC:
case COL_UNRES_SRC:
@@ -581,6 +587,7 @@ get_column_char_width(gint format)
#define TIME_ABS 2
#define DATE_TIME_ABS 3
#define TIME_DEL 4
+#define TIME_DEL_DIS 5
#define RES_DEF 0
#define RES_DO 1
@@ -672,6 +679,9 @@ get_column_format_from_str(gchar *str) {
case 'T':
time_off = TIME_DEL;
break;
+ case 'G': /* Todo: use a better letter for time since last displayed packet */
+ time_off = TIME_DEL_DIS;
+ break;
case 'L':
return COL_PACKET_LENGTH;
break;
diff --git a/epan/column_info.h b/epan/column_info.h
index ad91439d4d..67e0ebd21f 100644
--- a/epan/column_info.h
+++ b/epan/column_info.h
@@ -62,6 +62,7 @@ enum {
COL_ABS_TIME, /* Absolute time */
COL_ABS_DATE_TIME, /* Absolute date and time */
COL_DELTA_TIME, /* Delta time */
+ COL_DELTA_TIME_DIS, /* Delta time displayed*/
COL_DEF_SRC, /* Source address */
COL_RES_SRC, /* Resolved source */
COL_UNRES_SRC, /* Unresolved source */
diff --git a/epan/dissectors/packet-frame.c b/epan/dissectors/packet-frame.c
index 59bd538728..778154606f 100644
--- a/epan/dissectors/packet-frame.c
+++ b/epan/dissectors/packet-frame.c
@@ -43,6 +43,7 @@ int proto_frame = -1;
int hf_frame_arrival_time = -1;
static int hf_frame_time_invalid = -1;
static int hf_frame_time_delta = -1;
+static int hf_frame_time_delta_displayed = -1;
static int hf_frame_time_relative = -1;
int hf_frame_number = -1;
int hf_frame_packet_len = -1; /* Deprecated in favor of hf_frame_len */
@@ -195,12 +196,18 @@ dissect_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
expert_add_info_format(pinfo, item, PI_MALFORMED, PI_WARN, "Arrival Time: Fractional second out of range (0-1000000000)");
}
- ts = pinfo->fd->del_ts;
+ ts = pinfo->fd->del_cap_ts;
item = proto_tree_add_time(fh_tree, hf_frame_time_delta, tvb,
0, 0, &ts);
PROTO_ITEM_SET_GENERATED(item);
+ ts = pinfo->fd->del_dis_ts;
+
+ item = proto_tree_add_time(fh_tree, hf_frame_time_delta_displayed, tvb,
+ 0, 0, &ts);
+ PROTO_ITEM_SET_GENERATED(item);
+
ts = pinfo->fd->rel_ts;
item = proto_tree_add_time(fh_tree, hf_frame_time_relative, tvb,
@@ -462,7 +469,12 @@ proto_register_frame(void)
"The timestamp from the capture is out of the valid range", HFILL }},
{ &hf_frame_time_delta,
- { "Time delta from previous displayed frame", "frame.time_delta", FT_RELATIVE_TIME, BASE_NONE, NULL,
+ { "Time delta from previous captured frame", "frame.time_delta", FT_RELATIVE_TIME, BASE_NONE, NULL,
+ 0x0,
+ "Time delta from previous captured frame", HFILL }},
+
+ { &hf_frame_time_delta_displayed,
+ { "Time delta from previous displayed frame", "frame.time_delta_displayed", FT_RELATIVE_TIME, BASE_NONE, NULL,
0x0,
"Time delta from previous displayed frame", HFILL }},
diff --git a/epan/frame_data.h b/epan/frame_data.h
index e6baff2ea5..52f9ef798c 100644
--- a/epan/frame_data.h
+++ b/epan/frame_data.h
@@ -46,7 +46,8 @@ typedef struct _frame_data {
guint32 cum_bytes; /* Cumulative bytes into the capture */
nstime_t abs_ts; /* Absolute timestamp */
nstime_t rel_ts; /* Relative timestamp (yes, it can be negative) */
- nstime_t del_ts; /* Delta timestamp (yes, it can be negative) */
+ nstime_t del_dis_ts; /* Delta timestamp to previous displayed frame (yes, it can be negative) */
+ nstime_t del_cap_ts; /* Delta timestamp to previous captured frame (yes, it can be negative) */
gint64 file_off; /* File offset */
int lnk_t; /* Per-packet encapsulation/data-link type */
struct {
diff --git a/epan/timestamp.h b/epan/timestamp.h
index 3e22c6222e..bf45d3f8b6 100644
--- a/epan/timestamp.h
+++ b/epan/timestamp.h
@@ -32,7 +32,8 @@ typedef enum {
TS_RELATIVE, /* Since start of capture */
TS_ABSOLUTE,
TS_ABSOLUTE_WITH_DATE,
- TS_DELTA, /* Since previous packet */
+ TS_DELTA, /* Since previous captured packet */
+ TS_DELTA_DIS, /* Since previous displayed packet */
TS_EPOCH, /* Seconds (and fractions) since epoch */
/*
diff --git a/epan/wslua/wslua_pinfo.c b/epan/wslua/wslua_pinfo.c
index 4e0168fa01..3aa8e78d80 100644
--- a/epan/wslua/wslua_pinfo.c
+++ b/epan/wslua/wslua_pinfo.c
@@ -296,6 +296,7 @@ static const struct col_names_t colnames[] = {
{"rel_time",COL_REL_TIME},
{"date",COL_ABS_DATE_TIME},
{"delta_time",COL_DELTA_TIME},
+ {"delta_time_displayed",COL_DELTA_TIME_DIS},
{"src",COL_DEF_SRC},
{"src_res",COL_RES_SRC},
{"src_unres",COL_UNRES_SRC},
@@ -583,7 +584,8 @@ PINFO_GET_NUMBER(Pinfo_len,pinfo->fd->pkt_len)
PINFO_GET_NUMBER(Pinfo_caplen,pinfo->fd->cap_len)
PINFO_GET_NUMBER(Pinfo_abs_ts,(((double)pinfo->fd->abs_ts.secs) + (((double)pinfo->fd->abs_ts.nsecs) / 1000000000.0) ))
PINFO_GET_NUMBER(Pinfo_rel_ts,(((double)pinfo->fd->rel_ts.secs) + (((double)pinfo->fd->rel_ts.nsecs) / 1000000000.0) ))
-PINFO_GET_NUMBER(Pinfo_delta_ts,(((double)pinfo->fd->del_ts.secs) + (((double)pinfo->fd->del_ts.nsecs) / 1000000000.0) ))
+PINFO_GET_NUMBER(Pinfo_delta_ts,(((double)pinfo->fd->del_cap_ts.secs) + (((double)pinfo->fd->del_cap_ts.nsecs) / 1000000000.0) ))
+PINFO_GET_NUMBER(Pinfo_delta_dis_ts,(((double)pinfo->fd->del_dis_ts.secs) + (((double)pinfo->fd->del_dis_ts.nsecs) / 1000000000.0) ))
PINFO_GET_NUMBER(Pinfo_ipproto,pinfo->ipproto)
PINFO_GET_NUMBER(Pinfo_circuit_id,pinfo->circuit_id)
PINFO_GET_NUMBER(Pinfo_ptype,pinfo->ptype)
@@ -769,9 +771,12 @@ static const pinfo_method_t Pinfo_methods[] = {
/* WSLUA_ATTRIBUTE Pinfo_rel_ts RO Number of seconds passed since beginning of capture */
{"rel_ts",Pinfo_rel_ts, pushnil_param, PARAM_NONE },
- /* WSLUA_ATTRIBUTE Pinfo_delta_ts RO Number of seconds passed since the last packet */
+ /* WSLUA_ATTRIBUTE Pinfo_delta_ts RO Number of seconds passed since the last captured packet */
{"delta_ts",Pinfo_delta_ts, pushnil_param, PARAM_NONE },
+ /* WSLUA_ATTRIBUTE Pinfo_delta_dis_ts RO Number of seconds passed since the last displayed packet */
+ {"delta_dis_ts",Pinfo_delta_dis_ts, pushnil_param, PARAM_NONE },
+
/* WSLUA_ATTRIBUTE Pinfo_visited RO Whether this packet hass been already visited */
{"visited",Pinfo_visited, pushnil_param, PARAM_NONE },