]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/mac80211/ieee80211_i.h
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / net / mac80211 / ieee80211_i.h
index b80c386899276dd436ebc93caab1957622389be5..533fd32f49fff23aff77b5faa45b87a07d19d5f9 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/types.h>
 #include <linux/spinlock.h>
 #include <linux/etherdevice.h>
+#include <linux/leds.h>
 #include <net/ieee80211_radiotap.h>
 #include <net/cfg80211.h>
 #include <net/mac80211.h>
@@ -167,6 +168,7 @@ typedef unsigned __bitwise__ ieee80211_rx_result;
  * @IEEE80211_RX_FRAGMENTED: fragmented frame
  * @IEEE80211_RX_AMSDU: a-MSDU packet
  * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed
+ * @IEEE80211_RX_DEFERRED_RELEASE: frame was subjected to receive reordering
  *
  * These are per-frame flags that are attached to a frame in the
  * @rx_flags field of &struct ieee80211_rx_status.
@@ -177,6 +179,7 @@ enum ieee80211_packet_rx_flags {
        IEEE80211_RX_FRAGMENTED                 = BIT(2),
        IEEE80211_RX_AMSDU                      = BIT(3),
        IEEE80211_RX_MALFORMED_ACTION_FRM       = BIT(4),
+       IEEE80211_RX_DEFERRED_RELEASE           = BIT(5),
 };
 
 /**
@@ -260,6 +263,7 @@ enum ieee80211_work_type {
        IEEE80211_WORK_ASSOC_BEACON_WAIT,
        IEEE80211_WORK_ASSOC,
        IEEE80211_WORK_REMAIN_ON_CHANNEL,
+       IEEE80211_WORK_OFFCHANNEL_TX,
 };
 
 /**
@@ -320,6 +324,10 @@ struct ieee80211_work {
                struct {
                        u32 duration;
                } remain;
+               struct {
+                       struct sk_buff *frame;
+                       u32 wait;
+               } offchan_tx;
        };
 
        int ie_len;
@@ -349,8 +357,10 @@ struct ieee80211_if_managed {
        struct work_struct chswitch_work;
        struct work_struct beacon_connection_loss_work;
 
+       unsigned long beacon_timeout;
        unsigned long probe_timeout;
        int probe_send_count;
+       bool nullfunc_failed;
 
        struct mutex mtx;
        struct cfg80211_bss *associated;
@@ -477,6 +487,8 @@ struct ieee80211_if_mesh {
        struct mesh_config mshcfg;
        u32 mesh_seqnum;
        bool accepting_plinks;
+       const u8 *vendor_ie;
+       u8 vendor_ie_len;
 };
 
 #ifdef CONFIG_MAC80211_MESH
@@ -550,7 +562,7 @@ struct ieee80211_sub_if_data {
        unsigned int fragment_next;
 
        struct ieee80211_key *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS];
-       struct ieee80211_key *default_key;
+       struct ieee80211_key *default_unicast_key, *default_multicast_key;
        struct ieee80211_key *default_mgmt_key;
 
        u16 sequence_number;
@@ -578,9 +590,7 @@ struct ieee80211_sub_if_data {
                struct ieee80211_if_vlan vlan;
                struct ieee80211_if_managed mgd;
                struct ieee80211_if_ibss ibss;
-#ifdef CONFIG_MAC80211_MESH
                struct ieee80211_if_mesh mesh;
-#endif
                u32 mntr_flags;
        } u;
 
@@ -588,7 +598,8 @@ struct ieee80211_sub_if_data {
        struct {
                struct dentry *dir;
                struct dentry *subdir_stations;
-               struct dentry *default_key;
+               struct dentry *default_unicast_key;
+               struct dentry *default_multicast_key;
                struct dentry *default_mgmt_key;
        } debugfs;
 #endif
@@ -602,19 +613,6 @@ struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p)
        return container_of(p, struct ieee80211_sub_if_data, vif);
 }
 
-static inline void
-ieee80211_sdata_set_mesh_id(struct ieee80211_sub_if_data *sdata,
-                           u8 mesh_id_len, u8 *mesh_id)
-{
-#ifdef CONFIG_MAC80211_MESH
-       struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-       ifmsh->mesh_id_len = mesh_id_len;
-       memcpy(ifmsh->mesh_id, mesh_id, mesh_id_len);
-#else
-       WARN_ON(1);
-#endif
-}
-
 enum sdata_queue_type {
        IEEE80211_SDATA_QUEUE_TYPE_FRAME        = 0,
        IEEE80211_SDATA_QUEUE_AGG_START         = 1,
@@ -635,6 +633,20 @@ enum queue_stop_reason {
        IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 };
 
+#ifdef CONFIG_MAC80211_LEDS
+struct tpt_led_trigger {
+       struct led_trigger trig;
+       char name[32];
+       const struct ieee80211_tpt_blink *blink_table;
+       unsigned int blink_table_len;
+       struct timer_list timer;
+       unsigned long prev_traffic;
+       unsigned long tx_bytes, rx_bytes;
+       unsigned int active, want;
+       bool running;
+};
+#endif
+
 /**
  * mac80211 scan flags - currently active scan mode
  *
@@ -764,6 +776,15 @@ struct ieee80211_local {
        struct sk_buff_head skb_queue;
        struct sk_buff_head skb_queue_unreliable;
 
+       /*
+        * Internal FIFO queue which is shared between multiple rx path
+        * stages. Its main task is to provide a serialization mechanism,
+        * so all rx handlers can enjoy having exclusive access to their
+        * private data structures.
+        */
+       struct sk_buff_head rx_skb_queue;
+       bool running_rx_handler;        /* protected by rx_skb_queue.lock */
+
        /* Station data */
        /*
         * The mutex only protects the list and counter,
@@ -843,6 +864,7 @@ struct ieee80211_local {
 #ifdef CONFIG_MAC80211_LEDS
        int tx_led_counter, rx_led_counter;
        struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led;
+       struct tpt_led_trigger *tpt_led_trigger;
        char tx_led_name[32], rx_led_name[32],
             assoc_led_name[32], radio_led_name[32];
 #endif
@@ -929,6 +951,15 @@ struct ieee80211_local {
        } debugfs;
 #endif
 
+       struct ieee80211_channel *hw_roc_channel;
+       struct net_device *hw_roc_dev;
+       struct sk_buff *hw_roc_skb, *hw_roc_skb_for_status;
+       struct work_struct hw_roc_start, hw_roc_done;
+       enum nl80211_channel_type hw_roc_channel_type;
+       unsigned int hw_roc_duration;
+       u32 hw_roc_cookie;
+       bool hw_roc_for_tx;
+
        /* dummy netdev for use w/ NAPI */
        struct net_device napi_dev;
 
@@ -1120,6 +1151,7 @@ void ieee80211_offchannel_stop_beaconing(struct ieee80211_local *local);
 void ieee80211_offchannel_stop_station(struct ieee80211_local *local);
 void ieee80211_offchannel_return(struct ieee80211_local *local,
                                 bool enable_beaconing);
+void ieee80211_hw_roc_setup(struct ieee80211_local *local);
 
 /* interface handling */
 int ieee80211_iface_init(void);
@@ -1264,6 +1296,8 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
                             int powersave);
 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
                             struct ieee80211_hdr *hdr);
+void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
+                            struct ieee80211_hdr *hdr, bool ack);
 void ieee80211_beacon_connection_loss_work(struct work_struct *work);
 
 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
@@ -1278,6 +1312,9 @@ void ieee80211_add_pending_skb(struct ieee80211_local *local,
                               struct sk_buff *skb);
 int ieee80211_add_pending_skbs(struct ieee80211_local *local,
                               struct sk_buff_head *skbs);
+int ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
+                                 struct sk_buff_head *skbs,
+                                 void (*fn)(void *data), void *data);
 
 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
                         u16 transaction, u16 auth_alg,
@@ -1287,6 +1324,10 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
                             const u8 *ie, size_t ie_len,
                             enum ieee80211_band band, u32 rate_mask,
                             u8 channel);
+struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
+                                         u8 *dst,
+                                         const u8 *ssid, size_t ssid_len,
+                                         const u8 *ie, size_t ie_len);
 void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
                              const u8 *ssid, size_t ssid_len,
                              const u8 *ie, size_t ie_len);