[802.11] Add rate control support; fix two bugs; remove high rate bits
[people/oremanj/gpxe.git] / src / include / gpxe / net80211.h
index b719db9..c233a8f 100644 (file)
@@ -5,6 +5,7 @@
 #include <gpxe/ieee80211.h>
 #include <gpxe/iobuf.h>
 #include <gpxe/netdevice.h>
+#include <gpxe/rc80211.h>
 
 /** @file
  * The gPXE 802.11 MAC layer.
@@ -198,9 +199,26 @@ enum net80211_crypto_alg {
 /** Whether the auto-association task is waiting for a reply from the AP */
 #define NET80211_WAITING        (1 << 13)
 
-/** Whether the auto-association task should be suppressed */
+/** Whether the auto-association task should be suppressed
+ *
+ * This is set by the `iwlist' command so that it can open the device
+ * without starting another probe process that will interfere with its
+ * own.
+ */
 #define NET80211_NO_ASSOC      (1 << 14)
 
+/** Whether this association was performed using a broadcast SSID
+ *
+ * If the user opened this device without netX/ssid set, the device's
+ * SSID will be set to that of the network it chooses to associate
+ * with, but the netX/ssid setting will remain blank. If we don't
+ * remember that we started from no specified SSID, it will appear
+ * every time settings are updated (e.g. after DHCP) that we need to
+ * reassociate due to the change.
+ */
+#define NET80211_AUTO_SSID     (1 << 15)
+
+
 /** @} */
 
 
@@ -235,21 +253,6 @@ enum net80211_crypto_alg {
 /** @} */
 
 
-/** @defgroup net80211_ratedefs 802.11 layer rate flags */
-/** @{ */
-
-/** Get rate (in 100 kbps) from a ratecode */
-#define NET80211_RATE_VALUE(r) ((r) & 0x3fff)
-
-/** Rate flag 1 (reserved) */
-#define NET80211_RATE_FLAG1    0x8000
-
-/** Rate flag 2 (reserved) */
-#define NET80211_RATE_FLAG2    0x4000
-
-/** @} */
-
-
 /** The maximum number of TX rates we allow to be configured simultaneously */
 #define NET80211_MAX_RATES     16
 
@@ -650,9 +653,7 @@ struct net80211_device
 
        /** A list of all possible TX rates we might use
         *
-        * Rates are in units of 100 kbps. We reserve two bits for
-        * future flags (e.g. for 802.11n), meaning we can represent
-        * rates up to 1.6 Gbps.
+        * Rates are in units of 100 kbps.
         */
        u16 rates[NET80211_MAX_RATES];
 
@@ -750,7 +751,7 @@ struct net80211_device
         * To prevent association when opening the device, user code
         * can set the NET80211_NO_ASSOC bit.
         */
-       short state;
+       u16 state;
 
        /** gPXE error code associated with @c state */
        int assoc_rc;
@@ -789,6 +790,9 @@ struct net80211_device
        /** Signal strength of last received packet */
        int last_signal;
 
+       /** Rate control state */
+       struct rc80211_ctx *rctl;
+
        /* ---------- Packet handling state ---------- */
 
        /** Fragment reassembly state */
@@ -896,8 +900,9 @@ struct net80211_wlan
 /* Associate with the best or user-specified network: */
 void net80211_autoassociate ( struct net80211_device *dev );
 
-/* Change channel: */
+/* Set physical-layer parameters: */
 int net80211_change_channel ( struct net80211_device *dev, int channel );
+void net80211_set_rate_idx ( struct net80211_device *dev, int rate );
 
 /* Find networks: */
 struct net80211_probe_ctx * net80211_probe_start ( struct net80211_device *dev,
@@ -936,7 +941,7 @@ int net80211_register ( struct net80211_device *dev,
                        struct net80211_device_operations *ops,
                        struct net80211_hw_info *hw );
 void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
-                  int signal );
+                  int signal, u16 rate );
 void net80211_rx_err ( struct net80211_device *dev,
                       struct io_buffer *iob, int rc );
 void net80211_tx_complete ( struct net80211_device *dev,