#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-802_11.c,v 1.31.2.13 2007-07-22 20:01:16 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-802_11.c,v 1.31.2.14 2007-07-22 22:01:05 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
data_header_print(u_int16_t fc, const u_char *p, const u_int8_t **srcp,
const u_int8_t **dstp)
{
- switch (FC_SUBTYPE(fc)) {
- case DATA_DATA:
- case DATA_NODATA:
- break;
- case DATA_DATA_CF_ACK:
- case DATA_NODATA_CF_ACK:
- printf("CF Ack ");
- break;
- case DATA_DATA_CF_POLL:
- case DATA_NODATA_CF_POLL:
- printf("CF Poll ");
- break;
- case DATA_DATA_CF_ACK_POLL:
- case DATA_NODATA_CF_ACK_POLL:
- printf("CF Ack/Poll ");
- break;
+ u_int subtype = FC_SUBTYPE(fc);
+
+ if (DATA_FRAME_IS_CF_ACK(subtype) || DATA_FRAME_IS_CF_POLL(subtype) ||
+ DATA_FRAME_IS_QOS(subtype)) {
+ printf("CF ");
+ if (DATA_FRAME_IS_CF_ACK(subtype)) {
+ if (DATA_FRAME_IS_CF_POLL(subtype))
+ printf("Ack/Poll");
+ else
+ printf("Ack");
+ } else {
+ if (DATA_FRAME_IS_CF_POLL(subtype))
+ printf("Poll");
+ }
+ if (DATA_FRAME_IS_QOS(subtype))
+ printf("+QoS");
+ printf(" ");
}
#define ADDR1 (p + 4)
static int
extract_header_length(u_int16_t fc)
{
+ int len;
+
switch (FC_TYPE(fc)) {
case T_MGMT:
return MGMT_HDRLEN;
return 0;
}
case T_DATA:
- return (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24;
+ len = (FC_TO_DS(fc) && FC_FROM_DS(fc)) ? 30 : 24;
+ if (DATA_FRAME_IS_QOS(FC_SUBTYPE(fc)))
+ len += 2;
+ return len;
default:
printf("unknown IEEE802.11 frame type (%d)", FC_TYPE(fc));
return 0;