Get rid of an unused #define.
[obnox/wireshark/wip.git] / packet-ieee80211.c
index 00caa8b674cd5bc9b0cd2ad7c83cfafc100e679c..3868ba2b58d861ca91ecd3ab33f14197136b7872 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.31 2001/06/20 23:58:57 guy Exp $
+ * $Id: packet-ieee80211.c,v 1.33 2001/06/21 06:59:47 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
 #define DATA_SHORT_HDR_LEN     24
 #define DATA_LONG_HDR_LEN      30
 #define MGT_FRAME_HDR_LEN      24      /* Length of Managment frame-headers */
-#define CTLR
+
 #define MGT_ASSOC_REQ        0x00      /* Management - association request        */
 #define MGT_ASSOC_RESP       0x01      /* Management - association response       */
 #define MGT_REASSOC_REQ      0x02      /* Management - reassociation request      */
@@ -332,10 +332,35 @@ static dissector_handle_t llc_handle;
 /* ************************************************************************* */
 /*            Return the length of the current header (in bytes)             */
 /* ************************************************************************* */
-int
+static int
 find_header_length (guint16 fcf)
 {
-  return (COOK_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? 30 : 24;
+  switch (COOK_FRAME_TYPE (fcf)) {
+
+  case MGT_FRAME:
+    return MGT_FRAME_HDR_LEN;
+
+  case CONTROL_FRAME:
+    switch (COMPOSE_FRAME_TYPE (fcf)) {
+
+    case CTRL_CTS:
+    case CTRL_ACKNOWLEDGEMENT:
+      return 10;
+
+    case CTRL_RTS:
+    case CTRL_PS_POLL:
+    case CTRL_CFP_END:
+    case CTRL_CFP_ENDACK:
+      return 16;
+    }
+    return 4;  /* XXX */
+
+  case DATA_FRAME:
+    return (COOK_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? DATA_LONG_HDR_LEN :
+                                                      DATA_SHORT_HDR_LEN;
+  default:
+    return 4;  /* XXX */
+  }
 }
 
 
@@ -413,7 +438,7 @@ get_tagged_parameter_tree (proto_tree * tree, tvbuff_t *tvb, int start, int size
 /* ************************************************************************* */
 /*            Add the subtree used to store WEP parameters                   */
 /* ************************************************************************* */
-void
+static void
 get_wep_parameter_tree (proto_tree * tree, tvbuff_t *tvb, int start, int size)
 {
   proto_item *wep_fields;
@@ -443,7 +468,7 @@ add_fixed_field (proto_tree * tree, tvbuff_t * tvb, int offset, int lfcode)
 {
   const guint8 *dataptr;
   char out_buff[SHORT_STR];
-  guint16 *temp16;
+  guint16 capability;
   proto_item *cap_item;
   static proto_tree *cap_tree;
   double temp_double;
@@ -466,10 +491,8 @@ add_fixed_field (proto_tree * tree, tvbuff_t * tvb, int offset, int lfcode)
       proto_tree_add_string (tree, ff_timestamp, tvb, offset, 8, out_buff);
       break;
 
-
     case FIELD_BEACON_INTERVAL:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp_double = ((double) *((guint16 *) dataptr));
+      temp_double = (double) tvb_get_letohs (tvb, offset);
       temp_double = temp_double * 1024 / 1000000;
       proto_tree_add_double_format (tree, ff_beacon_interval, tvb, offset, 2,
                                    temp_double,"Beacon Interval: %f [Seconds]",
@@ -478,85 +501,61 @@ add_fixed_field (proto_tree * tree, tvbuff_t * tvb, int offset, int lfcode)
 
 
     case FIELD_CAP_INFO:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *) dataptr;
+      capability = tvb_get_letohs (tvb, offset);
 
       cap_item = proto_tree_add_uint_format (tree, ff_capture, 
                                             tvb, offset, 2,
-                                            pletohs (temp16),
+                                            capability,
                                             "Capability Information: 0x%04X",
-                                            pletohs (temp16));
+                                            capability);
       cap_tree = proto_item_add_subtree (cap_item, ett_cap_tree);
       proto_tree_add_boolean (cap_tree, ff_cf_ess, tvb, offset, 1,
-                             pletohs (temp16));
+                             capability);
       proto_tree_add_boolean (cap_tree, ff_cf_ibss, tvb, offset, 1,
-                             pletohs (temp16));
+                             capability);
       proto_tree_add_boolean (cap_tree, ff_cf_privacy, tvb, offset, 1,
-                             pletohs (temp16));
+                             capability);
       proto_tree_add_boolean (cap_tree, ff_cf_preamble, tvb, offset, 1,
-                             pletohs (temp16));
+                             capability);
       proto_tree_add_boolean (cap_tree, ff_cf_pbcc, tvb, offset, 1,
-                             pletohs (temp16));
+                             capability);
       proto_tree_add_boolean (cap_tree, ff_cf_agility, tvb, offset, 1,
-                             pletohs (temp16));
-      if (ESS_SET (pletohs (temp16)) != 0)     /* This is an AP */
+                             capability);
+      if (ESS_SET (capability) != 0)   /* This is an AP */
        proto_tree_add_uint (cap_tree, ff_cf_ap_poll, tvb, offset, 2,
-                            ((pletohs (temp16) & 0xC) >> 2));
+                            ((capability & 0xC) >> 2));
 
       else                     /* This is a STA */
        proto_tree_add_uint (cap_tree, ff_cf_sta_poll, tvb, offset, 2,
-                            ((pletohs (temp16) & 0xC) >> 2));
+                            ((capability & 0xC) >> 2));
       break;
 
-
     case FIELD_AUTH_ALG:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 =(guint16 *) dataptr;
-      proto_tree_add_uint (tree, ff_auth_alg, tvb, offset, 2,
-                          pletohs (temp16));
+      proto_tree_add_uint (tree, ff_auth_alg, tvb, offset, 2, TRUE);
       break;
 
-
     case FIELD_AUTH_TRANS_SEQ:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *)dataptr;
-      proto_tree_add_uint (tree, ff_auth_seq, tvb, offset, 2,
-                          pletohs (temp16));
+      proto_tree_add_uint (tree, ff_auth_seq, tvb, offset, 2, TRUE);
       break;
 
-
     case FIELD_CURRENT_AP_ADDR:
-      dataptr = tvb_get_ptr (tvb, offset, 6);
-      proto_tree_add_ether (tree, ff_current_ap, tvb, offset, 6, dataptr);
+      proto_tree_add_item (tree, ff_current_ap, tvb, offset, 6, FALSE);
       break;
 
-
     case FIELD_LISTEN_IVAL:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *) dataptr;
-      proto_tree_add_uint (tree, ff_listen_ival, tvb, offset, 2,
-                          pletohs (temp16));
+      proto_tree_add_item (tree, ff_listen_ival, tvb, offset, 2, TRUE);
       break;
 
-
     case FIELD_REASON_CODE:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *) dataptr;
-      proto_tree_add_uint (tree, ff_reason, tvb, offset, 2, pletohs (temp16));
+      proto_tree_add_item (tree, ff_reason, tvb, offset, 2, TRUE);
       break;
 
-
     case FIELD_ASSOC_ID:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *) dataptr;
-      proto_tree_add_uint (tree, ff_assoc_id, tvb, offset, 2, pletohs (temp16));
+      proto_tree_add_item (tree, ff_assoc_id, tvb, offset, 2, TRUE);
       break;
 
     case FIELD_STATUS_CODE:
-      dataptr = tvb_get_ptr (tvb, offset, 2);
-      temp16 = (guint16 *) dataptr;
-      proto_tree_add_uint (tree, ff_status_code, tvb, offset, 2,
-                          pletohs (temp16));
+      proto_tree_add_item (tree, ff_status_code, tvb, offset, 2, TRUE);
       break;
     }
 }
@@ -568,7 +567,6 @@ add_fixed_field (proto_tree * tree, tvbuff_t * tvb, int offset, int lfcode)
 static int
 add_tagged_field (proto_tree * tree, tvbuff_t * tvb, int offset)
 {
-  const guint8 *tag_info_ptr;
   const guint8 *tag_data_ptr;
   guint32 tag_no, tag_len;
   unsigned int i;
@@ -576,9 +574,8 @@ add_tagged_field (proto_tree * tree, tvbuff_t * tvb, int offset)
   char out_buff[SHORT_STR];
 
 
-  tag_info_ptr = tvb_get_ptr (tvb, offset, 2);
-  tag_no = tag_info_ptr[0];
-  tag_len = tag_info_ptr[1];
+  tag_no = tvb_get_guint8(tvb, offset);
+  tag_len = tvb_get_guint8(tvb, offset + 1);
 
   tag_data_ptr = tvb_get_ptr (tvb, offset + 2, tag_len);
 
@@ -611,7 +608,7 @@ add_tagged_field (proto_tree * tree, tvbuff_t * tvb, int offset)
     }
 
 
-  switch (tag_info_ptr[0])
+  switch (tag_no)
     {
 
 
@@ -902,11 +899,9 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
 
       if (tree)
        {
-         proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6, dst);
 
-         proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6,
-                               tvb_get_ptr (tvb, 10, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6, src);
 
          proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 16, 6,
                                tvb_get_ptr (tvb, 16, 6));
@@ -974,10 +969,8 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
            {
 
            case DATA_ADDR_T1:
-             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6,
-                                   tvb_get_ptr (tvb, 4, 6));
-             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6,
-                                   tvb_get_ptr (tvb, 10, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6, dst);
+             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6, src);
              proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 16, 6,
                                    tvb_get_ptr (tvb, 16, 6));
              proto_tree_add_uint (hdr_tree, hf_frag_number, tvb, 22, 2,
@@ -990,12 +983,10 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
              
              
            case DATA_ADDR_T2:
-             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6,
-                                   tvb_get_ptr (tvb, 4, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 4, 6, dst);
              proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 10, 6,
                                    tvb_get_ptr (tvb, 10, 6));
-             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 16, 6,
-                                   tvb_get_ptr (tvb, 16, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 16, 6, src);
              proto_tree_add_uint (hdr_tree, hf_frag_number, tvb, 22, 2,
                                   COOK_FRAGMENT_NUMBER (tvb_get_letohs
                                                         (tvb, 22)));
@@ -1008,10 +999,8 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
            case DATA_ADDR_T3:
              proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 4, 6,
                                    tvb_get_ptr (tvb, 4, 6));
-             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6,
-                                   tvb_get_ptr (tvb, 10, 6));
-             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6,
-                                   tvb_get_ptr (tvb, 16, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 10, 6, src);
+             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6, dst);
              proto_tree_add_uint (hdr_tree, hf_frag_number, tvb, 22, 2,
                                   COOK_FRAGMENT_NUMBER (tvb_get_letohs
                                                         (tvb, 22)));
@@ -1026,16 +1015,14 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
                                    tvb_get_ptr (tvb, 4, 6));
              proto_tree_add_ether (hdr_tree, hf_addr_ta, tvb, 10, 6,
                                    tvb_get_ptr (tvb, 10, 6));
-             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6,
-                                   tvb_get_ptr (tvb, 16, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_da, tvb, 16, 6, dst);
              proto_tree_add_uint (hdr_tree, hf_frag_number, tvb, 22, 2,
                                   COOK_FRAGMENT_NUMBER (tvb_get_letohs
                                                         (tvb, 22)));
              proto_tree_add_uint (hdr_tree, hf_seq_number, tvb, 22, 2,
                                   COOK_SEQUENCE_NUMBER (tvb_get_letohs
                                                         (tvb, 22)));
-             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 24, 6,
-                                   tvb_get_ptr (tvb, 24, 6));
+             proto_tree_add_ether (hdr_tree, hf_addr_sa, tvb, 24, 6, src);
              break;
            }
 
@@ -1302,12 +1289,9 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
 
       if (tree)
        {
-         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
-
-         proto_tree_add_ether (hdr_tree, hf_addr_ta, tvb, 10, 6,
-                               tvb_get_ptr (tvb, 10, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 4, 6, dst);
 
+         proto_tree_add_ether (hdr_tree, hf_addr_ta, tvb, 10, 6, src);
        }
       break;
 
@@ -1321,12 +1305,9 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
 
       if (tree)
        {
-         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
-
-         proto_tree_add_ether (hdr_tree, hf_addr_ta, tvb, 10, 6,
-                               tvb_get_ptr (tvb, 10, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6, dst);
 
+         proto_tree_add_ether (hdr_tree, hf_addr_ta, tvb, 10, 6, src);
        }
       break;
 
@@ -1337,11 +1318,7 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
       set_dst_addr_cols(pinfo, dst, "RA");
 
       if (tree)
-       {
-         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
-
-       }
+         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6, dst);
       break;
 
 
@@ -1351,8 +1328,7 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
       set_dst_addr_cols(pinfo, dst, "RA");
 
       if (tree)
-       proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6,
-                             tvb_get_ptr (tvb, 4, 6));
+       proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6, dst);
       break;
 
 
@@ -1365,10 +1341,8 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
 
       if (tree)
        {
-         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
-         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 10, 6,
-                               tvb_get_ptr (tvb, 10, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6, dst);
+         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 10, 6, src);
        }
       break;
 
@@ -1382,11 +1356,9 @@ dissect_ieee80211 (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
 
       if (tree)
        {
-         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6,
-                               tvb_get_ptr (tvb, 4, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_ra, tvb, 4, 6, dst);
 
-         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 10, 6,
-                               tvb_get_ptr (tvb, 10, 6));
+         proto_tree_add_ether (hdr_tree, hf_addr_bssid, tvb, 10, 6, src);
        }
       break;
 
@@ -1666,12 +1638,12 @@ proto_register_wlan (void)
       "Basic Service Set ID", HFILL }},
 
     {&hf_frag_number,
-     {"Fragment number", "wlan.frag", FT_UINT16, BASE_HEX, NULL, 0,
+     {"Fragment number", "wlan.frag", FT_UINT16, BASE_DEC, NULL, 0,
       "Fragment number", HFILL }},
 
     {&hf_seq_number,
-     {"Sequence number", "wlan.seq", FT_UINT16, BASE_HEX, NULL, 0,
-      "Fragment number", HFILL }},
+     {"Sequence number", "wlan.seq", FT_UINT16, BASE_DEC, NULL, 0,
+      "Sequence number", HFILL }},
 
     {&hf_fcs,
      {"Frame Check Sequence (not verified)", "wlan.fcs", FT_UINT32, BASE_HEX,
@@ -1752,7 +1724,6 @@ proto_register_wlan (void)
      {"Channel Agility", "wlan.fixed.capabilities.agility",
       FT_BOOLEAN, 8, TFS (&cf_agility_flags), 0x0080, "Channel Agility", HFILL }},
 
-
     {&ff_auth_seq,
      {"Authentication SEQ", "wlan.fixed.auth_seq",
       FT_UINT16, BASE_HEX, NULL, 0, "Authentication sequence number", HFILL }},