Search Linux Wireless

Re: [PATCH 2/3] mac80211: move function ieee80211_sta_join_ibss()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2008-02-15 at 16:01 +0900, Bruno Randolf wrote:
> this moves ieee80211_sta_join_ibss() up for the next patch (ibss merge).

Dunno if it needs sign-off, but

Acked-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>

> ---
> 
>  net/mac80211/ieee80211_sta.c |  317 +++++++++++++++++++++---------------------
>  1 files changed, 159 insertions(+), 158 deletions(-)
> 
> 
> diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c
> index 2c7b8be..72d7a86 100644
> --- a/net/mac80211/ieee80211_sta.c
> +++ b/net/mac80211/ieee80211_sta.c
> @@ -2030,6 +2030,165 @@ void ieee80211_rx_bss_list_deinit(struct net_device *dev)
>  }
>  
> 
> +static int ieee80211_sta_join_ibss(struct net_device *dev,
> +				   struct ieee80211_if_sta *ifsta,
> +				   struct ieee80211_sta_bss *bss)
> +{
> +	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
> +	int res, rates, i, j;
> +	struct sk_buff *skb;
> +	struct ieee80211_mgmt *mgmt;
> +	struct ieee80211_tx_control control;
> +	struct rate_selection ratesel;
> +	u8 *pos;
> +	struct ieee80211_sub_if_data *sdata;
> +	struct ieee80211_supported_band *sband;
> +
> +	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> +
> +	/* Remove possible STA entries from other IBSS networks. */
> +	sta_info_flush(local, NULL);
> +
> +	if (local->ops->reset_tsf) {
> +		/* Reset own TSF to allow time synchronization work. */
> +		local->ops->reset_tsf(local_to_hw(local));
> +	}
> +	memcpy(ifsta->bssid, bss->bssid, ETH_ALEN);
> +	res = ieee80211_if_config(dev);
> +	if (res)
> +		return res;
> +
> +	local->hw.conf.beacon_int = bss->beacon_int >= 10 ? bss->beacon_int : 10;
> +
> +	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
> +	sdata->drop_unencrypted = bss->capability &
> +		WLAN_CAPABILITY_PRIVACY ? 1 : 0;
> +
> +	res = ieee80211_set_freq(local, bss->freq);
> +
> +	if (local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS) {
> +		printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
> +		       "%d MHz\n", dev->name, local->oper_channel->center_freq);
> +		return -1;
> +	}
> +
> +	/* Set beacon template */
> +	skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
> +	do {
> +		if (!skb)
> +			break;
> +
> +		skb_reserve(skb, local->hw.extra_tx_headroom);
> +
> +		mgmt = (struct ieee80211_mgmt *)
> +			skb_put(skb, 24 + sizeof(mgmt->u.beacon));
> +		memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
> +		mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
> +						   IEEE80211_STYPE_BEACON);
> +		memset(mgmt->da, 0xff, ETH_ALEN);
> +		memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
> +		memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
> +		mgmt->u.beacon.beacon_int =
> +			cpu_to_le16(local->hw.conf.beacon_int);
> +		mgmt->u.beacon.capab_info = cpu_to_le16(bss->capability);
> +
> +		pos = skb_put(skb, 2 + ifsta->ssid_len);
> +		*pos++ = WLAN_EID_SSID;
> +		*pos++ = ifsta->ssid_len;
> +		memcpy(pos, ifsta->ssid, ifsta->ssid_len);
> +
> +		rates = bss->supp_rates_len;
> +		if (rates > 8)
> +			rates = 8;
> +		pos = skb_put(skb, 2 + rates);
> +		*pos++ = WLAN_EID_SUPP_RATES;
> +		*pos++ = rates;
> +		memcpy(pos, bss->supp_rates, rates);
> +
> +		if (bss->band == IEEE80211_BAND_2GHZ) {
> +			pos = skb_put(skb, 2 + 1);
> +			*pos++ = WLAN_EID_DS_PARAMS;
> +			*pos++ = 1;
> +			*pos++ = ieee80211_frequency_to_channel(bss->freq);
> +		}
> +
> +		pos = skb_put(skb, 2 + 2);
> +		*pos++ = WLAN_EID_IBSS_PARAMS;
> +		*pos++ = 2;
> +		/* FIX: set ATIM window based on scan results */
> +		*pos++ = 0;
> +		*pos++ = 0;
> +
> +		if (bss->supp_rates_len > 8) {
> +			rates = bss->supp_rates_len - 8;
> +			pos = skb_put(skb, 2 + rates);
> +			*pos++ = WLAN_EID_EXT_SUPP_RATES;
> +			*pos++ = rates;
> +			memcpy(pos, &bss->supp_rates[8], rates);
> +		}
> +
> +		memset(&control, 0, sizeof(control));
> +		rate_control_get_rate(dev, sband, skb, &ratesel);
> +		if (!ratesel.rate) {
> +			printk(KERN_DEBUG "%s: Failed to determine TX rate "
> +			       "for IBSS beacon\n", dev->name);
> +			break;
> +		}
> +		control.vif = &sdata->vif;
> +		control.tx_rate = ratesel.rate;
> +		if (sdata->bss_conf.use_short_preamble &&
> +		    ratesel.rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
> +			control.flags |= IEEE80211_TXCTL_SHORT_PREAMBLE;
> +		control.antenna_sel_tx = local->hw.conf.antenna_sel_tx;
> +		control.flags |= IEEE80211_TXCTL_NO_ACK;
> +		control.retry_limit = 1;
> +
> +		ifsta->probe_resp = skb_copy(skb, GFP_ATOMIC);
> +		if (ifsta->probe_resp) {
> +			mgmt = (struct ieee80211_mgmt *)
> +				ifsta->probe_resp->data;
> +			mgmt->frame_control =
> +				IEEE80211_FC(IEEE80211_FTYPE_MGMT,
> +					     IEEE80211_STYPE_PROBE_RESP);
> +		} else {
> +			printk(KERN_DEBUG "%s: Could not allocate ProbeResp "
> +			       "template for IBSS\n", dev->name);
> +		}
> +
> +		if (local->ops->beacon_update &&
> +		    local->ops->beacon_update(local_to_hw(local),
> +					     skb, &control) == 0) {
> +			printk(KERN_DEBUG "%s: Configured IBSS beacon "
> +			       "template\n", dev->name);
> +			skb = NULL;
> +		}
> +
> +		rates = 0;
> +		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> +		for (i = 0; i < bss->supp_rates_len; i++) {
> +			int bitrate = (bss->supp_rates[i] & 0x7f) * 5;
> +			for (j = 0; j < sband->n_bitrates; j++)
> +				if (sband->bitrates[j].bitrate == bitrate)
> +					rates |= BIT(j);
> +		}
> +		ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates;
> +	} while (0);
> +
> +	if (skb) {
> +		printk(KERN_DEBUG "%s: Failed to configure IBSS beacon "
> +		       "template\n", dev->name);
> +		dev_kfree_skb(skb);
> +	}
> +
> +	ifsta->state = IEEE80211_IBSS_JOINED;
> +	mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
> +
> +	ieee80211_rx_bss_put(dev, bss);
> +
> +	return res;
> +}
> +
> +
>  static void ieee80211_rx_bss_info(struct net_device *dev,
>  				  struct ieee80211_mgmt *mgmt,
>  				  size_t len,
> @@ -2896,164 +3055,6 @@ static int ieee80211_sta_config_auth(struct net_device *dev,
>  	return -1;
>  }
>  
> -static int ieee80211_sta_join_ibss(struct net_device *dev,
> -				   struct ieee80211_if_sta *ifsta,
> -				   struct ieee80211_sta_bss *bss)
> -{
> -	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
> -	int res, rates, i, j;
> -	struct sk_buff *skb;
> -	struct ieee80211_mgmt *mgmt;
> -	struct ieee80211_tx_control control;
> -	struct rate_selection ratesel;
> -	u8 *pos;
> -	struct ieee80211_sub_if_data *sdata;
> -	struct ieee80211_supported_band *sband;
> -
> -	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> -
> -	/* Remove possible STA entries from other IBSS networks. */
> -	sta_info_flush(local, NULL);
> -
> -	if (local->ops->reset_tsf) {
> -		/* Reset own TSF to allow time synchronization work. */
> -		local->ops->reset_tsf(local_to_hw(local));
> -	}
> -	memcpy(ifsta->bssid, bss->bssid, ETH_ALEN);
> -	res = ieee80211_if_config(dev);
> -	if (res)
> -		return res;
> -
> -	local->hw.conf.beacon_int = bss->beacon_int >= 10 ? bss->beacon_int : 10;
> -
> -	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
> -	sdata->drop_unencrypted = bss->capability &
> -		WLAN_CAPABILITY_PRIVACY ? 1 : 0;
> -
> -	res = ieee80211_set_freq(local, bss->freq);
> -
> -	if (local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS) {
> -		printk(KERN_DEBUG "%s: IBSS not allowed on frequency "
> -		       "%d MHz\n", dev->name, local->oper_channel->center_freq);
> -		return -1;
> -	}
> -
> -	/* Set beacon template based on scan results */
> -	skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400);
> -	do {
> -		if (!skb)
> -			break;
> -
> -		skb_reserve(skb, local->hw.extra_tx_headroom);
> -
> -		mgmt = (struct ieee80211_mgmt *)
> -			skb_put(skb, 24 + sizeof(mgmt->u.beacon));
> -		memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
> -		mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT,
> -						   IEEE80211_STYPE_BEACON);
> -		memset(mgmt->da, 0xff, ETH_ALEN);
> -		memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN);
> -		memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
> -		mgmt->u.beacon.beacon_int =
> -			cpu_to_le16(local->hw.conf.beacon_int);
> -		mgmt->u.beacon.capab_info = cpu_to_le16(bss->capability);
> -
> -		pos = skb_put(skb, 2 + ifsta->ssid_len);
> -		*pos++ = WLAN_EID_SSID;
> -		*pos++ = ifsta->ssid_len;
> -		memcpy(pos, ifsta->ssid, ifsta->ssid_len);
> -
> -		rates = bss->supp_rates_len;
> -		if (rates > 8)
> -			rates = 8;
> -		pos = skb_put(skb, 2 + rates);
> -		*pos++ = WLAN_EID_SUPP_RATES;
> -		*pos++ = rates;
> -		memcpy(pos, bss->supp_rates, rates);
> -
> -		if (bss->band == IEEE80211_BAND_2GHZ) {
> -			pos = skb_put(skb, 2 + 1);
> -			*pos++ = WLAN_EID_DS_PARAMS;
> -			*pos++ = 1;
> -			*pos++ = ieee80211_frequency_to_channel(bss->freq);
> -		}
> -
> -		pos = skb_put(skb, 2 + 2);
> -		*pos++ = WLAN_EID_IBSS_PARAMS;
> -		*pos++ = 2;
> -		/* FIX: set ATIM window based on scan results */
> -		*pos++ = 0;
> -		*pos++ = 0;
> -
> -		if (bss->supp_rates_len > 8) {
> -			rates = bss->supp_rates_len - 8;
> -			pos = skb_put(skb, 2 + rates);
> -			*pos++ = WLAN_EID_EXT_SUPP_RATES;
> -			*pos++ = rates;
> -			memcpy(pos, &bss->supp_rates[8], rates);
> -		}
> -
> -		memset(&control, 0, sizeof(control));
> -		rate_control_get_rate(dev, sband, skb, &ratesel);
> -		if (!ratesel.rate) {
> -			printk(KERN_DEBUG "%s: Failed to determine TX rate "
> -			       "for IBSS beacon\n", dev->name);
> -			break;
> -		}
> -		control.vif = &sdata->vif;
> -		control.tx_rate = ratesel.rate;
> -		if (sdata->bss_conf.use_short_preamble &&
> -		    ratesel.rate->flags & IEEE80211_RATE_SHORT_PREAMBLE)
> -			control.flags |= IEEE80211_TXCTL_SHORT_PREAMBLE;
> -		control.antenna_sel_tx = local->hw.conf.antenna_sel_tx;
> -		control.flags |= IEEE80211_TXCTL_NO_ACK;
> -		control.retry_limit = 1;
> -
> -		ifsta->probe_resp = skb_copy(skb, GFP_ATOMIC);
> -		if (ifsta->probe_resp) {
> -			mgmt = (struct ieee80211_mgmt *)
> -				ifsta->probe_resp->data;
> -			mgmt->frame_control =
> -				IEEE80211_FC(IEEE80211_FTYPE_MGMT,
> -					     IEEE80211_STYPE_PROBE_RESP);
> -		} else {
> -			printk(KERN_DEBUG "%s: Could not allocate ProbeResp "
> -			       "template for IBSS\n", dev->name);
> -		}
> -
> -		if (local->ops->beacon_update &&
> -		    local->ops->beacon_update(local_to_hw(local),
> -					     skb, &control) == 0) {
> -			printk(KERN_DEBUG "%s: Configured IBSS beacon "
> -			       "template based on scan results\n", dev->name);
> -			skb = NULL;
> -		}
> -
> -		rates = 0;
> -		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
> -		for (i = 0; i < bss->supp_rates_len; i++) {
> -			int bitrate = (bss->supp_rates[i] & 0x7f) * 5;
> -			for (j = 0; j < sband->n_bitrates; j++)
> -				if (sband->bitrates[j].bitrate == bitrate)
> -					rates |= BIT(j);
> -		}
> -		ifsta->supp_rates_bits[local->hw.conf.channel->band] = rates;
> -	} while (0);
> -
> -	if (skb) {
> -		printk(KERN_DEBUG "%s: Failed to configure IBSS beacon "
> -		       "template\n", dev->name);
> -		dev_kfree_skb(skb);
> -	}
> -
> -	ifsta->state = IEEE80211_IBSS_JOINED;
> -	mod_timer(&ifsta->timer, jiffies + IEEE80211_IBSS_MERGE_INTERVAL);
> -
> -	ieee80211_rx_bss_put(dev, bss);
> -
> -	return res;
> -}
> -
>  
>  static int ieee80211_sta_create_ibss(struct net_device *dev,
>  				     struct ieee80211_if_sta *ifsta)
> 
> 

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux