diff --git a/epan/column-utils.c b/epan/column-utils.c index deaff46536..5dd92a7887 100644 --- a/epan/column-utils.c +++ b/epan/column-utils.c @@ -1421,6 +1421,31 @@ col_set_circuit_id(packet_info *pinfo, int col) pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col]; } +#if 0 +/* ------------- */ +static gchar * +set_circuit_id(packet_info *pinfo) +{ + char *ret = ""; + switch (pinfo->ctype) { + + case CT_DLCI: + case CT_X25: + case CT_ISUP: + ret = se_strdup_printf("%u", pinfo->circuit_id); + break; + + case CT_ISDN: + ret = se_strdup_printf("%s", val_to_str(pinfo->circuit_id, channel_vals, "Unknown (%u)")); + break; + + default: + break; + } + return ret; +} +#endif + gboolean col_based_on_frame_data(column_info *cinfo, gint col) { @@ -1660,4 +1685,271 @@ col_fill_in(packet_info *pinfo, gboolean fill_fd_colums) } } } +#if 0 +XXX this needs more rework? +/* --------------------------- */ +static gchar * +set_addr(address *addr, gboolean is_res) +{ + if (addr->type == AT_NONE) + return ""; /* no address, nothing to do */ + + if (is_res) { + return se_get_addr_name(addr /*, COL_MAX_LEN*/); + } + return se_address_to_str(addr); +} + +/* Fills col_text in the frame data structure */ +void +col_fill_fdata(packet_info *pinfo) +{ + int i; + frame_data *fdata; + gboolean res; + + if (!pinfo->cinfo) + return; + + fdata = pinfo->fd; + + res =FALSE; + + for (i = 0; i < pinfo->cinfo->num_cols; i++) { + + switch (pinfo->cinfo->col_fmt[i]) { + case COL_NUMBER: /* frame number */ + case COL_PACKET_LENGTH: /* fd->pkt_len */ + case COL_CUMULATIVE_BYTES: /* fd->cum_bytes */ + case COL_CLS_TIME: + case COL_ABS_TIME: + case COL_ABS_DATE_TIME: /* from fd structures */ + case COL_REL_TIME: + case COL_DELTA_TIME: + case COL_DELTA_TIME_DIS: + break; + + case COL_DEF_SRC: + case COL_RES_SRC: /* COL_DEF_SRC is currently just like COL_RES_SRC */ + res = TRUE; + case COL_UNRES_SRC: + fdata->col_text[i] = set_addr(&pinfo->src, res); + break; + + case COL_DEF_DL_SRC: + case COL_RES_DL_SRC: + res = TRUE; + case COL_UNRES_DL_SRC: + fdata->col_text[i] = set_addr (&pinfo->dl_src, res); + break; + + case COL_DEF_NET_SRC: + case COL_RES_NET_SRC: + res = TRUE; + case COL_UNRES_NET_SRC: + fdata->col_text[i] = set_addr (&pinfo->net_src, res); + break; + + case COL_DEF_DST: + case COL_RES_DST: /* COL_DEF_DST is currently just like COL_RES_DST */ + res = TRUE; + case COL_UNRES_DST: + fdata->col_text[i] = set_addr (&pinfo->dst, res); + break; + + case COL_DEF_DL_DST: + case COL_RES_DL_DST: + res = TRUE; + case COL_UNRES_DL_DST: + fdata->col_text[i] = set_addr (&pinfo->dl_dst, res); + break; + + case COL_DEF_NET_DST: + case COL_RES_NET_DST: + res = TRUE; + case COL_UNRES_NET_DST: + fdata->col_text[i] = set_addr (&pinfo->net_dst, res); + break; + + case COL_DEF_SRC_PORT: + case COL_RES_SRC_PORT: /* COL_DEF_SRC_PORT is currently just like COL_RES_SRC_PORT */ + fdata->col_text[i] = set_port(pinfo, TRUE, pinfo->srcport); + break; + case COL_UNRES_SRC_PORT: + fdata->col_text[i] = set_port(pinfo, FALSE, pinfo->srcport); + break; + + case COL_DEF_DST_PORT: + case COL_RES_DST_PORT: /* COL_DEF_DST_PORT is currently just like COL_RES_DST_PORT */ + fdata->col_text[i] = set_port(pinfo, TRUE, pinfo->destport); + break; + + case COL_UNRES_DST_PORT: + fdata->col_text[i] = set_port(pinfo, FALSE, pinfo->destport); + break; + + case COL_IF_DIR: /* currently done by dissectors */ + case COL_PROTOCOL: + case COL_INFO: + case COL_HPUX_SUBSYS: + case COL_HPUX_DEVID: + case COL_DCE_CALL: + case COL_8021Q_VLAN_ID: + case COL_DSCP_VALUE: + case COL_COS_VALUE: + case COL_FR_DLCI: + case COL_BSSGP_TLLI: + case COL_EXPERT: + case COL_CUSTOM: + case COL_FREQ_CHAN: + if (pinfo->cinfo->col_data[i] != pinfo->cinfo->col_buf[i]) { + /* XXX assume it's a constant */ + fdata->col_text[i] = (gchar *)pinfo->cinfo->col_data[i]; + } + else { + /* copy */ + fdata->col_text[i] = se_strdup(pinfo->cinfo->col_data[i]); + } + break; + case COL_OXID: + fdata->col_text[i] = (gchar *)(GUINT_TO_POINTER((guint)pinfo->oxid)); + break; + case COL_RXID: + fdata->col_text[i] = (gchar *)(GUINT_TO_POINTER((guint)pinfo->rxid)); + break; + case COL_CIRCUIT_ID: + set_circuit_id(pinfo); + break; + case COL_SRCIDX: + fdata->col_text[i] = (gchar *)(GUINT_TO_POINTER((guint)pinfo->src_idx)); + break; + case COL_DSTIDX: + fdata->col_text[i] = (gchar *)(GUINT_TO_POINTER((guint)pinfo->dst_idx)); + break; + case COL_VSAN: + fdata->col_text[i] = (gchar *)(GUINT_TO_POINTER((guint)pinfo->vsan)); + break; + + case NUM_COL_FMTS: /* keep compiler happy - shouldn't get here */ + g_assert_not_reached(); + break; + } + } +} + +/* XXX Gets/creates the text fro col_text in frame data */ +/* --------------------- */ +gchar * +col_get_text(frame_data *fd, column_info *cinfo, gint col) +{ +static gchar fmtbuf[3][COL_MAX_LEN]; +static int idx; +gchar *buf; +gchar *ptr; + + idx = (idx + 1) % 3; + buf = fmtbuf[idx]; + *buf = 0; + ptr = buf; + + switch (cinfo->col_fmt[col]) { + case COL_NUMBER: /* frame number */ + g_snprintf(buf, COL_MAX_LEN, "%u", fd->num); + break; + + case COL_CLS_TIME: + set_cls_time(fd, buf); + break; + case COL_ABS_TIME: + set_abs_time(fd, buf); + break; + case COL_ABS_DATE_TIME: + set_abs_date_time(fd, buf); + break; + case COL_REL_TIME: + set_rel_time(fd, buf); + break; + case COL_DELTA_TIME: + set_delta_time(fd, buf); + break; + case COL_DELTA_TIME_DIS: + set_delta_time_dis(fd, buf); + break; + + case COL_PACKET_LENGTH: /* fd->pkt_len */ + g_snprintf(buf, COL_MAX_LEN, "%u", fd->pkt_len); + break; + + case COL_CUMULATIVE_BYTES: /* fd->cum_bytes */ + g_snprintf(buf, COL_MAX_LEN, "%u", fd->cum_bytes); + break; + + case COL_DEF_SRC: + case COL_RES_SRC: /* network address */ + case COL_UNRES_SRC: + case COL_DEF_DL_SRC: + case COL_RES_DL_SRC: + case COL_UNRES_DL_SRC: + case COL_DEF_NET_SRC: + case COL_RES_NET_SRC: + case COL_UNRES_NET_SRC: + case COL_DEF_DST: + case COL_RES_DST: + case COL_UNRES_DST: + case COL_DEF_DL_DST: + case COL_RES_DL_DST: + case COL_UNRES_DL_DST: + case COL_DEF_NET_DST: + case COL_RES_NET_DST: + case COL_UNRES_NET_DST: + + case COL_IF_DIR: + case COL_CIRCUIT_ID: + case COL_PROTOCOL: + case COL_INFO: + case COL_HPUX_SUBSYS: + case COL_HPUX_DEVID: + case COL_DCE_CALL: + case COL_8021Q_VLAN_ID: + case COL_DSCP_VALUE: + case COL_COS_VALUE: + case COL_FR_DLCI: + case COL_BSSGP_TLLI: + case COL_EXPERT: + case COL_CUSTOM: + case COL_FREQ_CHAN: + ptr = fd->col_text[col]; + break; + + case COL_DEF_SRC_PORT: + case COL_RES_SRC_PORT: + case COL_UNRES_SRC_PORT: + case COL_DEF_DST_PORT: + case COL_RES_DST_PORT: + case COL_UNRES_DST_PORT: + /* hack */ + if (GPOINTER_TO_UINT(fd->col_text[col]) <= 65536) + g_snprintf(buf, COL_MAX_LEN, "%u", GPOINTER_TO_UINT(fd->col_text[col])); + else + ptr = fd->col_text[col]; + break; + + case COL_OXID: + case COL_RXID: + case COL_SRCIDX: + case COL_DSTIDX: + g_snprintf(buf, COL_MAX_LEN, "0x%x", GPOINTER_TO_UINT(fd->col_text[col])); + break; + + case COL_VSAN: + g_snprintf(buf, COL_MAX_LEN, "%u", GPOINTER_TO_UINT(fd->col_text[col])); + break; + + case NUM_COL_FMTS: /* keep compiler happy - shouldn't get here */ + g_assert_not_reached(); + break; + } + return ptr; +} +#endif diff --git a/epan/libwireshark.def b/epan/libwireshark.def index 59aa9863bb..02225be1bc 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -83,6 +83,7 @@ col_based_on_frame_data col_clear col_custom_prime_edt col_custom_set_fstr +col_fill_in col_fill_in_frame_data col_format_desc col_format_to_string diff --git a/file.c b/file.c index f16ec3fb42..ddee0925f7 100644 --- a/file.c +++ b/file.c @@ -1107,18 +1107,17 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, #ifdef NEW_PACKET_LIST if (add_to_packet_list) { - if (cinfo) - epan_dissect_fill_in_columns(&edt, FALSE); + /* We fill the needed columns from new_packet_list */ row = new_packet_list_append(cinfo, fdata, &edt.pi); } #endif - if( (fdata->flags.passed_dfilter) || (edt.pi.fd->flags.ref_time) ) + if( (fdata->flags.passed_dfilter) || (fdata->flags.ref_time) ) { /* This frame either passed the display filter list or is marked as a time reference frame. All time reference frames are displayed even if they dont pass the display filter */ - if(edt.pi.fd->flags.ref_time){ + if(fdata->flags.ref_time){ /* if this was a TIME REF frame we should reset the cul bytes field */ cum_bytes = fdata->pkt_len; fdata->cum_bytes = cum_bytes; @@ -1211,6 +1210,7 @@ read_packet(capture_file *cf, dfilter_t *dfcode, fdata->flags.marked = 0; fdata->flags.ref_time = 0; fdata->color_filter = NULL; + fdata->col_text = NULL; fdata->abs_ts.secs = phdr->ts.secs; fdata->abs_ts.nsecs = phdr->ts.nsecs; diff --git a/gtk/new_packet_list.c b/gtk/new_packet_list.c index 925c5b5e4a..7b0df5d58a 100644 --- a/gtk/new_packet_list.c +++ b/gtk/new_packet_list.c @@ -110,8 +110,9 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo if (cinfo) { /* Allocate the array holding column text, the size is the current number of columns */ - row_data.col_text = se_alloc(sizeof(row_data.col_text)*packetlist->n_columns); + fdata->col_text = se_alloc(sizeof(fdata->col_text)*packetlist->n_columns); g_assert(packetlist->n_columns == cinfo->num_cols); + col_fill_in(pinfo, FALSE); for(i = 0; i < cinfo->num_cols; i++) { switch (cinfo->col_fmt[i]){ /* We already store the value in frame_data, so don't duplicate this. */ @@ -124,11 +125,11 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo case COL_PACKET_LENGTH: /* 47) Packet length in bytes */ case COL_REL_TIME: /* 49) Relative time */ case COL_CLS_TIME: /* 58) Command line-specified time (default relative) */ - row_data.col_text[i] = NULL; + fdata->col_text[i] = NULL; break; /* We handle custom columns lazily */ case COL_CUSTOM: /* 8) Custom column (any filter name's contents) */ - row_data.col_text[i] = NULL; + fdata->col_text[i] = NULL; break; /* String in pinfo */ case COL_OXID: /* 22) Fibre Channel OXID */ @@ -136,7 +137,7 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo case COL_SRCIDX: /* 5) Src port idx - Cisco MDS-specific */ case COL_DSTIDX: /* 4) Dst port idx - Cisco MDS-specific */ case COL_VSAN: /* 6) VSAN - Cisco MDS-specific */ - row_data.col_text[i] = se_strdup(pinfo->cinfo->col_buf[i]); + fdata->col_text[i] = se_strdup(pinfo->cinfo->col_buf[i]); break; /* Columns based on (binary)data in pinfo */ case COL_CIRCUIT_ID: /* 3) Circuit ID */ @@ -173,7 +174,7 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo case COL_RES_SRC_PORT: /* 55) Resolved source port */ case COL_UNRES_SRC_PORT: /* 56) Unresolved source port */ /* pinfo->srcport */ - row_data.col_text[i] = se_strdup(cinfo->col_data[i]); + fdata->col_text[i] = se_strdup(cinfo->col_data[i]); break; /* currently done by dissectors XXX change to custom col instead??*/ case COL_IF_DIR: /* 21) FW-1 monitor interface/direction */ @@ -199,7 +200,7 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo /* Will be set by various dissectors */ case COL_DELTA_CONV_TIME: /* 12) Delta time to last frame in conversation */ case COL_REL_CONV_TIME: /* 50) Relative time to beginning of conversation */ - row_data.col_text[i] = se_strdup(cinfo->col_data[i]); + fdata->col_text[i] = se_strdup(cinfo->col_data[i]); break; default: /* We should have a case statement for all columns */ @@ -207,8 +208,6 @@ new_packet_list_append(column_info *cinfo, frame_data *fdata, packet_info *pinfo } } } - else - row_data.col_text = NULL; row_data.fdata = fdata; @@ -662,7 +661,7 @@ show_cell_data_func(GtkTreeViewColumn *col _U_, GtkCellRenderer *renderer, col_fill_in_frame_data(fdata, &cfile.cinfo, col_num); cell_text = cfile.cinfo.col_data[col_num]; }else - cell_text = record->col_text[col_num]; + cell_text = fdata->col_text[col_num]; if((fdata->color_filter)||(fdata->flags.marked)){ gboolean color_on = enable_color; @@ -801,7 +800,7 @@ get_col_text_from_record( PacketListRecord *record, gint col_num, gchar** cell_t col_fill_in_frame_data(record->fdata, &cfile.cinfo, col_num); *cell_text = g_strdup(cfile.cinfo.col_data[col_num]); }else - *cell_text = g_strdup(record->col_text[col_num]); + *cell_text = g_strdup(record->fdata->col_text[col_num]); return TRUE; } diff --git a/gtk/packet_list_store.c b/gtk/packet_list_store.c index aa93a9cb58..6152b29a52 100644 --- a/gtk/packet_list_store.c +++ b/gtk/packet_list_store.c @@ -361,7 +361,7 @@ packet_list_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, g_value_set_pointer(value, iter->user_data); break; case G_TYPE_STRING: - g_value_set_string(value, record->col_text[column]); + g_value_set_string(value, record->fdata->col_text[column]); break; default: g_warning ("%s: Unsupported type (%s) retrieved.", G_STRLOC, g_type_name (value->g_type)); @@ -574,7 +574,6 @@ packet_list_append_record(PacketList *packet_list, row_data_t *row_data) newrecord = se_alloc(sizeof(PacketListRecord)); newrecord->dissected = FALSE; - newrecord->col_text = row_data->col_text; newrecord->fdata = row_data->fdata; newrecord->pos = pos; @@ -600,11 +599,11 @@ packet_list_change_record(PacketList *packet_list, guint row, gint col, column_i g_assert(row < PACKET_LIST_RECORD_COUNT(packet_list->rows)); record = PACKET_LIST_RECORD_GET(packet_list->rows, row); g_assert(record->pos == row); - g_assert(!record->col_text || (record->col_text[col] == NULL)); - if (!record->col_text) - record->col_text = se_alloc0(sizeof(record->col_text)*packet_list->n_columns); + g_assert(!record->fdata->col_text || (record->fdata->col_text[col] == NULL)); + if (!record->fdata->col_text) + record->fdata->col_text = se_alloc0(sizeof(record->fdata->col_text)*packet_list->n_columns); - record->col_text[col] = se_strdup(cinfo->col_data[col]); + record->fdata->col_text[col] = se_strdup(cinfo->col_data[col]); } static gboolean @@ -695,13 +694,13 @@ packet_list_compare_records(gint sort_id, PacketListRecord *a, if (col_based_on_frame_data(&cfile.cinfo, sort_id)) return frame_data_compare(a->fdata, b->fdata, cfile.cinfo.col_fmt[sort_id]); - if((a->col_text[sort_id]) && (b->col_text[sort_id])) - return strcmp(a->col_text[sort_id], b->col_text[sort_id]); + if((a->fdata->col_text[sort_id]) && (b->fdata->col_text[sort_id])) + return strcmp(a->fdata->col_text[sort_id], b->fdata->col_text[sort_id]); - if(a->col_text[sort_id] == b->col_text[sort_id]) + if(a->fdata->col_text[sort_id] == b->fdata->col_text[sort_id]) return 0; /* both are NULL */ else - return (a->col_text[sort_id] == NULL) ? -1 : 1; + return (a->fdata->col_text[sort_id] == NULL) ? -1 : 1; g_return_val_if_reached(0); } diff --git a/gtk/packet_list_store.h b/gtk/packet_list_store.h index 4a4fc4b95f..e04f9acbdd 100644 --- a/gtk/packet_list_store.h +++ b/gtk/packet_list_store.h @@ -38,7 +38,6 @@ #define PACKETLIST_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PACKETLIST_TYPE_LIST, PacketListClass)) typedef struct { - gchar **col_text; frame_data *fdata; } row_data_t;