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 <[EMAIL PROTECTED]>
> ---
>
> 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)
>
>
signature.asc
Description: This is a digitally signed message part
_______________________________________________ ath5k-devel mailing list [email protected] https://lists.ath5k.org/mailman/listinfo/ath5k-devel
