From Jouni Malinen: add columns for the 802.11 data rate and signal
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 5 Jul 2004 09:29:06 +0000 (09:29 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Mon, 5 Jul 2004 09:29:06 +0000 (09:29 +0000)
strength for AVS headers.

Also add them for the Prism and Radiotap headers, and for the
pseudo-header from non-native captures.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@11316 f5534014-38df-0310-8fa8-9805f1628bb7

column.c
epan/column_info.h
packet-ieee80211.c
packet-prism.c
packet-radiotap.c
packet-wlancap.c

index 125ba546bf6bf0ffcb6cfcd26cbe1a3d8d970044..e0674a292f2ad9281d7f97857b5b6f4e0b6897c7 100644 (file)
--- a/column.c
+++ b/column.c
@@ -1,7 +1,7 @@
 /* column.c
  * Routines for handling column preferences
  *
- * $Id: column.c,v 1.47 2004/03/18 19:04:30 obiot Exp $
+ * $Id: column.c,v 1.48 2004/07/05 09:29:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -53,7 +53,7 @@ col_format_to_string(gint fmt) {
                      "%rd", "%ud", "%hd", "%rhd", "%uhd", "%nd", "%rnd",
                      "%und", "%S", "%rS", "%uS", "%D", "%rD", "%uD", "%p",
                      "%i", "%L", "%B", "%XO", "%XR", "%I", "%c", "%Xs", 
-                     "%Xd", "%V" };
+                     "%Xd", "%V", "%x", "%e" };
                      
   if (fmt < 0 || fmt > NUM_COL_FMTS)
     return NULL;
@@ -105,6 +105,8 @@ static gchar *dlist[NUM_COL_FMTS] = {
        "Src PortIdx",
        "Dst PortIdx",
        "VSAN",
+       "IEEE 802.11 TX rate",
+       "IEEE 802.11 RSSI",
 };
 
 gchar *
@@ -187,6 +189,12 @@ get_column_format_matches(gboolean *fmt_list, gint format) {
     case COL_VSAN:
       fmt_list[COL_VSAN] = TRUE;
       break;
+    case COL_TX_RATE:
+      fmt_list[COL_TX_RATE] = TRUE;
+      break;
+    case COL_RSSI:
+      fmt_list[COL_RSSI] = TRUE;
+      break;
     default:
       break;
   }
@@ -283,6 +291,12 @@ get_column_longest_string(gint format)
     case COL_VSAN:
       return "000000";
       break;
+    case COL_TX_RATE:
+      return "108.0";
+      break;
+    case COL_RSSI:
+      return "100";
+      break;
     default: /* COL_INFO */
       return "Source port: kerberos-master  Destination port: kerberos-master";
       break;
@@ -414,6 +428,12 @@ get_column_format_from_str(gchar *str) {
       case 'V':
         return COL_VSAN;
         break;
+      case 'x':
+        return COL_TX_RATE;
+        break;
+      case 'e':
+        return COL_RSSI;
+        break;
     }
     cptr++;
   }
index 51b6661b6ada1ed42c7af6e85e7ea0304d5bcb86..6556ad3d7be55c344f6ceb37032aed2b1aaf078d 100644 (file)
@@ -1,7 +1,7 @@
 /* column.h
  * Definitions for column structures and routines
  *
- * $Id: column_info.h,v 1.12 2004/01/31 04:10:04 guy Exp $
+ * $Id: column_info.h,v 1.13 2004/07/05 09:29:06 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -93,6 +93,8 @@ enum {
   COL_SRCIDX,         /* Src port idx - Cisco MDS-specific */
   COL_DSTIDX,         /* Dst port idx - Cisco MDS-specific */
   COL_VSAN,           /* VSAN - Cisco MDS-specific */
+  COL_TX_RATE,        /* IEEE 802.11 - TX rate in Mbps */
+  COL_RSSI,           /* IEEE 802.11 - received signal strength */
   NUM_COL_FMTS        /* Should always be last */
 };
 
index 6a2ae9a1ed66115479b4589c334978d82a5fa18e..a5f159cd86cfd67c89f9d3533f0572cdc19dc3d9 100644 (file)
@@ -3,7 +3,7 @@
  * Copyright 2000, Axis Communications AB
  * Inquiries/bugreports should be sent to Johan.Jorgensen@axis.com
  *
- * $Id: packet-ieee80211.c,v 1.112 2004/07/04 03:46:01 guy Exp $
+ * $Id: packet-ieee80211.c,v 1.113 2004/07/05 09:29:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -1450,6 +1450,19 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
   if (check_col (pinfo->cinfo, COL_INFO))
     col_clear (pinfo->cinfo, COL_INFO);
 
+  /* Add the radio information, if present, to the column information */
+  if (has_radio_information) {
+    if (check_col(pinfo->cinfo, COL_TX_RATE)) {
+       col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%g",
+          .5*pinfo->pseudo_header->ieee_802_11.data_rate);
+    }
+    if (check_col(pinfo->cinfo, COL_RSSI)) {
+      /* XX - this is a percentage, not a dBm or normalized or raw RSSI */
+      col_add_fstr(pinfo->cinfo, COL_RSSI, "%u",
+          pinfo->pseudo_header->ieee_802_11.signal_level);
+    }
+  }
+
   fcf = tvb_get_letohs (tvb, 0);
   if (wlan_broken_fc) {
     /* Swap bytes */
index 5da3fb5929943ef98bc0a29bbb6ad469d29f24d7..0aedf6662b8a57e606f3d8e4a4a6357c7eefe93c 100644 (file)
@@ -9,7 +9,7 @@
  *
  * By Tim Newsham
  *
- * $Id: packet-prism.c,v 1.11 2004/02/14 20:55:23 guy Exp $
+ * $Id: packet-prism.c,v 1.12 2004/07/05 09:29:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -122,23 +122,27 @@ capture_prism(const guchar *pd, int offset, int len, packet_counts *ld)
  * below more readable
  */
 #define IFHELP(size, name, var, str) \
-        proto_tree_add_uint_format(prism_tree, hf_prism_ ## name, \
-            tvb, offset, size, hdr.var, str, hdr.var);           \
+        if(tree) {                                               \
+            proto_tree_add_uint_format(prism_tree, hf_prism_ ## name, \
+                tvb, offset, size, hdr.var, str, hdr.var);               \
+        }                                                                \
         offset += (size)
 #define INTFIELD(size, name, str)      IFHELP(size, name, name, str)
 #define VALFIELD(name, str) \
-        proto_tree_add_uint_format(prism_tree, hf_prism_ ## name ## _data, \
-            tvb, offset, 12, hdr.name.data,                               \
-            str ": 0x%x (DID 0x%x, Status 0x%x, Length 0x%x)",            \
-            hdr.name.data, hdr.name.did,                                  \
-            hdr.name.status, hdr.name.len);                               \
+        if(tree) {                                               \
+            proto_tree_add_uint_format(prism_tree, hf_prism_ ## name ## _data, \
+                tvb, offset, 12, hdr.name.data,                                   \
+                str ": 0x%x (DID 0x%x, Status 0x%x, Length 0x%x)",        \
+                hdr.name.data, hdr.name.did,                              \
+                hdr.name.status, hdr.name.len);                                   \
+        }                                                                 \
         offset += 12
 
 static void
 dissect_prism(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
     struct prism_hdr hdr;
-    proto_tree *prism_tree;
+    proto_tree *prism_tree = NULL;
     proto_item *ti;
     tvbuff_t *next_tvb;
     int offset;
@@ -169,24 +173,35 @@ dissect_prism(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         ti = proto_tree_add_protocol_format(tree, proto_prism,
             tvb, 0, sizeof hdr, "Prism Monitoring Header");
         prism_tree = proto_item_add_subtree(ti, ett_prism);
+    }
 
-        INTFIELD(4, msgcode, "Message Code: %d");
-        INTFIELD(4, msglen, "Message Length: %d");
+    INTFIELD(4, msgcode, "Message Code: %d");
+    INTFIELD(4, msglen, "Message Length: %d");
+    if(tree) {
         proto_tree_add_text(prism_tree, tvb, offset, sizeof hdr.devname,
             "Device: %s", hdr.devname);
-        offset += sizeof hdr.devname;
-
-        VALFIELD(hosttime, "Host Time");
-        VALFIELD(mactime, "MAC Time");
-        VALFIELD(channel, "Channel");
-        VALFIELD(rssi, "RSSI");
-        VALFIELD(sq, "SQ");
-        VALFIELD(signal, "Signal");
-        VALFIELD(noise, "Noise");
-        VALFIELD(rate, "Rate");
-        VALFIELD(istx, "IsTX");
-        VALFIELD(frmlen, "Frame Length");
     }
+    offset += sizeof hdr.devname;
+
+    VALFIELD(hosttime, "Host Time");
+    VALFIELD(mactime, "MAC Time");
+    VALFIELD(channel, "Channel");
+    VALFIELD(rssi, "RSSI");
+    if (check_col(pinfo->cinfo, COL_RSSI)) {
+      col_add_fstr(pinfo->cinfo, COL_RSSI, "%d",
+                  hdr.rssi.data);
+    }
+
+    VALFIELD(sq, "SQ");
+    VALFIELD(signal, "Signal");
+    VALFIELD(noise, "Noise");
+    if (check_col(pinfo->cinfo, COL_TX_RATE)) {
+      col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%d.%d",
+                  hdr.rate.data / 10, hdr.rate.data % 10);
+    }
+    VALFIELD(rate, "Rate");
+    VALFIELD(istx, "IsTX");
+    VALFIELD(frmlen, "Frame Length");
 
     /* dissect the 802.11 header next */
     next_tvb = tvb_new_subset(tvb, sizeof hdr, -1, -1);
index aaa252090f3a4b84f4366d79fcdcc0fe62e00ea0..590f77720d37a96465907ba9a1d8a5b1b7226941 100644 (file)
@@ -2,7 +2,7 @@
  *  packet-radiotap.c
  *     Decode packets with a Radiotap header
  *
- * $Id: packet-radiotap.c,v 1.3 2004/02/01 04:29:07 jmayer Exp $
+ * $Id: packet-radiotap.c,v 1.4 2004/07/05 09:29:04 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -266,7 +266,7 @@ dissect_radiotap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 #define BITNO_4(x) (((x) >> 2) ? 2 + BITNO_2((x) >> 2) : BITNO_2((x)))
 #define BITNO_2(x) (((x) & 2) ? 1 : 0)
 #define BIT(n) (1 << n)
-    proto_tree *radiotap_tree;
+    proto_tree *radiotap_tree = NULL;
     proto_item *ti;
     int offset;
     guint32 version;
@@ -295,21 +295,24 @@ dissect_radiotap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        ti = proto_tree_add_protocol_format(tree, proto_radiotap,
              tvb, 0, length, "Radiotap Header");
        radiotap_tree = proto_item_add_subtree(ti, ett_radiotap);
+    }
 
-       for (; present; present = next_present) {
-           /* clear the least significant bit that is set */
-           next_present = present & (present - 1);
+    for (; present; present = next_present) {
+       /* clear the least significant bit that is set */
+       next_present = present & (present - 1);
 
-           /* extract the least significant bit that is set */
-           bit = BITNO_32(present ^ next_present);
+       /* extract the least significant bit that is set */
+       bit = BITNO_32(present ^ next_present);
 
-           switch (bit) {
-           case IEEE80211_RADIOTAP_FLAGS:
+       switch (bit) {
+       case IEEE80211_RADIOTAP_FLAGS:
+           if (tree) {
                proto_tree_add_uint(radiotap_tree, hf_radiotap_preamble,
                        tvb, 0, 0, (tvb_get_guint8(tvb, offset) &
                                IEEE80211_RADIOTAP_F_SHORTPRE) != 0);
-               offset++;
-               /* XXX CFP, WEP, FRAG */
+           }
+           offset++;
+           /* XXX CFP, WEP, FRAG */
 #if 0
       capability = tvb_get_letohs (tvb, offset);
 
@@ -343,39 +346,58 @@ dissect_radiotap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
       proto_tree_add_boolean (cap_tree, ff_dsss_ofdm, tvb, offset, 2,
                              capability);
 #endif
-               break;
-           case IEEE80211_RADIOTAP_RATE:
-               rate = tvb_get_guint8(tvb, offset) & 0x7f;
+           break;
+       case IEEE80211_RADIOTAP_RATE:
+           rate = tvb_get_guint8(tvb, offset) & 0x7f;
+           if (check_col(pinfo->cinfo, COL_TX_RATE)) {
+               col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%d.%d",
+                   rate / 2, rate & 1 ? 5 : 0);
+           }
+           if (tree) {
                proto_tree_add_uint_format(radiotap_tree, hf_radiotap_datarate,
                        tvb, offset, 1, tvb_get_guint8(tvb, offset), 
                        "Datarate: %d.%d Mbps", rate / 2, rate & 1 ? 5 : 0);
-               offset++;
-               break;
-           case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
-           case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
-               /* XXX distinguish units */
+           }
+           offset++;
+           break;
+       case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
+       case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
+           /* XXX distinguish units */
+           if (check_col(pinfo->cinfo, COL_RSSI)) {
+               col_add_fstr(pinfo->cinfo, COL_RSSI, "%d",
+                   tvb_get_guint8(tvb, offset));
+           }
+           if (tree) {
                proto_tree_add_int(radiotap_tree, hf_radiotap_antsignal,
                                   tvb, offset, 1, tvb_get_guint8(tvb, offset));
-               offset++;
-               break;
-           case IEEE80211_RADIOTAP_DBM_ANTNOISE:
-           case IEEE80211_RADIOTAP_DB_ANTNOISE:
-               /* XXX distinguish units */
+           }
+           offset++;
+           break;
+       case IEEE80211_RADIOTAP_DBM_ANTNOISE:
+       case IEEE80211_RADIOTAP_DB_ANTNOISE:
+           /* XXX distinguish units */
+           if (tree) {
                proto_tree_add_int(radiotap_tree, hf_radiotap_antnoise,
                                   tvb, offset, 1, tvb_get_guint8(tvb, offset));
-               offset++;
-               break;
-           case IEEE80211_RADIOTAP_ANTENNA:
+           }
+           offset++;
+           break;
+       case IEEE80211_RADIOTAP_ANTENNA:
+           if (tree) {
                proto_tree_add_uint(radiotap_tree, hf_radiotap_antenna,
                                   tvb, offset, 1, tvb_get_guint8(tvb, offset));
-               offset++;
-               break;
-           case IEEE80211_RADIOTAP_DBM_TX_POWER:
+           }
+           offset++;
+           break;
+       case IEEE80211_RADIOTAP_DBM_TX_POWER:
+           if (tree) {
                proto_tree_add_int(radiotap_tree, hf_radiotap_txpower,
                                   tvb, offset, 1, tvb_get_guint8(tvb, offset));
-               offset++;
-               break;
-           case IEEE80211_RADIOTAP_CHANNEL:
+           }
+           offset++;
+           break;
+       case IEEE80211_RADIOTAP_CHANNEL:
+           if (tree) {
                freq = tvb_get_letohs(tvb, offset);
                flags = tvb_get_letohs(tvb, offset+2);
                proto_tree_add_uint_format(radiotap_tree, hf_radiotap_channel_frequency,
@@ -383,30 +405,32 @@ dissect_radiotap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        "Channel: %u (chan %u)", freq, ieee80211_mhz2ieee(freq, flags));
                proto_tree_add_uint(radiotap_tree, hf_radiotap_channel_flags,
                        tvb, offset+2, 2, flags);
-               offset+=4;
-               break;
-           case IEEE80211_RADIOTAP_FHSS:
-           case IEEE80211_RADIOTAP_LOCK_QUALITY:
-           case IEEE80211_RADIOTAP_TX_ATTENUATION:
-           case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
+           }
+           offset+=4;
+           break;
+       case IEEE80211_RADIOTAP_FHSS:
+       case IEEE80211_RADIOTAP_LOCK_QUALITY:
+       case IEEE80211_RADIOTAP_TX_ATTENUATION:
+       case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
 #if 0
-               tvb_get_letohs(tvb, offset);
+           tvb_get_letohs(tvb, offset);
 #endif
-               offset+=2;
-               break;
-           case IEEE80211_RADIOTAP_TSFT:
+           offset+=2;
+           break;
+       case IEEE80211_RADIOTAP_TSFT:
+           if (tree) {
                proto_tree_add_item(radiotap_tree, hf_radiotap_mactime,
                                    tvb, offset, 8, FALSE);
-               offset+=8;
-               break;
-           default:
-               /*
-                * This indicates a field whose size we do not
-                * know, so we cannot proceed.
-                */
-               next_present = 0;
-               continue;
            }
+           offset+=8;
+           break;
+       default:
+           /*
+            * This indicates a field whose size we do not
+            * know, so we cannot proceed.
+            */
+           next_present = 0;
+           continue;
        }
     }
 
index 508c0de62300568429536d4b1e7945e7113877ca..24e0a00404dc2e953bc3e692c6be3b2d3c63a95a 100644 (file)
@@ -7,10 +7,14 @@
  *  additional fields, is designed to be non-hardware-specific, and more 
  *  importantly, version and length fields so it can be extended later 
  *  without breaking anything.
+ *
+ *  See
+ *
+ *     http://www.shaftnet.org/~pizza/software/capturefrm.txt
  * 
  * By Solomon Peachy
  *
- * $Id: packet-wlancap.c,v 1.4 2004/01/29 10:58:28 guy Exp $
+ * $Id: packet-wlancap.c,v 1.5 2004/07/05 09:29:05 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -206,6 +210,17 @@ dissect_wlancap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     if(check_col(pinfo->cinfo, COL_INFO))
         col_add_fstr(pinfo->cinfo, COL_INFO, "AVS WLAN Capture v%x, Length %d",version, length);
 
+    if (check_col(pinfo->cinfo, COL_TX_RATE)) {
+      guint32 txrate = tvb_get_ntohl(tvb, offset + 32);
+      col_add_fstr(pinfo->cinfo, COL_TX_RATE, "%d.%d",
+                  txrate / 10, txrate % 10);
+    }
+    if (check_col(pinfo->cinfo, COL_RSSI)) {
+      /* XXX cook ssi_signal (Based on type; ie format) */
+      col_add_fstr(pinfo->cinfo, COL_RSSI, "%d",
+                  tvb_get_ntohl(tvb, offset + 48));
+    }
+
     /* Dissect the packet */
     if (tree) {
       ti = proto_tree_add_protocol_format(tree, proto_wlancap,