aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas
diff options
context:
space:
mode:
authorJavier Cardona <javier@cozybit.com>2008-09-11 18:32:50 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-09-15 16:48:25 -0400
commit9c31fd635ddfae6eb61712491770befa2ce1fdde (patch)
tree9321ed2597668e02093798e635c4613891f94fcf /drivers/net/wireless/libertas
parentbed7aac9416f50425d2200df32bcc9bf248ff8cb (diff)
libertas: Reduce the WPA key installation time.
WPA requires that the PTK is installed immediately after the 4-way handshake in order to properly decrypt the subsequent incoming EAPOL-GTK frame. If the PTK is not enabled by the time the EAPOL-GTK frame arrives, the frame is dropped and the supplicant does not receive the group key. This will happen with fast Access Points that send the EAPOL-GTK frame before the suplicant has successfully installed and enabled the PTK. To mitigate this situation, this patch simplifies and accelerates the SIOCSIWENCODEEXT execution. This patch resolves OLPC ticket 7825 (http://dev.laptop.org/ticket/7825) Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas')
-rw-r--r--drivers/net/wireless/libertas/wext.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index d86fcf0a5ad5..1156be53df3f 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -30,6 +30,14 @@ static inline void lbs_postpone_association_work(struct lbs_private *priv)
30 queue_delayed_work(priv->work_thread, &priv->assoc_work, HZ / 2); 30 queue_delayed_work(priv->work_thread, &priv->assoc_work, HZ / 2);
31} 31}
32 32
33static inline void lbs_do_association_work(struct lbs_private *priv)
34{
35 if (priv->surpriseremoved)
36 return;
37 cancel_delayed_work(&priv->assoc_work);
38 queue_delayed_work(priv->work_thread, &priv->assoc_work, 0);
39}
40
33static inline void lbs_cancel_association_work(struct lbs_private *priv) 41static inline void lbs_cancel_association_work(struct lbs_private *priv)
34{ 42{
35 cancel_delayed_work(&priv->assoc_work); 43 cancel_delayed_work(&priv->assoc_work);
@@ -1585,12 +1593,14 @@ static int lbs_set_encodeext(struct net_device *dev,
1585 set_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags); 1593 set_bit(ASSOC_FLAG_SECINFO, &assoc_req->flags);
1586 } 1594 }
1587 1595
1588 disable_wep (assoc_req); 1596 /* Only disable wep if necessary: can't waste time here. */
1597 if (priv->mac_control & CMD_ACT_MAC_WEP_ENABLE)
1598 disable_wep(assoc_req);
1589 } 1599 }
1590 1600
1591out: 1601out:
1592 if (ret == 0) { 1602 if (ret == 0) { /* key installation is time critical: postpone not! */
1593 lbs_postpone_association_work(priv); 1603 lbs_do_association_work(priv);
1594 } else { 1604 } else {
1595 lbs_cancel_association_work(priv); 1605 lbs_cancel_association_work(priv);
1596 } 1606 }