From Dinesh Dutt: Add Fibre Channel support, including FCIP, Basic FC
[obnox/wireshark/wip.git] / epan / column-utils.c
1 /* column-utils.c
2  * Routines for column utilities.
3  *
4  * $Id: column-utils.c,v 1.28 2002/12/08 02:32:35 gerald Exp $
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@ethereal.com>
8  * Copyright 1998 Gerald Combs
9  *
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.
14  *
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.
19  *
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.
23  */
24
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29 #include <string.h>
30 #include <time.h>
31
32 #ifdef NEED_SNPRINTF_H
33 # include "snprintf.h"
34 #endif
35
36 #include "column-utils.h"
37 #include "timestamp.h"
38 #include "sna-utils.h"
39 #include "atalk-utils.h"
40 #include "to_str.h"
41 #include "packet_info.h"
42 #include "pint.h"
43 #include "resolv.h"
44 #include "ipv6-utils.h"
45 #include "osi-utils.h"
46
47 /* Allocate all the data structures for constructing column data, given
48    the number of columns. */
49 void
50 col_init(column_info *col_info, gint num_cols)
51 {
52   col_info->num_cols    = num_cols;
53   col_info->col_fmt     = (gint *) g_malloc(sizeof(gint) * num_cols);
54   col_info->fmt_matx    = (gboolean **) g_malloc(sizeof(gboolean *) * num_cols);
55   col_info->col_width   = (gint *) g_malloc(sizeof(gint) * num_cols);
56   col_info->col_title   = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
57   col_info->col_data    = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
58   col_info->col_buf     = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
59   col_info->col_expr    = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
60   col_info->col_expr_val = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
61 }
62
63 gboolean
64 col_get_writable(column_info *cinfo)
65 {
66         return (cinfo ? cinfo->writable : FALSE);
67 }
68
69 void
70 col_set_writable(column_info *cinfo, gboolean writable)
71 {
72         if (cinfo)
73                 cinfo->writable = writable;
74 }
75
76 /* Checks to see if a particular packet information element is needed for
77    the packet list */
78 gint
79 check_col(column_info *cinfo, gint el) {
80   int i;
81
82   if (cinfo && cinfo->writable) {
83     for (i = 0; i < cinfo->num_cols; i++) {
84       if (cinfo->fmt_matx[i][el])
85         return TRUE;
86     }
87   }
88   return FALSE;
89 }
90
91
92
93 /* Use this to clear out a column, especially if you're going to be
94    appending to it later; at least on some platforms, it's more
95    efficient than using "col_add_str()" with a null string, and
96    more efficient than "col_set_str()" with a null string if you
97    later append to it, as the later append will cause a string
98    copy to be done. */
99 void
100 col_clear(column_info *cinfo, gint el) {
101   int    i;
102
103   for (i = 0; i < cinfo->num_cols; i++) {
104     if (cinfo->fmt_matx[i][el]) {
105       cinfo->col_buf[i][0] = 0;
106       cinfo->col_data[i] = cinfo->col_buf[i];
107       cinfo->col_expr[i][0] = '\0';
108       cinfo->col_expr_val[i][0] = '\0';
109     }
110   }
111 }
112
113 /* Use this if "str" points to something that will stay around (and thus
114    needn't be copied). */
115 void
116 col_set_str(column_info *cinfo, gint el, gchar* str) {
117   int i;
118
119   for (i = 0; i < cinfo->num_cols; i++) {
120     if (cinfo->fmt_matx[i][el])
121       cinfo->col_data[i] = str;
122   }
123 }
124
125 /* Adds a vararg list to a packet info string. */
126 void
127 col_add_fstr(column_info *cinfo, gint el, const gchar *format, ...) {
128   va_list ap;
129   int     i;
130   size_t  max_len;
131
132   if (el == COL_INFO)
133         max_len = COL_MAX_INFO_LEN;
134   else
135         max_len = COL_MAX_LEN;
136
137   va_start(ap, format);
138   for (i = 0; i < cinfo->num_cols; i++) {
139     if (cinfo->fmt_matx[i][el]) {
140       vsnprintf(cinfo->col_buf[i], max_len, format, ap);
141       cinfo->col_data[i] = cinfo->col_buf[i];
142     }
143   }
144   va_end(ap);
145 }
146
147 /* Appends a vararg list to a packet info string. */
148 void
149 col_append_fstr(column_info *cinfo, gint el, const gchar *format, ...) {
150   va_list ap;
151   int     i;
152   size_t  len, max_len;
153
154   if (el == COL_INFO)
155         max_len = COL_MAX_INFO_LEN;
156   else
157         max_len = COL_MAX_LEN;
158
159   va_start(ap, format);
160   for (i = 0; i < cinfo->num_cols; i++) {
161     if (cinfo->fmt_matx[i][el]) {
162       if (cinfo->col_data[i] != cinfo->col_buf[i]) {
163         /* This was set with "col_set_str()"; copy the string they
164            set it to into the buffer, so we can append to it. */
165         strncpy(cinfo->col_buf[i], cinfo->col_data[i], max_len);
166         cinfo->col_buf[i][max_len - 1] = '\0';
167       }
168       len = strlen(cinfo->col_buf[i]);
169       vsnprintf(&cinfo->col_buf[i][len], max_len - len, format, ap);
170       cinfo->col_data[i] = cinfo->col_buf[i];
171     }
172   }
173   va_end(ap);
174 }
175
176 /* Prepends a vararg list to a packet info string. */
177 #define COL_BUF_MAX_LEN (((COL_MAX_INFO_LEN) > (COL_MAX_LEN)) ? \
178         (COL_MAX_INFO_LEN) : (COL_MAX_LEN))
179 void
180 col_prepend_fstr(column_info *cinfo, gint el, const gchar *format, ...)
181 {
182   va_list ap;
183   int     i;
184   char    orig_buf[COL_BUF_MAX_LEN];
185   char   *orig;
186   size_t  max_len;
187
188   if (el == COL_INFO)
189         max_len = COL_MAX_INFO_LEN;
190   else
191         max_len = COL_MAX_LEN;
192
193   va_start(ap, format);
194   for (i = 0; i < cinfo->num_cols; i++) {
195     if (cinfo->fmt_matx[i][el]) {
196       if (cinfo->col_data[i] != cinfo->col_buf[i]) {
197         /* This was set with "col_set_str()"; which is effectively const */
198         orig = cinfo->col_data[i];
199       } else {
200         orig = orig_buf;
201         strncpy(orig, cinfo->col_buf[i], max_len);
202         orig[max_len - 1] = '\0';
203       }
204       vsnprintf(cinfo->col_buf[i], max_len, format, ap);
205       strncat(cinfo->col_buf[i], orig, max_len);
206       cinfo->col_buf[i][max_len - 1] = '\0';
207       cinfo->col_data[i] = cinfo->col_buf[i];
208     }
209   }
210   va_end(ap);
211 }
212
213 /* Use this if "str" points to something that won't stay around (and
214    must thus be copied). */
215 void
216 col_add_str(column_info *cinfo, gint el, const gchar* str) {
217   int    i;
218   size_t max_len;
219
220   if (el == COL_INFO)
221         max_len = COL_MAX_INFO_LEN;
222   else
223         max_len = COL_MAX_LEN;
224
225   for (i = 0; i < cinfo->num_cols; i++) {
226     if (cinfo->fmt_matx[i][el]) {
227       strncpy(cinfo->col_buf[i], str, max_len);
228       cinfo->col_buf[i][max_len - 1] = 0;
229       cinfo->col_data[i] = cinfo->col_buf[i];
230     }
231   }
232 }
233
234 void
235 col_append_str(column_info *cinfo, gint el, const gchar* str) {
236   int    i;
237   size_t len, max_len;
238
239   if (el == COL_INFO)
240         max_len = COL_MAX_INFO_LEN;
241   else
242         max_len = COL_MAX_LEN;
243
244   for (i = 0; i < cinfo->num_cols; i++) {
245     if (cinfo->fmt_matx[i][el]) {
246       if (cinfo->col_data[i] != cinfo->col_buf[i]) {
247         /* This was set with "col_set_str()"; copy the string they
248            set it to into the buffer, so we can append to it. */
249         strncpy(cinfo->col_buf[i], cinfo->col_data[i], max_len);
250         cinfo->col_buf[i][max_len - 1] = '\0';
251       }
252       len = strlen(cinfo->col_buf[i]);
253       strncat(cinfo->col_buf[i], str, max_len - len);
254       cinfo->col_buf[i][max_len - 1] = 0;
255       cinfo->col_data[i] = cinfo->col_buf[i];
256     }
257   }
258 }
259
260 static void
261 col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col)
262 {
263   struct tm *tmp;
264   time_t then;
265
266   then = fd->abs_secs;
267   tmp = localtime(&then);
268   if (tmp != NULL) {
269     snprintf(cinfo->col_buf[col], COL_MAX_LEN,
270              "%04d-%02d-%02d %02d:%02d:%02d.%06ld",
271              tmp->tm_year + 1900,
272              tmp->tm_mon + 1,
273              tmp->tm_mday,
274              tmp->tm_hour,
275              tmp->tm_min,
276              tmp->tm_sec,
277              (long)fd->abs_usecs);
278   } else {
279     cinfo->col_buf[col][0] = '\0';
280   }
281   cinfo->col_data[col] = cinfo->col_buf[col];
282   strcpy(cinfo->col_expr[col],"frame.time");
283   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
284 }
285
286 static void
287 col_set_rel_time(frame_data *fd, column_info *cinfo, int col)
288 {
289   display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
290         fd->rel_secs, fd->rel_usecs, USECS);
291   cinfo->col_data[col] = cinfo->col_buf[col];
292   strcpy(cinfo->col_expr[col],"frame.time_relative");
293   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
294 }
295
296 static void
297 col_set_delta_time(frame_data *fd, column_info *cinfo, int col)
298 {
299   display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
300         fd->del_secs, fd->del_usecs, USECS);
301   cinfo->col_data[col] = cinfo->col_buf[col];
302   strcpy(cinfo->col_expr[col],"frame.time_delta");
303   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
304 }
305
306 /* To do: Add check_col checks to the col_add* routines */
307
308 static void
309 col_set_abs_time(frame_data *fd, column_info *cinfo, int col)
310 {
311   struct tm *tmp;
312   time_t then;
313
314   then = fd->abs_secs;
315   tmp = localtime(&then);
316   if (tmp != NULL) {
317     snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%02d:%02d:%02d.%06ld",
318              tmp->tm_hour,
319              tmp->tm_min,
320              tmp->tm_sec,
321              (long)fd->abs_usecs);
322   } else {
323     cinfo->col_buf[col][0] = '\0';
324   }
325   cinfo->col_data[col] = cinfo->col_buf[col];
326   strcpy(cinfo->col_expr[col],"frame.time");
327   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
328 }
329
330 /* Add "command-line-specified" time.
331    XXX - this is called from "file.c" when the user changes the time
332    format they want for "command-line-specified" time; it's a bit ugly
333    that we have to export it, but if we go to a CList-like widget that
334    invokes callbacks to get the text for the columns rather than
335    requiring us to stuff the text into the widget from outside, we
336    might be able to clean this up. */
337 void
338 col_set_cls_time(frame_data *fd, column_info *cinfo, int col)
339 {
340   switch (timestamp_type) {
341     case ABSOLUTE:
342       col_set_abs_time(fd, cinfo, col);
343       break;
344
345     case ABSOLUTE_WITH_DATE:
346       col_set_abs_date_time(fd, cinfo, col);
347       break;
348
349     case RELATIVE:
350       col_set_rel_time(fd, cinfo, col);
351       break;
352
353     case DELTA:
354       col_set_delta_time(fd, cinfo, col);
355       break;
356   }
357 }
358
359 static void
360 col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_res,
361              gboolean is_src)
362 {
363   guint32 ipv4_addr;
364   struct e_in6_addr ipv6_addr;
365   struct atalk_ddp_addr ddp_addr;
366   struct sna_fid_type_4_addr sna_fid_type_4_addr;
367   gchar *fcid;
368   guint32 tmpfc;
369
370   pinfo->cinfo->col_expr[col][0] = '\0';
371   pinfo->cinfo->col_expr_val[col][0] = '\0';
372   switch (addr->type) {
373
374   case AT_ETHER:
375     if (is_res)
376       strncpy(pinfo->cinfo->col_buf[col], get_ether_name(addr->data), COL_MAX_LEN);
377     else
378       strncpy(pinfo->cinfo->col_buf[col], ether_to_str(addr->data), COL_MAX_LEN);
379     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
380     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
381     if (is_src)
382       strcpy(pinfo->cinfo->col_expr[col], "eth.src");
383     else
384       strcpy(pinfo->cinfo->col_expr[col], "eth.dst");
385     strncpy(pinfo->cinfo->col_expr_val[col], ether_to_str(addr->data), COL_MAX_LEN);
386     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
387     break;
388
389   case AT_IPv4:
390     memcpy(&ipv4_addr, addr->data, sizeof ipv4_addr);
391     if (is_res)
392       strncpy(pinfo->cinfo->col_buf[col], get_hostname(ipv4_addr), COL_MAX_LEN);
393     else
394       strncpy(pinfo->cinfo->col_buf[col], ip_to_str(addr->data), COL_MAX_LEN);
395     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
396     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
397     if (is_src)
398       strcpy(pinfo->cinfo->col_expr[col], "ip.src");
399     else
400       strcpy(pinfo->cinfo->col_expr[col], "ip.dst");
401     strncpy(pinfo->cinfo->col_expr_val[col], ip_to_str(addr->data), COL_MAX_LEN);
402     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
403     break;
404
405   case AT_IPv6:
406     memcpy(&ipv6_addr.s6_addr, addr->data, sizeof ipv6_addr.s6_addr);
407     if (is_res)
408       strncpy(pinfo->cinfo->col_buf[col], get_hostname6(&ipv6_addr), COL_MAX_LEN);
409     else
410       strncpy(pinfo->cinfo->col_buf[col], ip6_to_str(&ipv6_addr), COL_MAX_LEN);
411     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
412     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
413     if (is_src)
414       strcpy(pinfo->cinfo->col_expr[col], "ipv6.src");
415     else
416       strcpy(pinfo->cinfo->col_expr[col], "ipv6.dst");
417     strncpy(pinfo->cinfo->col_expr_val[col], ip6_to_str(&ipv6_addr), COL_MAX_LEN);
418     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
419     break;
420
421   case AT_IPX:
422     strncpy(pinfo->cinfo->col_buf[col],
423       ipx_addr_to_str(pntohl(&addr->data[0]), &addr->data[4]), COL_MAX_LEN);
424     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
425     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
426     break;
427
428   case AT_SNA:
429     switch (addr->len) {
430
431     case 1:
432       snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%04X", addr->data[0]);
433       break;
434
435     case 2:
436       snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%04X",
437         pntohs(&addr->data[0]));
438       break;
439
440     case SNA_FID_TYPE_4_ADDR_LEN:
441       memcpy(&sna_fid_type_4_addr, addr->data, SNA_FID_TYPE_4_ADDR_LEN);
442       strncpy(pinfo->cinfo->col_buf[col],
443         sna_fid_type_4_addr_to_str(&sna_fid_type_4_addr), COL_MAX_LEN);
444       break;
445     }
446     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
447     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
448     break;
449
450   case AT_ATALK:
451     memcpy(&ddp_addr, addr->data, sizeof ddp_addr);
452     strncpy(pinfo->cinfo->col_buf[col], atalk_addr_to_str(&ddp_addr),
453       COL_MAX_LEN);
454     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
455     if (is_src)
456       strcpy(pinfo->cinfo->col_expr[col], "ddp.src");
457     else
458       strcpy(pinfo->cinfo->col_expr[col], "ddp.dst");
459     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
460     strcpy(pinfo->cinfo->col_expr_val[col],pinfo->cinfo->col_buf[col]);
461     break;
462
463   case AT_VINES:
464     strncpy(pinfo->cinfo->col_buf[col], vines_addr_to_str(&addr->data[0]),
465       COL_MAX_LEN);
466     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
467     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
468     break;
469
470   case AT_OSI:
471     strncpy(pinfo->cinfo->col_buf[col], print_nsap_net(addr->data, addr->len),
472       COL_MAX_LEN);
473     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
474     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
475     break;
476
477   case AT_ARCNET:
478     snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "0x%02X",
479       addr->data[0]);
480     pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
481     if (is_src)
482       strcpy(pinfo->cinfo->col_expr[col], "arcnet.src");
483     else
484       strcpy(pinfo->cinfo->col_expr[col], "arcnet.dst");
485     pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
486     strcpy(pinfo->cinfo->col_expr_val[col],pinfo->cinfo->col_buf[col]);
487     break;
488
489   case AT_FC:
490       tmpfc = *((guint32 *)addr->data);
491       fcid = fc_to_str ((const guint8 *)&tmpfc);
492
493       strncpy (pinfo->cinfo->col_buf[col], fcid, COL_MAX_LEN);
494       pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
495       pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
496       break;
497       
498   default:
499     break;
500   }
501 }
502
503 static void
504 col_set_port(packet_info *pinfo, int col, port_type ptype, guint32 port,
505                 gboolean is_res, gboolean is_src)
506 {
507   pinfo->cinfo->col_expr[col][0] = '\0';
508   pinfo->cinfo->col_expr_val[col][0] = '\0';
509   switch (ptype) {
510
511   case PT_SCTP:
512     if (is_res)
513       strncpy(pinfo->cinfo->col_buf[col], get_sctp_port(port), COL_MAX_LEN);
514     else
515       snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
516     break;
517
518   case PT_TCP:
519     if (is_res)
520       strncpy(pinfo->cinfo->col_buf[col], get_tcp_port(port), COL_MAX_LEN);
521     else
522       snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
523     if (is_src)
524       strcpy(pinfo->cinfo->col_expr[col], "tcp.srcport");
525     else
526       strcpy(pinfo->cinfo->col_expr[col], "tcp.dstport");
527     snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
528     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
529     break;
530
531   case PT_UDP:
532     if (is_res)
533       strncpy(pinfo->cinfo->col_buf[col], get_udp_port(port), COL_MAX_LEN);
534     else
535       snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
536     if (is_src)
537       strcpy(pinfo->cinfo->col_expr[col], "udp.srcport");
538     else
539       strcpy(pinfo->cinfo->col_expr[col], "udp.dstport");
540     snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
541     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
542     break;
543
544   case PT_DDP:
545     if (is_src)
546       strcpy(pinfo->cinfo->col_expr[col], "ddp.src_socket");
547     else
548       strcpy(pinfo->cinfo->col_expr[col], "ddp.dst_socket");
549     snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "%u", port);
550     snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "%u", port);
551     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
552     break;
553
554   case PT_IPX:
555     /* XXX - resolve IPX socket numbers */
556     snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "0x%04x", port);
557     if (is_src)
558       strcpy(pinfo->cinfo->col_expr[col], "ipx.src.socket");
559     else
560       strcpy(pinfo->cinfo->col_expr[col], "ipx.dst.socket");
561     snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "0x%04x", port);
562     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
563     break;
564
565   default:
566     break;
567   }
568   pinfo->cinfo->col_buf[col][COL_MAX_LEN - 1] = '\0';
569   pinfo->cinfo->col_data[col] = pinfo->cinfo->col_buf[col];
570 }
571
572 void
573 fill_in_columns(packet_info *pinfo)
574 {
575   int i;
576
577   for (i = 0; i < pinfo->cinfo->num_cols; i++) {
578     switch (pinfo->cinfo->col_fmt[i]) {
579
580     case COL_NUMBER:
581       snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->fd->num);
582       pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
583       strcpy(pinfo->cinfo->col_expr[i], "frame.number");
584       strcpy(pinfo->cinfo->col_expr_val[i], pinfo->cinfo->col_buf[i]);
585       break;
586
587     case COL_CLS_TIME:
588       col_set_cls_time(pinfo->fd, pinfo->cinfo, i);
589       break;
590
591     case COL_ABS_TIME:
592       col_set_abs_time(pinfo->fd, pinfo->cinfo, i);
593       break;
594
595     case COL_ABS_DATE_TIME:
596       col_set_abs_date_time(pinfo->fd, pinfo->cinfo, i);
597       break;
598
599     case COL_REL_TIME:
600       col_set_rel_time(pinfo->fd, pinfo->cinfo, i);
601       break;
602
603     case COL_DELTA_TIME:
604       col_set_delta_time(pinfo->fd, pinfo->cinfo, i);
605       break;
606
607     case COL_DEF_SRC:
608     case COL_RES_SRC:   /* COL_DEF_SRC is currently just like COL_RES_SRC */
609       col_set_addr(pinfo, i, &pinfo->src, TRUE, TRUE);
610       break;
611
612     case COL_UNRES_SRC:
613       col_set_addr(pinfo, i, &pinfo->src, FALSE, TRUE);
614       break;
615
616     case COL_DEF_DL_SRC:
617     case COL_RES_DL_SRC:
618       col_set_addr(pinfo, i, &pinfo->dl_src, TRUE, TRUE);
619       break;
620
621     case COL_UNRES_DL_SRC:
622       col_set_addr(pinfo, i, &pinfo->dl_src, FALSE, TRUE);
623       break;
624
625     case COL_DEF_NET_SRC:
626     case COL_RES_NET_SRC:
627       col_set_addr(pinfo, i, &pinfo->net_src, TRUE, TRUE);
628       break;
629
630     case COL_UNRES_NET_SRC:
631       col_set_addr(pinfo, i, &pinfo->net_src, FALSE, TRUE);
632       break;
633
634     case COL_DEF_DST:
635     case COL_RES_DST:   /* COL_DEF_DST is currently just like COL_RES_DST */
636       col_set_addr(pinfo, i, &pinfo->dst, TRUE, FALSE);
637       break;
638
639     case COL_UNRES_DST:
640       col_set_addr(pinfo, i, &pinfo->dst, FALSE, FALSE);
641       break;
642
643     case COL_DEF_DL_DST:
644     case COL_RES_DL_DST:
645       col_set_addr(pinfo, i, &pinfo->dl_dst, TRUE, FALSE);
646       break;
647
648     case COL_UNRES_DL_DST:
649       col_set_addr(pinfo, i, &pinfo->dl_dst, FALSE, FALSE);
650       break;
651
652     case COL_DEF_NET_DST:
653     case COL_RES_NET_DST:
654       col_set_addr(pinfo, i, &pinfo->net_dst, TRUE, FALSE);
655       break;
656
657     case COL_UNRES_NET_DST:
658       col_set_addr(pinfo, i, &pinfo->net_dst, FALSE, FALSE);
659       break;
660
661     case COL_DEF_SRC_PORT:
662     case COL_RES_SRC_PORT:      /* COL_DEF_SRC_PORT is currently just like COL_RES_SRC_PORT */
663       col_set_port(pinfo, i, pinfo->ptype, pinfo->srcport, TRUE, TRUE);
664       break;
665
666     case COL_UNRES_SRC_PORT:
667       col_set_port(pinfo, i, pinfo->ptype, pinfo->srcport, FALSE, TRUE);
668       break;
669
670     case COL_DEF_DST_PORT:
671     case COL_RES_DST_PORT:      /* COL_DEF_DST_PORT is currently just like COL_RES_DST_PORT */
672       col_set_port(pinfo, i, pinfo->ptype, pinfo->destport, TRUE, FALSE);
673       break;
674
675     case COL_UNRES_DST_PORT:
676       col_set_port(pinfo, i, pinfo->ptype, pinfo->destport, FALSE, FALSE);
677       break;
678
679     case COL_PROTOCOL:  /* currently done by dissectors */
680     case COL_INFO:      /* currently done by dissectors */
681       break;
682
683     case COL_PACKET_LENGTH:
684       snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "%u", pinfo->fd->pkt_len);
685       pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
686       strcpy(pinfo->cinfo->col_expr[i], "frame.pkt_len");
687       strcpy(pinfo->cinfo->col_expr_val[i], pinfo->cinfo->col_buf[i]);
688       break;
689
690     case COL_OXID:
691         snprintf (pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->oxid);
692         pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
693         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
694         break;
695
696     case COL_RXID:
697         snprintf (pinfo->cinfo->col_buf[i], COL_MAX_LEN, "0x%x", pinfo->rxid);
698         pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
699         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
700         break;
701
702     case NUM_COL_FMTS:  /* keep compiler happy - shouldn't get here */
703       g_assert_not_reached();
704       break;
705     }
706   }
707 }