• Home
  • Raw
  • Download

Lines Matching full:dev

100 	struct net80211_device *dev;  member
170 static void net80211_add_channels ( struct net80211_device *dev, int start,
172 static void net80211_filter_hw_channels ( struct net80211_device *dev );
173 static void net80211_set_rtscts_rate ( struct net80211_device *dev );
174 static int net80211_process_capab ( struct net80211_device *dev,
176 static int net80211_process_ie ( struct net80211_device *dev,
179 net80211_marshal_request_info ( struct net80211_device *dev,
188 static void net80211_handle_auth ( struct net80211_device *dev,
190 static void net80211_handle_assoc_reply ( struct net80211_device *dev,
192 static int net80211_send_disassoc ( struct net80211_device *dev, int reason,
194 static void net80211_handle_mgmt ( struct net80211_device *dev,
202 static void net80211_free_frags ( struct net80211_device *dev, int fcid );
203 static struct io_buffer *net80211_accum_frags ( struct net80211_device *dev,
205 static void net80211_rx_frag ( struct net80211_device *dev,
278 struct net80211_device *dev = netdev->priv; in net80211_netdev_open() local
281 if ( dev->op == &net80211_null_ops ) in net80211_netdev_open()
284 if ( dev->op->open ) in net80211_netdev_open()
285 rc = dev->op->open ( dev ); in net80211_netdev_open()
290 if ( ! ( dev->state & NET80211_NO_ASSOC ) ) in net80211_netdev_open()
291 net80211_autoassociate ( dev ); in net80211_netdev_open()
305 struct net80211_device *dev = netdev->priv; in net80211_netdev_close() local
307 if ( dev->state & NET80211_WORKING ) in net80211_netdev_close()
308 process_del ( &dev->proc_assoc ); in net80211_netdev_close()
311 if ( dev->state & NET80211_ASSOCIATED ) in net80211_netdev_close()
312 net80211_send_disassoc ( dev, IEEE80211_REASON_LEAVING, 0 ); in net80211_netdev_close()
314 if ( dev->handshaker && dev->handshaker->stop && in net80211_netdev_close()
315 dev->handshaker->started ) in net80211_netdev_close()
316 dev->handshaker->stop ( dev ); in net80211_netdev_close()
318 free ( dev->crypto ); in net80211_netdev_close()
319 free ( dev->handshaker ); in net80211_netdev_close()
320 dev->crypto = NULL; in net80211_netdev_close()
321 dev->handshaker = NULL; in net80211_netdev_close()
324 dev->state = 0; in net80211_netdev_close()
326 if ( dev->op->close ) in net80211_netdev_close()
327 dev->op->close ( dev ); in net80211_netdev_close()
343 struct net80211_device *dev = netdev->priv; in net80211_netdev_transmit() local
347 if ( dev->crypto && ! ( hdr->fc & IEEE80211_FC_PROTECTED ) && in net80211_netdev_transmit()
349 struct io_buffer *niob = dev->crypto->encrypt ( dev->crypto, in net80211_netdev_transmit()
365 if ( dev->op->transmit ) in net80211_netdev_transmit()
366 rc = dev->op->transmit ( dev, iobuf ); in net80211_netdev_transmit()
378 struct net80211_device *dev = netdev->priv; in net80211_netdev_poll() local
380 if ( dev->op->poll ) in net80211_netdev_poll()
381 dev->op->poll ( dev ); in net80211_netdev_poll()
392 struct net80211_device *dev = netdev->priv; in net80211_netdev_irq() local
394 if ( dev->op->irq ) in net80211_netdev_irq()
395 dev->op->irq ( dev, enable ); in net80211_netdev_irq()
433 * @v dev 802.11 device
464 u16 net80211_duration ( struct net80211_device *dev, int bytes, u16 rate ) in net80211_duration() argument
466 struct net80211_channel *chan = &dev->channels[dev->channel]; in net80211_duration()
482 if ( dev->phy_flags & NET80211_PHY_USE_SHORT_PREAMBLE ) in net80211_duration()
510 struct net80211_device *dev = netdev->priv; in net80211_ll_push() local
518 if ( ! ( dev->state & NET80211_ASSOCIATED ) ) { in net80211_ll_push()
519 if ( dev->assoc_rc ) in net80211_ll_push()
520 return dev->assoc_rc; in net80211_ll_push()
529 hdr->duration = net80211_duration ( dev, 10, dev->rates[dev->rate] ); in net80211_ll_push()
531 memcpy ( hdr->addr1, dev->bssid, ETH_ALEN ); in net80211_ll_push()
535 hdr->seq = IEEE80211_MAKESEQ ( ++dev->last_tx_seqnr, 0 ); in net80211_ll_push()
637 * @ret dev 802.11 device wrapped by network device, or NULL
643 struct net80211_device *dev; in net80211_get() local
645 list_for_each_entry ( dev, &net80211_devices, list ) { in net80211_get()
646 if ( netdev->priv == dev ) in net80211_get()
656 * @v dev 802.11 device
663 int net80211_keep_mgmt ( struct net80211_device *dev, int enable ) in net80211_keep_mgmt() argument
665 int oldenab = dev->keep_mgmt; in net80211_keep_mgmt()
667 dev->keep_mgmt = enable; in net80211_keep_mgmt()
674 * @v dev 802.11 device
684 struct io_buffer * net80211_mgmt_dequeue ( struct net80211_device *dev, in net80211_mgmt_dequeue() argument
690 list_for_each_entry ( rxi, &dev->mgmt_info_queue, list ) { in net80211_mgmt_dequeue()
696 list_for_each_entry ( iobuf, &dev->mgmt_queue, list ) { in net80211_mgmt_dequeue()
709 * @v dev 802.11 device
723 int net80211_tx_mgmt ( struct net80211_device *dev, u16 fc, u8 dest[6], in net80211_tx_mgmt() argument
731 hdr->duration = net80211_duration ( dev, 10, dev->rates[dev->rate] ); in net80211_tx_mgmt()
732 hdr->seq = IEEE80211_MAKESEQ ( ++dev->last_tx_seqnr, 0 ); in net80211_tx_mgmt()
735 memcpy ( hdr->addr2, dev->netdev->ll_addr, ETH_ALEN ); /* SA = TA */ in net80211_tx_mgmt()
739 if ( ! dev->crypto ) in net80211_tx_mgmt()
742 struct io_buffer *eiob = dev->crypto->encrypt ( dev->crypto, in net80211_tx_mgmt()
748 return netdev_tx ( dev->netdev, iob ); in net80211_tx_mgmt()
758 * @ret dev Newly allocated 802.11 device
768 struct net80211_device *dev; in net80211_alloc() local
770 alloc_netdev ( sizeof ( *dev ) + priv_size ); in net80211_alloc()
780 dev = netdev->priv; in net80211_alloc()
781 dev->netdev = netdev; in net80211_alloc()
782 dev->priv = ( u8 * ) dev + sizeof ( *dev ); in net80211_alloc()
783 dev->op = &net80211_null_ops; in net80211_alloc()
785 process_init_stopped ( &dev->proc_assoc, net80211_step_associate, in net80211_alloc()
787 INIT_LIST_HEAD ( &dev->mgmt_queue ); in net80211_alloc()
788 INIT_LIST_HEAD ( &dev->mgmt_info_queue ); in net80211_alloc()
790 return dev; in net80211_alloc()
796 * @v dev 802.11 device
803 int net80211_register ( struct net80211_device *dev, in net80211_register() argument
807 dev->op = ops; in net80211_register()
808 dev->hw = malloc ( sizeof ( *hw ) ); in net80211_register()
809 if ( ! dev->hw ) in net80211_register()
812 memcpy ( dev->hw, hw, sizeof ( *hw ) ); in net80211_register()
813 memcpy ( dev->netdev->hw_addr, hw->hwaddr, ETH_ALEN ); in net80211_register()
816 memcpy ( dev->channels, dev->hw->channels, in net80211_register()
817 NET80211_MAX_CHANNELS * sizeof ( dev->channels[0] ) ); in net80211_register()
818 dev->channel = 0; in net80211_register()
820 list_add_tail ( &dev->list, &net80211_devices ); in net80211_register()
821 return register_netdev ( dev->netdev ); in net80211_register()
827 * @v dev 802.11 device
832 void net80211_unregister ( struct net80211_device *dev ) in net80211_unregister() argument
834 unregister_netdev ( dev->netdev ); in net80211_unregister()
835 list_del ( &dev->list ); in net80211_unregister()
836 dev->op = &net80211_null_ops; in net80211_unregister()
842 * @v dev 802.11 device
846 void net80211_free ( struct net80211_device *dev ) in net80211_free() argument
848 free ( dev->hw ); in net80211_free()
849 rc80211_free ( dev->rctl ); in net80211_free()
850 netdev_nullify ( dev->netdev ); in net80211_free()
851 netdev_put ( dev->netdev ); in net80211_free()
860 * @v dev 802.11 device
874 static inline void net80211_set_state ( struct net80211_device *dev, in net80211_set_state() argument
895 dev->state = ( dev->state & ~clear ) | set; in net80211_set_state()
896 dev->state = ( dev->state & ~statmsk ) | ( status & statmsk ); in net80211_set_state()
899 netdev_link_down ( dev->netdev ); in net80211_set_state()
902 dev->op->config ( dev, NET80211_CFG_ASSOC ); in net80211_set_state()
906 dev->assoc_rc = -E80211_REASON ( status ); in net80211_set_state()
908 dev->assoc_rc = -E80211_STATUS ( status ); in net80211_set_state()
909 netdev_link_err ( dev->netdev, dev->assoc_rc ); in net80211_set_state()
916 * @v dev 802.11 device
925 static void net80211_add_channels ( struct net80211_device *dev, int start, in net80211_add_channels() argument
930 for ( i = dev->nr_channels; len-- && i < NET80211_MAX_CHANNELS; i++ ) { in net80211_add_channels()
931 dev->channels[i].channel_nr = chan; in net80211_add_channels()
932 dev->channels[i].maxpower = txpower; in net80211_add_channels()
933 dev->channels[i].hw_value = 0; in net80211_add_channels()
936 dev->channels[i].band = NET80211_BAND_2GHZ; in net80211_add_channels()
938 dev->channels[i].center_freq = 2484; in net80211_add_channels()
940 dev->channels[i].center_freq = 2407 + 5 * chan; in net80211_add_channels()
943 dev->channels[i].band = NET80211_BAND_5GHZ; in net80211_add_channels()
944 dev->channels[i].center_freq = 5000 + 5 * chan; in net80211_add_channels()
949 dev->nr_channels = i; in net80211_add_channels()
955 * @v dev 802.11 device
958 * allow; this function filters out channels in dev->channels that are
959 * not supported by the hardware list in dev->hwinfo. It also copies
969 static void net80211_filter_hw_channels ( struct net80211_device *dev ) in net80211_filter_hw_channels() argument
972 int old_freq = dev->channels[dev->channel].center_freq; in net80211_filter_hw_channels()
975 if ( ! dev->hw->nr_channels ) in net80211_filter_hw_channels()
978 dev->channel = 0; in net80211_filter_hw_channels()
979 for ( chan = dev->channels; chan < dev->channels + dev->nr_channels; in net80211_filter_hw_channels()
982 for ( hwchan = dev->hw->channels; in net80211_filter_hw_channels()
983 hwchan < dev->hw->channels + dev->hw->nr_channels; in net80211_filter_hw_channels()
999 dev->channel = i - delta; in net80211_filter_hw_channels()
1005 dev->nr_channels -= delta; in net80211_filter_hw_channels()
1007 if ( dev->channels[dev->channel].center_freq != old_freq ) in net80211_filter_hw_channels()
1008 dev->op->config ( dev, NET80211_CFG_CHANNEL ); in net80211_filter_hw_channels()
1014 * @v dev 802.11 device
1018 static int net80211_process_capab ( struct net80211_device *dev, in net80211_process_capab() argument
1021 u16 old_phy = dev->phy_flags; in net80211_process_capab()
1025 DBGC ( dev, "802.11 %p cannot handle IBSS network\n", dev ); in net80211_process_capab()
1029 dev->phy_flags &= ~( NET80211_PHY_USE_SHORT_PREAMBLE | in net80211_process_capab()
1033 dev->phy_flags |= NET80211_PHY_USE_SHORT_PREAMBLE; in net80211_process_capab()
1036 dev->phy_flags |= NET80211_PHY_USE_SHORT_SLOT; in net80211_process_capab()
1038 if ( old_phy != dev->phy_flags ) in net80211_process_capab()
1039 dev->op->config ( dev, NET80211_CFG_PHY_PARAMS ); in net80211_process_capab()
1047 * @v dev 802.11 device
1052 static int net80211_process_ie ( struct net80211_device *dev, in net80211_process_ie() argument
1055 u16 old_rate = dev->rates[dev->rate]; in net80211_process_ie()
1056 u16 old_phy = dev->phy_flags; in net80211_process_ie()
1060 int band = dev->channels[dev->channel].band; in net80211_process_ie()
1069 memcpy ( dev->essid, ie->ssid, ie->len ); in net80211_process_ie()
1070 dev->essid[ie->len] = 0; in net80211_process_ie()
1077 dev->nr_rates = 0; in net80211_process_ie()
1078 dev->basic_rates = 0; in net80211_process_ie()
1082 dev->nr_rates < NET80211_MAX_RATES; i++ ) { in net80211_process_ie()
1087 dev->basic_rates |= in net80211_process_ie()
1088 ( 1 << dev->nr_rates ); in net80211_process_ie()
1090 dev->rates[dev->nr_rates++] = rate; in net80211_process_ie()
1096 if ( dev->channel < dev->nr_channels && ds_channel == in net80211_process_ie()
1097 dev->channels[dev->channel].channel_nr ) in net80211_process_ie()
1100 net80211_change_channel ( dev, ds_channel ); in net80211_process_ie()
1104 dev->nr_channels = 0; in net80211_process_ie()
1106 DBGC ( dev, "802.11 %p setting country regulations " in net80211_process_ie()
1107 "for %c%c\n", dev, ie->country.name[0], in net80211_process_ie()
1113 DBGC ( dev, "802.11 %p ignoring regulatory " in net80211_process_ie()
1114 "extension information\n", dev ); in net80211_process_ie()
1116 net80211_add_channels ( dev, in net80211_process_ie()
1122 net80211_filter_hw_channels ( dev ); in net80211_process_ie()
1126 dev->phy_flags &= ~( NET80211_PHY_USE_PROTECTION | in net80211_process_ie()
1129 dev->phy_flags |= NET80211_PHY_USE_PROTECTION; in net80211_process_ie()
1131 dev->phy_flags |= NET80211_PHY_USE_SHORT_PREAMBLE; in net80211_process_ie()
1141 dev->rate = 0; in net80211_process_ie()
1142 for ( i = 0; i < dev->nr_rates; i++ ) { in net80211_process_ie()
1144 for ( j = 0; j < dev->hw->nr_rates[band]; j++ ) { in net80211_process_ie()
1145 if ( dev->hw->rates[band][j] == dev->rates[i] ){ in net80211_process_ie()
1154 dev->rates[i - delta] = dev->rates[i]; in net80211_process_ie()
1155 if ( old_rate == dev->rates[i] ) in net80211_process_ie()
1156 dev->rate = i - delta; in net80211_process_ie()
1160 dev->nr_rates -= delta; in net80211_process_ie()
1164 for ( i = 1; i < dev->nr_rates; i++ ) { in net80211_process_ie()
1165 u16 rate = dev->rates[i]; in net80211_process_ie()
1168 for ( j = i - 1; j >= 0 && dev->rates[j] >= rate; j-- ) in net80211_process_ie()
1169 dev->rates[j + 1] = dev->rates[j]; in net80211_process_ie()
1170 dev->rates[j + 1] = rate; in net80211_process_ie()
1175 br = dev->basic_rates; in net80211_process_ie()
1179 dev->basic_rates = br; in net80211_process_ie()
1182 net80211_set_rtscts_rate ( dev ); in net80211_process_ie()
1184 if ( dev->rates[dev->rate] != old_rate ) in net80211_process_ie()
1188 if ( dev->hw->flags & NET80211_HW_NO_SHORT_PREAMBLE ) in net80211_process_ie()
1189 dev->phy_flags &= ~NET80211_PHY_USE_SHORT_PREAMBLE; in net80211_process_ie()
1190 if ( dev->hw->flags & NET80211_HW_NO_SHORT_SLOT ) in net80211_process_ie()
1191 dev->phy_flags &= ~NET80211_PHY_USE_SHORT_SLOT; in net80211_process_ie()
1193 if ( old_phy != dev->phy_flags ) in net80211_process_ie()
1197 dev->op->config ( dev, changed ); in net80211_process_ie()
1205 * @v dev 802.11 device
1210 net80211_marshal_request_info ( struct net80211_device *dev, in net80211_marshal_request_info() argument
1216 ie->len = strlen ( dev->essid ); in net80211_marshal_request_info()
1217 memcpy ( ie->ssid, dev->essid, ie->len ); in net80211_marshal_request_info()
1222 ie->len = dev->nr_rates; in net80211_marshal_request_info()
1227 ie->rates[i] = dev->rates[i] / 5; in net80211_marshal_request_info()
1228 if ( dev->basic_rates & ( 1 << i ) ) in net80211_marshal_request_info()
1234 if ( dev->rsn_ie && dev->rsn_ie->id == IEEE80211_IE_RSN ) { in net80211_marshal_request_info()
1235 memcpy ( ie, dev->rsn_ie, dev->rsn_ie->len + 2 ); in net80211_marshal_request_info()
1239 if ( dev->nr_rates > 8 ) { in net80211_marshal_request_info()
1244 ie->len = dev->nr_rates - 8; in net80211_marshal_request_info()
1246 for ( ; i < dev->nr_rates; i++ ) { in net80211_marshal_request_info()
1247 ie->rates[i - 8] = dev->rates[i] / 5; in net80211_marshal_request_info()
1248 if ( dev->basic_rates & ( 1 << i ) ) in net80211_marshal_request_info()
1255 if ( dev->rsn_ie && dev->rsn_ie->id == IEEE80211_IE_VENDOR ) { in net80211_marshal_request_info()
1256 memcpy ( ie, dev->rsn_ie, dev->rsn_ie->len + 2 ); in net80211_marshal_request_info()
1282 * @v dev 802.11 device
1298 struct net80211_probe_ctx * net80211_probe_start ( struct net80211_device *dev, in net80211_probe_start() argument
1307 assert ( dev->netdev->state & NETDEV_OPEN ); in net80211_probe_start()
1309 ctx->dev = dev; in net80211_probe_start()
1310 ctx->old_keep_mgmt = net80211_keep_mgmt ( dev, 1 ); in net80211_probe_start()
1312 if ( dev->essid != ctx->essid ) in net80211_probe_start()
1313 strcpy ( dev->essid, ctx->essid ); in net80211_probe_start()
1323 ie = net80211_marshal_request_info ( dev, in net80211_probe_start()
1342 while ( dev->nr_channels % ctx->hop_step == 0 && ctx->hop_step > 1 ) in net80211_probe_start()
1348 dev->channel = 0; in net80211_probe_start()
1349 dev->op->config ( dev, NET80211_CFG_CHANNEL ); in net80211_probe_start()
1373 struct net80211_device *dev = ctx->dev; in net80211_probe_step() local
1394 dev->channel = ( dev->channel + ctx->hop_step ) in net80211_probe_step()
1395 % dev->nr_channels; in net80211_probe_step()
1396 dev->op->config ( dev, NET80211_CFG_CHANNEL ); in net80211_probe_step()
1397 udelay ( dev->hw->channel_change_time ); in net80211_probe_step()
1411 rc = net80211_tx_mgmt ( dev, IEEE80211_STYPE_PROBE_REQ, in net80211_probe_step()
1415 DBGC ( dev, "802.11 %p send probe failed: " in net80211_probe_step()
1416 "%s\n", dev, strerror ( rc ) ); in net80211_probe_step()
1423 while ( ( iob = net80211_mgmt_dequeue ( dev, &signal ) ) != NULL ) { in net80211_probe_step()
1436 DBGC2 ( dev, "802.11 %p probe: non-beacon\n", dev ); in net80211_probe_step()
1441 DBGC ( dev, "802.11 %p probe: beacon with no IEs\n", in net80211_probe_step()
1442 dev ); in net80211_probe_step()
1455 DBGC ( dev, "802.11 %p probe: beacon with no SSID\n", in net80211_probe_step()
1456 dev ); in net80211_probe_step()
1464 DBGC2 ( dev, "802.11 %p probe: beacon with wrong SSID " in net80211_probe_step()
1465 "(%s)\n", dev, ssid ); in net80211_probe_step()
1475 DBGC2 ( dev, "802.11 %p probe: beacon for %s " in net80211_probe_step()
1476 "(%s) with weaker signal %d\n", dev, in net80211_probe_step()
1494 wlan->channel = dev->channels[dev->channel].channel_nr; in net80211_probe_step()
1514 dev, wlan->essid ); in net80211_probe_step()
1522 DBGC ( dev, "802.11 %p probe warning: network " in net80211_probe_step()
1524 "settings: %s\n", dev, wlan->essid, in net80211_probe_step()
1530 DBGC2 ( dev, "802.11 %p probe: good beacon for %s (%s)\n", in net80211_probe_step()
1531 dev, wlan->essid, eth_ntoa ( wlan->bssid ) ); in net80211_probe_step()
1567 DBGC ( ctx->dev, "802.11 %p probe: found nothing for '%s'\n", in net80211_probe_finish_best()
1568 ctx->dev, ctx->essid ); in net80211_probe_finish_best()
1572 net80211_keep_mgmt ( ctx->dev, ctx->old_keep_mgmt ); in net80211_probe_finish_best()
1600 net80211_keep_mgmt ( ctx->dev, ctx->old_keep_mgmt ); in net80211_probe_finish_all()
1659 struct net80211_device *dev = in net80211_step_associate() local
1662 int status = dev->state & NET80211_STATUS_MASK; in net80211_step_associate()
1666 * the dev->state variable. At each call, we take the in net80211_step_associate()
1679 if ( dev->state & NET80211_WAITING ) { in net80211_step_associate()
1681 if ( ! dev->associating ) in net80211_step_associate()
1684 if ( currticks() - dev->ctx.assoc->last_packet > ASSOC_TIMEOUT ) { in net80211_step_associate()
1686 dev->ctx.assoc->times_tried++; in net80211_step_associate()
1687 if ( ++dev->ctx.assoc->times_tried > ASSOC_RETRIES ) { in net80211_step_associate()
1696 if ( dev->state & NET80211_PROBED ) in net80211_step_associate()
1697 dev->ctx.assoc->times_tried = 0; in net80211_step_associate()
1700 if ( ! ( dev->state & NET80211_PROBED ) ) { in net80211_step_associate()
1703 if ( ! dev->ctx.probe ) { in net80211_step_associate()
1707 int band = dev->hw->bands; in net80211_step_associate()
1712 rc = net80211_prepare_probe ( dev, band, active ); in net80211_step_associate()
1716 dev->ctx.probe = net80211_probe_start ( dev, dev->essid, in net80211_step_associate()
1718 if ( ! dev->ctx.probe ) { in net80211_step_associate()
1719 dev->assoc_rc = -ENOMEM; in net80211_step_associate()
1724 rc = net80211_probe_step ( dev->ctx.probe ); in net80211_step_associate()
1729 dev->associating = net80211_probe_finish_best ( dev->ctx.probe ); in net80211_step_associate()
1730 dev->ctx.probe = NULL; in net80211_step_associate()
1731 if ( ! dev->associating ) { in net80211_step_associate()
1740 if ( ! dev->essid[0] ) in net80211_step_associate()
1741 dev->state |= NET80211_AUTO_SSID; in net80211_step_associate()
1743 DBGC ( dev, "802.11 %p found network %s (%s)\n", dev, in net80211_step_associate()
1744 dev->associating->essid, in net80211_step_associate()
1745 eth_ntoa ( dev->associating->bssid ) ); in net80211_step_associate()
1747 dev->ctx.assoc = zalloc ( sizeof ( *dev->ctx.assoc ) ); in net80211_step_associate()
1748 if ( ! dev->ctx.assoc ) { in net80211_step_associate()
1753 dev->state |= NET80211_PROBED; in net80211_step_associate()
1754 dev->ctx.assoc->method = IEEE80211_AUTH_OPEN_SYSTEM; in net80211_step_associate()
1760 dev->ctx.assoc->last_packet = currticks(); in net80211_step_associate()
1762 if ( ! ( dev->state & NET80211_AUTHENTICATED ) ) { in net80211_step_associate()
1767 int method = dev->ctx.assoc->method; in net80211_step_associate()
1773 dev->ctx.assoc->method = in net80211_step_associate()
1780 DBGC ( dev, "802.11 %p authenticating with method %d\n", dev, in net80211_step_associate()
1781 dev->ctx.assoc->method ); in net80211_step_associate()
1783 rc = net80211_prepare_assoc ( dev, dev->associating ); in net80211_step_associate()
1787 rc = net80211_send_auth ( dev, dev->associating, in net80211_step_associate()
1788 dev->ctx.assoc->method ); in net80211_step_associate()
1795 if ( ! ( dev->state & NET80211_ASSOCIATED ) ) { in net80211_step_associate()
1801 DBGC ( dev, "802.11 %p associating\n", dev ); in net80211_step_associate()
1803 if ( dev->handshaker && dev->handshaker->start && in net80211_step_associate()
1804 ! dev->handshaker->started ) { in net80211_step_associate()
1805 rc = dev->handshaker->start ( dev ); in net80211_step_associate()
1808 dev->handshaker->started = 1; in net80211_step_associate()
1811 rc = net80211_send_assoc ( dev, dev->associating ); in net80211_step_associate()
1818 if ( ! ( dev->state & NET80211_CRYPTO_SYNCED ) ) { in net80211_step_associate()
1820 DBGC ( dev, "802.11 %p security handshaking\n", dev ); in net80211_step_associate()
1822 if ( ! dev->handshaker || ! dev->handshaker->step ) { in net80211_step_associate()
1823 dev->state |= NET80211_CRYPTO_SYNCED; in net80211_step_associate()
1827 rc = dev->handshaker->step ( dev ); in net80211_step_associate()
1835 if ( dev->state & NET80211_ASSOCIATED ) in net80211_step_associate()
1836 dev->assoc_rc = rc; in net80211_step_associate()
1842 dev->assoc_rc = 0; in net80211_step_associate()
1843 dev->state |= NET80211_CRYPTO_SYNCED; in net80211_step_associate()
1849 netdev_link_up ( dev->netdev ); in net80211_step_associate()
1850 dev->assoc_rc = 0; in net80211_step_associate()
1851 dev->state &= ~NET80211_WORKING; in net80211_step_associate()
1853 free ( dev->ctx.assoc ); in net80211_step_associate()
1854 dev->ctx.assoc = NULL; in net80211_step_associate()
1856 net80211_free_wlan ( dev->associating ); in net80211_step_associate()
1857 dev->associating = NULL; in net80211_step_associate()
1859 dev->rctl = rc80211_init ( dev ); in net80211_step_associate()
1863 DBGC ( dev, "802.11 %p associated with %s (%s)\n", dev, in net80211_step_associate()
1864 dev->essid, eth_ntoa ( dev->bssid ) ); in net80211_step_associate()
1869 dev->state &= ~( NET80211_WORKING | NET80211_WAITING ); in net80211_step_associate()
1871 dev->assoc_rc = rc; in net80211_step_associate()
1873 netdev_link_err ( dev->netdev, dev->assoc_rc ); in net80211_step_associate()
1876 need to worry about freeing dev->ctx.probe. */ in net80211_step_associate()
1878 if ( dev->state & NET80211_PROBED ) { in net80211_step_associate()
1879 free ( dev->ctx.assoc ); in net80211_step_associate()
1880 dev->ctx.assoc = NULL; in net80211_step_associate()
1883 net80211_free_wlan ( dev->associating ); in net80211_step_associate()
1884 dev->associating = NULL; in net80211_step_associate()
1888 DBGC ( dev, "802.11 %p association failed (state=%04x): " in net80211_step_associate()
1889 "%s\n", dev, dev->state, strerror ( dev->assoc_rc ) ); in net80211_step_associate()
1892 net80211_autoassociate ( dev ); in net80211_step_associate()
1906 struct net80211_device *dev; in net80211_check_settings_update() local
1910 list_for_each_entry ( dev, &net80211_devices, list ) { in net80211_check_settings_update()
1911 if ( ! ( dev->netdev->state & NETDEV_OPEN ) ) in net80211_check_settings_update()
1915 if ( dev->handshaker && dev->handshaker->change_key && in net80211_check_settings_update()
1916 dev->handshaker->change_key ( dev ) < 0 ) in net80211_check_settings_update()
1919 fetch_string_setting ( netdev_settings ( dev->netdev ), in net80211_check_settings_update()
1924 ( ! ( ! ssid[0] && ( dev->state & NET80211_AUTO_SSID ) ) && in net80211_check_settings_update()
1925 strcmp ( ssid, dev->essid ) != 0 ) ) { in net80211_check_settings_update()
1926 DBGC ( dev, "802.11 %p updating association: " in net80211_check_settings_update()
1927 "%s -> %s\n", dev, dev->essid, ssid ); in net80211_check_settings_update()
1928 net80211_autoassociate ( dev ); in net80211_check_settings_update()
1938 * @v dev 802.11 device
1942 void net80211_autoassociate ( struct net80211_device *dev ) in net80211_autoassociate() argument
1944 if ( ! ( dev->state & NET80211_WORKING ) ) { in net80211_autoassociate()
1945 DBGC2 ( dev, "802.11 %p spawning association process\n", dev ); in net80211_autoassociate()
1946 process_add ( &dev->proc_assoc ); in net80211_autoassociate()
1948 DBGC2 ( dev, "802.11 %p restarting association\n", dev ); in net80211_autoassociate()
1953 if ( dev->associating ) in net80211_autoassociate()
1954 net80211_free_wlan ( dev->associating ); in net80211_autoassociate()
1956 if ( ! ( dev->state & NET80211_PROBED ) ) in net80211_autoassociate()
1958 net80211_probe_finish_best ( dev->ctx.probe ) ); in net80211_autoassociate()
1960 free ( dev->ctx.assoc ); in net80211_autoassociate()
1963 fetch_string_setting ( netdev_settings ( dev->netdev ), in net80211_autoassociate()
1964 &net80211_ssid_setting, dev->essid, in net80211_autoassociate()
1966 dev->ctx.probe = NULL; in net80211_autoassociate()
1967 dev->associating = NULL; in net80211_autoassociate()
1968 dev->assoc_rc = 0; in net80211_autoassociate()
1969 net80211_set_state ( dev, NET80211_PROBED, NET80211_WORKING, 0 ); in net80211_autoassociate()
1975 * @v dev 802.11 device
1980 static void net80211_set_rtscts_rate ( struct net80211_device *dev ) in net80211_set_rtscts_rate() argument
1982 u16 datarate = dev->rates[dev->rate]; in net80211_set_rtscts_rate()
1987 for ( i = 0; i < dev->nr_rates; i++ ) { in net80211_set_rtscts_rate()
1988 u16 rate = dev->rates[i]; in net80211_set_rtscts_rate()
1990 if ( ! ( dev->basic_rates & ( 1 << i ) ) || rate > datarate ) in net80211_set_rtscts_rate()
2004 dev->rtscts_rate = rts_idx; in net80211_set_rtscts_rate()
2010 * @v dev 802.11 device
2011 * @v rate Rate to set, as index into @c dev->rates array
2013 void net80211_set_rate_idx ( struct net80211_device *dev, int rate ) in net80211_set_rate_idx() argument
2015 assert ( dev->netdev->state & NETDEV_OPEN ); in net80211_set_rate_idx()
2017 if ( rate >= 0 && rate < dev->nr_rates && rate != dev->rate ) { in net80211_set_rate_idx()
2018 DBGC2 ( dev, "802.11 %p changing rate from %d->%d Mbps\n", in net80211_set_rate_idx()
2019 dev, dev->rates[dev->rate] / 10, in net80211_set_rate_idx()
2020 dev->rates[rate] / 10 ); in net80211_set_rate_idx()
2022 dev->rate = rate; in net80211_set_rate_idx()
2023 net80211_set_rtscts_rate ( dev ); in net80211_set_rate_idx()
2024 dev->op->config ( dev, NET80211_CFG_RATE ); in net80211_set_rate_idx()
2031 * @v dev 802.11 device
2034 int net80211_change_channel ( struct net80211_device *dev, int channel ) in net80211_change_channel() argument
2036 int i, oldchan = dev->channel; in net80211_change_channel()
2038 assert ( dev->netdev->state & NETDEV_OPEN ); in net80211_change_channel()
2040 for ( i = 0; i < dev->nr_channels; i++ ) { in net80211_change_channel()
2041 if ( dev->channels[i].channel_nr == channel ) { in net80211_change_channel()
2042 dev->channel = i; in net80211_change_channel()
2047 if ( i == dev->nr_channels ) in net80211_change_channel()
2051 return dev->op->config ( dev, NET80211_CFG_CHANNEL ); in net80211_change_channel()
2059 * @v dev 802.11 device
2064 int net80211_prepare_probe ( struct net80211_device *dev, int band, in net80211_prepare_probe() argument
2067 assert ( dev->netdev->state & NETDEV_OPEN ); in net80211_prepare_probe()
2070 DBGC ( dev, "802.11 %p cannot perform active scanning on " in net80211_prepare_probe()
2071 "5GHz band\n", dev ); in net80211_prepare_probe()
2078 DBGC ( dev, "802.11 %p asked to prepare for scanning nothing\n", in net80211_prepare_probe()
2079 dev ); in net80211_prepare_probe()
2083 dev->nr_channels = 0; in net80211_prepare_probe()
2086 net80211_add_channels ( dev, 1, 11, NET80211_REG_TXPOWER ); in net80211_prepare_probe()
2089 net80211_add_channels ( dev, 1, 14, in net80211_prepare_probe()
2092 net80211_add_channels ( dev, 36, 8, in net80211_prepare_probe()
2096 net80211_filter_hw_channels ( dev ); in net80211_prepare_probe()
2099 dev->channel = 0; in net80211_prepare_probe()
2100 dev->op->config ( dev, NET80211_CFG_CHANNEL ); in net80211_prepare_probe()
2103 dev->rate = 0; in net80211_prepare_probe()
2104 dev->nr_rates = 1; in net80211_prepare_probe()
2105 dev->rates[0] = dev->hw->rates[dev->channels[0].band][0]; in net80211_prepare_probe()
2106 dev->op->config ( dev, NET80211_CFG_RATE ); in net80211_prepare_probe()
2114 * @v dev 802.11 device
2118 int net80211_prepare_assoc ( struct net80211_device *dev, in net80211_prepare_assoc() argument
2127 assert ( dev->netdev->state & NETDEV_OPEN ); in net80211_prepare_assoc()
2129 net80211_set_state ( dev, NET80211_ASSOCIATED, 0, 0 ); in net80211_prepare_assoc()
2130 memcpy ( dev->bssid, wlan->bssid, ETH_ALEN ); in net80211_prepare_assoc()
2131 strcpy ( dev->essid, wlan->essid ); in net80211_prepare_assoc()
2133 free ( dev->rsn_ie ); in net80211_prepare_assoc()
2134 dev->rsn_ie = NULL; in net80211_prepare_assoc()
2136 dev->last_beacon_timestamp = beacon->timestamp; in net80211_prepare_assoc()
2137 dev->tx_beacon_interval = 1024 * beacon->beacon_interval; in net80211_prepare_assoc()
2142 net80211_change_channel ( dev, wlan->channel ); in net80211_prepare_assoc()
2144 rc = net80211_process_capab ( dev, beacon->capability ); in net80211_prepare_assoc()
2148 rc = net80211_process_ie ( dev, beacon->info_element, in net80211_prepare_assoc()
2154 dev->rate = 0; in net80211_prepare_assoc()
2155 dev->op->config ( dev, NET80211_CFG_RATE ); in net80211_prepare_assoc()
2158 if ( dev->handshaker && dev->handshaker->stop && in net80211_prepare_assoc()
2159 dev->handshaker->started ) in net80211_prepare_assoc()
2160 dev->handshaker->stop ( dev ); in net80211_prepare_assoc()
2161 free ( dev->handshaker ); in net80211_prepare_assoc()
2162 dev->handshaker = NULL; in net80211_prepare_assoc()
2163 free ( dev->crypto ); in net80211_prepare_assoc()
2164 free ( dev->gcrypto ); in net80211_prepare_assoc()
2165 dev->crypto = dev->gcrypto = NULL; in net80211_prepare_assoc()
2170 dev->handshaker = zalloc ( sizeof ( *handshaker ) + in net80211_prepare_assoc()
2172 if ( ! dev->handshaker ) in net80211_prepare_assoc()
2175 memcpy ( dev->handshaker, handshaker, in net80211_prepare_assoc()
2177 dev->handshaker->priv = ( ( void * ) dev->handshaker + in net80211_prepare_assoc()
2184 ! dev->handshaker ) { in net80211_prepare_assoc()
2185 DBGC ( dev, "802.11 %p no support for handshaking scheme %d\n", in net80211_prepare_assoc()
2186 dev, wlan->handshaking ); in net80211_prepare_assoc()
2191 if ( dev->handshaker ) { in net80211_prepare_assoc()
2192 rc = dev->handshaker->init ( dev ); in net80211_prepare_assoc()
2203 * @v dev 802.11 device
2213 int net80211_send_auth ( struct net80211_device *dev, in net80211_send_auth() argument
2219 net80211_set_state ( dev, 0, NET80211_WAITING, 0 ); in net80211_send_auth()
2226 return net80211_tx_mgmt ( dev, IEEE80211_STYPE_AUTH, wlan->bssid, iob ); in net80211_send_auth()
2232 * @v dev 802.11 device
2240 static void net80211_handle_auth ( struct net80211_device *dev, in net80211_handle_auth() argument
2248 DBGC ( dev, "802.11 %p authentication received improperly " in net80211_handle_auth()
2249 "directed frame (seq. %d)\n", dev, auth->tx_seq ); in net80211_handle_auth()
2250 net80211_set_state ( dev, NET80211_WAITING, 0, in net80211_handle_auth()
2256 DBGC ( dev, "802.11 %p authentication failed: status %d\n", in net80211_handle_auth()
2257 dev, auth->status ); in net80211_handle_auth()
2258 net80211_set_state ( dev, NET80211_WAITING, 0, in net80211_handle_auth()
2263 if ( auth->algorithm == IEEE80211_AUTH_SHARED_KEY && ! dev->crypto ) { in net80211_handle_auth()
2264 DBGC ( dev, "802.11 %p can't perform shared-key authentication " in net80211_handle_auth()
2265 "without a cryptosystem\n", dev ); in net80211_handle_auth()
2266 net80211_set_state ( dev, NET80211_WAITING, 0, in net80211_handle_auth()
2282 netdev_tx ( dev->netdev, in net80211_handle_auth()
2283 dev->crypto->encrypt ( dev->crypto, iob ) ); in net80211_handle_auth()
2287 net80211_set_state ( dev, NET80211_WAITING, NET80211_AUTHENTICATED, in net80211_handle_auth()
2296 * @v dev 802.11 device
2300 int net80211_send_assoc ( struct net80211_device *dev, in net80211_send_assoc() argument
2307 net80211_set_state ( dev, 0, NET80211_WAITING, 0 ); in net80211_send_assoc()
2313 if ( ! ( dev->hw->flags & NET80211_HW_NO_SHORT_PREAMBLE ) ) in net80211_send_assoc()
2315 if ( ! ( dev->hw->flags & NET80211_HW_NO_SHORT_SLOT ) ) in net80211_send_assoc()
2322 ie = net80211_marshal_request_info ( dev, assoc->info_element ); in net80211_send_assoc()
2324 DBGP ( "802.11 %p about to send association request:\n", dev ); in net80211_send_assoc()
2329 return net80211_tx_mgmt ( dev, IEEE80211_STYPE_ASSOC_REQ, in net80211_send_assoc()
2336 * @v dev 802.11 device
2339 static void net80211_handle_assoc_reply ( struct net80211_device *dev, in net80211_handle_assoc_reply() argument
2346 net80211_process_capab ( dev, assoc->capability ); in net80211_handle_assoc_reply()
2347 net80211_process_ie ( dev, assoc->info_element, iob->tail ); in net80211_handle_assoc_reply()
2350 DBGC ( dev, "802.11 %p association failed: status %d\n", in net80211_handle_assoc_reply()
2351 dev, assoc->status ); in net80211_handle_assoc_reply()
2352 net80211_set_state ( dev, NET80211_WAITING, 0, in net80211_handle_assoc_reply()
2358 memcpy ( dev->bssid, hdr->addr3, ETH_ALEN ); in net80211_handle_assoc_reply()
2359 dev->aid = assoc->aid; in net80211_handle_assoc_reply()
2361 net80211_set_state ( dev, NET80211_WAITING, NET80211_ASSOCIATED, in net80211_handle_assoc_reply()
2369 * @v dev 802.11 device
2374 static int net80211_send_disassoc ( struct net80211_device *dev, int reason, in net80211_send_disassoc() argument
2380 if ( ! ( dev->state & NET80211_ASSOCIATED ) ) in net80211_send_disassoc()
2383 net80211_set_state ( dev, NET80211_ASSOCIATED, 0, 0 ); in net80211_send_disassoc()
2388 return net80211_tx_mgmt ( dev, deauth ? IEEE80211_STYPE_DEAUTH : in net80211_send_disassoc()
2389 IEEE80211_STYPE_DISASSOC, dev->bssid, iob ); in net80211_send_disassoc()
2396 * @v dev 802.11 device
2403 void net80211_deauthenticate ( struct net80211_device *dev, int rc ) in net80211_deauthenticate() argument
2405 net80211_send_disassoc ( dev, IEEE80211_REASON_UNSPECIFIED, 1 ); in net80211_deauthenticate()
2406 dev->assoc_rc = rc; in net80211_deauthenticate()
2407 netdev_link_err ( dev->netdev, rc ); in net80211_deauthenticate()
2409 net80211_autoassociate ( dev ); in net80211_deauthenticate()
2419 * @v dev 802.11 device
2423 static void net80211_update_link_quality ( struct net80211_device *dev, in net80211_update_link_quality() argument
2430 if ( ! ( dev->state & NET80211_ASSOCIATED ) ) in net80211_update_link_quality()
2434 dt = ( u32 ) ( beacon->timestamp - dev->last_beacon_timestamp ); in net80211_update_link_quality()
2435 rxi = dev->rx_beacon_interval; in net80211_update_link_quality()
2438 dev->rx_beacon_interval = rxi >> 3; in net80211_update_link_quality()
2440 dev->last_beacon_timestamp = beacon->timestamp; in net80211_update_link_quality()
2447 * @v dev 802.11 device
2451 static void net80211_handle_mgmt ( struct net80211_device *dev, in net80211_handle_mgmt() argument
2470 net80211_set_state ( dev, is_deauth ? NET80211_AUTHENTICATED : in net80211_handle_mgmt()
2473 DBGC ( dev, "802.11 %p %s: reason %d\n", in net80211_handle_mgmt()
2474 dev, is_deauth ? "deauthenticated" : "disassociated", in net80211_handle_mgmt()
2478 net80211_autoassociate ( dev ); in net80211_handle_mgmt()
2484 if ( ! ( dev->state & NET80211_AUTHENTICATED ) ) in net80211_handle_mgmt()
2485 net80211_handle_auth ( dev, iob ); in net80211_handle_mgmt()
2490 if ( ! ( dev->state & NET80211_ASSOCIATED ) ) in net80211_handle_mgmt()
2491 net80211_handle_assoc_reply ( dev, iob ); in net80211_handle_mgmt()
2497 net80211_update_link_quality ( dev, iob ); in net80211_handle_mgmt()
2501 if ( dev->keep_mgmt ) { in net80211_handle_mgmt()
2505 DBGC ( dev, "802.11 %p out of memory\n", dev ); in net80211_handle_mgmt()
2509 list_add_tail ( &iob->list, &dev->mgmt_queue ); in net80211_handle_mgmt()
2510 list_add_tail ( &rxinf->list, &dev->mgmt_info_queue ); in net80211_handle_mgmt()
2522 DBGC ( dev, "802.11 %p received strange management request " in net80211_handle_mgmt()
2523 "(%04x)\n", dev, stype ); in net80211_handle_mgmt()
2527 DBGC ( dev, "802.11 %p received unimplemented management " in net80211_handle_mgmt()
2528 "packet (%04x)\n", dev, stype ); in net80211_handle_mgmt()
2541 * @v dev 802.11 device
2546 static void net80211_free_frags ( struct net80211_device *dev, int fcid ) in net80211_free_frags() argument
2549 struct net80211_frag_cache *frag = &dev->frags[fcid]; in net80211_free_frags()
2566 * @v dev 802.11 device
2574 static struct io_buffer *net80211_accum_frags ( struct net80211_device *dev, in net80211_accum_frags() argument
2577 struct net80211_frag_cache *frag = &dev->frags[fcid]; in net80211_accum_frags()
2605 * @v dev 802.11 device
2609 static void net80211_rx_frag ( struct net80211_device *dev, in net80211_rx_frag() argument
2622 if ( dev->frags[i].in_use == 0 ) in net80211_rx_frag()
2625 if ( dev->frags[i].start_ticks + timeout >= in net80211_rx_frag()
2627 net80211_free_frags ( dev, i ); in net80211_rx_frag()
2631 if ( dev->frags[i].start_ticks > newest_ticks ) { in net80211_rx_frag()
2633 newest_ticks = dev->frags[i].start_ticks; in net80211_rx_frag()
2642 net80211_free_frags ( dev, i ); in net80211_rx_frag()
2645 dev->frags[i].in_use = 1; in net80211_rx_frag()
2646 dev->frags[i].seqnr = IEEE80211_SEQNR ( hdr->seq ); in net80211_rx_frag()
2647 dev->frags[i].start_ticks = currticks(); in net80211_rx_frag()
2648 dev->frags[i].iob[0] = iob; in net80211_rx_frag()
2653 if ( dev->frags[i].in_use && dev->frags[i].seqnr == in net80211_rx_frag()
2659 DBGC ( dev, "802.11 %p dropped fragment fc=%04x " in net80211_rx_frag()
2660 "seq=%04x\n", dev, hdr->fc, hdr->seq ); in net80211_rx_frag()
2665 dev->frags[i].iob[fragnr] = iob; in net80211_rx_frag()
2670 size += iob_len ( dev->frags[i].iob[j] ); in net80211_rx_frag()
2671 if ( dev->frags[i].iob[j] == NULL ) in net80211_rx_frag()
2677 net80211_accum_frags ( dev, i, fragnr, in net80211_rx_frag()
2679 net80211_free_frags ( dev, i ); in net80211_rx_frag()
2680 net80211_rx ( dev, niob, signal, 0 ); in net80211_rx_frag()
2682 DBGC ( dev, "802.11 %p dropping fragmented " in net80211_rx_frag()
2684 "fc=%04x seq=%04x\n", dev, hdr->fc, in net80211_rx_frag()
2686 net80211_free_frags ( dev, i ); in net80211_rx_frag()
2695 * @v dev 802.11 device
2702 void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob, in net80211_rx() argument
2714 if ( dev->last_rx_seq == hdr->seq ) in net80211_rx()
2716 dev->last_rx_seq = hdr->seq; in net80211_rx()
2718 if ( dev->hw->flags & NET80211_HW_RX_HAS_FCS ) { in net80211_rx()
2725 ! memcmp ( hdr->addr2, dev->bssid, ETH_ALEN ) ) { in net80211_rx()
2728 struct net80211_crypto *crypto = dev->crypto; in net80211_rx()
2730 if ( ! dev->crypto ) { in net80211_rx()
2731 DBGC ( dev, "802.11 %p cannot decrypt packet " in net80211_rx()
2732 "without a cryptosystem\n", dev ); in net80211_rx()
2736 if ( ( hdr->addr1[0] & 1 ) && dev->gcrypto ) { in net80211_rx()
2738 crypto = dev->gcrypto; in net80211_rx()
2743 DBGC ( dev, "802.11 %p decryption error\n", dev ); in net80211_rx()
2750 dev->last_signal = signal; in net80211_rx()
2755 net80211_rx_frag ( dev, iob, signal ); in net80211_rx()
2761 net80211_handle_mgmt ( dev, iob, signal ); in net80211_rx()
2770 if ( dev->rctl ) in net80211_rx()
2771 rc80211_update_rx ( dev, hdr->fc & IEEE80211_FC_RETRY, rate ); in net80211_rx()
2774 if ( dev->state & NET80211_ASSOCIATED ) { in net80211_rx()
2775 netdev_rx ( dev->netdev, iob ); in net80211_rx()
2783 netdev_rx_err ( dev->netdev, NULL, EINVAL_CRYPTO_REQUEST ); in net80211_rx()
2785 DBGC2 ( dev, "802.11 %p dropped packet fc=%04x seq=%04x\n", dev, in net80211_rx()
2793 * @v dev 802.11 device
2800 void net80211_rx_err ( struct net80211_device *dev, in net80211_rx_err() argument
2803 netdev_rx_err ( dev->netdev, iob, rc ); in net80211_rx_err()
2808 * @v dev 802.11 device
2820 void net80211_tx_complete ( struct net80211_device *dev, in net80211_tx_complete() argument
2824 if ( dev->rctl ) in net80211_tx_complete()
2825 rc80211_update_tx ( dev, retries, rc ); in net80211_tx_complete()
2828 netdev_tx_complete_err ( dev->netdev, iob, rc ); in net80211_tx_complete()