aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-05-15 06:55:29 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:48:11 -0400
commite039fa4a4195ac4ee895e6f3d1334beed63256fe (patch)
treecfd0762d73df96b73052378be7b157c4ac6e7035 /net/mac80211/mlme.c
parente24549485f859be6518929bb1c9c0257d79f033d (diff)
mac80211: move TX info into skb->cb
This patch converts mac80211 and all drivers to have transmit information and status in skb->cb rather than allocating extra memory for it and copying all the data around. To make it fit, a union is used where only data that is necessary for all steps is kept outside of the union. A number of fixes were done by Ivo, as well as the rt2x00 part of this patch. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 604149369dc9..9a264379d7b1 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -578,7 +578,7 @@ void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
578 int encrypt) 578 int encrypt)
579{ 579{
580 struct ieee80211_sub_if_data *sdata; 580 struct ieee80211_sub_if_data *sdata;
581 struct ieee80211_tx_packet_data *pkt_data; 581 struct ieee80211_tx_info *info;
582 582
583 sdata = IEEE80211_DEV_TO_SUB_IF(dev); 583 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
584 skb->dev = sdata->local->mdev; 584 skb->dev = sdata->local->mdev;
@@ -586,11 +586,11 @@ void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
586 skb_set_network_header(skb, 0); 586 skb_set_network_header(skb, 0);
587 skb_set_transport_header(skb, 0); 587 skb_set_transport_header(skb, 0);
588 588
589 pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; 589 info = IEEE80211_SKB_CB(skb);
590 memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); 590 memset(info, 0, sizeof(struct ieee80211_tx_info));
591 pkt_data->ifindex = sdata->dev->ifindex; 591 info->control.ifindex = sdata->dev->ifindex;
592 if (!encrypt) 592 if (!encrypt)
593 pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; 593 info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT;
594 594
595 dev_queue_xmit(skb); 595 dev_queue_xmit(skb);
596} 596}
@@ -2314,7 +2314,7 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
2314 int res, rates, i, j; 2314 int res, rates, i, j;
2315 struct sk_buff *skb; 2315 struct sk_buff *skb;
2316 struct ieee80211_mgmt *mgmt; 2316 struct ieee80211_mgmt *mgmt;
2317 struct ieee80211_tx_control control; 2317 struct ieee80211_tx_info *control;
2318 struct rate_selection ratesel; 2318 struct rate_selection ratesel;
2319 u8 *pos; 2319 u8 *pos;
2320 struct ieee80211_sub_if_data *sdata; 2320 struct ieee80211_sub_if_data *sdata;
@@ -2404,21 +2404,22 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
2404 memcpy(pos, &bss->supp_rates[8], rates); 2404 memcpy(pos, &bss->supp_rates[8], rates);
2405 } 2405 }
2406 2406
2407 memset(&control, 0, sizeof(control)); 2407 control = IEEE80211_SKB_CB(skb);
2408
2408 rate_control_get_rate(dev, sband, skb, &ratesel); 2409 rate_control_get_rate(dev, sband, skb, &ratesel);
2409 if (ratesel.rate_idx < 0) { 2410 if (ratesel.rate_idx < 0) {
2410 printk(KERN_DEBUG "%s: Failed to determine TX rate " 2411 printk(KERN_DEBUG "%s: Failed to determine TX rate "
2411 "for IBSS beacon\n", dev->name); 2412 "for IBSS beacon\n", dev->name);
2412 break; 2413 break;
2413 } 2414 }
2414 control.vif = &sdata->vif; 2415 control->control.vif = &sdata->vif;
2415 control.tx_rate_idx = ratesel.rate_idx; 2416 control->tx_rate_idx = ratesel.rate_idx;
2416 if (sdata->bss_conf.use_short_preamble && 2417 if (sdata->bss_conf.use_short_preamble &&
2417 sband->bitrates[ratesel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) 2418 sband->bitrates[ratesel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE)
2418 control.flags |= IEEE80211_TXCTL_SHORT_PREAMBLE; 2419 control->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE;
2419 control.antenna_sel_tx = local->hw.conf.antenna_sel_tx; 2420 control->antenna_sel_tx = local->hw.conf.antenna_sel_tx;
2420 control.flags |= IEEE80211_TXCTL_NO_ACK; 2421 control->flags |= IEEE80211_TX_CTL_NO_ACK;
2421 control.retry_limit = 1; 2422 control->control.retry_limit = 1;
2422 2423
2423 ifsta->probe_resp = skb_copy(skb, GFP_ATOMIC); 2424 ifsta->probe_resp = skb_copy(skb, GFP_ATOMIC);
2424 if (ifsta->probe_resp) { 2425 if (ifsta->probe_resp) {
@@ -2433,8 +2434,7 @@ static int ieee80211_sta_join_ibss(struct net_device *dev,
2433 } 2434 }
2434 2435
2435 if (local->ops->beacon_update && 2436 if (local->ops->beacon_update &&
2436 local->ops->beacon_update(local_to_hw(local), 2437 local->ops->beacon_update(local_to_hw(local), skb) == 0) {
2437 skb, &control) == 0) {
2438 printk(KERN_DEBUG "%s: Configured IBSS beacon " 2438 printk(KERN_DEBUG "%s: Configured IBSS beacon "
2439 "template\n", dev->name); 2439 "template\n", dev->name);
2440 skb = NULL; 2440 skb = NULL;