[PATCH] nl80211: Make use of the ht opmode bss attribute

Helmut Schaa helmut.schaa
Thu Jan 27 00:19:17 PST 2011


Jouni, did you have a chance to review this patch already?

Thanks,
Helmut

Am Freitag, 7. Januar 2011 schrieb Helmut Schaa:
> In order to enable protection mechanisms for different HT opmodes the
> driver needs to be aware of the current HT opmode that is calculated by
> hostapd. Hence, pass the current opmode to the nl80211 driver via
> the bss attribute NL80211_ATTR_BSS_HT_OPMODE.
> 
> Signed-off-by: Helmut Schaa <helmut.schaa at googlemail.com>
> ---
>  src/drivers/driver_nl80211.c |   27 ++++++++++++++++++++++-----
>  1 files changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
> index 328e063..d6e3943 100644
> --- a/src/drivers/driver_nl80211.c
> +++ b/src/drivers/driver_nl80211.c
> @@ -5260,7 +5260,8 @@ static int i802_set_tx_queue_params(void *priv, int queue, int aifs,
>  }
>  
>  
> -static int i802_set_bss(void *priv, int cts, int preamble, int slot)
> +static int i802_set_bss(void *priv, int cts, int preamble, int slot,
> +			int ht_opmode)
>  {
>  	struct i802_bss *bss = priv;
>  	struct wpa_driver_nl80211_data *drv = bss->drv;
> @@ -5279,7 +5280,8 @@ static int i802_set_bss(void *priv, int cts, int preamble, int slot)
>  		NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_PREAMBLE, preamble);
>  	if (slot >= 0)
>  		NLA_PUT_U8(msg, NL80211_ATTR_BSS_SHORT_SLOT_TIME, slot);
> -
> +	if (ht_opmode >= 0)
> +		NLA_PUT_U16(msg, NL80211_ATTR_BSS_HT_OPMODE, ht_opmode);
>  	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(bss->ifname));
>  
>  	return send_and_recv_msgs(drv, msg, NULL, NULL);
> @@ -5290,19 +5292,19 @@ static int i802_set_bss(void *priv, int cts, int preamble, int slot)
>  
>  static int i802_set_cts_protect(void *priv, int value)
>  {
> -	return i802_set_bss(priv, value, -1, -1);
> +	return i802_set_bss(priv, value, -1, -1, -1);
>  }
>  
>  
>  static int i802_set_preamble(void *priv, int value)
>  {
> -	return i802_set_bss(priv, -1, value, -1);
> +	return i802_set_bss(priv, -1, value, -1, -1);
>  }
>  
>  
>  static int i802_set_short_slot_time(void *priv, int value)
>  {
> -	return i802_set_bss(priv, -1, -1, value);
> +	return i802_set_bss(priv, -1, -1, value, -1);
>  }
>  
>  
> @@ -5370,6 +5372,20 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
>  }
>  
>  
> +static int i802_set_ht_params(void *priv, const u8 *ht_capab,
> +			      size_t ht_capab_len, const u8 *ht_oper,
> +			      size_t ht_oper_len)
> +{
> +	if (ht_oper_len >= 6) {
> +		/* ht opmode uses 16bit in octet 5 & 6 */
> +		u16 ht_opmode = le_to_host16(((u16 *)ht_oper)[2]);
> +		return i802_set_bss(priv, -1, -1, -1, ht_opmode);
> +	}
> +	else
> +		return -1;
> +}
> +
> +
>  static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
>  {
>  	struct wpa_driver_nl80211_data *drv = eloop_ctx;
> @@ -6370,6 +6386,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
>  	.set_tx_queue_params = i802_set_tx_queue_params,
>  	.set_sta_vlan = i802_set_sta_vlan,
>  	.set_wds_sta = i802_set_wds_sta,
> +	.set_ht_params = i802_set_ht_params,
>  #endif /* HOSTAPD */
>  	.set_freq = i802_set_freq,
>  	.send_action = wpa_driver_nl80211_send_action,
> 




More information about the Hostap mailing list