1
#ifndef _IPXE_NET80211_H
2
#define _IPXE_NET80211_H
4
#include <ipxe/process.h>
5
#include <ipxe/ieee80211.h>
6
#include <ipxe/iobuf.h>
7
#include <ipxe/netdevice.h>
8
#include <ipxe/rc80211.h>
12
* The iPXE 802.11 MAC layer.
16
* Major things NOT YET supported:
17
* - any type of security
20
* Major things that probably will NEVER be supported, barring a
21
* compelling use case and/or corporate sponsorship:
23
* - 802.1X authentication ("WPA Enterprise")
24
* - Contention-free periods
25
* - "ad-hoc" networks (IBSS), monitor mode, host AP mode
26
* - hidden networks on the 5GHz band due to regulatory issues
27
* - spectrum management on the 5GHz band (TPC and DFS), as required
28
* in some non-US regulatory domains
29
* - Clause 14 PHYs (Frequency-Hopping Spread Spectrum on 2.4GHz)
30
* and Clause 16 PHYs (infrared) - I'm not aware of any real-world
34
FILE_LICENCE ( GPL2_OR_LATER );
36
/* All 802.11 devices are handled using a generic "802.11 device"
37
net_device, with a link in its `priv' field to a net80211_device
38
which we use to handle 802.11-specific details. */
41
/** @defgroup net80211_band RF bands on which an 802.11 device can transmit */
44
/** The 2.4 GHz ISM band, unlicensed in most countries */
45
#define NET80211_BAND_2GHZ 0
46
/** The band from 4.9 GHz to 5.7 GHz, which tends to be more restricted */
47
#define NET80211_BAND_5GHZ 1
48
/** Number of RF bands */
49
#define NET80211_NR_BANDS 2
51
/** Bitmask for the 2GHz band */
52
#define NET80211_BAND_BIT_2GHZ (1 << 0)
53
/** Bitmask for the 5GHz band */
54
#define NET80211_BAND_BIT_5GHZ (1 << 1)
59
/** @defgroup net80211_mode 802.11 operation modes supported by hardware */
62
/** 802.11a: 54 Mbps operation using OFDM signaling on the 5GHz band */
63
#define NET80211_MODE_A (1 << 0)
65
/** 802.11b: 1-11 Mbps operation using DSSS/CCK signaling on the 2.4GHz band */
66
#define NET80211_MODE_B (1 << 1)
68
/** 802.11g: 54 Mbps operation using ERP/OFDM signaling on the 2.4GHz band */
69
#define NET80211_MODE_G (1 << 2)
71
/** 802.11n: High-rate operation using MIMO technology on 2.4GHz or 5GHz */
72
#define NET80211_MODE_N (1 << 3)
77
/** @defgroup net80211_cfg Constants for the net80211 config callback */
80
/** Channel choice (@c dev->channel) or regulatory parameters have changed */
81
#define NET80211_CFG_CHANNEL (1 << 0)
83
/** Requested transmission rate (@c dev->rate) has changed */
84
#define NET80211_CFG_RATE (1 << 1)
86
/** Association has been established with a new BSS (@c dev->bssid) */
87
#define NET80211_CFG_ASSOC (1 << 2)
89
/** Low-level link parameters (short preamble, protection, etc) have changed */
90
#define NET80211_CFG_PHY_PARAMS (1 << 3)
95
/** An 802.11 security handshaking protocol */
96
enum net80211_security_proto {
97
/** No security handshaking
99
* This might be used with an open network or with WEP, as
100
* WEP does not have a cryptographic handshaking phase.
102
NET80211_SECPROT_NONE = 0,
104
/** Pre-shared key handshaking
106
* This implements the "WPA Personal" handshake. 802.1X
107
* authentication is not performed -- the user supplies a
108
* pre-shared key directly -- but there is a 4-way handshake
109
* between client and AP to verify that both have the same key
110
* without revealing the contents of that key.
112
NET80211_SECPROT_PSK = 1,
114
/** Full EAP 802.1X handshaking
116
* This implements the "WPA Enterprise" handshake, connecting
117
* to an 802.1X authentication server to provide credentials
118
* and receive a pairwise master key (PMK), which is then used
119
* in the same 4-way handshake as the PSK method.
121
NET80211_SECPROT_EAP = 2,
123
/** Dummy value used when the handshaking type can't be detected */
124
NET80211_SECPROT_UNKNOWN = 3,
128
/** An 802.11 data encryption algorithm */
129
enum net80211_crypto_alg {
130
/** No security, an "Open" network */
131
NET80211_CRYPT_NONE = 0,
133
/** Network protected with WEP (awful RC4-based system)
135
* WEP uses a naive application of RC4, with a monotonically
136
* increasing initialization vector that is prepended to the
137
* key to initialize the RC4 keystream. It is highly insecure
138
* and can be completely cracked or subverted using automated,
139
* robust, freely available tools (aircrack-ng) in minutes.
141
* 40-bit and 104-bit WEP are differentiated only by the size
142
* of the key. They may be advertised as 64-bit and 128-bit,
143
* counting the non-random IV as part of the key bits.
145
NET80211_CRYPT_WEP = 1,
147
/** Network protected with TKIP (better RC4-based system)
149
* Usually known by its trade name of WPA (Wi-Fi Protected
150
* Access), TKIP implements a message integrity code (MIC)
151
* called Michael, a timestamp counter for replay prevention,
152
* and a key mixing function that together remove almost all
153
* the security problems with WEP. Countermeasures are
154
* implemented to prevent high data-rate attacks.
156
* There exists one known attack on TKIP, that allows one to
157
* send between 7 and 15 arbitrary short data packets on a
158
* QoS-enabled network given about an hour of data
159
* gathering. Since iPXE does not support QoS for 802.11
160
* networks, this is not a threat to us. The only other method
161
* is a brute-force passphrase attack.
163
NET80211_CRYPT_TKIP = 2,
165
/** Network protected with CCMP (AES-based system)
167
* Often called WPA2 in commerce, or RSNA (Robust Security
168
* Network Architecture) in the 802.11 standard, CCMP is
169
* highly secure and does not have any known attack vectors.
170
* Since it is based on a block cipher, the statistical
171
* correlation and "chopchop" attacks used with great success
172
* against WEP and minor success against TKIP fail.
174
NET80211_CRYPT_CCMP = 3,
176
/** Dummy value used when the cryptosystem can't be detected */
177
NET80211_CRYPT_UNKNOWN = 4,
181
/** @defgroup net80211_state Bits for the 802.11 association state field */
184
/** An error code indicating the failure mode, or 0 if successful */
185
#define NET80211_STATUS_MASK 0x7F
187
/** Whether the error code provided is a "reason" code, not a "status" code */
188
#define NET80211_IS_REASON 0x80
190
/** Whether we have found the network we will be associating with */
191
#define NET80211_PROBED (1 << 8)
193
/** Whether we have successfully authenticated with the network
195
* This usually has nothing to do with actual security; it is a
196
* holdover from older 802.11 implementation ideas.
198
#define NET80211_AUTHENTICATED (1 << 9)
200
/** Whether we have successfully associated with the network */
201
#define NET80211_ASSOCIATED (1 << 10)
203
/** Whether we have completed security handshaking with the network
205
* Once this is set, we can send data packets. For that reason this
206
* bit is set even in cases where no security handshaking is
209
#define NET80211_CRYPTO_SYNCED (1 << 11)
211
/** Whether the auto-association task is running */
212
#define NET80211_WORKING (1 << 12)
214
/** Whether the auto-association task is waiting for a reply from the AP */
215
#define NET80211_WAITING (1 << 13)
217
/** Whether the auto-association task should be suppressed
219
* This is set by the `iwlist' command so that it can open the device
220
* without starting another probe process that will interfere with its
223
#define NET80211_NO_ASSOC (1 << 14)
225
/** Whether this association was performed using a broadcast SSID
227
* If the user opened this device without netX/ssid set, the device's
228
* SSID will be set to that of the network it chooses to associate
229
* with, but the netX/ssid setting will remain blank. If we don't
230
* remember that we started from no specified SSID, it will appear
231
* every time settings are updated (e.g. after DHCP) that we need to
232
* reassociate due to the difference between the set SSID and our own.
234
#define NET80211_AUTO_SSID (1 << 15)
240
/** @defgroup net80211_phy 802.11 physical layer flags */
243
/** Whether to use RTS/CTS or CTS-to-self protection for transmissions
245
* Since the RTS or CTS is transmitted using 802.11b signaling, and
246
* includes a field indicating the amount of time that will be used by
247
* transmission of the following packet, this serves as an effective
248
* protection mechanism to avoid 802.11b clients interfering with
249
* 802.11g clients on mixed networks.
251
#define NET80211_PHY_USE_PROTECTION (1 << 1)
253
/** Whether to use 802.11b short preamble operation
255
* Short-preamble operation can moderately increase throughput on
256
* 802.11b networks operating between 2Mbps and 11Mbps. It is
257
* irrelevant for 802.11g data rates, since they use a different
260
#define NET80211_PHY_USE_SHORT_PREAMBLE (1 << 2)
262
/** Whether to use 802.11g short slot operation
264
* This affects a low-level timing parameter of 802.11g transmissions.
266
#define NET80211_PHY_USE_SHORT_SLOT (1 << 3)
271
/** The maximum number of TX rates we allow to be configured simultaneously */
272
#define NET80211_MAX_RATES 16
274
/** The maximum number of channels we allow to be configured simultaneously */
275
#define NET80211_MAX_CHANNELS 40
277
/** Seconds we'll wait to get all fragments of a packet */
278
#define NET80211_FRAG_TIMEOUT 2
280
/** The number of fragments we can receive at once
282
* The 802.11 standard requires that this be at least 3.
284
#define NET80211_NR_CONCURRENT_FRAGS 3
286
/** Maximum TX power to allow (dBm), if we don't get a regulatory hint */
287
#define NET80211_REG_TXPOWER 20
290
struct net80211_device;
292
/** Operations that must be implemented by an 802.11 driver */
293
struct net80211_device_operations {
294
/** Open 802.11 device
296
* @v dev 802.11 device
297
* @ret rc Return status code
299
* This method should allocate RX I/O buffers and enable the
300
* hardware to start transmitting and receiving packets on the
301
* channels its net80211_register() call indicated it could
302
* handle. It does not need to tune the antenna to receive
303
* packets on any particular channel.
305
int ( * open ) ( struct net80211_device *dev );
307
/** Close 802.11 network device
309
* @v dev 802.11 device
311
* This method should stop the flow of packets, and call
312
* net80211_tx_complete() for any packets remaining in the
315
void ( * close ) ( struct net80211_device *dev );
317
/** Transmit packet on 802.11 network device
319
* @v dev 802.11 device
320
* @v iobuf I/O buffer
321
* @ret rc Return status code
323
* This method should cause the hardware to initiate
324
* transmission of the I/O buffer, using the channel and rate
325
* most recently indicated by an appropriate call to the
326
* @c config callback. The 802.11 layer guarantees that said
327
* channel and rate will be the same as those currently
328
* reflected in the fields of @a dev.
330
* If this method returns success, the I/O buffer remains
331
* owned by the network layer's TX queue, and the driver must
332
* eventually call net80211_tx_complete() to free the buffer
333
* whether transmission succeeded or not. If this method
334
* returns failure, it will be interpreted as "failure to
335
* enqueue buffer" and the I/O buffer will be immediately
338
* This method is guaranteed to be called only when the device
341
int ( * transmit ) ( struct net80211_device *dev,
342
struct io_buffer *iobuf );
344
/** Poll for completed and received packets
346
* @v dev 802.11 device
348
* This method should cause the hardware to check for
349
* completed transmissions and received packets. Any received
350
* packets should be delivered via net80211_rx(), and
351
* completed transmissions should be indicated using
352
* net80211_tx_complete().
354
* This method is guaranteed to be called only when the device
357
void ( * poll ) ( struct net80211_device *dev );
359
/** Enable or disable interrupts
361
* @v dev 802.11 device
362
* @v enable If TRUE, interrupts should be enabled
364
void ( * irq ) ( struct net80211_device *dev, int enable );
366
/** Update hardware state to match 802.11 layer state
368
* @v dev 802.11 device
369
* @v changed Set of flags indicating what may have changed
370
* @ret rc Return status code
372
* This method should cause the hardware state to be
373
* reinitialized from the state indicated in fields of
374
* net80211_device, in the areas indicated by bits set in
375
* @a changed. If the hardware is unable to do so, this method
376
* may return an appropriate error indication.
378
* This method is guaranteed to be called only when the device
381
int ( * config ) ( struct net80211_device *dev, int changed );
384
/** An 802.11 RF channel. */
385
struct net80211_channel
387
/** The band with which this channel is associated */
390
/** A channel number interpreted according to the band
392
* The 2.4GHz band uses channel numbers from 1-13 at 5MHz
393
* intervals such that channel 1 is 2407 MHz; channel 14,
394
* legal for use only in Japan, is defined separately as 2484
395
* MHz. Adjacent channels will overlap, since 802.11
396
* transmissions use a 20 MHz (4-channel) bandwidth. Most
397
* commonly, channels 1, 6, and 11 are used.
399
* The 5GHz band uses channel numbers derived directly from
400
* the frequency; channel 0 is 5000 MHz, and channels are
401
* always spaced 5 MHz apart. Channel numbers over 180 are
402
* relative to 4GHz instead of 5GHz, but these are rarely
403
* seen. Most channels are not legal for use.
407
/** The center frequency for this channel
409
* Currently a bandwidth of 20 MHz is assumed.
413
/** Hardware channel value */
416
/** Maximum allowable transmit power, in dBm
418
* This should be interpreted as EIRP, the power supplied to
419
* an ideal isotropic antenna in order to achieve the same
420
* average signal intensity as the real hardware at a
421
* particular distance.
423
* Currently no provision is made for directional antennas.
428
/** Information on the capabilities of an 802.11 hardware device
430
* In its probe callback, an 802.11 driver must read hardware
431
* registers to determine the appropriate contents of this structure,
432
* fill it, and pass it to net80211_register() so that the 802.11
433
* layer knows how to treat the hardware and what to advertise as
434
* supported to access points.
436
struct net80211_hw_info
438
/** Default hardware MAC address.
440
* The user may change this by setting the @c netX/mac setting
441
* before the driver's open function is called; in that case
442
* the driver must set the hardware MAC address to the address
443
* contained in the wrapping net_device's ll_addr field, or if
444
* that is impossible, set that ll_addr field back to the
445
* unchangeable hardware MAC address.
449
/** A bitwise OR of the 802.11x modes supported by this device */
452
/** A bitwise OR of the bands on which this device can communicate */
455
/** A set of flags indicating peculiarities of this device. */
457
/** Received frames include a frame check sequence. */
458
NET80211_HW_RX_HAS_FCS = (1 << 1),
460
/** Hardware doesn't support 2.4GHz short preambles
462
* This is only relevant for 802.11b operation above
463
* 2Mbps. All 802.11g devices support short preambles.
465
NET80211_HW_NO_SHORT_PREAMBLE = (1 << 2),
467
/** Hardware doesn't support 802.11g short slot operation */
468
NET80211_HW_NO_SHORT_SLOT = (1 << 3),
471
/** Signal strength information that can be provided by the device
473
* Signal strength is passed to net80211_rx(), primarily to
474
* allow determination of the closest access point for a
475
* multi-AP network. The units are provided for completeness
476
* of status displays.
479
/** No signal strength information supported */
480
NET80211_SIGNAL_NONE = 0,
481
/** Signal strength in arbitrary units */
482
NET80211_SIGNAL_ARBITRARY,
483
/** Signal strength in decibels relative to arbitrary base */
485
/** Signal strength in decibels relative to 1mW */
489
/** Maximum signal in arbitrary cases
491
* If signal_type is NET80211_SIGNAL_ARBITRARY or
492
* NET80211_SIGNAL_DB, the driver should report it on a scale
493
* from 0 to signal_max.
497
/** List of RF channels supported by the card */
498
struct net80211_channel channels[NET80211_MAX_CHANNELS];
500
/** Number of supported channels */
503
/** List of transmission rates supported by the card, indexed by band
505
* Rates should be in 100kbps increments (e.g. 11 Mbps would
506
* be represented as the number 110).
508
u16 rates[NET80211_NR_BANDS][NET80211_MAX_RATES];
510
/** Number of supported rates, indexed by band */
511
int nr_rates[NET80211_NR_BANDS];
513
/** Estimate of the time required to change channels, in microseconds
515
* If this is not known, a guess on the order of a few
516
* milliseconds (value of 1000-5000) is reasonable.
518
unsigned channel_change_time;
521
/** Structure tracking received fragments for a packet
523
* We set up a fragment cache entry when we receive a packet marked as
524
* fragment 0 with the "more fragments" bit set in its frame control
525
* header. We are required by the 802.11 standard to track 3
526
* fragmented packets arriving simultaneously; if we receive more we
527
* may drop some. Upon receipt of a new fragment-0 packet, if no entry
528
* is available or expired, we take over the most @e recent entry for
529
* the new packet, since we don't want to starve old entries from ever
530
* finishing at all. If we get a fragment after the zeroth with no
531
* cache entry for its packet, we drop it.
533
struct net80211_frag_cache
535
/** Whether this cache entry is in use */
538
/** Sequence number of this MSDU (packet) */
541
/** Timestamp from point at which first fragment was collected */
544
/** Buffers for each fragment */
545
struct io_buffer *iob[16];
549
/** Interface to an 802.11 security handshaking protocol
551
* Security handshaking protocols handle parsing a user-specified key
552
* into a suitable input to the encryption algorithm, and for WPA and
553
* better systems, manage performing whatever authentication with the
554
* network is necessary.
556
* At all times when any method in this structure is called with a
557
* net80211_device argument @a dev, a dynamically allocated copy of
558
* the handshaker structure itself with space for the requested amount
559
* of private data may be accessed as @c dev->handshaker. The
560
* structure will not be modified, and will only be freed during
561
* reassociation and device closing after the @a stop method has been
564
struct net80211_handshaker
566
/** The security handshaking protocol implemented */
567
enum net80211_security_proto protocol;
569
/** Initialize security handshaking protocol
571
* @v dev 802.11 device
572
* @ret rc Return status code
574
* This method is expected to access @c netX/key or other
575
* applicable settings to determine the parameters for
576
* handshaking. If no handshaking is required, it should call
577
* sec80211_install() with the cryptosystem and key that are
578
* to be used, and @c start and @c step should be set to @c
581
* This is always called just before association is performed,
582
* but after its parameters have been set; in particular, you
583
* may rely on the contents of the @a essid field in @a dev.
585
int ( * init ) ( struct net80211_device *dev );
587
/** Start handshaking
589
* @v dev 802.11 device
590
* @ret rc Return status code
592
* This method is expected to set up internal state so that
593
* packets sent immediately after association, before @a step
594
* can be called, will be handled appropriately.
596
* This is always called just before association is attempted.
598
int ( * start ) ( struct net80211_device *dev );
600
/** Process handshaking state
602
* @v dev 802.11 device
603
* @ret rc Return status code, or positive if done
605
* This method is expected to perform as much progress on the
606
* protocol it implements as is possible without blocking. It
607
* should return 0 if it wishes to be called again, a negative
608
* return status code on error, or a positive value if
609
* handshaking is complete. In the case of a positive return,
610
* net80211_crypto_install() must have been called.
612
* If handshaking may require further action (e.g. an AP that
613
* might decide to rekey), handlers must be installed by this
614
* function that will act without further calls to @a step.
616
int ( * step ) ( struct net80211_device *dev );
618
/** Change cryptographic key based on setting
620
* @v dev 802.11 device
621
* @ret rc Return status code
623
* This method is called whenever the @c netX/key setting
624
* @e may have been changed. It is expected to determine
625
* whether it did in fact change, and if so, to install the
626
* new key using net80211_crypto_install(). If it is not
627
* possible to do this immediately, this method should return
628
* an error; in that case the 802.11 stack will reassociate,
629
* following the usual init/start/step sequence.
631
* This method is only relevant when it is possible to
632
* associate successfully with an incorrect key. When it is
633
* not, a failed association will be retried until the user
634
* changes the key setting, and a successful association will
635
* not be dropped due to such a change. When association with
636
* an incorrect key is impossible, this function should return
637
* 0 after performing no action.
639
int ( * change_key ) ( struct net80211_device *dev );
641
/** Stop security handshaking handlers
643
* @v dev 802.11 device
645
* This method is called just before freeing a security
646
* handshaker; it could, for example, delete a process that @a
647
* start had created to manage the security of the connection.
648
* If not needed it may be set to NULL.
650
void ( * stop ) ( struct net80211_device *dev );
652
/** Amount of private data requested
654
* Before @c init is called for the first time, this structure's
655
* @c priv pointer will point to this many bytes of allocated
656
* data, where the allocation will be performed separately for
657
* each net80211_device.
661
/** Whether @a start has been called
663
* Reset to 0 after @a stop is called.
667
/** Pointer to private data
669
* In initializing this structure statically for a linker
670
* table, set this to NULL.
675
#define NET80211_HANDSHAKERS __table ( struct net80211_handshaker, \
676
"net80211_handshakers" )
677
#define __net80211_handshaker __table_entry ( NET80211_HANDSHAKERS, 01 )
680
/** Interface to an 802.11 cryptosystem
682
* Cryptosystems define a net80211_crypto structure statically, using
683
* a iPXE linker table to make it available to the 802.11 layer. When
684
* the cryptosystem needs to be used, the 802.11 code will allocate a
685
* copy of the static definition plus whatever space the algorithm has
686
* requested for private state, and point net80211_device::crypto or
687
* net80211_device::gcrypto at it.
689
struct net80211_crypto
691
/** The cryptographic algorithm implemented */
692
enum net80211_crypto_alg algorithm;
694
/** Initialize cryptosystem using a given key
696
* @v crypto 802.11 cryptosystem
697
* @v key Pointer to key bytes
698
* @v keylen Number of key bytes
699
* @v rsc Initial receive sequence counter, if applicable
700
* @ret rc Return status code
702
* This method is passed the communication key provided by the
703
* security handshake handler, which will already be in the
704
* low-level form required. It may not store a pointer to the
705
* key after returning; it must copy it to its private storage.
707
int ( * init ) ( struct net80211_crypto *crypto, const void *key,
708
int keylen, const void *rsc );
710
/** Encrypt a frame using the cryptosystem
712
* @v crypto 802.11 cryptosystem
714
* @ret eiob Newly allocated I/O buffer with encrypted packet
716
* This method is called to encrypt a single frame. It is
717
* guaranteed that initialize() will have completed
718
* successfully before this method is called.
720
* The frame passed already has an 802.11 header prepended,
721
* but the PROTECTED bit in the frame control field will not
722
* be set; this method is responsible for setting it. The
723
* returned I/O buffer should contain a complete copy of @a
724
* iob, including the 802.11 header, but with the PROTECTED
725
* bit set, the data encrypted, and whatever encryption
726
* headers/trailers are necessary added.
728
* This method should never free the passed I/O buffer.
730
* Return NULL if the packet could not be encrypted, due to
731
* memory limitations or otherwise.
733
struct io_buffer * ( * encrypt ) ( struct net80211_crypto *crypto,
734
struct io_buffer *iob );
736
/** Decrypt a frame using the cryptosystem
738
* @v crypto 802.11 cryptosystem
739
* @v eiob Encrypted I/O buffer
740
* @ret iob Newly allocated I/O buffer with decrypted packet
742
* This method is called to decrypt a single frame. It is
743
* guaranteed that initialize() will have completed
744
* successfully before this method is called.
746
* Decryption follows the reverse of the pattern used for
747
* encryption: this method must copy the 802.11 header into
748
* the returned packet, decrypt the data stream, remove any
749
* encryption header or trailer, and clear the PROTECTED bit
750
* in the frame control header.
752
* This method should never free the passed I/O buffer.
754
* Return NULL if memory was not available for decryption, if
755
* a consistency or integrity check on the decrypted frame
756
* failed, or if the decrypted frame should not be processed
757
* by the network stack for any other reason.
759
struct io_buffer * ( * decrypt ) ( struct net80211_crypto *crypto,
760
struct io_buffer *iob );
762
/** Length of private data requested to be allocated */
765
/** Private data for the algorithm to store key and state info */
769
#define NET80211_CRYPTOS __table ( struct net80211_crypto, "net80211_cryptos" )
770
#define __net80211_crypto __table_entry ( NET80211_CRYPTOS, 01 )
773
struct net80211_probe_ctx;
774
struct net80211_assoc_ctx;
777
/** Structure encapsulating the complete state of an 802.11 device
779
* An 802.11 device is always wrapped by a network device, and this
780
* network device is always pointed to by the @a netdev field. In
781
* general, operations should never be performed by 802.11 code using
782
* netdev functions directly. It is usually the case that the 802.11
783
* layer might need to do some processing or bookkeeping on top of
784
* what the netdevice code will do.
786
struct net80211_device
788
/** The net_device that wraps us. */
789
struct net_device *netdev;
791
/** List of 802.11 devices. */
792
struct list_head list;
794
/** 802.11 device operations */
795
struct net80211_device_operations *op;
797
/** Driver private data */
800
/** Information about the hardware, provided to net80211_register() */
801
struct net80211_hw_info *hw;
803
/* ---------- Channel and rate fields ---------- */
805
/** A list of all possible channels we might use */
806
struct net80211_channel channels[NET80211_MAX_CHANNELS];
808
/** The number of channels in the channels array */
811
/** The channel currently in use, as an index into the channels array */
814
/** A list of all possible TX rates we might use
816
* Rates are in units of 100 kbps.
818
u16 rates[NET80211_MAX_RATES];
820
/** The number of transmission rates in the rates array */
823
/** The rate currently in use, as an index into the rates array */
826
/** The rate to use for RTS/CTS transmissions
828
* This is always the fastest basic rate that is not faster
829
* than the data rate in use. Also an index into the rates array.
833
/** Bitmask of basic rates
835
* If bit N is set in this value, with the LSB considered to
836
* be bit 0, then rate N in the rates array is a "basic" rate.
838
* We don't decide which rates are "basic"; our AP does, and
839
* we respect its wishes. We need to be able to identify basic
840
* rates in order to calculate the duration of a CTS packet
841
* used for 802.11 g/b interoperability.
845
/* ---------- Association fields ---------- */
847
/** The asynchronous association process.
849
* When an 802.11 netdev is opened, or when the user changes
850
* the SSID setting on an open 802.11 device, an
851
* autoassociation task is started by net80211_autoassocate()
852
* to associate with the new best network. The association is
853
* asynchronous, but no packets can be transmitted until it is
854
* complete. If it is successful, the wrapping net_device is
855
* set as "link up". If it fails, @c assoc_rc will be set with
856
* an error indication.
858
struct process proc_assoc;
860
/** Network with which we are associating
862
* This will be NULL when we are not actively in the process
863
* of associating with a network we have already successfully
866
struct net80211_wlan *associating;
868
/** Context for the association process
870
* This is a probe_ctx if the @c PROBED flag is not set in @c
871
* state, and an assoc_ctx otherwise.
874
struct net80211_probe_ctx *probe;
875
struct net80211_assoc_ctx *assoc;
878
/** Security handshaker being used */
879
struct net80211_handshaker *handshaker;
881
/** State of our association to the network
883
* Since the association process happens asynchronously, it's
884
* necessary to have some channel of communication so the
885
* driver can say "I got an association reply and we're OK" or
886
* similar. This variable provides that link. It is a bitmask
887
* of any of NET80211_PROBED, NET80211_AUTHENTICATED,
888
* NET80211_ASSOCIATED, NET80211_CRYPTO_SYNCED to indicate how
889
* far along in associating we are; NET80211_WORKING if the
890
* association task is running; and NET80211_WAITING if a
891
* packet has been sent that we're waiting for a reply to. We
892
* can only be crypto-synced if we're associated, we can
893
* only be associated if we're authenticated, we can only be
894
* authenticated if we've probed.
896
* If an association process fails (that is, we receive a
897
* packet with an error indication), the error code is copied
898
* into bits 6-0 of this variable and bit 7 is set to specify
899
* what type of error code it is. An AP can provide either a
900
* "status code" (0-51 are defined) explaining why it refused
901
* an association immediately, or a "reason code" (0-45 are
902
* defined) explaining why it canceled an association after it
903
* had originally OK'ed it. Status and reason codes serve
904
* similar functions, but they use separate error message
905
* tables. A iPXE-formatted return status code (negative) is
906
* placed in @c assoc_rc.
908
* If the failure to associate is indicated by a status code,
909
* the NET80211_IS_REASON bit will be clear; if it is
910
* indicated by a reason code, the bit will be set. If we were
911
* successful, both zero status and zero reason mean success,
912
* so there is no ambiguity.
914
* To prevent association when opening the device, user code
915
* can set the NET80211_NO_ASSOC bit. The final bit in this
916
* variable, NET80211_AUTO_SSID, is used to remember whether
917
* we picked our SSID through automated probing as opposed to
918
* user specification; the distinction becomes relevant in the
919
* settings applicator.
923
/** Return status code associated with @c state */
926
/** RSN or WPA information element to include with association
928
* If set to @c NULL, none will be included. It is expected
929
* that this will be set by the @a init function of a security
930
* handshaker if it is needed.
932
union ieee80211_ie *rsn_ie;
934
/* ---------- Parameters of currently associated network ---------- */
936
/** 802.11 cryptosystem for our current network
938
* For an open network, this will be set to NULL.
940
struct net80211_crypto *crypto;
942
/** 802.11 cryptosystem for multicast and broadcast frames
944
* If this is NULL, the cryptosystem used for receiving
945
* unicast frames will also be used for receiving multicast
946
* and broadcast frames. Transmitted multicast and broadcast
947
* frames are always sent unicast to the AP, who multicasts
948
* them on our behalf; thus they always use the unicast
951
struct net80211_crypto *gcrypto;
953
/** MAC address of the access point most recently associated */
956
/** SSID of the access point we are or will be associated with
958
* Although the SSID field in 802.11 packets is generally not
959
* NUL-terminated, here and in net80211_wlan we add a NUL for
962
char essid[IEEE80211_MAX_SSID_LEN+1];
964
/** Association ID given to us by the AP */
967
/** TSFT value for last beacon received, microseconds */
968
u64 last_beacon_timestamp;
970
/** Time between AP sending beacons, microseconds */
971
u32 tx_beacon_interval;
973
/** Smoothed average time between beacons, microseconds */
974
u32 rx_beacon_interval;
976
/* ---------- Physical layer information ---------- */
978
/** Physical layer options
980
* These control the use of CTS protection, short preambles,
981
* and short-slot operation.
985
/** Signal strength of last received packet */
988
/** Rate control state */
989
struct rc80211_ctx *rctl;
991
/* ---------- Packet handling state ---------- */
993
/** Fragment reassembly state */
994
struct net80211_frag_cache frags[NET80211_NR_CONCURRENT_FRAGS];
996
/** The sequence number of the last packet we sent */
999
/** Packet duplication elimination state
1001
* We are only required to handle immediate duplicates for
1002
* each direct sender, and since we can only have one direct
1003
* sender (the AP), we need only keep the sequence control
1004
* field from the most recent packet we've received. Thus,
1005
* this field stores the last sequence control field we've
1006
* received for a packet from the AP.
1010
/** RX management packet queue
1012
* Sometimes we want to keep probe, beacon, and action packets
1013
* that we receive, such as when we're scanning for networks.
1014
* Ordinarily we drop them because they are sent at a large
1015
* volume (ten beacons per second per AP, broadcast) and we
1016
* have no need of them except when we're scanning.
1018
* When keep_mgmt is TRUE, received probe, beacon, and action
1019
* management packets will be stored in this queue.
1021
struct list_head mgmt_queue;
1023
/** RX management packet info queue
1025
* We need to keep track of the signal strength for management
1026
* packets we're keeping, because that provides the only way
1027
* to distinguish between multiple APs for the same network.
1028
* Since we can't extend io_buffer to store signal, this field
1029
* heads a linked list of "RX packet info" structures that
1030
* contain that signal strength field. Its entries always
1031
* parallel the entries in mgmt_queue, because the two queues
1032
* are always added to or removed from in parallel.
1034
struct list_head mgmt_info_queue;
1036
/** Whether to store management packets
1038
* Received beacon, probe, and action packets will be added to
1039
* mgmt_queue (and their signal strengths added to
1040
* mgmt_info_queue) only when this variable is TRUE. It should
1041
* be set by net80211_keep_mgmt() (which returns the old
1042
* value) only when calling code is prepared to poll the
1043
* management queue frequently, because packets will otherwise
1044
* pile up and exhaust memory.
1049
/** Structure representing a probed network.
1051
* This is returned from the net80211_probe_finish functions and
1052
* passed to the low-level association functions. At least essid,
1053
* bssid, channel, beacon, and security must be filled in if you want
1054
* to build this structure manually.
1056
struct net80211_wlan
1058
/** The human-readable ESSID (network name)
1060
* Although the 802.11 SSID field is generally not
1061
* NUL-terminated, the iPXE code adds an extra NUL (and
1062
* expects one in this structure) for convenience.
1064
char essid[IEEE80211_MAX_SSID_LEN+1];
1066
/** MAC address of the strongest-signal access point for this ESSID */
1069
/** Signal strength of beacon frame from that access point */
1072
/** The channel on which that access point communicates
1074
* This is a raw channel number (net80211_channel::channel_nr),
1075
* so that it will not be affected by reconfiguration of the
1076
* device channels array.
1080
/** The complete beacon or probe-response frame received */
1081
struct io_buffer *beacon;
1083
/** Security handshaking method used on the network */
1084
enum net80211_security_proto handshaking;
1086
/** Cryptographic algorithm used on the network */
1087
enum net80211_crypto_alg crypto;
1089
/** Link to allow chaining multiple structures into a list to
1090
be returned from net80211_probe_finish_all(). */
1091
struct list_head list;
1095
/** 802.11 encryption key setting */
1096
extern const struct setting
1097
net80211_key_setting __setting ( SETTING_NETDEV_EXTRA, key );
1101
* @defgroup net80211_probe 802.11 network location API
1104
int net80211_prepare_probe ( struct net80211_device *dev, int band,
1106
struct net80211_probe_ctx * net80211_probe_start ( struct net80211_device *dev,
1109
int net80211_probe_step ( struct net80211_probe_ctx *ctx );
1110
struct net80211_wlan *
1111
net80211_probe_finish_best ( struct net80211_probe_ctx *ctx );
1112
struct list_head *net80211_probe_finish_all ( struct net80211_probe_ctx *ctx );
1114
void net80211_free_wlan ( struct net80211_wlan *wlan );
1115
void net80211_free_wlanlist ( struct list_head *list );
1120
* @defgroup net80211_mgmt 802.11 network management API
1123
struct net80211_device * net80211_get ( struct net_device *netdev );
1124
void net80211_autoassociate ( struct net80211_device *dev );
1126
int net80211_change_channel ( struct net80211_device *dev, int channel );
1127
void net80211_set_rate_idx ( struct net80211_device *dev, int rate );
1129
int net80211_keep_mgmt ( struct net80211_device *dev, int enable );
1130
struct io_buffer * net80211_mgmt_dequeue ( struct net80211_device *dev,
1132
int net80211_tx_mgmt ( struct net80211_device *dev, u16 fc,
1133
u8 bssid[ETH_ALEN], struct io_buffer *iob );
1138
* @defgroup net80211_assoc 802.11 network association API
1141
int net80211_prepare_assoc ( struct net80211_device *dev,
1142
struct net80211_wlan *wlan );
1143
int net80211_send_auth ( struct net80211_device *dev,
1144
struct net80211_wlan *wlan, int method );
1145
int net80211_send_assoc ( struct net80211_device *dev,
1146
struct net80211_wlan *wlan );
1147
void net80211_deauthenticate ( struct net80211_device *dev, int rc );
1152
* @defgroup net80211_driver 802.11 driver interface API
1155
struct net80211_device *net80211_alloc ( size_t priv_size );
1156
int net80211_register ( struct net80211_device *dev,
1157
struct net80211_device_operations *ops,
1158
struct net80211_hw_info *hw );
1159
u16 net80211_duration ( struct net80211_device *dev, int bytes, u16 rate );
1160
void net80211_rx ( struct net80211_device *dev, struct io_buffer *iob,
1161
int signal, u16 rate );
1162
void net80211_rx_err ( struct net80211_device *dev,
1163
struct io_buffer *iob, int rc );
1164
void net80211_tx_complete ( struct net80211_device *dev,
1165
struct io_buffer *iob, int retries, int rc );
1166
void net80211_unregister ( struct net80211_device *dev );
1167
void net80211_free ( struct net80211_device *dev );
1171
* Calculate duration field for a CTS control frame
1173
* @v dev 802.11 device
1174
* @v size Size of the packet being cleared to send
1176
* A CTS control frame's duration field captures the frame being
1177
* protected and its 10-byte ACK.
1179
static inline u16 net80211_cts_duration ( struct net80211_device *dev,
1182
return ( net80211_duration ( dev, 10,
1183
dev->rates[dev->rtscts_rate] ) +
1184
net80211_duration ( dev, size, dev->rates[dev->rate] ) );