Instead of converting between 802.11 frequencies and channels umpteen
[obnox/wireshark/wip.git] / epan / column-utils.c
index da1db1a5c04c7a49db1ff634e18f167533234ad2..2e6d58b197e73161d776431c34207228eb21907b 100644 (file)
@@ -3,8 +3,8 @@
  *
  * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
  * This program is free software; you can redistribute it and/or
 /* Allocate all the data structures for constructing column data, given
    the number of columns. */
 void
-col_setup(column_info *col_info, gint num_cols)
+col_setup(column_info *cinfo, gint num_cols)
 {
   int i;
 
-  col_info->num_cols   = num_cols;
-  col_info->col_fmt    = (gint *) g_malloc(sizeof(gint) * num_cols);
-  col_info->fmt_matx   = (gboolean **) g_malloc(sizeof(gboolean *) * num_cols);
-  col_info->col_first  = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
-  col_info->col_last   = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
-  col_info->col_title  = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
-  col_info->col_data   = (const gchar **) g_malloc(sizeof(gchar *) * num_cols);
-  col_info->col_buf    = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
-  col_info->col_fence  = (int *) g_malloc(sizeof(int) * num_cols);
-  col_info->col_expr   = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
-  col_info->col_expr_val = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
+  cinfo->num_cols      = num_cols;
+  cinfo->col_fmt       = (gint *) g_malloc(sizeof(gint) * num_cols);
+  cinfo->fmt_matx      = (gboolean **) g_malloc(sizeof(gboolean *) * num_cols);
+  cinfo->col_first     = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
+  cinfo->col_last      = (int *) g_malloc(sizeof(int) * (NUM_COL_FMTS));
+  cinfo->col_title     = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
+  cinfo->col_data      = (const gchar **) g_malloc(sizeof(gchar *) * num_cols);
+  cinfo->col_buf       = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
+  cinfo->col_fence     = (int *) g_malloc(sizeof(int) * num_cols);
+  cinfo->col_expr      = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
+  cinfo->col_expr_val = (gchar **) g_malloc(sizeof(gchar *) * num_cols);
 
   for (i = 0; i < NUM_COL_FMTS; i++) {
-    col_info->col_first[i] = -1;
-    col_info->col_last[i] = -1;
+    cinfo->col_first[i] = -1;
+    cinfo->col_last[i] = -1;
   }
 }
 
@@ -184,6 +184,13 @@ col_clear(column_info *cinfo, gint el)
     cinfo->col_data[i] = cinfo->col_buf[i];                    \
   }
 
+#define COL_CHECK_REF_TIME(fd, cinfo, col)     \
+  if(fd->flags.ref_time){                                      \
+    g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "*REF*");     \
+    cinfo->col_data[col] = cinfo->col_buf[col];                        \
+    return;                                                    \
+  }
+
 /* Use this if "str" points to something that will stay around (and thus
    needn't be copied). */
 void
@@ -373,6 +380,51 @@ col_prepend_fstr(column_info *cinfo, gint el, const gchar *format, ...)
   }
   va_end(ap);
 }
+void
+col_prepend_fence_fstr(column_info *cinfo, gint el, const gchar *format, ...)
+{
+  va_list     ap;
+  int         i;
+  char        orig_buf[COL_BUF_MAX_LEN];
+  const char *orig;
+  size_t      max_len;
+
+  g_assert(cinfo->col_first[el] >= 0);
+  if (el == COL_INFO)
+       max_len = COL_MAX_INFO_LEN;
+  else
+       max_len = COL_MAX_LEN;
+
+  va_start(ap, format);
+  for (i = cinfo->col_first[el]; i <= cinfo->col_last[el]; i++) {
+    if (cinfo->fmt_matx[i][el]) {
+      if (cinfo->col_data[i] != cinfo->col_buf[i]) {
+        /* This was set with "col_set_str()"; which is effectively const */
+        orig = cinfo->col_data[i];
+      } else {
+        strncpy(orig_buf, cinfo->col_buf[i], max_len);
+        orig_buf[max_len - 1] = '\0';
+        orig = orig_buf;
+      }
+      g_vsnprintf(cinfo->col_buf[i], max_len, format, ap);
+      cinfo->col_buf[i][max_len - 1] = '\0';
+
+      /*
+       * Move the fence if it exists, else create a new fence at the
+       * end of the prepended data.
+       */
+      if (cinfo->col_fence[i] > 0) {
+        cinfo->col_fence[i] += strlen(cinfo->col_buf[i]);
+      } else {
+        cinfo->col_fence[i]  = strlen(cinfo->col_buf[i]);
+      }
+      strncat(cinfo->col_buf[i], orig, max_len);
+      cinfo->col_buf[i][max_len - 1] = '\0';
+      cinfo->col_data[i] = cinfo->col_buf[i];
+    }
+  }
+  va_end(ap);
+}
 
 /* Use this if "str" points to something that won't stay around (and
    must thus be copied). */
@@ -473,10 +525,62 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col)
   struct tm *tmp;
   time_t then;
 
-  then = fd->abs_secs;
+  COL_CHECK_REF_TIME(fd, cinfo, col);
+
+  then = fd->abs_ts.secs;
   tmp = localtime(&then);
   if (tmp != NULL) {
-    g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+         switch(timestamp_get_precision()) {
+         case(TS_PREC_FIXED_SEC):
+         case(TS_PREC_AUTO_SEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%04d-%02d-%02d %02d:%02d:%02d",
+             tmp->tm_year + 1900,
+             tmp->tm_mon + 1,
+             tmp->tm_mday,
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec);
+                 break;
+         case(TS_PREC_FIXED_DSEC):
+         case(TS_PREC_AUTO_DSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%04d-%02d-%02d %02d:%02d:%02d.%01ld",
+             tmp->tm_year + 1900,
+             tmp->tm_mon + 1,
+             tmp->tm_mday,
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 100000000);
+                 break;
+         case(TS_PREC_FIXED_CSEC):
+         case(TS_PREC_AUTO_CSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%04d-%02d-%02d %02d:%02d:%02d.%02ld",
+             tmp->tm_year + 1900,
+             tmp->tm_mon + 1,
+             tmp->tm_mday,
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 10000000);
+                 break;
+         case(TS_PREC_FIXED_MSEC):
+         case(TS_PREC_AUTO_MSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
+             tmp->tm_year + 1900,
+             tmp->tm_mon + 1,
+             tmp->tm_mday,
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 1000000);
+                 break;
+         case(TS_PREC_FIXED_USEC):
+         case(TS_PREC_AUTO_USEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
              "%04d-%02d-%02d %02d:%02d:%02d.%06ld",
              tmp->tm_year + 1900,
              tmp->tm_mon + 1,
@@ -484,7 +588,23 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col)
              tmp->tm_hour,
              tmp->tm_min,
              tmp->tm_sec,
-             (long)fd->abs_usecs);
+             (long)fd->abs_ts.nsecs / 1000);
+                 break;
+         case(TS_PREC_FIXED_NSEC):
+         case(TS_PREC_AUTO_NSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%04d-%02d-%02d %02d:%02d:%02d.%09ld",
+             tmp->tm_year + 1900,
+             tmp->tm_mon + 1,
+             tmp->tm_mday,
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs);
+                 break;
+         default:
+                 g_assert_not_reached();
+         }
   } else {
     cinfo->col_buf[col][0] = '\0';
   }
@@ -496,8 +616,42 @@ col_set_abs_date_time(frame_data *fd, column_info *cinfo, int col)
 static void
 col_set_rel_time(frame_data *fd, column_info *cinfo, int col)
 {
-  display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
-       fd->rel_secs, fd->rel_usecs, USECS);
+  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,
+                       (gint32) fd->rel_ts.secs, fd->rel_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->rel_ts.secs, fd->rel_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->rel_ts.secs, fd->rel_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->rel_ts.secs, fd->rel_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->rel_ts.secs, fd->rel_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->rel_ts.secs, fd->rel_ts.nsecs, NSECS);
+                 break;
+         default:
+                 g_assert_not_reached();
+  }
   cinfo->col_data[col] = cinfo->col_buf[col];
   strcpy(cinfo->col_expr[col],"frame.time_relative");
   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
@@ -506,13 +660,91 @@ col_set_rel_time(frame_data *fd, column_info *cinfo, int col)
 static void
 col_set_delta_time(frame_data *fd, column_info *cinfo, int col)
 {
-  display_signed_time(cinfo->col_buf[col], COL_MAX_LEN,
-       fd->del_secs, fd->del_usecs, USECS);
+  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,
+                       (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_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_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_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_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_cap_ts.secs, fd->del_cap_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");
   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,
+                       (gint32) 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,
+                       (gint32) 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,
+                       (gint32) 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,
+                       (gint32) 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,
+                       (gint32) 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,
+                       (gint32) 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
@@ -521,14 +753,68 @@ col_set_abs_time(frame_data *fd, column_info *cinfo, int col)
   struct tm *tmp;
   time_t then;
 
-  then = fd->abs_secs;
+  COL_CHECK_REF_TIME(fd, cinfo, col);
+
+  then = fd->abs_ts.secs;
   tmp = localtime(&then);
   if (tmp != NULL) {
-    g_snprintf(cinfo->col_buf[col], COL_MAX_LEN, "%02d:%02d:%02d.%06ld",
+         switch(timestamp_get_precision()) {
+         case(TS_PREC_FIXED_SEC):
+         case(TS_PREC_AUTO_SEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d",
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec);
+                 break;
+         case(TS_PREC_FIXED_DSEC):
+         case(TS_PREC_AUTO_DSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d.%01ld",
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 100000000);
+                 break;
+         case(TS_PREC_FIXED_CSEC):
+         case(TS_PREC_AUTO_CSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d.%02ld",
              tmp->tm_hour,
              tmp->tm_min,
              tmp->tm_sec,
-             (long)fd->abs_usecs);
+             (long)fd->abs_ts.nsecs / 10000000);
+                 break;
+         case(TS_PREC_FIXED_MSEC):
+         case(TS_PREC_AUTO_MSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d.%03ld",
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 1000000);
+                 break;
+         case(TS_PREC_FIXED_USEC):
+         case(TS_PREC_AUTO_USEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d.%06ld",
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs / 1000);
+                 break;
+         case(TS_PREC_FIXED_NSEC):
+         case(TS_PREC_AUTO_NSEC):
+                 g_snprintf(cinfo->col_buf[col], COL_MAX_LEN,
+             "%02d:%02d:%02d.%09ld",
+             tmp->tm_hour,
+             tmp->tm_min,
+             tmp->tm_sec,
+             (long)fd->abs_ts.nsecs);
+                 break;
+         default:
+                 g_assert_not_reached();
+         }
   } else {
     cinfo->col_buf[col][0] = '\0';
   }
@@ -537,7 +823,51 @@ col_set_abs_time(frame_data *fd, column_info *cinfo, int col)
   strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
 }
 
-/* Add "command-line-specified" time.
+static void
+col_set_epoch_time(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_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_ts.nsecs / 1000000000, SECS);
+                 break;
+         case(TS_PREC_FIXED_DSEC):
+         case(TS_PREC_AUTO_DSEC):
+                 display_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_ts.nsecs / 100000000, DSECS);
+                 break;
+         case(TS_PREC_FIXED_CSEC):
+         case(TS_PREC_AUTO_CSEC):
+                 display_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_ts.nsecs / 10000000, CSECS);
+                 break;
+         case(TS_PREC_FIXED_MSEC):
+         case(TS_PREC_AUTO_MSEC):
+                 display_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_ts.nsecs / 1000000, MSECS);
+                 break;
+         case(TS_PREC_FIXED_USEC):
+         case(TS_PREC_AUTO_USEC):
+                 display_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_ts.nsecs / 1000, USECS);
+                 break;
+         case(TS_PREC_FIXED_NSEC):
+         case(TS_PREC_AUTO_NSEC):
+                 display_epoch_time(cinfo->col_buf[col], COL_MAX_LEN,
+                       fd->abs_ts.secs, fd->abs_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");
+  strcpy(cinfo->col_expr_val[col],cinfo->col_buf[col]);
+}
+/* Set the format of the variable time format.
    XXX - this is called from "file.c" when the user changes the time
    format they want for "command-line-specified" time; it's a bit ugly
    that we have to export it, but if we go to a CList-like widget that
@@ -545,9 +875,9 @@ col_set_abs_time(frame_data *fd, column_info *cinfo, int col)
    requiring us to stuff the text into the widget from outside, we
    might be able to clean this up. */
 void
-col_set_cls_time(frame_data *fd, column_info *cinfo, int col)
+col_set_cls_time(frame_data *fd, column_info *cinfo, gint col)
 {
-  switch (get_timestamp_setting()) {
+  switch (timestamp_get_type()) {
     case TS_ABSOLUTE:
       col_set_abs_time(fd, cinfo, col);
       break;
@@ -563,6 +893,19 @@ col_set_cls_time(frame_data *fd, column_info *cinfo, int 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:
+       /* code is missing for this case, but I don't know which [jmayer20051219] */
+       g_assert(FALSE);
+        break;
   }
 }
 
@@ -574,10 +917,10 @@ col_set_addr(packet_info *pinfo, int col, address *addr, gboolean is_res,
 
   pinfo->cinfo->col_expr[col][0] = '\0';
   pinfo->cinfo->col_expr_val[col][0] = '\0';
-  
+
   if (addr->type == AT_NONE)
     return;    /* no address, nothing to do */
-  
+
   if (is_res) {
     get_addr_name_buf(addr, pinfo->cinfo->col_buf[col],COL_MAX_LEN-1);
   } else {
@@ -726,6 +1069,17 @@ col_set_port(packet_info *pinfo, int col, gboolean is_res, gboolean is_src)
     pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
     break;
 
+  case PT_USB:
+    /* XXX - resolve USB endpoint numbers */
+    g_snprintf(pinfo->cinfo->col_buf[col], COL_MAX_LEN, "0x%08x", port);
+    if (is_src)
+      strcpy(pinfo->cinfo->col_expr[col], "usb.src.endpoint");
+    else
+      strcpy(pinfo->cinfo->col_expr[col], "usb.dst.endpoint");
+    g_snprintf(pinfo->cinfo->col_expr_val[col], COL_MAX_LEN, "0x%08x", port);
+    pinfo->cinfo->col_expr_val[col][COL_MAX_LEN - 1] = '\0';
+    break;
+
   default:
     break;
   }
@@ -813,7 +1167,7 @@ col_set_circuit_id(packet_info *pinfo, int col)
 }
 
 void
-fill_in_columns(packet_info *pinfo)
+col_fill_in(packet_info *pinfo)
 {
   int i;
 
@@ -828,48 +1182,27 @@ fill_in_columns(packet_info *pinfo)
       break;
 
     case COL_CLS_TIME:
-      if(pinfo->fd->flags.ref_time){
-         g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "*REF*");
-         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
-      } else {
-         col_set_cls_time(pinfo->fd, pinfo->cinfo, i);
-      }
+       col_set_cls_time(pinfo->fd, pinfo->cinfo, i);
       break;
 
     case COL_ABS_TIME:
-      if(pinfo->fd->flags.ref_time){
-         g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "*REF*");
-         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
-      } else {
-         col_set_abs_time(pinfo->fd, pinfo->cinfo, i);
-      }
+      col_set_abs_time(pinfo->fd, pinfo->cinfo, i);
       break;
 
     case COL_ABS_DATE_TIME:
-      if(pinfo->fd->flags.ref_time){
-         g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "*REF*");
-         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
-      } else {
-         col_set_abs_date_time(pinfo->fd, pinfo->cinfo, i);
-      }
+      col_set_abs_date_time(pinfo->fd, pinfo->cinfo, i);
       break;
 
     case COL_REL_TIME:
-      if(pinfo->fd->flags.ref_time){
-         g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "*REF*");
-         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
-      } else {
-         col_set_rel_time(pinfo->fd, pinfo->cinfo, i);
-      }
+      col_set_rel_time(pinfo->fd, pinfo->cinfo, i);
       break;
 
     case COL_DELTA_TIME:
-      if(pinfo->fd->flags.ref_time){
-         g_snprintf(pinfo->cinfo->col_buf[i], COL_MAX_LEN, "*REF*");
-         pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
-      } else {
-         col_set_delta_time(pinfo->fd, pinfo->cinfo, i);
-      }
+      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:
@@ -996,14 +1329,36 @@ fill_in_columns(packet_info *pinfo)
       pinfo->cinfo->col_buf[i][COL_MAX_LEN - 1] = '\0';
       pinfo->cinfo->col_data[i] = pinfo->cinfo->col_buf[i];
       break;
-        
+
     case COL_HPUX_SUBSYS: /* done by nettl disector */
     case COL_HPUX_DEVID:  /* done by nettl disector */
       break;
-        
+
     case COL_DCE_CALL: /* done by dcerpc */
       break;
 
+    case COL_DCE_CTX:  /* done by dcerpc */
+      break;
+
+    case COL_8021Q_VLAN_ID:
+        break;
+
+    case COL_DSCP_VALUE:       /* done by packet-ip.c */
+       break;
+
+    case COL_COS_VALUE:                /* done by packet-vlan.c */
+       break;
+
+    case COL_FR_DLCI:  /* done by packet-fr.c */
+    case COL_BSSGP_TLLI: /* done by packet-bssgp.c */
+        break;
+
+    case COL_EXPERT:    /* done by expert.c */
+        break;
+
+    case COL_FREQ_CHAN:    /* done by radio dissectors */
+        break;
+
     case NUM_COL_FMTS: /* keep compiler happy - shouldn't get here */
       g_assert_not_reached();
       break;