So that net/ieee80211.h can be made private to ipw2x00 in a follow-up.
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
 void hostap_dump_tx_header(const char *name,
                           const struct hfa384x_tx_frame *tx);
 extern const struct header_ops hostap_80211_ops;
-int hostap_80211_get_hdrlen(u16 fc);
+int hostap_80211_get_hdrlen(__le16 fc);
 struct net_device_stats *hostap_get_stats(struct net_device *dev);
 void hostap_setup_dev(struct net_device *dev, local_info_t *local,
                      int type);
 
 #define HOSTAP_80211_H
 
 #include <linux/types.h>
-#include <net/ieee80211.h>
+#include <linux/skbuff.h>
 
 struct hostap_ieee80211_mgmt {
        __le16 frame_control;
 
 #include <linux/etherdevice.h>
 #include <net/lib80211.h>
+#include <linux/if_arp.h>
 
 #include "hostap_80211.h"
 #include "hostap.h"
 void hostap_dump_rx_80211(const char *name, struct sk_buff *skb,
                          struct hostap_80211_rx_status *rx_stats)
 {
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u16 fc;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
 
        printk(KERN_DEBUG "%s: RX signal=%d noise=%d rate=%d len=%d "
               "jiffies=%ld\n",
        if (skb->len < 2)
                return;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
+       fc = le16_to_cpu(hdr->frame_control);
        printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d)%s%s",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              fc, (fc & IEEE80211_FCTL_FTYPE) >> 2,
+              (fc & IEEE80211_FCTL_STYPE) >> 4,
               fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
               fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
 
        }
 
        printk(" dur=0x%04x seq=0x%04x\n", le16_to_cpu(hdr->duration_id),
-              le16_to_cpu(hdr->seq_ctl));
+              le16_to_cpu(hdr->seq_ctrl));
 
        printk(KERN_DEBUG "   A1=%pM", hdr->addr1);
        printk(" A2=%pM", hdr->addr2);
        int hdrlen, phdrlen, head_need, tail_need;
        u16 fc;
        int prism_header, ret;
-       struct ieee80211_hdr_4addr *fhdr;
+       struct ieee80211_hdr *fhdr;
 
        iface = netdev_priv(dev);
        local = iface->local;
                phdrlen = 0;
        }
 
-       fhdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(fhdr->frame_ctl);
+       fhdr = (struct ieee80211_hdr *) skb->data;
+       fc = le16_to_cpu(fhdr->frame_control);
 
        if (type == PRISM2_RX_MGMT && (fc & IEEE80211_FCTL_VERS)) {
                printk(KERN_DEBUG "%s: dropped management frame with header "
                return 0;
        }
 
-       hdrlen = hostap_80211_get_hdrlen(fc);
+       hdrlen = hostap_80211_get_hdrlen(fhdr->frame_control);
 
        /* check if there is enough room for extra data; if not, expand skb
         * buffer to be large enough for the changes */
 
 /* Called only as a tasklet (software IRQ) */
 static struct sk_buff *
-prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr_4addr *hdr)
+prism2_frag_cache_get(local_info_t *local, struct ieee80211_hdr *hdr)
 {
        struct sk_buff *skb = NULL;
        u16 sc;
        unsigned int frag, seq;
        struct prism2_frag_entry *entry;
 
-       sc = le16_to_cpu(hdr->seq_ctl);
-       frag = WLAN_GET_SEQ_FRAG(sc);
-       seq = WLAN_GET_SEQ_SEQ(sc) >> 4;
+       sc = le16_to_cpu(hdr->seq_ctrl);
+       frag = sc & IEEE80211_SCTL_FRAG;
+       seq = (sc & IEEE80211_SCTL_SEQ) >> 4;
 
        if (frag == 0) {
                /* Reserve enough space to fit maximum frame length */
                skb = dev_alloc_skb(local->dev->mtu +
-                                   sizeof(struct ieee80211_hdr_4addr) +
+                                   sizeof(struct ieee80211_hdr) +
                                    8 /* LLC */ +
                                    2 /* alignment */ +
                                    8 /* WEP */ + ETH_ALEN /* WDS */);
 
 /* Called only as a tasklet (software IRQ) */
 static int prism2_frag_cache_invalidate(local_info_t *local,
-                                       struct ieee80211_hdr_4addr *hdr)
+                                       struct ieee80211_hdr *hdr)
 {
        u16 sc;
        unsigned int seq;
        struct prism2_frag_entry *entry;
 
-       sc = le16_to_cpu(hdr->seq_ctl);
-       seq = WLAN_GET_SEQ_SEQ(sc) >> 4;
+       sc = le16_to_cpu(hdr->seq_ctrl);
+       seq = (sc & IEEE80211_SCTL_SEQ) >> 4;
 
        entry = prism2_frag_cache_find(local, seq, -1, hdr->addr2, hdr->addr1);
 
                     struct hostap_80211_rx_status *rx_stats, u16 type,
                     u16 stype)
 {
-       if (local->iw_mode == IW_MODE_MASTER) {
-               hostap_update_sta_ps(local, (struct ieee80211_hdr_4addr *)
-                                    skb->data);
-       }
+       if (local->iw_mode == IW_MODE_MASTER)
+               hostap_update_sta_ps(local, (struct ieee80211_hdr *) skb->data);
 
        if (local->hostapd && type == IEEE80211_FTYPE_MGMT) {
                if (stype == IEEE80211_STYPE_BEACON &&
 
 
 static int
-hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr_4addr *hdr,
-                   u16 fc, struct net_device **wds)
+hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr *hdr, u16 fc,
+                   struct net_device **wds)
 {
        /* FIX: is this really supposed to accept WDS frames only in Master
         * mode? What about Repeater or Managed with WDS frames? */
 {
        struct net_device *dev = local->dev;
        u16 fc, ethertype;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u8 *pos;
 
        if (skb->len < 24)
                return 0;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
+       hdr = (struct ieee80211_hdr *) skb->data;
+       fc = le16_to_cpu(hdr->frame_control);
 
        /* check that the frame is unicast frame to us */
        if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
 hostap_rx_frame_decrypt(local_info_t *local, struct sk_buff *skb,
                        struct lib80211_crypt_data *crypt)
 {
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        int res, hdrlen;
 
        if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
                return 0;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+       hdr = (struct ieee80211_hdr *) skb->data;
+       hdrlen = hostap_80211_get_hdrlen(hdr->frame_control);
 
        if (local->tkip_countermeasures &&
            strcmp(crypt->ops->name, "TKIP") == 0) {
 hostap_rx_frame_decrypt_msdu(local_info_t *local, struct sk_buff *skb,
                             int keyidx, struct lib80211_crypt_data *crypt)
 {
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        int res, hdrlen;
 
        if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
                return 0;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+       hdr = (struct ieee80211_hdr *) skb->data;
+       hdrlen = hostap_80211_get_hdrlen(hdr->frame_control);
 
        atomic_inc(&crypt->refcnt);
        res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv);
 {
        struct hostap_interface *iface;
        local_info_t *local;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        size_t hdrlen;
        u16 fc, type, stype, sc;
        struct net_device *wds = NULL;
        dev = local->ddev;
        iface = netdev_priv(dev);
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
        stats = hostap_get_stats(dev);
 
        if (skb->len < 10)
                goto rx_dropped;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
-       type = WLAN_FC_GET_TYPE(fc);
-       stype = WLAN_FC_GET_STYPE(fc);
-       sc = le16_to_cpu(hdr->seq_ctl);
-       frag = WLAN_GET_SEQ_FRAG(sc);
-       hdrlen = hostap_80211_get_hdrlen(fc);
+       fc = le16_to_cpu(hdr->frame_control);
+       type = fc & IEEE80211_FCTL_FTYPE;
+       stype = fc & IEEE80211_FCTL_STYPE;
+       sc = le16_to_cpu(hdr->seq_ctrl);
+       frag = sc & IEEE80211_SCTL_FRAG;
+       hdrlen = hostap_80211_get_hdrlen(hdr->frame_control);
 
        /* Put this code here so that we avoid duplicating it in all
         * Rx paths. - Jean II */
        if (local->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) &&
            (keyidx = hostap_rx_frame_decrypt(local, skb, crypt)) < 0)
                goto rx_dropped;
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
 
        /* skb: hdr + (possibly fragmented) plaintext payload */
 
                        printk(KERN_DEBUG "%s: Rx cannot get skb from "
                               "fragment cache (morefrag=%d seq=%u frag=%u)\n",
                               dev->name, (fc & IEEE80211_FCTL_MOREFRAGS) != 0,
-                              WLAN_GET_SEQ_SEQ(sc) >> 4, frag);
+                              (sc & IEEE80211_SCTL_SEQ) >> 4, frag);
                        goto rx_dropped;
                }
 
                /* this was the last fragment and the frame will be
                 * delivered, so remove skb from fragment cache */
                skb = frag_skb;
-               hdr = (struct ieee80211_hdr_4addr *) skb->data;
+               hdr = (struct ieee80211_hdr *) skb->data;
                prism2_frag_cache_invalidate(local, hdr);
        }
 
            hostap_rx_frame_decrypt_msdu(local, skb, keyidx, crypt))
                goto rx_dropped;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
        if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !local->open_wep) {
                if (local->ieee_802_1x &&
                    hostap_is_eapol_frame(local, skb)) {
 
 
 void hostap_dump_tx_80211(const char *name, struct sk_buff *skb)
 {
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u16 fc;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
 
        printk(KERN_DEBUG "%s: TX len=%d jiffies=%ld\n",
               name, skb->len, jiffies);
        if (skb->len < 2)
                return;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
+       fc = le16_to_cpu(hdr->frame_control);
        printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d)%s%s",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              fc, (fc & IEEE80211_FCTL_FTYPE) >> 2,
+              (fc & IEEE80211_FCTL_STYPE) >> 4,
               fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
               fc & IEEE80211_FCTL_FROMDS ? " [FromDS]" : "");
 
        }
 
        printk(" dur=0x%04x seq=0x%04x\n", le16_to_cpu(hdr->duration_id),
-              le16_to_cpu(hdr->seq_ctl));
+              le16_to_cpu(hdr->seq_ctrl));
 
        printk(KERN_DEBUG "   A1=%pM", hdr->addr1);
        printk(" A2=%pM", hdr->addr2);
        struct hostap_interface *iface;
        local_info_t *local;
        int need_headroom, need_tailroom = 0;
-       struct ieee80211_hdr_4addr hdr;
+       struct ieee80211_hdr hdr;
        u16 fc, ethertype = 0;
        enum {
                WDS_NO = 0, WDS_OWN_FRAME, WDS_COMPLIANT_FRAME
                memcpy(&hdr.addr3, local->bssid, ETH_ALEN);
        }
 
-       hdr.frame_ctl = cpu_to_le16(fc);
+       hdr.frame_control = cpu_to_le16(fc);
 
        skb_pull(skb, skip_header_bytes);
        need_headroom = local->func->need_tx_headroom + hdr_len + encaps_len;
        struct hostap_interface *iface;
        local_info_t *local;
        struct hostap_skb_tx_data *meta;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u16 fc;
 
        iface = netdev_priv(dev);
        meta->iface = iface;
 
        if (skb->len >= IEEE80211_DATA_HDR3_LEN + sizeof(rfc1042_header) + 2) {
-               hdr = (struct ieee80211_hdr_4addr *) skb->data;
-               fc = le16_to_cpu(hdr->frame_ctl);
-               if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
-                   WLAN_FC_GET_STYPE(fc) == IEEE80211_STYPE_DATA) {
+               hdr = (struct ieee80211_hdr *) skb->data;
+               fc = le16_to_cpu(hdr->frame_control);
+               if (ieee80211_is_data(hdr->frame_control) &&
+                   (fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DATA) {
                        u8 *pos = &skb->data[IEEE80211_DATA_HDR3_LEN +
                                             sizeof(rfc1042_header)];
                        meta->ethertype = (pos[0] << 8) | pos[1];
 {
        struct hostap_interface *iface;
        local_info_t *local;
-       struct ieee80211_hdr_4addr *hdr;
-       u16 fc;
+       struct ieee80211_hdr *hdr;
        int prefix_len, postfix_len, hdr_len, res;
 
        iface = netdev_priv(skb->dev);
 
        if (local->tkip_countermeasures &&
            strcmp(crypt->ops->name, "TKIP") == 0) {
-               hdr = (struct ieee80211_hdr_4addr *) skb->data;
+               hdr = (struct ieee80211_hdr *) skb->data;
                if (net_ratelimit()) {
                        printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
                               "TX packet to %pM\n",
                return NULL;
        }
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-       hdr_len = hostap_80211_get_hdrlen(fc);
+       hdr = (struct ieee80211_hdr *) skb->data;
+       hdr_len = hostap_80211_get_hdrlen(hdr->frame_control);
 
        /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
         * call both MSDU and MPDU encryption functions from here. */
        ap_tx_ret tx_ret;
        struct hostap_skb_tx_data *meta;
        int no_encrypt = 0;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
 
        iface = netdev_priv(dev);
        local = iface->local;
        tx_ret = hostap_handle_sta_tx(local, &tx);
        skb = tx.skb;
        meta = (struct hostap_skb_tx_data *) skb->cb;
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
+       hdr = (struct ieee80211_hdr *) skb->data;
+       fc = le16_to_cpu(hdr->frame_control);
        switch (tx_ret) {
        case AP_TX_CONTINUE:
                break;
        case AP_TX_CONTINUE_NOT_AUTHORIZED:
                if (local->ieee_802_1x &&
-                   WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
+                   ieee80211_is_data(hdr->frame_control) &&
                    meta->ethertype != ETH_P_PAE &&
                    !(meta->flags & HOSTAP_TX_FLAGS_WDS)) {
                        printk(KERN_DEBUG "%s: dropped frame to unauthorized "
 
                /* remove special version from the frame header */
                fc &= ~IEEE80211_FCTL_VERS;
-               hdr->frame_ctl = cpu_to_le16(fc);
+               hdr->frame_control = cpu_to_le16(fc);
        }
 
-       if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_DATA) {
+       if (!ieee80211_is_data(hdr->frame_control)) {
                no_encrypt = 1;
                tx.crypt = NULL;
        }
                /* Add ISWEP flag both for firmware and host based encryption
                 */
                fc |= IEEE80211_FCTL_PROTECTED;
-               hdr->frame_ctl = cpu_to_le16(fc);
+               hdr->frame_control = cpu_to_le16(fc);
        } else if (local->drop_unencrypted &&
-                  WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
+                  ieee80211_is_data(hdr->frame_control) &&
                   meta->ethertype != ETH_P_PAE) {
                if (net_ratelimit()) {
                        printk(KERN_DEBUG "%s: dropped unencrypted TX data "
 
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/random.h>
+#include <linux/if_arp.h>
 
 #include "hostap_wlan.h"
 #include "hostap.h"
 static void hostap_ap_tx_cb(struct sk_buff *skb, int ok, void *data)
 {
        struct ap_data *ap = data;
-       u16 fc;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
 
        if (!ap->local->hostapd || !ap->local->apdev) {
                dev_kfree_skb(skb);
                return;
        }
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-
        /* Pass the TX callback frame to the hostapd; use 802.11 header version
         * 1 to indicate failure (no ACK) and 2 success (frame ACKed) */
 
-       fc &= ~IEEE80211_FCTL_VERS;
-       fc |= ok ? BIT(1) : BIT(0);
-       hdr->frame_ctl = cpu_to_le16(fc);
+       hdr = (struct ieee80211_hdr *) skb->data;
+       hdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_VERS);
+       hdr->frame_control |= cpu_to_le16(ok ? BIT(1) : BIT(0));
 
        skb->dev = ap->local->apdev;
-       skb_pull(skb, hostap_80211_get_hdrlen(fc));
+       skb_pull(skb, hostap_80211_get_hdrlen(hdr->frame_control));
        skb->pkt_type = PACKET_OTHERHOST;
        skb->protocol = cpu_to_be16(ETH_P_802_2);
        memset(skb->cb, 0, sizeof(skb->cb));
 {
        struct ap_data *ap = data;
        struct net_device *dev = ap->local->dev;
-       struct ieee80211_hdr_4addr *hdr;
-       u16 fc, auth_alg, auth_transaction, status;
+       struct ieee80211_hdr *hdr;
+       u16 auth_alg, auth_transaction, status;
        __le16 *pos;
        struct sta_info *sta = NULL;
        char *txt = NULL;
                return;
        }
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-       if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT ||
-           WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_AUTH ||
+       hdr = (struct ieee80211_hdr *) skb->data;
+       if (!ieee80211_is_auth(hdr->frame_control) ||
            skb->len < IEEE80211_MGMT_HDR_LEN + 6) {
                printk(KERN_DEBUG "%s: hostap_ap_tx_cb_auth received invalid "
                       "frame\n", dev->name);
 {
        struct ap_data *ap = data;
        struct net_device *dev = ap->local->dev;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u16 fc, status;
        __le16 *pos;
        struct sta_info *sta = NULL;
                return;
        }
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-       if (WLAN_FC_GET_TYPE(fc) != IEEE80211_FTYPE_MGMT ||
-           (WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_ASSOC_RESP &&
-            WLAN_FC_GET_STYPE(fc) != IEEE80211_STYPE_REASSOC_RESP) ||
+       hdr = (struct ieee80211_hdr *) skb->data;
+       fc = le16_to_cpu(hdr->frame_control);
+       if ((!ieee80211_is_assoc_resp(hdr->frame_control) &&
+            !ieee80211_is_reassoc_resp(hdr->frame_control)) ||
            skb->len < IEEE80211_MGMT_HDR_LEN + 4) {
                printk(KERN_DEBUG "%s: hostap_ap_tx_cb_assoc received invalid "
                       "frame\n", dev->name);
 static void hostap_ap_tx_cb_poll(struct sk_buff *skb, int ok, void *data)
 {
        struct ap_data *ap = data;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        struct sta_info *sta;
 
        if (skb->len < 24)
                goto fail;
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
        if (ok) {
                spin_lock(&ap->sta_table_lock);
                sta = ap_get_sta(ap, hdr->addr1);
 {
        struct hostap_interface *iface;
        local_info_t *local;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        u16 fc;
        struct sk_buff *skb;
        struct hostap_skb_tx_data *meta;
        }
 
        fc = type_subtype;
-       hdrlen = hostap_80211_get_hdrlen(fc);
-       hdr = (struct ieee80211_hdr_4addr *) skb_put(skb, hdrlen);
+       hdrlen = hostap_80211_get_hdrlen(cpu_to_le16(type_subtype));
+       hdr = (struct ieee80211_hdr *) skb_put(skb, hdrlen);
        if (body)
                memcpy(skb_put(skb, body_len), body, body_len);
 
 
 
        memcpy(hdr->addr1, addr, ETH_ALEN); /* DA / RA */
-       if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) {
+       if (ieee80211_is_data(hdr->frame_control)) {
                fc |= IEEE80211_FCTL_FROMDS;
                memcpy(hdr->addr2, dev->dev_addr, ETH_ALEN); /* BSSID */
                memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* SA */
-       } else if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_CTL) {
+       } else if (ieee80211_is_ctl(hdr->frame_control)) {
                /* control:ACK does not have addr2 or addr3 */
                memset(hdr->addr2, 0, ETH_ALEN);
                memset(hdr->addr3, 0, ETH_ALEN);
                memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* BSSID */
        }
 
-       hdr->frame_ctl = cpu_to_le16(fc);
+       hdr->frame_control = cpu_to_le16(fc);
 
        meta = (struct hostap_skb_tx_data *) skb->cb;
        memset(meta, 0, sizeof(*meta));
                          struct hostap_80211_rx_status *rx_stats)
 {
        struct net_device *dev = local->dev;
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        size_t hdrlen;
        struct ap_data *ap = local->ap;
        char body[8 + WLAN_AUTH_CHALLENGE_LEN], *challenge = NULL;
        int len, olen;
        u16 auth_alg, auth_transaction, status_code;
        __le16 *pos;
-       u16 resp = WLAN_STATUS_SUCCESS, fc;
+       u16 resp = WLAN_STATUS_SUCCESS;
        struct sta_info *sta = NULL;
        struct lib80211_crypt_data *crypt;
        char *txt = "";
 
        len = skb->len - IEEE80211_MGMT_HDR_LEN;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
-       hdrlen = hostap_80211_get_hdrlen(fc);
+       hdrlen = hostap_80211_get_hdrlen(hdr->frame_control);
 
        if (len < 6) {
                PDEBUG(DEBUG_AP, "%s: handle_authen - too short payload "
                            challenge == NULL ||
                            memcmp(sta->u.sta.challenge, challenge,
                                   WLAN_AUTH_CHALLENGE_LEN) != 0 ||
-                           !(fc & IEEE80211_FCTL_PROTECTED)) {
+                           !ieee80211_has_protected(hdr->frame_control)) {
                                txt = "challenge response incorrect";
                                resp = WLAN_STATUS_CHALLENGE_FAIL;
                                goto fail;
                       "trans#=%d stat=%d len=%d fc=%04x) ==> %d (%s)\n",
                       dev->name, hdr->addr2,
                       auth_alg, auth_transaction, status_code, len,
-                      fc, resp, txt);
+                      le16_to_cpu(hdr->frame_control), resp, txt);
        }
 }
 
                         struct hostap_80211_rx_status *rx_stats, int reassoc)
 {
        struct net_device *dev = local->dev;
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        char body[12], *p, *lpos;
        int len, left;
        __le16 *pos;
                          struct hostap_80211_rx_status *rx_stats)
 {
        struct net_device *dev = local->dev;
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        char *body = (char *) (skb->data + IEEE80211_MGMT_HDR_LEN);
        int len;
        u16 reason_code;
                            struct hostap_80211_rx_status *rx_stats)
 {
        struct net_device *dev = local->dev;
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        char *body = skb->data + IEEE80211_MGMT_HDR_LEN;
        int len;
        u16 reason_code;
 
 /* Called only as a scheduled task for pending AP frames. */
 static void ap_handle_data_nullfunc(local_info_t *local,
-                                   struct ieee80211_hdr_4addr *hdr)
+                                   struct ieee80211_hdr *hdr)
 {
        struct net_device *dev = local->dev;
 
 
 /* Called only as a scheduled task for pending AP frames. */
 static void ap_handle_dropped_data(local_info_t *local,
-                                  struct ieee80211_hdr_4addr *hdr)
+                                  struct ieee80211_hdr *hdr)
 {
        struct net_device *dev = local->dev;
        struct sta_info *sta;
 
 /* Called only as a scheduled task for pending AP frames. */
 static void handle_pspoll(local_info_t *local,
-                         struct ieee80211_hdr_4addr *hdr,
+                         struct ieee80211_hdr *hdr,
                          struct hostap_80211_rx_status *rx_stats)
 {
        struct net_device *dev = local->dev;
        struct sk_buff *skb;
 
        PDEBUG(DEBUG_PS2, "handle_pspoll: BSSID=%pM, TA=%pM PWRMGT=%d\n",
-              hdr->addr1, hdr->addr2,
-              !!(le16_to_cpu(hdr->frame_ctl) & IEEE80211_FCTL_PM));
+              hdr->addr1, hdr->addr2, !!ieee80211_has_pm(hdr->frame_control));
 
        if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
                PDEBUG(DEBUG_AP,
 static void handle_beacon(local_info_t *local, struct sk_buff *skb,
                          struct hostap_80211_rx_status *rx_stats)
 {
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
        char *body = skb->data + IEEE80211_MGMT_HDR_LEN;
        int len, left;
        u16 beacon_int, capability;
        struct net_device *dev = local->dev;
 #endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
        u16 fc, type, stype;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
 
        /* FIX: should give skb->len to handler functions and check that the
         * buffer is long enough */
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-       type = WLAN_FC_GET_TYPE(fc);
-       stype = WLAN_FC_GET_STYPE(fc);
+       hdr = (struct ieee80211_hdr *) skb->data;
+       fc = le16_to_cpu(hdr->frame_control);
+       type = fc & IEEE80211_FCTL_FTYPE;
+       stype = fc & IEEE80211_FCTL_STYPE;
 
 #ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
        if (!local->hostapd && type == IEEE80211_FTYPE_DATA) {
 {
        struct hostap_interface *iface;
        local_info_t *local;
-       u16 fc;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
 
        iface = netdev_priv(dev);
        local = iface->local;
 
        local->stats.rx_packets++;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
+       hdr = (struct ieee80211_hdr *) skb->data;
 
        if (local->ap->ap_policy == AP_OTHER_AP_SKIP_ALL &&
-           WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_MGMT &&
-           WLAN_FC_GET_STYPE(fc) == IEEE80211_STYPE_BEACON)
+           ieee80211_is_beacon(hdr->frame_control))
                goto drop;
 
        skb->protocol = cpu_to_be16(ETH_P_HOSTAP);
 static void schedule_packet_send(local_info_t *local, struct sta_info *sta)
 {
        struct sk_buff *skb;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        struct hostap_80211_rx_status rx_stats;
 
        if (skb_queue_empty(&sta->tx_buf))
                return;
        }
 
-       hdr = (struct ieee80211_hdr_4addr *) skb_put(skb, 16);
+       hdr = (struct ieee80211_hdr *) skb_put(skb, 16);
 
        /* Generate a fake pspoll frame to start packet delivery */
-       hdr->frame_ctl = cpu_to_le16(
+       hdr->frame_control = cpu_to_le16(
                IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
        memcpy(hdr->addr1, local->dev->dev_addr, ETH_ALEN);
        memcpy(hdr->addr2, sta->addr, ETH_ALEN);
        struct sta_info *sta = NULL;
        struct sk_buff *skb = tx->skb;
        int set_tim, ret;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        struct hostap_skb_tx_data *meta;
 
        meta = (struct hostap_skb_tx_data *) skb->cb;
            meta->iface->type == HOSTAP_INTERFACE_STA)
                goto out;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
 
        if (hdr->addr1[0] & 0x01) {
                /* broadcast/multicast frame - no AP related processing */
 
        if (meta->flags & HOSTAP_TX_FLAGS_ADD_MOREDATA) {
                /* indicate to STA that more frames follow */
-               hdr->frame_ctl |=
+               hdr->frame_control |=
                        cpu_to_le16(IEEE80211_FCTL_MOREDATA);
        }
 
 void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb)
 {
        struct sta_info *sta;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
        struct hostap_skb_tx_data *meta;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
        meta = (struct hostap_skb_tx_data *) skb->cb;
 
        spin_lock(&local->ap->sta_table_lock);
 
 
 /* Called only as a tasklet (software IRQ). Called for each RX frame to update
- * STA power saving state. pwrmgt is a flag from 802.11 frame_ctl field. */
-int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr_4addr *hdr)
+ * STA power saving state. pwrmgt is a flag from 802.11 frame_control field. */
+int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr *hdr)
 {
        struct sta_info *sta;
        u16 fc;
        if (!sta)
                return -1;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
+       fc = le16_to_cpu(hdr->frame_control);
        hostap_update_sta_ps2(local, sta, fc & IEEE80211_FCTL_PM,
-                             WLAN_FC_GET_TYPE(fc), WLAN_FC_GET_STYPE(fc));
+                             fc & IEEE80211_FCTL_FTYPE,
+                             fc & IEEE80211_FCTL_STYPE);
 
        atomic_dec(&sta->users);
        return 0;
        int ret;
        struct sta_info *sta;
        u16 fc, type, stype;
-       struct ieee80211_hdr_4addr *hdr;
+       struct ieee80211_hdr *hdr;
 
        if (local->ap == NULL)
                return AP_RX_CONTINUE;
 
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
+       hdr = (struct ieee80211_hdr *) skb->data;
 
-       fc = le16_to_cpu(hdr->frame_ctl);
-       type = WLAN_FC_GET_TYPE(fc);
-       stype = WLAN_FC_GET_STYPE(fc);
+       fc = le16_to_cpu(hdr->frame_control);
+       type = fc & IEEE80211_FCTL_FTYPE;
+       stype = fc & IEEE80211_FCTL_STYPE;
 
        spin_lock(&local->ap->sta_table_lock);
        sta = ap_get_sta(local->ap, hdr->addr2);
 
 /* Called only as a tasklet (software IRQ) */
 int hostap_handle_sta_crypto(local_info_t *local,
-                            struct ieee80211_hdr_4addr *hdr,
+                            struct ieee80211_hdr *hdr,
                             struct lib80211_crypt_data **crypt,
                             void **sta_ptr)
 {
 
 /* Called only as a tasklet (software IRQ) */
 int hostap_update_rx_stats(struct ap_data *ap,
-                          struct ieee80211_hdr_4addr *hdr,
+                          struct ieee80211_hdr *hdr,
                           struct hostap_80211_rx_status *rx_stats)
 {
        struct sta_info *sta;
 
 ap_tx_ret hostap_handle_sta_tx(local_info_t *local, struct hostap_tx_data *tx);
 void hostap_handle_sta_release(void *ptr);
 void hostap_handle_sta_tx_exc(local_info_t *local, struct sk_buff *skb);
-int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr_4addr *hdr);
+int hostap_update_sta_ps(local_info_t *local, struct ieee80211_hdr *hdr);
 typedef enum {
        AP_RX_CONTINUE, AP_RX_DROP, AP_RX_EXIT, AP_RX_CONTINUE_NOT_AUTHORIZED
 } ap_rx_ret;
                               struct sk_buff *skb,
                               struct hostap_80211_rx_status *rx_stats,
                               int wds);
-int hostap_handle_sta_crypto(local_info_t *local, struct ieee80211_hdr_4addr *hdr,
+int hostap_handle_sta_crypto(local_info_t *local, struct ieee80211_hdr *hdr,
                             struct lib80211_crypt_data **crypt,
                             void **sta_ptr);
 int hostap_is_sta_assoc(struct ap_data *ap, u8 *sta_addr);
 int hostap_is_sta_authorized(struct ap_data *ap, u8 *sta_addr);
 int hostap_add_sta(struct ap_data *ap, u8 *sta_addr);
-int hostap_update_rx_stats(struct ap_data *ap, struct ieee80211_hdr_4addr *hdr,
+int hostap_update_rx_stats(struct ap_data *ap, struct ieee80211_hdr *hdr,
                           struct hostap_80211_rx_status *rx_stats);
 void hostap_update_rates(local_info_t *local);
 void hostap_add_wds_links(local_info_t *local);
 
 #include <linux/rtnetlink.h>
 #include <linux/wireless.h>
 #include <net/iw_handler.h>
-#include <net/ieee80211.h>
 #include <net/lib80211.h>
 #include <asm/irq.h>
 
        hdr_len = 24;
        skb_copy_from_linear_data(skb, &txdesc.frame_control, hdr_len);
        fc = le16_to_cpu(txdesc.frame_control);
-       if (WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA &&
-           (fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS) &&
+       if (ieee80211_is_data(txdesc.frame_control) &&
+           ieee80211_has_a4(txdesc.frame_control) &&
            skb->len >= 30) {
                /* Addr4 */
                skb_copy_from_linear_data_offset(skb, hdr_len, txdesc.addr4,
        stats.rate = rxdesc->rate;
 
        /* Convert Prism2 RX structure into IEEE 802.11 header */
-       hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(rxdesc->frame_control));
+       hdrlen = hostap_80211_get_hdrlen(rxdesc->frame_control);
        if (hdrlen > rx_hdrlen)
                hdrlen = rx_hdrlen;
 
                return;
        }
 
-       hdrlen = hostap_80211_get_hdrlen(le16_to_cpu(txdesc->frame_control));
+       hdrlen = hostap_80211_get_hdrlen(txdesc->frame_control);
        len = le16_to_cpu(txdesc->data_len);
        skb = dev_alloc_skb(hdrlen + len);
        if (skb == NULL) {
                if (skb->len >= sizeof(*txdesc)) {
                        /* Convert Prism2 RX structure into IEEE 802.11 header
                         */
-                       u16 fc = le16_to_cpu(txdesc->frame_control);
-                       int hdrlen = hostap_80211_get_hdrlen(fc);
+                       int hdrlen = hostap_80211_get_hdrlen(txdesc->frame_control);
                        memmove(skb_pull(skb, sizeof(*txdesc) - hdrlen),
                                &txdesc->frame_control, hdrlen);
 
        PDEBUG(DEBUG_EXTRA, "   retry_count=%d tx_rate=%d fc=0x%04x "
               "(%s%s%s::%d%s%s)\n",
               txdesc.retry_count, txdesc.tx_rate, fc,
-              WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_MGMT ? "Mgmt" : "",
-              WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_CTL ? "Ctrl" : "",
-              WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA ? "Data" : "",
-              WLAN_FC_GET_STYPE(fc) >> 4,
-              fc & IEEE80211_FCTL_TODS ? " ToDS" : "",
-              fc & IEEE80211_FCTL_FROMDS ? " FromDS" : "");
+              ieee80211_is_mgmt(txdesc.frame_control) ? "Mgmt" : "",
+              ieee80211_is_ctl(txdesc.frame_control) ? "Ctrl" : "",
+              ieee80211_is_data(txdesc.frame_control) ? "Data" : "",
+              (fc & IEEE80211_FCTL_STYPE) >> 4,
+              ieee80211_has_tods(txdesc.frame_control) ? " ToDS" : "",
+              ieee80211_has_fromds(txdesc.frame_control) ? " FromDS" : "");
        PDEBUG(DEBUG_EXTRA, "   A1=%pM A2=%pM A3=%pM A4=%pM\n",
               txdesc.addr1, txdesc.addr2,
               txdesc.addr3, txdesc.addr4);
 
 /* Host AP driver Info Frame processing (part of hostap.o module) */
 
+#include <linux/if_arp.h>
 #include "hostap_wlan.h"
 #include "hostap.h"
 #include "hostap_ap.h"
 
 
 #include <linux/types.h>
 #include <linux/ethtool.h>
+#include <linux/if_arp.h>
 #include <net/lib80211.h>
 
 #include "hostap_wlan.h"
 
 #include <linux/etherdevice.h>
 #include <net/net_namespace.h>
 #include <net/iw_handler.h>
-#include <net/ieee80211.h>
 #include <net/lib80211.h>
 #include <asm/uaccess.h>
 
        fc = __le16_to_cpu(rx->frame_control);
        printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
               "data_len=%d%s%s\n",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              fc, (fc & IEEE80211_FCTL_FTYPE) >> 2,
+              (fc & IEEE80211_FCTL_STYPE) >> 4,
               __le16_to_cpu(rx->duration_id), __le16_to_cpu(rx->seq_ctrl),
               __le16_to_cpu(rx->data_len),
               fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
        fc = __le16_to_cpu(tx->frame_control);
        printk(KERN_DEBUG "   FC=0x%04x (type=%d:%d) dur=0x%04x seq=0x%04x "
               "data_len=%d%s%s\n",
-              fc, WLAN_FC_GET_TYPE(fc) >> 2, WLAN_FC_GET_STYPE(fc) >> 4,
+              fc, (fc & IEEE80211_FCTL_FTYPE) >> 2,
+              (fc & IEEE80211_FCTL_STYPE) >> 4,
               __le16_to_cpu(tx->duration_id), __le16_to_cpu(tx->seq_ctrl),
               __le16_to_cpu(tx->data_len),
               fc & IEEE80211_FCTL_TODS ? " [ToDS]" : "",
 }
 
 
-int hostap_80211_get_hdrlen(u16 fc)
+int hostap_80211_get_hdrlen(__le16 fc)
 {
-       int hdrlen = 24;
-
-       switch (WLAN_FC_GET_TYPE(fc)) {
-       case IEEE80211_FTYPE_DATA:
-               if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
-                       hdrlen = 30; /* Addr4 */
-               break;
-       case IEEE80211_FTYPE_CTL:
-               switch (WLAN_FC_GET_STYPE(fc)) {
-               case IEEE80211_STYPE_CTS:
-               case IEEE80211_STYPE_ACK:
-                       hdrlen = 10;
-                       break;
-               default:
-                       hdrlen = 16;
-                       break;
-               }
-               break;
-       }
-
-       return hdrlen;
+       if (ieee80211_is_data(fc) && ieee80211_has_a4 (fc))
+               return 30; /* Addr4 */
+       else if (ieee80211_is_cts(fc) || ieee80211_is_ack(fc))
+               return 10;
+       else if (ieee80211_is_ctl(fc))
+               return 16;
+
+       return 24;
 }