2 * Routines for column utilities.
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32 #include "column-utils.h"
33 #include "timestamp.h"
34 #include "sna-utils.h"
35 #include "atalk-utils.h"
37 #include "packet_info.h"
39 #include "addr_resolv.h"
40 #include "ipv6-utils.h"
41 #include "osi-utils.h"
42 #include "value_string.h"
44 /* Allocate all the data structures for constructing column data, given
45 the number of columns. */
47 col_setup(column_info *cinfo, gint num_cols)
51 cinfo->num_cols = num_cols;
52 cinfo->col_fmt = (gint *) g_malloc(sizeof(gint) * num_cols);
53 cinfo->fmt_matx = (gboolean **) g_malloc(sizeof(gboolean *) * num_cols);
54 cinfo->col_first = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
55 cinfo->col_last = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
56 cinfo->col_title = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
57 cinfo->col_data = (const gchar **) g_malloc(sizeof(gchar *) * num_cols);
58 cinfo->col_buf = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
59 cinfo->col_fence = (int *) g_malloc(sizeof(int) * num_cols);
60 cinfo->col_expr = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
61 cinfo->col_expr_val = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
63 for (i = 0; i < NUM_COL_FMTS; i++) {
64 cinfo->col_first[i] = -1;
65 cinfo->col_last[i] = -1;
69 /* Initialize the data structures for constructing column data. */
71 col_init(column_info *cinfo)
75 for (i = 0; i < cinfo->num_cols; i++) {
76 cinfo->col_buf[i][0] = '\0';
77 cinfo->col_data[i] = cinfo->col_buf[i];
78 cinfo->col_fence[i] = 0;
79 cinfo->col_expr[i][0] = '\0';
80 cinfo->col_expr_val[i][0] = '\0';
82 cinfo->writable = TRUE;
86 col_get_writable(column_info *cinfo)
88 return (cinfo ? cinfo->writable : FALSE);
92 col_set_writable(column_info *cinfo, gboolean writable)
95 cinfo->writable = writable;
98 /* Checks to see if a particular packet information element is needed for
101 check_col(column_info *cinfo, gint el) {
103 if (cinfo && cinfo->writable) {
104 /* We are constructing columns, and they're writable */
105 if (cinfo->col_first[el] >= 0) {
106 /* There is at least one column in that format */
113 /* Sets the fence for a column to be at the end of the column. */
115 col_set_fence(column_info *cinfo, gint el)
119 if (cinfo && cinfo->writable) {
120 /* We are constructing columns, and they're writable */
121 if (cinfo->col_first[el] >= 0) {
122 /* There is at least one column in that format */
123 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
124 if (cinfo->fmt_matx[i][el]) {
125 cinfo->col_fence[i] = strlen(cinfo->col_data[i]);
132 /* Use this to clear out a column, especially if you're going to be
133 appending to it later; at least on some platforms, it's more
134 efficient than using "col_add_str()" with a null string, and
135 more efficient than "col_set_str()" with a null string if you
136 later append to it, as the later append will cause a string
139 col_clear(column_info *cinfo, gint el)
144 g_assert(cinfo->col_first[el] >= 0);
145 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
146 if (cinfo->fmt_matx[i][el]) {
148 * At this point, either
150 * 1) col_data[i] is equal to col_buf[i], in which case we
151 * don't have to worry about copying col_data[i] to
154 * 2) col_data[i] isn't equal to col_buf[i], in which case
155 * the only thing that's been done to the column is
156 * "col_set_str()" calls and possibly "col_set_fence()"
157 * calls, in which case the fence is either unset and
158 * at the beginning of the string or set and at the end
159 * of the string - if it's at the beginning, we're just
160 * going to clear the column, and if it's at the end,
161 * we don't do anything.
163 fence = cinfo->col_fence[i];
164 if (fence == 0 || cinfo->col_buf[i] == cinfo->col_data[i]) {
166 * The fence isn't at the end of the column, or the column wasn't
167 * last set with "col_set_str()", so clear the column out.
169 cinfo->col_buf[i][fence] = '\0';
170 cinfo->col_data[i] = cinfo->col_buf[i];
172 cinfo->col_expr[i][0] = '\0';
173 cinfo->col_expr_val[i][0] = '\0';
178 #define COL_CHECK_APPEND(cinfo, i, max_len) \
179 if (cinfo->col_data[i] != cinfo->col_buf[i]) { \
180 /* This was set with "col_set_str()"; copy the string they \
181 set it to into the buffer, so we can append to it. */ \
182 strncpy(cinfo->col_buf[i], cinfo->col_data[i], max_len); \
183 cinfo->col_buf[i][max_len - 1] = '\0'; \
184 cinfo->col_data[i] = cinfo->col_buf[i]; \
187 #define COL_CHECK_REF_TIME(fd, cinfo, col) \
188 if(fd->flags.ref_time){ \
189 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "*REF*"); \
190 cinfo->col_data[col] = cinfo->col_buf[col]; \
194 /* Use this if "str" points to something that will stay around (and thus
195 needn't be copied). */
197 col_set_str(column_info *cinfo, gint el, const gchar* str)
204 max_len = COL_MAX_INFO_LEN;
206 max_len = COL_MAX_LEN;
208 g_assert(cinfo->col_first[el] >= 0);
209 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
210 if (cinfo->fmt_matx[i][el]) {
211 fence = cinfo->col_fence[i];
214 * We will append the string after the fence.
215 * First arrange that we can append, if necessary.
217 COL_CHECK_APPEND(cinfo, i, max_len);
219 strncpy(&cinfo->col_buf[i][fence], str, max_len - fence);
220 cinfo->col_buf[i][max_len - 1] = 0;
223 * There's no fence, so we can just set the column to point
226 cinfo->col_data[i] = str;
232 /* Adds a vararg list to a packet info string. */
234 col_add_fstr(column_info *cinfo, gint el, const gchar *format, ...) {
240 g_assert(cinfo->col_first[el] >= 0);
242 max_len = COL_MAX_INFO_LEN;
244 max_len = COL_MAX_LEN;
246 va_start(ap, format);
247 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
248 if (cinfo->fmt_matx[i][el]) {
249 fence = cinfo->col_fence[i];
252 * We will append the string after the fence.
253 * First arrange that we can append, if necessary.
255 COL_CHECK_APPEND(cinfo, i, max_len);
258 * There's no fence, so we can just write to the string.
260 cinfo->col_data[i] = cinfo->col_buf[i];
262 g_vsnprintf(&cinfo->col_buf[i][fence], max_len - fence, format, ap);
263 cinfo->col_buf[i][max_len - 1] = '\0';
270 col_do_append_sep_va_fstr(column_info *cinfo, gint el, const gchar *separator,
271 const gchar *format, va_list ap)
274 size_t len, max_len, sep_len;
276 g_assert(cinfo->col_first[el] >= 0);
278 max_len = COL_MAX_INFO_LEN;
280 max_len = COL_MAX_LEN;
282 if (separator == NULL)
285 sep_len = strlen(separator);
286 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
287 if (cinfo->fmt_matx[i][el]) {
289 * First arrange that we can append, if necessary.
291 COL_CHECK_APPEND(cinfo, i, max_len);
293 len = strlen(cinfo->col_buf[i]);
296 * If we have a separator, append it if the column isn't empty.
298 if (separator != NULL) {
300 strncat(cinfo->col_buf[i], separator, max_len - len);
304 g_vsnprintf(&cinfo->col_buf[i][len], max_len - len, format, ap);
305 cinfo->col_buf[i][max_len-1] = 0;
310 /* Appends a vararg list to a packet info string. */
312 col_append_fstr(column_info *cinfo, gint el, const gchar *format, ...)
316 va_start(ap, format);
317 col_do_append_sep_va_fstr(cinfo, el, NULL, format, ap);
321 /* Appends a vararg list to a packet info string.
322 * Prefixes it with the given separator if the column is not empty. */
324 col_append_sep_fstr(column_info *cinfo, gint el, const gchar *separator,
325 const gchar *format, ...)
329 if (separator == NULL)
330 separator = ", "; /* default */
331 va_start(ap, format);
332 col_do_append_sep_va_fstr(cinfo, el, separator, format, ap);
338 /* Prepends a vararg list to a packet info string. */
339 #define COL_BUF_MAX_LEN (((COL_MAX_INFO_LEN) > (COL_MAX_LEN)) ? \
340 (COL_MAX_INFO_LEN) : (COL_MAX_LEN))
342 col_prepend_fstr(column_info *cinfo, gint el, const gchar *format, ...)
346 char orig_buf[COL_BUF_MAX_LEN];
350 g_assert(cinfo->col_first[el] >= 0);
352 max_len = COL_MAX_INFO_LEN;
354 max_len = COL_MAX_LEN;
356 va_start(ap, format);
357 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
358 if (cinfo->fmt_matx[i][el]) {
359 if (cinfo->col_data[i] != cinfo->col_buf[i]) {
360 /* This was set with "col_set_str()"; which is effectively const */
361 orig = cinfo->col_data[i];
363 strncpy(orig_buf, cinfo->col_buf[i], max_len);
364 orig_buf[max_len - 1] = '\0';
367 g_vsnprintf(cinfo->col_buf[i], max_len, format, ap);
368 cinfo->col_buf[i][max_len - 1] = '\0';
371 * Move the fence, unless it's at the beginning of the string.
373 if (cinfo->col_fence[i] > 0)
374 cinfo->col_fence[i] += strlen(cinfo->col_buf[i]);
376 strncat(cinfo->col_buf[i], orig, max_len);
377 cinfo->col_buf[i][max_len - 1] = '\0';
378 cinfo->col_data[i] = cinfo->col_buf[i];
384 col_prepend_fence_fstr(column_info *cinfo, gint el, const gchar *format, ...)
388 char orig_buf[COL_BUF_MAX_LEN];
392 g_assert(cinfo->col_first[el] >= 0);
394 max_len = COL_MAX_INFO_LEN;
396 max_len = COL_MAX_LEN;
398 va_start(ap, format);
399 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
400 if (cinfo->fmt_matx[i][el]) {
401 if (cinfo->col_data[i] != cinfo->col_buf[i]) {
402 /* This was set with "col_set_str()"; which is effectively const */
403 orig = cinfo->col_data[i];
405 strncpy(orig_buf, cinfo->col_buf[i], max_len);
406 orig_buf[max_len - 1] = '\0';
409 g_vsnprintf(cinfo->col_buf[i], max_len, format, ap);
410 cinfo->col_buf[i][max_len - 1] = '\0';
413 * Move the fence if it exists, else create a new fence at the
414 * end of the prepended data.
416 if (cinfo->col_fence[i] > 0) {
417 cinfo->col_fence[i] += strlen(cinfo->col_buf[i]);
419 cinfo->col_fence[i] = strlen(cinfo->col_buf[i]);
421 strncat(cinfo->col_buf[i], orig, max_len);
422 cinfo->col_buf[i][max_len - 1] = '\0';
423 cinfo->col_data[i] = cinfo->col_buf[i];
429 /* Use this if "str" points to something that won't stay around (and
430 must thus be copied). */
432 col_add_str(column_info *cinfo, gint el, const gchar* str)
438 g_assert(cinfo->col_first[el] >= 0);
440 max_len = COL_MAX_INFO_LEN;
442 max_len = COL_MAX_LEN;
444 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
445 if (cinfo->fmt_matx[i][el]) {
446 fence = cinfo->col_fence[i];
449 * We will append the string after the fence.
450 * First arrange that we can append, if necessary.
452 COL_CHECK_APPEND(cinfo, i, max_len);
455 * There's no fence, so we can just write to the string.
457 cinfo->col_data[i] = cinfo->col_buf[i];
459 strncpy(&cinfo->col_buf[i][fence], str, max_len - fence);
460 cinfo->col_buf[i][max_len - 1] = 0;
466 col_do_append_str(column_info *cinfo, gint el, const gchar* separator,
470 size_t len, max_len, sep_len;
472 g_assert(cinfo->col_first[el] >= 0);
474 max_len = COL_MAX_INFO_LEN;
476 max_len = COL_MAX_LEN;
478 if (separator == NULL)
481 sep_len = strlen(separator);
483 for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
484 if (cinfo->fmt_matx[i][el]) {
486 * First arrange that we can append, if necessary.
488 COL_CHECK_APPEND(cinfo, i, max_len);
490 len = strlen(cinfo->col_buf[i]);
493 * If we have a separator, append it if the column isn't empty.
495 if (separator != NULL) {
497 strncat(cinfo->col_buf[i], separator, max_len - len);
501 strncat(cinfo->col_buf[i], str, max_len - len);
502 cinfo->col_buf[i][max_len - 1] = 0;
508 col_append_str(column_info *cinfo, gint el, const gchar* str)
510 col_do_append_str(cinfo, el, NULL, str);
514 col_append_sep_str(column_info *cinfo, gint el, const gchar* separator,
517 if (separator == NULL)
518 separator = ", "; /* default */
519 col_do_append_str(cinfo, el, separator, str);
523 col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col)
528 COL_CHECK_REF_TIME(fd, cinfo, col);
530 then = fd->abs_ts.secs;
531 tmp = localtime(&then);
533 switch(timestamp_get_precision()) {
534 case(TS_PREC_FIXED_SEC):
535 case(TS_PREC_AUTO_SEC):
536 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
537 "%04d-%02d-%02d %02d:%02d:%02d",
545 case(TS_PREC_FIXED_DSEC):
546 case(TS_PREC_AUTO_DSEC):
547 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
548 "%04d-%02d-%02d %02d:%02d:%02d.%01ld",
555 (long)fd->abs_ts.nsecs / 100000000);
557 case(TS_PREC_FIXED_CSEC):
558 case(TS_PREC_AUTO_CSEC):
559 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
560 "%04d-%02d-%02d %02d:%02d:%02d.%02ld",
567 (long)fd->abs_ts.nsecs / 10000000);
569 case(TS_PREC_FIXED_MSEC):
570 case(TS_PREC_AUTO_MSEC):
571 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
572 "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
579 (long)fd->abs_ts.nsecs / 1000000);
581 case(TS_PREC_FIXED_USEC):
582 case(TS_PREC_AUTO_USEC):
583 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
584 "%04d-%02d-%02d %02d:%02d:%02d.%06ld",
591 (long)fd->abs_ts.nsecs / 1000);
593 case(TS_PREC_FIXED_NSEC):
594 case(TS_PREC_AUTO_NSEC):
595 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
596 "%04d-%02d-%02d %02d:%02d:%02d.%09ld",
603 (long)fd->abs_ts.nsecs);
606 g_assert_not_reached();
609 cinfo->col_buf[col][0] = '\0';
611 cinfo->col_data[col] = cinfo->col_buf[col];
612 strcpy(cinfo->col_expr[col],"frame.time");
613 strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
617 col_set_rel_time(frame_data *fd, column_info *cinfo, int col)
619 COL_CHECK_REF_TIME(fd, cinfo, col);
621 switch(timestamp_get_precision()) {
622 case(TS_PREC_FIXED_SEC):
623 case(TS_PREC_AUTO_SEC):
624 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
625 fd->rel_ts.secs, fd->rel_ts.nsecs / 1000000000, SECS);
627 case(TS_PREC_FIXED_DSEC):
628 case(TS_PREC_AUTO_DSEC):
629 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
630 fd->rel_ts.secs, fd->rel_ts.nsecs / 100000000, DSECS);
632 case(TS_PREC_FIXED_CSEC):
633 case(TS_PREC_AUTO_CSEC):
634 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
635 fd->rel_ts.secs, fd->rel_ts.nsecs / 10000000, CSECS);
637 case(TS_PREC_FIXED_MSEC):
638 case(TS_PREC_AUTO_MSEC):
639 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
640 fd->rel_ts.secs, fd->rel_ts.nsecs / 1000000, MSECS);
642 case(TS_PREC_FIXED_USEC):
643 case(TS_PREC_AUTO_USEC):
644 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
645 fd->rel_ts.secs, fd->rel_ts.nsecs / 1000, USECS);
647 case(TS_PREC_FIXED_NSEC):
648 case(TS_PREC_AUTO_NSEC):
649 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
650 fd->rel_ts.secs, fd->rel_ts.nsecs, NSECS);
653 g_assert_not_reached();
655 cinfo->col_data[col] = cinfo->col_buf[col];
656 strcpy(cinfo->col_expr[col],"frame.time_relative");
657 strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
661 col_set_delta_time(frame_data *fd, column_info *cinfo, int col)
663 COL_CHECK_REF_TIME(fd, cinfo, col);
665 switch(timestamp_get_precision()) {
666 case(TS_PREC_FIXED_SEC):
667 case(TS_PREC_AUTO_SEC):
668 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
669 fd->del_ts.secs, fd->del_ts.nsecs / 1000000000, SECS);
671 case(TS_PREC_FIXED_DSEC):
672 case(TS_PREC_AUTO_DSEC):
673 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
674 fd->del_ts.secs, fd->del_ts.nsecs / 100000000, DSECS);
676 case(TS_PREC_FIXED_CSEC):
677 case(TS_PREC_AUTO_CSEC):
678 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
679 fd->del_ts.secs, fd->del_ts.nsecs / 10000000, CSECS);
681 case(TS_PREC_FIXED_MSEC):
682 case(TS_PREC_AUTO_MSEC):
683 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
684 fd->del_ts.secs, fd->del_ts.nsecs / 1000000, MSECS);
686 case(TS_PREC_FIXED_USEC):
687 case(TS_PREC_AUTO_USEC):
688 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
689 fd->del_ts.secs, fd->del_ts.nsecs / 1000, USECS);
691 case(TS_PREC_FIXED_NSEC):
692 case(TS_PREC_AUTO_NSEC):
693 display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
694 fd->del_ts.secs, fd->del_ts.nsecs, NSECS);
697 g_assert_not_reached();
699 cinfo->col_data[col] = cinfo->col_buf[col];
700 strcpy(cinfo->col_expr[col],"frame.time_delta");
701 strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
704 /* To do: Add check_col checks to the col_add* routines */
707 col_set_abs_time(frame_data *fd, column_info *cinfo, int col)
712 COL_CHECK_REF_TIME(fd, cinfo, col);
714 then = fd->abs_ts.secs;
715 tmp = localtime(&then);
717 switch(timestamp_get_precision()) {
718 case(TS_PREC_FIXED_SEC):
719 case(TS_PREC_AUTO_SEC):
720 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
726 case(TS_PREC_FIXED_DSEC):
727 case(TS_PREC_AUTO_DSEC):
728 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
729 "%02d:%02d:%02d.%01ld",
733 (long)fd->abs_ts.nsecs / 100000000);
735 case(TS_PREC_FIXED_CSEC):
736 case(TS_PREC_AUTO_CSEC):
737 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
738 "%02d:%02d:%02d.%02ld",
742 (long)fd->abs_ts.nsecs / 10000000);
744 case(TS_PREC_FIXED_MSEC):
745 case(TS_PREC_AUTO_MSEC):
746 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
747 "%02d:%02d:%02d.%03ld",
751 (long)fd->abs_ts.nsecs / 1000000);
753 case(TS_PREC_FIXED_USEC):
754 case(TS_PREC_AUTO_USEC):
755 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
756 "%02d:%02d:%02d.%06ld",
760 (long)fd->abs_ts.nsecs / 1000);
762 case(TS_PREC_FIXED_NSEC):
763 case(TS_PREC_AUTO_NSEC):
764 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
765 "%02d:%02d:%02d.%09ld",
769 (long)fd->abs_ts.nsecs);
772 g_assert_not_reached();
775 cinfo->col_buf[col][0] = '\0';
777 cinfo->col_data[col] = cinfo->col_buf[col];
778 strcpy(cinfo->col_expr[col],"frame.time");
779 strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
782 /* Set the format of the variable time format.
783 XXX - this is called from "file.c" when the user changes the time
784 format they want for "command-line-specified" time; it's a bit ugly
785 that we have to export it, but if we go to a CList-like widget that
786 invokes callbacks to get the text for the columns rather than
787 requiring us to stuff the text into the widget from outside, we
788 might be able to clean this up. */
790 col_set_cls_time(frame_data *fd, column_info *cinfo, gint col)
792 switch (timestamp_get_type()) {
794 col_set_abs_time(fd, cinfo, col);
797 case TS_ABSOLUTE_WITH_DATE:
798 col_set_abs_date_time(fd, cinfo, col);
802 col_set_rel_time(fd, cinfo, col);
806 col_set_delta_time(fd, cinfo, col);
809 /* code is missing for this case, but I don't know which [jmayer20051219] */
816 col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_res,
819 struct e_in6_addr ipv6_addr;
821 pinfo->cinfo->col_expr[col][0] = '\0';
822 pinfo->cinfo->col_expr_val[col][0] = '\0';
824 if (addr->type == AT_NONE)
825 return; /* no address, nothing to do */
828 get_addr_name_buf(addr, pinfo->cinfo->col_buf[col],COL_MAX_LEN-1);
830 switch (addr->type) {
833 /* XXX - should be done in "address_to_str_buf()", but that routine
834 doesn't know COL_MAX_LEN; it should be changed to take the
835 maximum length as an argument. */
836 strncpy(pinfo->cinfo->col_buf[col], addr->data, COL_MAX_LEN);
837 pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
841 address_to_str_buf(addr, pinfo->cinfo->col_buf[col], COL_MAX_LEN);
845 pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
847 switch (addr->type) {
851 strcpy(pinfo->cinfo->col_expr[col], "eth.src");
853 strcpy(pinfo->cinfo->col_expr[col], "eth.dst");
854 strncpy(pinfo->cinfo->col_expr_val[col], ether_to_str(addr->data), COL_MAX_LEN);
855 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
860 strcpy(pinfo->cinfo->col_expr[col], "ip.src");
862 strcpy(pinfo->cinfo->col_expr[col], "ip.dst");
863 strncpy(pinfo->cinfo->col_expr_val[col], ip_to_str(addr->data), COL_MAX_LEN);
864 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
869 strcpy(pinfo->cinfo->col_expr[col], "ipv6.src");
871 strcpy(pinfo->cinfo->col_expr[col], "ipv6.dst");
872 strncpy(pinfo->cinfo->col_expr_val[col], ip6_to_str(&ipv6_addr), COL_MAX_LEN);
873 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
878 strcpy(pinfo->cinfo->col_expr[col], "ddp.src");
880 strcpy(pinfo->cinfo->col_expr[col], "ddp.dst");
881 strcpy(pinfo->cinfo->col_expr_val[col], pinfo->cinfo->col_buf[col]);
886 strcpy(pinfo->cinfo->col_expr[col], "arcnet.src");
888 strcpy(pinfo->cinfo->col_expr[col], "arcnet.dst");
889 strcpy(pinfo->cinfo->col_expr_val[col], pinfo->cinfo->col_buf[col]);
898 col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src)
903 port = pinfo->srcport;
905 port = pinfo->destport;
906 pinfo->cinfo->col_expr[col][0] = '\0';
907 pinfo->cinfo->col_expr_val[col][0] = '\0';
908 switch (pinfo->ptype) {
912 strncpy(pinfo->cinfo->col_buf[col], get_sctp_port(port), COL_MAX_LEN);
914 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
919 strncpy(pinfo->cinfo->col_buf[col], get_tcp_port(port), COL_MAX_LEN);
921 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
923 strcpy(pinfo->cinfo->col_expr[col], "tcp.srcport");
925 strcpy(pinfo->cinfo->col_expr[col], "tcp.dstport");
926 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
927 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
932 strncpy(pinfo->cinfo->col_buf[col], get_udp_port(port), COL_MAX_LEN);
934 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
936 strcpy(pinfo->cinfo->col_expr[col], "udp.srcport");
938 strcpy(pinfo->cinfo->col_expr[col], "udp.dstport");
939 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
940 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
945 strcpy(pinfo->cinfo->col_expr[col], "ddp.src_socket");
947 strcpy(pinfo->cinfo->col_expr[col], "ddp.dst_socket");
948 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
949 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
950 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
954 /* XXX - resolve IPX socket numbers */
955 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "0x%04x", port);
957 strcpy(pinfo->cinfo->col_expr[col], "ipx.src.socket");
959 strcpy(pinfo->cinfo->col_expr[col], "ipx.dst.socket");
960 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "0x%04x", port);
961 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
965 /* XXX - resolve IDP socket numbers */
966 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "0x%04x", port);
968 strcpy(pinfo->cinfo->col_expr[col], "idp.src.socket");
970 strcpy(pinfo->cinfo->col_expr[col], "idp.dst.socket");
971 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "0x%04x", port);
972 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
978 pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
979 pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
983 * XXX - this should be in some common code in the epan directory, shared
984 * by this code and packet-isdn.c.
986 static const value_string channel_vals[] = {
1022 col_set_circuit_id(packet_info *pinfo, int col)
1024 pinfo->cinfo->col_expr[col][0] = '\0';
1025 pinfo->cinfo->col_expr_val[col][0] = '\0';
1026 switch (pinfo->ctype) {
1029 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1030 strcpy(pinfo->cinfo->col_expr[col], "fr.dlci");
1031 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1032 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
1036 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%s",
1037 val_to_str(pinfo->circuit_id, channel_vals, "Unknown (%u)"));
1038 strcpy(pinfo->cinfo->col_expr[col], "isdn.channel");
1039 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1040 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
1044 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1048 g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1049 strcpy(pinfo->cinfo->col_expr[col], "isup.cic");
1050 g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", pinfo->circuit_id);
1051 pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
1057 pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
1058 pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
1062 col_fill_in(packet_info *pinfo)
1066 for (i = 0; i < pinfo->cinfo->num_cols; i++) {
1067 switch (pinfo->cinfo->col_fmt[i]) {
1070 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->fd->num);
1071 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1072 strcpy(pinfo->cinfo->col_expr[i], "frame.number");
1073 strcpy(pinfo->cinfo->col_expr_val[i], pinfo->cinfo->col_buf[i]);
1077 col_set_cls_time(pinfo->fd, pinfo->cinfo, i);
1081 col_set_abs_time(pinfo->fd, pinfo->cinfo, i);
1084 case COL_ABS_DATE_TIME:
1085 col_set_abs_date_time(pinfo->fd, pinfo->cinfo, i);
1089 col_set_rel_time(pinfo->fd, pinfo->cinfo, i);
1092 case COL_DELTA_TIME:
1093 col_set_delta_time(pinfo->fd, pinfo->cinfo, i);
1097 case COL_RES_SRC: /* COL_DEF_SRC is currently just like COL_RES_SRC */
1098 col_set_addr(pinfo, i, &pinfo->src, TRUE, TRUE);
1102 col_set_addr(pinfo, i, &pinfo->src, FALSE, TRUE);
1105 case COL_DEF_DL_SRC:
1106 case COL_RES_DL_SRC:
1107 col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, TRUE);
1110 case COL_UNRES_DL_SRC:
1111 col_set_addr(pinfo, i, &pinfo->dl_src, FALSE, TRUE);
1114 case COL_DEF_NET_SRC:
1115 case COL_RES_NET_SRC:
1116 col_set_addr(pinfo, i, &pinfo->net_src, TRUE, TRUE);
1119 case COL_UNRES_NET_SRC:
1120 col_set_addr(pinfo, i, &pinfo->net_src, FALSE, TRUE);
1124 case COL_RES_DST: /* COL_DEF_DST is currently just like COL_RES_DST */
1125 col_set_addr(pinfo, i, &pinfo->dst, TRUE, FALSE);
1129 col_set_addr(pinfo, i, &pinfo->dst, FALSE, FALSE);
1132 case COL_DEF_DL_DST:
1133 case COL_RES_DL_DST:
1134 col_set_addr(pinfo, i, &pinfo->dl_dst, TRUE, FALSE);
1137 case COL_UNRES_DL_DST:
1138 col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, FALSE);
1141 case COL_DEF_NET_DST:
1142 case COL_RES_NET_DST:
1143 col_set_addr(pinfo, i, &pinfo->net_dst, TRUE, FALSE);
1146 case COL_UNRES_NET_DST:
1147 col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, FALSE);
1150 case COL_DEF_SRC_PORT:
1151 case COL_RES_SRC_PORT: /* COL_DEF_SRC_PORT is currently just like COL_RES_SRC_PORT */
1152 col_set_port(pinfo, i, TRUE, TRUE);
1155 case COL_UNRES_SRC_PORT:
1156 col_set_port(pinfo, i, FALSE, TRUE);
1159 case COL_DEF_DST_PORT:
1160 case COL_RES_DST_PORT: /* COL_DEF_DST_PORT is currently just like COL_RES_DST_PORT */
1161 col_set_port(pinfo, i, TRUE, FALSE);
1164 case COL_UNRES_DST_PORT:
1165 col_set_port(pinfo, i, FALSE, FALSE);
1168 case COL_PROTOCOL: /* currently done by dissectors */
1169 case COL_INFO: /* currently done by dissectors */
1172 case COL_PACKET_LENGTH:
1173 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->fd->pkt_len);
1174 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1175 strcpy(pinfo->cinfo->col_expr[i], "frame.pkt_len");
1176 strcpy(pinfo->cinfo->col_expr_val[i], pinfo->cinfo->col_buf[i]);
1179 case COL_CUMULATIVE_BYTES:
1180 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->fd->cum_bytes);
1181 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1185 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->oxid);
1186 pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
1187 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1191 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->rxid);
1192 pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
1193 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1196 case COL_IF_DIR: /* currently done by dissectors */
1199 case COL_CIRCUIT_ID:
1200 col_set_circuit_id(pinfo, i);
1204 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->src_idx);
1205 pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
1206 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1210 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->dst_idx);
1211 pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
1212 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1216 g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->vsan);
1217 pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
1218 pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
1221 case COL_HPUX_SUBSYS: /* done by nettl disector */
1222 case COL_HPUX_DEVID: /* done by nettl disector */
1225 case COL_DCE_CALL: /* done by dcerpc */
1228 case COL_8021Q_VLAN_ID:
1231 case NUM_COL_FMTS: /* keep compiler happy - shouldn't get here */
1232 g_assert_not_reached();