Remove Series III code from vwr_read_s2_W_rec().

It's only called if vwr->FPGA_VERSION is S2_W_FPGA, so any code that's
run only if it's *not* S2_W_FPGA is dead code.  Remove it, for clarity.

While we're at it, add some new comments, fix some comments, and get rid
of an unused argument to vwr_read_s2_W_rec().

Change-Id: I3e4bd5d7a79f36d8354a0bbf875ee87eeaf60d43
Reviewed-on: https://code.wireshark.org/review/21414
Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
Guy Harris 2017-04-29 17:37:48 -07:00
parent c0a1ce2821
commit a48997a174
1 changed files with 138 additions and 106 deletions

View File

@ -82,12 +82,48 @@
#define COMMAND_RX 0x21
#define COMMAND_TX 0x31
/* the metadata headers */
/*
* The data in packet records begins with a sequence of metadata headers.
*
* For packet records from FPGA versions < 48:
*
* The first header is the IxVeriWave common header, and that's
* followed either by a WLAN metadata header or an Ethernet
* metadata header. The port type field indicates whether it's
* a WLAN packet or an Ethernet packet. Following that may, for
* WLAN, be 1 octet of information from the FPGA and 16 bytes of
* data including the PLCP header. After that comes the WLAN or
* Ethernet frame, beginning with the MAC header.
*
* For packet records from FPGA versions >= 48:
*
* The first header contains only a 1-octet port type value, which
* has a packet type value in the upper 4 bits and zero in the lower
* 4 bits. NOTE: this is indistinguishable from an old FPGA header
* if the packet type value is 0.
*
* If the packet type value isn't 3, the port type value is followed
* by a 1-octet FPGA version number, which is followed by a timestamp
* header.
*
* If the packet type value is 3 or 4, the next item is an RF metadata
* header. For type 3, that immediately follows the port number octet,
* otherwise it immediately follows the timestamp header.
*
* If the packet type isn't 3, the next item is a WLAN metadata header,
* in a format different from the WLAN metadata header for FPGA versions
* < 48. That is followed by a PLCP header, which is followed by a
* header giving additional layer 2 through 4 metadata.
*
* Following those headers is the WLAN or Ethernet frame, beginning with
* the MAC header.
*/
/*
* IxVeriWave common header:
*
* 2 octets - port type
* 1 octet - port type
* 1 octet - FPGA version, or 0
* 2 octets - length of the common header
* 2 octets - MSDU length
* 4 octets - flow ID
@ -101,7 +137,7 @@
*/
/* Size of the IxVeriWave common header */
#define STATS_COMMON_FIELDS_LEN (2+2+2+4+2+2+4+4+8+8+4)
#define STATS_COMMON_FIELDS_LEN (1+1+2+2+4+2+2+4+4+8+8+4)
/* Port type */
#define WLAN_PORT 0
@ -176,13 +212,74 @@
/* Size of the VeriWave Ethernet metadata header */
#define EXT_ETHERNET_FIELDS_LEN (2+2+2+4+4+4)
/*
* OCTO timestamp header.
*
* 4 octets - latency or 0
* 4 octets - lower 32 bits of signature time stamp
* 8 octets - start time
* 8 octets - end time
* 4 octets - delta(?) time
*/
/* Size of Timestamp header including 1st 4 Management bytes for OCTO version FPGA*/
#define OCTO_TIMESTAMP_FIELDS_LEN (4+4+8+8+4+4)
/*
* OCTO layer 1-4 header:
*
* 2 octets - header length
* 1 octet - l1p_1
* 1 octet - number of spatial streams
* 2 octets - PHY rate
* 1 octet - l1p_2
* 1 octet - RSSI
* 1 octet - antenna b signal power, or 100 if missing
* 1 octet - antenna c signal power, or 100 if missing
* 1 octet - antenna d signal power, or 100 if missing
* 1 octet - signal bandwidth mask
* 1 octet - antenna port energy detect and VU_MASK
* 1 octet - L1InfoC or 0
* 2 octets - MSDU length
* 16 octets - PLCP?
* 4 octets - BM, BV, CV, BSSID and ClientID
* 2 octets - FV, QT, HT, L4V, TID and WLAN type
* 1 octets - flow sequence number
* 3 octets - flow ID
* 2 octets - layer 4 ID
* 4 octets - payload decode
* 3 octets - info
* 4 octets - errors
*/
/* Size of Layer-1, PLCP, and Layer-2/4 header incase of OCTO version FPGA */
#define OCTO_LAYER1TO4_LEN (2+14+16+23)
/* Size of RF header*/
/*
* OCTO modified RF layer:
*
* 1 octet - RF ID
* 3 octets - unused (zero)
* 8 octets - noise for 4 ports
* 8 octets - signal/noise ration for 4 ports
* 8 octets - PFE for 4 ports
* 8 octets - EVM SIG data for 4 ports
* 8 octets - EVM SIG pilot for 4 ports
* 8 octets - EVM Data data for 4 ports
* 8 octets - EVM Data pilot for 4 ports
* 8 octets - EVM worst symbol for 4 ports
* 8 octets - CONTEXT_P for 4 ports
*
* Not supplied:
* 24 octets of additional data
*/
/* Size of RF header, if all fields were supplied */
#define OCTO_RF_MOD_ACTUAL_LEN 100 /* */
/* Size of RF header with the fields we do supply */
#define OCTO_MODIFIED_RF_LEN 76 /* 24 bytes of RF are not displayed*/
/*Offset of differnt parameters of RF header for port-1*/
#define RF_PORT_1_NOISE_OFF 4
#define RF_PORT_1_SNR_OFF 6
@ -628,7 +725,7 @@ typedef struct {
guint32 RETRY_ERR; /* excessive retries on TX failure */
guint8 IS_RX; /* TX/RX bit in STATS block */
guint8 MT_MASK; /* modulation type mask */
guint16 VCID_MASK; /* VC ID is only 9 bits */
guint16 VCID_MASK; /* VC ID might not be a full 16 bits */
guint32 FLOW_VALID; /* flow-is-valid flag (else force to 0) */
guint16 QOS_VALID;
guint32 RX_DECRYPTS; /* RX-frame-was-decrypted bits */
@ -678,7 +775,7 @@ static int vwr_get_fpga_version(wtap *, int *, gchar **);
static gboolean vwr_read_s1_W_rec(vwr_t *, struct wtap_pkthdr *, Buffer *,
const guint8 *, int, int *, gchar **);
static gboolean vwr_read_s2_W_rec(vwr_t *, struct wtap_pkthdr *, Buffer *,
const guint8 *, int, int, int, int *,
const guint8 *, int, int, int *,
gchar **);
/* For FPGA version >= 48 (OCTO Platform), following function will be used */
static gboolean vwr_read_s3_W_rec(vwr_t *, struct wtap_pkthdr *, Buffer *,
@ -981,8 +1078,8 @@ static int vwr_get_fpga_version(wtap *wth, int *err, gchar **err_info)
return (-1);
}
g_free(rec);
/* We found an FPGA that works */
g_free(rec);
return fpga_version;
}
}
@ -1180,9 +1277,11 @@ static gboolean vwr_read_s1_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
*
* All values are copied out in little-endian byte order.
*/
phtole8(&data_ptr[bytes_written], WLAN_PORT); /* 1st octet of record for port_type*/
/* 1st octet of record for port_type and command (command is 0, hence RX) */
phtole8(&data_ptr[bytes_written], WLAN_PORT);
bytes_written += 1;
phtole8(&data_ptr[bytes_written], 0); /* 2nd octet of record for fpga version*/
/* 2nd octet of record for fpga version (0, hence pre-OCTO) */
phtole8(&data_ptr[bytes_written], 0);
bytes_written += 1;
phtoles(&data_ptr[bytes_written], STATS_COMMON_FIELDS_LEN); /* it_len */
bytes_written += 2;
@ -1286,12 +1385,11 @@ static gboolean vwr_read_s1_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
Buffer *buf, const guint8 *rec, int rec_size,
int IS_TX, int log_mode _U_, int *err, gchar **err_info)
Buffer *buf, const guint8 *rec, int rec_size,
int IS_TX, int *err, gchar **err_info)
{
guint8 *data_ptr;
int bytes_written = 0; /* bytes output to buf so far */
register int i; /* temps */
const guint8 *s_start_ptr,*s_trail_ptr, *plcp_ptr, *m_ptr; /* stats & MPDU ptr */
guint32 msdu_length, actual_octets; /* octets in frame */
guint8 l1p_1,l1p_2, plcp_type, mcs_index, nss; /* mod (CCK-L/CCK-S/OFDM) */
@ -1314,8 +1412,6 @@ static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
guint64 delta_b; /* Used for calculating latency */
guint16 phyRate;
guint16 vw_flags; /* VeriWave-specific packet flags */
guint8 L1InfoC,vht_ndp_flag = 0;
guint8 plcp_hdr_flag = 0; /* indicates plcp hdr info */
/*
* The record data must be large enough to hold the statistics header,
@ -1334,89 +1430,38 @@ static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
s_start_ptr = &(rec[0]); /* point to stats header */
s_trail_ptr = &(rec[rec_size - vVW510021_W_STATS_TRAILER_LEN]); /* point to stats trailer */
/* L1p info is different for series III and for Series II - need to check */
l1p_1 = s_start_ptr[vVW510021_W_L1P_1_OFF];
l1p_2 = s_start_ptr[vVW510021_W_L1P_2_OFF];
if (vwr->FPGA_VERSION == S2_W_FPGA)
mcs_index = vVW510021_W_S2_MCS_INDEX(l1p_1);
plcp_type = vVW510021_W_S2_PLCP_TYPE(l1p_2);
/* we do the range checks at the end before copying the values
into the wtap header */
msdu_length = ((s_start_ptr[vVW510021_W_MSDU_LENGTH_OFF+1] & 0x1f) << 8)
+ s_start_ptr[vVW510021_W_MSDU_LENGTH_OFF];
vc_id = pntoh16(&s_start_ptr[vVW510021_W_VCID_OFF]);
if (IS_TX)
{
mcs_index = vVW510021_W_S2_MCS_INDEX(l1p_1);
plcp_type = vVW510021_W_S2_PLCP_TYPE(l1p_2);
/* we do the range checks at the end before copying the values
into the wtap header */
msdu_length = ((s_start_ptr[vVW510021_W_MSDU_LENGTH_OFF+1] & 0x1f) << 8)
+ s_start_ptr[vVW510021_W_MSDU_LENGTH_OFF];
vc_id = pntoh16(&s_start_ptr[vVW510021_W_VCID_OFF]);
if (IS_TX)
{
rssi[0] = (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x80) ?
-1 * (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x7f) :
s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x7f;
}
else
{
rssi[0] = (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x80) ?
(s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF]- 256) :
s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF];
}
rssi[1] = 100;
rssi[2] = 100;
rssi[3] = 100;
nss = (mcs_index / 8) + 1;
plcp_ptr = &(rec[8]);
rssi[0] = (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x80) ?
-1 * (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x7f) :
s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x7f;
}
else
{
plcp_type = vVW510021_W_S3_PLCP_TYPE(l1p_2);
if (plcp_type == vVW510021_W_PLCP_VHT_MIXED)
{
/* S3 FPGA VHT frames ***/
mcs_index = vVW510021_W_S3_MCS_INDEX_VHT(l1p_1);
nss = vVW510021_W_S3_NSS_VHT(l1p_1); /* The nss is zero based from the fpga - increment it here */
plcp_hdr_flag = 1;
}
else /*** S3_FPGA HT frames ***/
{
mcs_index = l1p_1 & 0x3f;
nss = (mcs_index / 8) + 1;
}
/*** Extract NDP Flag if it is a received frame ***/
if (!IS_TX){
L1InfoC = s_start_ptr[8];
vht_ndp_flag = L1InfoC & 0x80;
}
msdu_length = pntoh24(&s_start_ptr[9]);
vc_id = pntoh16(&s_start_ptr[14]) & vVW510024_W_VCID_MASK;
for (i = 0; i < 4; i++)
{
if (IS_TX)
{
rssi[i] = (s_start_ptr[4+i] & 0x80) ? -1 * (s_start_ptr[4+i] & 0x7f) : s_start_ptr[4+i] & 0x7f;
}
else
{
rssi[i] = (s_start_ptr[4+i] >= 128) ? (s_start_ptr[4+i] - 256) : s_start_ptr[4+i];
}
}
/*** 16 bytes of PLCP header + 1 byte of L1P for user position ***/
/* XXX - S3 claims to have 16 bytes of stats block and 16 bytes of
*something*. Are those 16 bytes the PLCP? */
plcp_ptr = &(rec[16]);
rssi[0] = (s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF] & 0x80) ?
(s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF]- 256) :
s_start_ptr[vVW510021_W_RSSI_TXPOWER_OFF];
}
/*** Add the PLCP length for S3_W_FPGA version VHT frames for Beamforming decode ***/
rssi[1] = 100;
rssi[2] = 100;
rssi[3] = 100;
nss = (mcs_index / 8) + 1;
plcp_ptr = &(rec[8]);
actual_octets = msdu_length;
if (plcp_hdr_flag == 1) {
/*** 16 bytes of PLCP header + 1 byte of L1P for user position ***/
actual_octets = actual_octets + 17;
}
/*
* Sanity check the octets field to determine if it's greater than
* the packet data available in the record - i.e., the record size
@ -1628,9 +1673,11 @@ static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
* All values are copied out in little-endian byte order.
*/
/*** msdu_length = msdu_length + 16; ***/
phtole8(&data_ptr[bytes_written], WLAN_PORT); /* 1st octet of record for port*/
/* 1st octet of record for port_type and command (command is 0, hence RX) */
phtole8(&data_ptr[bytes_written], WLAN_PORT);
bytes_written += 1;
phtole8(&data_ptr[bytes_written], 0); /* 2nd octet of record for fpga version*/
/* 2nd octet of record for fpga version (0, hence pre-OCTO) */
phtole8(&data_ptr[bytes_written], 0);
bytes_written += 1;
phtoles(&data_ptr[bytes_written], STATS_COMMON_FIELDS_LEN); /* it_len */
bytes_written += 2;
@ -1676,12 +1723,6 @@ static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
phtoles(&data_ptr[bytes_written], phyRate);
bytes_written += 2;
/*** If received frame populate the ndp_flag in the same byte as plcp_type***/
if (!IS_TX) {
plcp_type = vht_ndp_flag + plcp_type;
}
data_ptr[bytes_written] = plcp_type;
bytes_written += 1;
@ -1728,15 +1769,6 @@ static gboolean vwr_read_s2_W_rec(vwr_t *vwr, struct wtap_pkthdr *phdr,
phtolel(&data_ptr[bytes_written], errors);
bytes_written += 4;
/*** copy PLCP header and L1InfoC for VHT frames***/
if (plcp_hdr_flag == 1) {
data_ptr[bytes_written] = L1InfoC;
bytes_written += 1;
memcpy(&data_ptr[bytes_written], &rec[16], 16);
bytes_written += 16;
}
/* Finally, copy the whole MAC frame to the packet buffer as-is.
* This does not include the stats header or the PLCP.
* This also does not include the last 4 bytes, as those don't
@ -3138,7 +3170,7 @@ vwr_process_rec_data(FILE_T fh, int rec_size,
ret = vwr_read_s1_W_rec(vwr, phdr, buf, rec, rec_size, err, err_info);
break;
case S2_W_FPGA:
ret = vwr_read_s2_W_rec(vwr, phdr, buf, rec, rec_size, IS_TX, log_mode, err, err_info);
ret = vwr_read_s2_W_rec(vwr, phdr, buf, rec, rec_size, IS_TX, err, err_info);
break;
case S3_W_FPGA:
ret = vwr_read_s3_W_rec(vwr, phdr, buf, rec, rec_size, IS_TX, log_mode, err, err_info);