Add an option to col_fill_in() to allow us to disable column expression processing. This is rarely needed. It's only needed when the user right clicks on the packet list view to generate a display filter.

svn path=/trunk/; revision=29806
This commit is contained in:
Kovarththanan Rajaratnam 2009-09-08 19:00:54 +00:00
parent 1ad55d8c02
commit de23d92163
10 changed files with 79 additions and 46 deletions

View File

@ -1153,7 +1153,7 @@ col_set_time(column_info *cinfo, gint el, nstime_t *ts, char *fieldname)
}
static void
col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src)
col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src, gboolean fill_col_exprs)
{
struct e_in6_addr ipv6_addr;
@ -1168,6 +1168,9 @@ col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src)
pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
#endif
if (!fill_col_exprs)
return;
switch (addr->type) {
case AT_ETHER:
@ -1226,7 +1229,7 @@ col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_src)
/* ------------------------ */
static void
col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src)
col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src, gboolean fill_col_exprs _U_)
{
guint32 port;
@ -1235,6 +1238,8 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src)
else
port = pinfo->destport;
/* TODO: Use fill_col_exprs */
switch (pinfo->ptype) {
case PT_SCTP:
if (is_res)
@ -1334,15 +1339,13 @@ col_based_on_frame_data(column_info *cinfo, gint col)
}
void
col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col)
col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col, gboolean fill_col_exprs)
{
switch (cinfo->col_fmt[col]) {
case COL_NUMBER:
g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%u", fd->num);
cinfo->col_data[col] = cinfo->col_buf[col];
cinfo->col_expr.col_expr[col] = "frame.number";
g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN);
break;
case COL_CLS_TIME:
@ -1351,14 +1354,13 @@ col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col)
case COL_REL_TIME:
case COL_DELTA_TIME:
case COL_DELTA_TIME_DIS:
/* TODO: Pass on fill_col_exprs */
col_set_fmt_time(fd, cinfo, cinfo->col_fmt[col], col);
break;
case COL_PACKET_LENGTH:
g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%u", fd->pkt_len);
cinfo->col_data[col] = cinfo->col_buf[col];
cinfo->col_expr.col_expr[col] = "frame.len";
g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN);
break;
case COL_CUMULATIVE_BYTES:
@ -1369,10 +1371,41 @@ col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col)
default:
break;
}
if (!fill_col_exprs)
return;
switch (cinfo->col_fmt[col]) {
case COL_NUMBER:
cinfo->col_expr.col_expr[col] = "frame.number";
g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN);
break;
case COL_CLS_TIME:
case COL_ABS_TIME:
case COL_ABS_DATE_TIME:
case COL_REL_TIME:
case COL_DELTA_TIME:
case COL_DELTA_TIME_DIS:
/* Already handled above */
break;
case COL_PACKET_LENGTH:
cinfo->col_expr.col_expr[col] = "frame.len";
g_strlcpy(cinfo->col_expr.col_expr_val[col], cinfo->col_buf[col], COL_MAX_LEN);
break;
case COL_CUMULATIVE_BYTES:
break;
default:
break;
}
}
void
col_fill_in(packet_info *pinfo, gboolean fill_fd_colums)
col_fill_in(packet_info *pinfo, gboolean fill_col_exprs, gboolean fill_fd_colums)
{
int i;
@ -1392,79 +1425,79 @@ col_fill_in(packet_info *pinfo, gboolean fill_fd_colums)
case COL_PACKET_LENGTH:
case COL_CUMULATIVE_BYTES:
if (fill_fd_colums)
col_fill_in_frame_data(pinfo->fd, pinfo->cinfo, i);
col_fill_in_frame_data(pinfo->fd, pinfo->cinfo, i, fill_col_exprs);
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);
col_set_addr(pinfo, i, &pinfo->src, TRUE, fill_col_exprs);
break;
case COL_UNRES_SRC:
col_set_addr(pinfo, i, &pinfo->src, TRUE);
col_set_addr(pinfo, i, &pinfo->src, TRUE, fill_col_exprs);
break;
case COL_DEF_DL_SRC:
case COL_RES_DL_SRC:
col_set_addr(pinfo, i, &pinfo->dl_src, TRUE);
col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, fill_col_exprs);
break;
case COL_UNRES_DL_SRC:
col_set_addr(pinfo, i, &pinfo->dl_src, TRUE);
col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, fill_col_exprs);
break;
case COL_DEF_NET_SRC:
case COL_RES_NET_SRC:
col_set_addr(pinfo, i, &pinfo->net_src, TRUE);
col_set_addr(pinfo, i, &pinfo->net_src, TRUE, fill_col_exprs);
break;
case COL_UNRES_NET_SRC:
col_set_addr(pinfo, i, &pinfo->net_src, TRUE);
col_set_addr(pinfo, i, &pinfo->net_src, TRUE, fill_col_exprs);
break;
case COL_DEF_DST:
case COL_RES_DST: /* COL_DEF_DST is currently just like COL_RES_DST */
col_set_addr(pinfo, i, &pinfo->dst, FALSE);
col_set_addr(pinfo, i, &pinfo->dst, FALSE, fill_col_exprs);
break;
case COL_UNRES_DST:
col_set_addr(pinfo, i, &pinfo->dst, FALSE);
col_set_addr(pinfo, i, &pinfo->dst, FALSE, fill_col_exprs);
break;
case COL_DEF_DL_DST:
case COL_RES_DL_DST:
col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE);
col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, fill_col_exprs);
break;
case COL_UNRES_DL_DST:
col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE);
col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, fill_col_exprs);
break;
case COL_DEF_NET_DST:
case COL_RES_NET_DST:
col_set_addr(pinfo, i, &pinfo->net_dst, FALSE);
col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, fill_col_exprs);
break;
case COL_UNRES_NET_DST:
col_set_addr(pinfo, i, &pinfo->net_dst, FALSE);
col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, fill_col_exprs);
break;
case COL_DEF_SRC_PORT:
case COL_RES_SRC_PORT: /* COL_DEF_SRC_PORT is currently just like COL_RES_SRC_PORT */
col_set_port(pinfo, i, TRUE, TRUE);
col_set_port(pinfo, i, TRUE, TRUE, fill_col_exprs);
break;
case COL_UNRES_SRC_PORT:
col_set_port(pinfo, i, FALSE, TRUE);
col_set_port(pinfo, i, FALSE, TRUE, fill_col_exprs);
break;
case COL_DEF_DST_PORT:
case COL_RES_DST_PORT: /* COL_DEF_DST_PORT is currently just like COL_RES_DST_PORT */
col_set_port(pinfo, i, TRUE, FALSE);
col_set_port(pinfo, i, TRUE, FALSE, fill_col_exprs);
break;
case COL_UNRES_DST_PORT:
col_set_port(pinfo, i, FALSE, FALSE);
col_set_port(pinfo, i, FALSE, FALSE, fill_col_exprs);
break;
case COL_VSAN:

View File

@ -70,13 +70,13 @@ extern void col_set_fmt_time(frame_data *fd, column_info *cinfo, gint fmt, gint
*
* Internal, don't use this in dissectors!
*/
extern void col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col);
extern void col_fill_in_frame_data(frame_data *fd, column_info *cinfo, gint col, gboolean fill_col_exprs);
/** Fill in all columns of the given packet.
*
* Internal, don't use this in dissectors!
*/
extern void col_fill_in(packet_info *pinfo, gboolean fill_fd_colums);
extern void col_fill_in(packet_info *pinfo, gboolean fill_col_exprs, gboolean fill_fd_colums);
/* Utility routines used by packet*.c */
@ -87,7 +87,7 @@ extern void col_fill_in(packet_info *pinfo, gboolean fill_fd_colums);
*/
extern gboolean col_get_writable(column_info *cinfo);
/** Set the columns writable.
/** Set the columns writable.
*
* @param cinfo the current packet row
* @param writable TRUE if it's writable, FALSE if not
@ -101,8 +101,8 @@ extern void col_set_writable(column_info *cinfo, gboolean writable);
*/
extern gint check_col(column_info *cinfo, gint col);
/** Sets a fence for the current column content,
* so this content won't be affected by further col_... function calls.
/** Sets a fence for the current column content,
* so this content won't be affected by further col_... function calls.
*
* This can be useful if a protocol is more than once in a single packet,
* e.g. multiple HTTP calls in a single TCP packet.
@ -231,11 +231,11 @@ extern void col_append_sep_fstr(column_info *cinfo, gint col, const gchar *sep,
*
* Used by multiple dissectors to set the time in the column
* COL_DELTA_CONV_TIME
*
*
* @param cinfo the current packet row
* @param col the column to use, e.g. COL_INFO
* @param ts the time to set in the column
* @param fieldname the fieldname to use for creating a filter (when
* @param fieldname the fieldname to use for creating a filter (when
* applying/preparing/copying as filter)
*/
extern void col_set_time(column_info *cinfo, int col,

View File

@ -239,9 +239,9 @@ epan_custom_set(epan_dissect_t *edt, int field_id,
}
void
epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_fd_colums)
epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_col_exprs, gboolean fill_fd_colums)
{
col_custom_set_edt(edt, edt->pi.cinfo);
col_fill_in(&edt->pi, fill_fd_colums);
col_fill_in(&edt->pi, fill_col_exprs, fill_fd_colums);
}

View File

@ -111,7 +111,7 @@ epan_dissect_prime_dfilter(epan_dissect_t *edt, const dfilter_t *dfcode);
/* fill the dissect run output into the packet list columns */
void
epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_fd_colums);
epan_dissect_fill_in_columns(epan_dissect_t *edt, gboolean fill_col_exprs, gboolean fill_fd_colums);
/* releases resources attached to the packet dissection. DOES NOT free the actual pointer */
void

8
file.c
View File

@ -1190,7 +1190,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
}
#ifndef NEW_PACKET_LIST
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
#endif
/* If we haven't yet seen the first frame, this is it.
@ -2298,7 +2298,7 @@ print_packet(capture_file *cf, frame_data *fdata,
information. */
if (args->print_args->print_summary) {
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
} else
epan_dissect_run(&edt, pseudo_header, pd, fdata, NULL);
@ -2630,7 +2630,7 @@ write_psml_packet(capture_file *cf, frame_data *fdata,
proto_tree_needed = have_custom_cols(&cf->cinfo);
epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed);
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
/* Write out the information in that tree. */
proto_tree_write_psml(&edt, fh);
@ -2704,7 +2704,7 @@ write_csv_packet(capture_file *cf, frame_data *fdata,
proto_tree_needed = have_custom_cols(&cf->cinfo);
epan_dissect_init(&edt, proto_tree_needed, proto_tree_needed);
epan_dissect_run(&edt, pseudo_header, pd, fdata, &cf->cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_fill_in_columns(&edt, FALSE, TRUE);
/* Write out the information in that tree. */
proto_tree_write_csv(&edt, fh);

View File

@ -526,7 +526,7 @@ get_filter_from_packet_list_row_and_column(gpointer data)
epan_dissect_run(&edt, &cfile.pseudo_header, cfile.pd, fdata,
&cfile.cinfo);
epan_dissect_fill_in_columns(&edt, TRUE);
epan_dissect_fill_in_columns(&edt, TRUE, TRUE);
if (strlen(cfile.cinfo.col_expr.col_expr[column]) != 0 &&
strlen(cfile.cinfo.col_expr.col_expr_val[column]) != 0) {

View File

@ -642,7 +642,7 @@ show_cell_data_func(GtkTreeViewColumn *col _U_, GtkCellRenderer *renderer,
g_assert(fdata->col_text);
if (col_based_on_frame_data(&cfile.cinfo, col_num)) {
col_fill_in_frame_data(fdata, &cfile.cinfo, col_num);
col_fill_in_frame_data(fdata, &cfile.cinfo, col_num, FALSE);
cell_text = cfile.cinfo.col_data[col_num];
}else
cell_text = fdata->col_text[col_num];
@ -757,7 +757,7 @@ static gboolean
get_col_text_from_record( PacketListRecord *record, gint col_num, gchar** cell_text){
if (col_based_on_frame_data(&cfile.cinfo, col_num)) {
col_fill_in_frame_data(record->fdata, &cfile.cinfo, col_num);
col_fill_in_frame_data(record->fdata, &cfile.cinfo, col_num, FALSE);
*cell_text = g_strdup(cfile.cinfo.col_data[col_num]);
}else
*cell_text = g_strdup(record->fdata->col_text[col_num]);

View File

@ -1085,7 +1085,7 @@ packet_list_dissect_and_cache_record(PacketList *packet_list, PacketListRecord *
if (dissect_columns) {
/* "Stringify" non frame_data vals */
epan_dissect_fill_in_columns(&edt, FALSE /* fill_fd_colums */);
epan_dissect_fill_in_columns(&edt, FALSE, FALSE /* fill_fd_colums */);
for(col = 0; col < cinfo->num_cols; ++col) {
/* Skip columns based om frame_data because we already store those. */
@ -1216,7 +1216,7 @@ packet_list_get_widest_column_string(PacketList *packet_list, gint col)
}
}
col_fill_in_frame_data(&fdata, &cfile.cinfo, col);
col_fill_in_frame_data(&fdata, &cfile.cinfo, col, FALSE);
return cfile.cinfo.col_buf[col];
}

View File

@ -141,7 +141,7 @@ void new_window_cb(GtkWidget *w _U_)
DataPtr->edt = epan_dissect_new(TRUE, TRUE);
epan_dissect_run(DataPtr->edt, &DataPtr->pseudo_header, DataPtr->pd,
DataPtr->frame, &cfile.cinfo);
epan_dissect_fill_in_columns(DataPtr->edt, TRUE);
epan_dissect_fill_in_columns(DataPtr->edt, FALSE, TRUE);
/*
* Build title of window by getting column data constructed when the

View File

@ -2909,7 +2909,7 @@ print_packet(capture_file *cf, epan_dissect_t *edt)
}
} else {
/* Just fill in the columns. */
epan_dissect_fill_in_columns(edt, TRUE);
epan_dissect_fill_in_columns(edt, FALSE, TRUE);
/* Now print them. */
switch (output_action) {