From Tom Brezinski:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 28 Jan 2012 17:10:50 +0000 (17:10 +0000)
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 28 Jan 2012 17:10:50 +0000 (17:10 +0000)
includes radio data from the capture.

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6746

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

wiretap/network_instruments.c
wiretap/network_instruments.h

index 794ceec5c335e9c1ee39414562fce8b20ad6df0f..c6b4f9e7804909e6c9abee2f22fde16da30320e1 100644 (file)
@@ -105,8 +105,8 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
 static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
     union wtap_pseudo_header *pseudo_header, guint8 *pd, int length,
     int *err, gchar **err_info);
-static int read_packet_header(FILE_T fh, packet_entry_header *packet_header,
-    int *err, gchar **err_info);
+static int read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, 
+       packet_entry_header *packet_header, int *err, gchar **err_info);
 static int read_packet_data(FILE_T fh, int offset_to_frame, int current_offset_from_packet_header,
     guint8 *pd, int length, int *err, char **err_info);
 static gboolean skip_to_next_packet(wtap *wth, int offset_to_next_packet,
@@ -276,7 +276,7 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
         *data_offset = wth->data_offset;
 
         /* process the packet header, including TLVs */
-        bytes_consumed = read_packet_header(wth->fh, &packet_header, err,
+               bytes_consumed = read_packet_header(wth->fh, &wth->pseudo_header, &packet_header, err,
             err_info);
         if (bytes_consumed <= 0)
             return FALSE;    /* EOF or error */
@@ -344,6 +344,9 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
         /* There is no FCS in the frame */
         wth->pseudo_header.eth.fcs_len = 0;
         break;
+       case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
+               /* Updated in read_packet_header */
+               break;
     }
 
     /* set-up the packet buffer */
@@ -381,7 +384,7 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
         return FALSE;
 
     /* process the packet header, including TLVs */
-    offset = read_packet_header(wth->random_fh, &packet_header, err,
+       offset = read_packet_header(wth->random_fh, pseudo_header, &packet_header, err,
         err_info);
     if (offset <= 0)
         return FALSE;    /* EOF or error */
@@ -393,6 +396,9 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
         /* There is no FCS in the frame */
         pseudo_header->eth.fcs_len = 0;
         break;
+       case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
+               /* Updated in read_packet_header */
+               break;
     }
 
     /* read the frame data */
@@ -404,14 +410,15 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
 }
 
 static int
-read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err,
-    gchar **err_info)
+read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, 
+       packet_entry_header *packet_header, int *err, gchar **err_info)
 {
     int offset;
     int bytes_read;
     guint i;
     tlv_header tlvh;
     int seek_increment;
+       tlv_wireless_info wireless_header;
 
     offset = 0;
 
@@ -471,13 +478,32 @@ read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err,
             return -1;
         }
 
-        /* skip the TLV data */
-        seek_increment = tlvh.length - (int)sizeof tlvh;
-        if (seek_increment > 0) {
-            if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
+        /* process (or skip over) the current TLV */
+        switch (tlvh.type) {
+        case INFORMATION_TYPE_WIRELESS:
+                       bytes_read = file_read(&wireless_header, sizeof wireless_header, fh);
+                       if (bytes_read != sizeof wireless_header) {
+                               *err = file_error(fh, err_info);
+                if(*err == 0)
+                    *err = WTAP_ERR_SHORT_READ;
                 return -1;
-        }
-        offset += seek_increment;
+                       }
+                       /* update the pseudo header */
+                       pseudo_header->ieee_802_11.fcs_len = 0;
+                       pseudo_header->ieee_802_11.channel = wireless_header.frequency;
+                       pseudo_header->ieee_802_11.data_rate = wireless_header.rate;
+                       pseudo_header->ieee_802_11.signal_level = wireless_header.strengthPercent;
+                       offset += bytes_read;
+            break;
+        default:
+                       /* skip the TLV data */
+                       seek_increment = tlvh.length - (int)sizeof tlvh;
+                       if (seek_increment > 0) {
+                               if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
+                                       return -1;
+                       }
+                       offset += seek_increment;
+               }
     }
 
     return offset;
@@ -714,7 +740,7 @@ static gint observer_to_wtap_encap(int observer_encap)
     case OBSERVER_FIBRE_CHANNEL:
         return WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS;
     case OBSERVER_WIRELESS_802_11:
-        return WTAP_ENCAP_IEEE_802_11;
+        return WTAP_ENCAP_IEEE_802_11_WITH_RADIO;
     case OBSERVER_UNDEFINED:
         return WTAP_ENCAP_UNKNOWN;
     }
index 6abb6d30f35c0aad70a707f3bdb846ba4c1a0061..d3266ffb13cd4ce00ef9d251a7582b96f086e475 100644 (file)
@@ -79,12 +79,24 @@ typedef struct tlv_time_info {
     (_tlv_time_info).length = GUINT16_TO_LE((_tlv_time_info).length); \
        (_tlv_time_info).time_format = GUINT32_FROM_LE((_tlv_time_info).time_format)
 
+typedef struct tlv_wireless_info {
+       guint8 quality;
+       guint8 signalStrength;
+       guint8 rate;
+       guint8 frequency;
+       guint8 qualityPercent;
+       guint8 strengthPercent;
+       guint8 conditions;
+       guint8 reserved;
+} tlv_wireless_info;
+
 /*
  * TLV type values.
  */
 #define INFORMATION_TYPE_ALIAS_LIST            0x01
 #define INFORMATION_TYPE_COMMENT               0x02    /* ASCII text */
 #define INFORMATION_TYPE_TIME_INFO             0x04
+#define INFORMATION_TYPE_WIRELESS              0x101
 
 /*
  * TVL TIME_INFO values.