diff options
author | sfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7> | 2007-03-23 18:08:17 +0000 |
---|---|---|
committer | sfisher <sfisher@f5534014-38df-0310-8fa8-9805f1628bb7> | 2007-03-23 18:08:17 +0000 |
commit | ee2cc676a11553dc899953a0a074b07ba3812f3c (patch) | |
tree | 49c7db39b4c44d02429daa16149f2ba63678af4e /epan | |
parent | 4a0cba066a6021188a8c8c3b8b00d5b6e3ae67fc (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.c | 68 | ||||
-rw-r--r-- | epan/column.c | 10 | ||||
-rw-r--r-- | epan/column_info.h | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-frame.c | 16 | ||||
-rw-r--r-- | epan/frame_data.h | 3 | ||||
-rw-r--r-- | epan/timestamp.h | 3 | ||||
-rw-r--r-- | epan/wslua/wslua_pinfo.c | 9 |
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 }, |