linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] mac80211: send the Auth frame in IBSS
@ 2012-01-12 20:36 Antonio Quartulli
  2012-01-12 20:36 ` [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion Antonio Quartulli
  0 siblings, 1 reply; 4+ messages in thread
From: Antonio Quartulli @ 2012-01-12 20:36 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Johannes Berg, Antonio Quartulli

Now in IBSS mode, each station sends a Auth frame each time it finds a new
station that is joining the IBSS

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
---

This patch is based on the not yet committed patch
"mac80211: fix IBSS auth frame DA"


 net/mac80211/ibss.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 9b70689..a7564e3 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -289,6 +289,14 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
 		    addr, sdata->name);
 #endif
 
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
+	printk(KERN_DEBUG "TX Auth SA=%pM DA=%pM BSSID=%pM"
+	       "(auth_transaction=1)\n", sdata->vif.addr,
+	       sdata->u.ibss.bssid, addr);
+#endif
+	ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
+			    addr, sdata->u.ibss.bssid, NULL, 0, 0);
+
 	sta_info_move_state(sta, IEEE80211_STA_AUTH);
 	sta_info_move_state(sta, IEEE80211_STA_ASSOC);
 	sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
-- 
1.7.3.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion
  2012-01-12 20:36 [PATCH 1/2] mac80211: send the Auth frame in IBSS Antonio Quartulli
@ 2012-01-12 20:36 ` Antonio Quartulli
  2012-01-12 20:50   ` Johannes Berg
  0 siblings, 1 reply; 4+ messages in thread
From: Antonio Quartulli @ 2012-01-12 20:36 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, Johannes Berg, Antonio Quartulli

In case of re-authentication of a node, in IBSS mode, the sta_info structure
corresponding to it is first destroyed and then reinserted. In this way its
internal state is reset.

This operation is helpful in case of a node being rebooted which is joining the
ad-hoc cell again before its purge timeout on the other nodes expires.

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
---
 net/mac80211/ibss.c |   94 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 57 insertions(+), 37 deletions(-)

diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index a7564e3..d80de75 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -35,32 +35,6 @@
 
 #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
 
-
-static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
-					struct ieee80211_mgmt *mgmt,
-					size_t len)
-{
-	u16 auth_alg, auth_transaction;
-
-	lockdep_assert_held(&sdata->u.ibss.mtx);
-
-	if (len < 24 + 6)
-		return;
-
-	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
-	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
-
-	/*
-	 * IEEE 802.11 standard does not require authentication in IBSS
-	 * networks and most implementations do not seem to use it.
-	 * However, try to reply to authentication attempts if someone
-	 * has actually implemented this.
-	 */
-	if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1)
-		ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0, mgmt->sa,
-				    sdata->u.ibss.bssid, NULL, 0, 0);
-}
-
 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 				      const u8 *bssid, const int beacon_int,
 				      struct ieee80211_channel *chan,
@@ -275,7 +249,8 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 				  cbss->tsf);
 }
 
-static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
+static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta,
+						  bool auth)
 	__acquires(RCU)
 {
 	struct ieee80211_sub_if_data *sdata = sta->sdata;
@@ -289,13 +264,15 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
 		    addr, sdata->name);
 #endif
 
+	if (auth) {
 #ifdef CONFIG_MAC80211_IBSS_DEBUG
-	printk(KERN_DEBUG "TX Auth SA=%pM DA=%pM BSSID=%pM"
-	       "(auth_transaction=1)\n", sdata->vif.addr,
-	       sdata->u.ibss.bssid, addr);
+		printk(KERN_DEBUG "TX Auth SA=%pM DA=%pM BSSID=%pM"
+		       "(auth_transaction=1)\n", sdata->vif.addr,
+		       sdata->u.ibss.bssid, addr);
 #endif
-	ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
-			    addr, sdata->u.ibss.bssid, NULL, 0, 0);
+		ieee80211_send_auth(sdata, 1, WLAN_AUTH_OPEN, NULL, 0,
+				    addr, sdata->u.ibss.bssid, NULL, 0, 0);
+	}
 
 	sta_info_move_state(sta, IEEE80211_STA_AUTH);
 	sta_info_move_state(sta, IEEE80211_STA_ASSOC);
@@ -312,7 +289,7 @@ static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
 static struct sta_info *
 ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
 		       const u8 *bssid, const u8 *addr,
-		       u32 supp_rates)
+		       u32 supp_rates, bool auth)
 	__acquires(RCU)
 {
 	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
@@ -354,7 +331,7 @@ ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
 	sta->sta.supp_rates[band] = supp_rates |
 			ieee80211_mandatory_rates(local, band);
 
-	return ieee80211_ibss_finish_sta(sta);
+	return ieee80211_ibss_finish_sta(sta, auth);
 }
 
 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
@@ -419,7 +396,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
 			} else {
 				rcu_read_unlock();
 				sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
-						mgmt->sa, supp_rates);
+						mgmt->sa, supp_rates, true);
 			}
 		}
 
@@ -547,7 +524,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
 		ieee80211_sta_join_ibss(sdata, bss);
 		supp_rates = ieee80211_sta_get_rates(local, elems, band);
 		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
-				       supp_rates);
+				       supp_rates, true);
 		rcu_read_unlock();
 	}
 
@@ -784,6 +761,49 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
 	}
 }
 
+static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
+					struct ieee80211_mgmt *mgmt,
+					size_t len)
+{
+	u16 auth_alg, auth_transaction;
+	size_t baselen;
+
+	lockdep_assert_held(&sdata->u.ibss.mtx);
+
+	if (len < 24 + 6)
+		return;
+
+	baselen = (u8 *) mgmt->u.auth.variable - (u8 *) mgmt;
+	if (baselen > len)
+		return;
+
+	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
+	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
+
+	if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1) {
+#ifdef CONFIG_MAC80211_IBSS_DEBUG
+		printk(KERN_DEBUG "%s: RX Auth SA=%pM DA=%pM BSSID=%pM."
+		       "(auth_transaction=%d)\n",
+		       sdata->name, mgmt->sa, mgmt->da, mgmt->bssid,
+		       auth_transaction);
+#endif
+		if (sta_info_destroy_addr(sdata, mgmt->sa) != -ENOENT) {
+			ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, 0,
+					       false);
+			rcu_read_unlock();
+		}
+
+		/*
+		 * IEEE 802.11 standard does not require authentication in IBSS
+		 * networks and most implementations do not seem to use it.
+		 * However, try to reply to authentication attempts if someone
+		 * has actually implemented this.
+		 */
+		ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
+				    mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0);
+	}
+}
+
 static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
 					struct sk_buff *req)
 {
@@ -952,7 +972,7 @@ void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
 		list_del(&sta->list);
 		spin_unlock_bh(&ifibss->incomplete_lock);
 
-		ieee80211_ibss_finish_sta(sta);
+		ieee80211_ibss_finish_sta(sta, true);
 		rcu_read_unlock();
 		spin_lock_bh(&ifibss->incomplete_lock);
 	}
-- 
1.7.3.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion
  2012-01-12 20:36 ` [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion Antonio Quartulli
@ 2012-01-12 20:50   ` Johannes Berg
  2012-01-12 21:37     ` Antonio Quartulli
  0 siblings, 1 reply; 4+ messages in thread
From: Johannes Berg @ 2012-01-12 20:50 UTC (permalink / raw)
  To: Antonio Quartulli; +Cc: John W. Linville, linux-wireless

On Thu, 2012-01-12 at 21:36 +0100, Antonio Quartulli wrote:

> +static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
> +					struct ieee80211_mgmt *mgmt,
> +					size_t len)
> +{
> +	u16 auth_alg, auth_transaction;
> +	size_t baselen;
> +
> +	lockdep_assert_held(&sdata->u.ibss.mtx);
> +
> +	if (len < 24 + 6)
> +		return;
> +
> +	baselen = (u8 *) mgmt->u.auth.variable - (u8 *) mgmt;
> +	if (baselen > len)
> +		return;
> +
> +	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
> +	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
> +
> +	if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1) {

negating & return would be easier to read & less indentation

> +#ifdef CONFIG_MAC80211_IBSS_DEBUG
> +		printk(KERN_DEBUG "%s: RX Auth SA=%pM DA=%pM BSSID=%pM."
> +		       "(auth_transaction=%d)\n",
> +		       sdata->name, mgmt->sa, mgmt->da, mgmt->bssid,
> +		       auth_transaction);
> +#endif
> +		if (sta_info_destroy_addr(sdata, mgmt->sa) != -ENOENT) {
> +			ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, 0,
> +					       false);
> +			rcu_read_unlock();
> +		}

This doesn't seem to make sense, why not add the station even if we
didn't know about it before?

johannes


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion
  2012-01-12 20:50   ` Johannes Berg
@ 2012-01-12 21:37     ` Antonio Quartulli
  0 siblings, 0 replies; 4+ messages in thread
From: Antonio Quartulli @ 2012-01-12 21:37 UTC (permalink / raw)
  To: Johannes Berg; +Cc: John W. Linville, linux-wireless

On Thu, Jan 12, 2012 at 09:50:51PM +0100, Johannes Berg wrote:
> On Thu, 2012-01-12 at 21:36 +0100, Antonio Quartulli wrote:
> 
> > +static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
> > +					struct ieee80211_mgmt *mgmt,
> > +					size_t len)
> > +{
> > +	u16 auth_alg, auth_transaction;
> > +	size_t baselen;
> > +
> > +	lockdep_assert_held(&sdata->u.ibss.mtx);
> > +
> > +	if (len < 24 + 6)
> > +		return;
> > +
> > +	baselen = (u8 *) mgmt->u.auth.variable - (u8 *) mgmt;
> > +	if (baselen > len)
> > +		return;
> > +
> > +	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
> > +	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
> > +
> > +	if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1) {
> 
> negating & return would be easier to read & less indentation

I agree :-)

> 
> > +#ifdef CONFIG_MAC80211_IBSS_DEBUG
> > +		printk(KERN_DEBUG "%s: RX Auth SA=%pM DA=%pM BSSID=%pM."
> > +		       "(auth_transaction=%d)\n",
> > +		       sdata->name, mgmt->sa, mgmt->da, mgmt->bssid,
> > +		       auth_transaction);
> > +#endif
> > +		if (sta_info_destroy_addr(sdata, mgmt->sa) != -ENOENT) {
> > +			ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa, 0,
> > +					       false);
> > +			rcu_read_unlock();
> > +		}
> 
> This doesn't seem to make sense, why not add the station even if we
> didn't know about it before?

mh, at the beginning the idea was to avoid to interfere with the current sta_adding mechanism,
so if a station was not there yet, then I didn't want to add it at that point.

But looking at the code now I can consider it a mistake, since it doesn't really
make sense.

I'll remove it in version 2 of this patch.

Thanks

p.s. In version 2 I will also write a more "understandable" commit message

> 
> johannes
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Antonio Quartulli

..each of us alone is worth nothing..
Ernesto "Che" Guevara

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-01-12 21:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-12 20:36 [PATCH 1/2] mac80211: send the Auth frame in IBSS Antonio Quartulli
2012-01-12 20:36 ` [PATCH 2/2] mac80211: in IBSS use the Auth frame to trigger STA reinsertion Antonio Quartulli
2012-01-12 20:50   ` Johannes Berg
2012-01-12 21:37     ` Antonio Quartulli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).