sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget6/translations/zh_CN/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/zh_TW/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/it_IT/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/ja_JP/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/ko_KR/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget6/translations/sp_SP/driver-api/80211/mac80211-advancedmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(hmac80211 subsystem (advanced)h]hmac80211 subsystem (advanced)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhP/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced.rsthKubh paragraph)}(hInformation contained within this part of the book is of interest only for advanced interaction of mac80211 with drivers to exploit more hardware capabilities and improve performance.h]hInformation contained within this part of the book is of interest only for advanced interaction of mac80211 with drivers to exploit more hardware capabilities and improve performance.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h LED supporth]h LED support}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hMac80211 supports various ways of blinking LEDs. Wherever possible, device LEDs should be exposed as LED class devices and hooked up to the appropriate trigger, which will then be triggered appropriately by mac80211.h]hMac80211 supports various ways of blinking LEDs. Wherever possible, device LEDs should be exposed as LED class devices and hooked up to the appropriate trigger, which will then be triggered appropriately by mac80211.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleieee80211_tpt_blink (C struct)c.ieee80211_tpt_blinkhNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(hieee80211_tpt_blinkh]hdesc_signature_line)}(hstruct ieee80211_tpt_blinkh](hdesc_sig_keyword)}(hstructh]hstruct}(hj hhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhM@ubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhM@ubh desc_name)}(hieee80211_tpt_blinkh]h desc_sig_name)}(hjh]hieee80211_tpt_blink}(hj3hhhNhNubah}(h]h ]nah"]h$]h&]uh1j1hj-ubah}(h]h ](sig-namedescnameeh"]h$]h&] xml:spacepreserveuh1j+hjhhhjhM@ubeh}(h]h ]h"]h$]h&]jIjJ add_permalinkuh1jsphinx_line_type declaratorhhhhhjhM@ubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhjhM@hhhhubh desc_content)}(hhh]h)}(hthroughput blink descriptionh]hthroughput blink description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMAhjahhubah}(h]h ]h"]h$]h&]uh1j_hhhhhjhM@ubeh}(h]h ](cstructeh"]h$]h&]domainj|objtypej}desctypej}noindex noindexentrynocontentsentryuh1hhhhhhNhNubh container)}(h**Definition**:: struct ieee80211_tpt_blink { int throughput; int blink_time; }; **Members** ``throughput`` throughput in Kbit/sec ``blink_time`` blink time in milliseconds (full cycle, ie. one off + one on period)h](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMEhjubh literal_block)}(hGstruct ieee80211_tpt_blink { int throughput; int blink_time; };h]hGstruct ieee80211_tpt_blink { int throughput; int blink_time; };}hjsbah}(h]h ]h"]h$]h&]jIjJuh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMGhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMLhjubhdefinition_list)}(hhh](hdefinition_list_item)}(h&``throughput`` throughput in Kbit/sec h](hterm)}(h``throughput``h]hliteral)}(hjh]h throughput}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMChjubh definition)}(hhh]h)}(hthroughput in Kbit/sech]hthroughput in Kbit/sec}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubj)}(hS``blink_time`` blink time in milliseconds (full cycle, ie. one off + one on period)h](j)}(h``blink_time``h]j)}(hj!h]h blink_time}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMDhjubj)}(hhh]h)}(hDblink time in milliseconds (full cycle, ie. one off + one on period)h]hDblink time in milliseconds (full cycle, ie. one off + one on period)}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMDhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMDhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(ieee80211_tpt_led_trigger_flags (C enum)!c.ieee80211_tpt_led_trigger_flagshNtauh1hhhhhhNhNubh)}(hhh](h)}(hieee80211_tpt_led_trigger_flagsh]j)}(h$enum ieee80211_tpt_led_trigger_flagsh](j )}(henumh]henum}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMKubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjvhhhjhMKubj,)}(hieee80211_tpt_led_trigger_flagsh]j2)}(hjth]hieee80211_tpt_led_trigger_flags}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjvhhhjhMKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjrhhhjhMKubah}(h]jmah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhMKhjohhubj`)}(hhh]h)}(hthroughput trigger flagsh]hthroughput trigger flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMLhjhhubah}(h]h ]h"]h$]h&]uh1j_hjohhhjhMKubeh}(h]h ](j|enumeh"]h$]h&]jj|jjjjjjjuh1hhhhhhNhNubj)}(hX**Constants** ``IEEE80211_TPT_LEDTRIG_FL_RADIO`` enable blinking with radio ``IEEE80211_TPT_LEDTRIG_FL_WORK`` enable blinking when working ``IEEE80211_TPT_LEDTRIG_FL_CONNECTED`` enable blinking when at least one interface is connected in some way, including being an APh](h)}(h **Constants**h]j)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMPhjubj)}(hhh](j)}(h>``IEEE80211_TPT_LEDTRIG_FL_RADIO`` enable blinking with radio h](j)}(h"``IEEE80211_TPT_LEDTRIG_FL_RADIO``h]j)}(hjh]hIEEE80211_TPT_LEDTRIG_FL_RADIO}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMShjubj)}(hhh]h)}(henable blinking with radioh]henable blinking with radio}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMShjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMShjubj)}(h?``IEEE80211_TPT_LEDTRIG_FL_WORK`` enable blinking when working h](j)}(h!``IEEE80211_TPT_LEDTRIG_FL_WORK``h]j)}(hj7h]hIEEE80211_TPT_LEDTRIG_FL_WORK}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMVhj1ubj)}(hhh]h)}(henable blinking when workingh]henable blinking when working}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMVhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMVhjubj)}(h``IEEE80211_TPT_LEDTRIG_FL_CONNECTED`` enable blinking when at least one interface is connected in some way, including being an APh](j)}(h&``IEEE80211_TPT_LEDTRIG_FL_CONNECTED``h]j)}(hjph]h"IEEE80211_TPT_LEDTRIG_FL_CONNECTED}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMYhjjubj)}(hhh]h)}(h[enable blinking when at least one interface is connected in some way, including being an APh]h[enable blinking when at least one interface is connected in some way, including being an AP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMYhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhMYhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&ieee80211_get_tx_led_name (C function)c.ieee80211_get_tx_led_namehNtauh1hhhhhhNhNubh)}(hhh](h)}(h@const char * ieee80211_get_tx_led_name (struct ieee80211_hw *hw)h]j)}(h>const char *ieee80211_get_tx_led_name(struct ieee80211_hw *hw)h](j )}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMoubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMoubhdesc_sig_keyword_type)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhjhMoubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMoubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjhhhjhMoubj,)}(hieee80211_get_tx_led_nameh]j2)}(hieee80211_get_tx_led_nameh]hieee80211_get_tx_led_name}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjhhhjhMoubhdesc_parameterlist)}(h(struct ieee80211_hw *hw)h]hdesc_parameter)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hjGhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj6ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjXhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjUubah}(h]h ]h"]h$]h&] refdomainj|reftype identifier reftargetjZmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]js ASTIdentifier)}jnjsbc.ieee80211_get_tx_led_nameasbuh1hhj6ubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj6ubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj2)}(hhwh]hhw}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj6ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj0ubah}(h]h ]h"]h$]h&]jIjJuh1j.hjhhhjhMoubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhjhMoubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhMohjhhubj`)}(hhh]h)}(hget name of TX LEDh]hget name of TX LED}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMdhjhhubah}(h]h ]h"]h$]h&]uh1j_hjhhhjhMoubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for **Description** mac80211 creates a transmit LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device. **Return** The name of the LED trigger. ``NULL`` if not configured for LEDs.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhhjubj)}(hhh]j)}(hI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjh]hstruct ieee80211_hw *hw}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMkhjubj)}(hhh]h)}(h,the hardware to get the LED trigger name forh]h,the hardware to get the LED trigger name for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjAh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMmhjubh)}(hX mac80211 creates a transmit LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device.h](hmac80211 creates a transmit LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or }(hjWhhhNhNubj)}(h``NULL``h]hNULL}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubhY if not configured for LEDs) of the trigger so you can automatically link the LED device.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMehjubh)}(h **Return**h]j)}(hjzh]hReturn}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMjhjubh)}(hAThe name of the LED trigger. ``NULL`` if not configured for LEDs.h](hThe name of the LED trigger. }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if not configured for LEDs.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMmhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&ieee80211_get_rx_led_name (C function)c.ieee80211_get_rx_led_namehNtauh1hhhhhhNhNubh)}(hhh](h)}(h@const char * ieee80211_get_rx_led_name (struct ieee80211_hw *hw)h]j)}(h>const char *ieee80211_get_rx_led_name(struct ieee80211_hw *hw)h](j )}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj,)}(hieee80211_get_rx_led_nameh]j2)}(hieee80211_get_rx_led_nameh]hieee80211_get_rx_led_name}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjhhhjhMubj/)}(h(struct ieee80211_hw *hw)h]j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(h h]h }(hjChhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj2ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjThhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjQubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjVmodnameN classnameNjrju)}jx]j{)}jnjsbc.ieee80211_get_rx_led_nameasbuh1hhj2ubj)}(h h]h }(hjthhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj2ubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj2)}(hhwh]hhw}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj2ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj.ubah}(h]h ]h"]h$]h&]jIjJuh1j.hjhhhjhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhjhMubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhMhjhhubj`)}(hhh]h)}(hget name of RX LEDh]hget name of RX LED}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMyhjhhubah}(h]h ]h"]h$]h&]uh1j_hjhhhjhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for **Description** mac80211 creates a receive LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device. **Return** The name of the LED trigger. ``NULL`` if not configured for LEDs.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhM}hjubj)}(hhh]j)}(hI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjh]hstruct ieee80211_hw *hw}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h,the hardware to get the LED trigger name forh]h,the hardware to get the LED trigger name for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj5h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubh)}(hX mac80211 creates a receive LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device.h](hmac80211 creates a receive LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or }(hjKhhhNhNubj)}(h``NULL``h]hNULL}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubhY if not configured for LEDs) of the trigger so you can automatically link the LED device.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMzhjubh)}(h **Return**h]j)}(hjnh]hReturn}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubh)}(hAThe name of the LED trigger. ``NULL`` if not configured for LEDs.h](hThe name of the LED trigger. }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh if not configured for LEDs.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)ieee80211_get_assoc_led_name (C function)c.ieee80211_get_assoc_led_namehNtauh1hhhhhhNhNubh)}(hhh](h)}(hCconst char * ieee80211_get_assoc_led_name (struct ieee80211_hw *hw)h]j)}(hAconst char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)h](j )}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMubj)}(hcharh]hchar}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj,)}(hieee80211_get_assoc_led_nameh]j2)}(hieee80211_get_assoc_led_nameh]hieee80211_get_assoc_led_name}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjhhhjhMubj/)}(h(struct ieee80211_hw *hw)h]j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj&ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjHhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjEubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjJmodnameN classnameNjrju)}jx]j{)}jnjsbc.ieee80211_get_assoc_led_nameasbuh1hhj&ubj)}(h h]h }(hjhhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj&ubj)}(hj h]h*}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj2)}(hhwh]hhw}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj&ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj"ubah}(h]h ]h"]h$]h&]jIjJuh1j.hjhhhjhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhjhMubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhMhjhhubj`)}(hhh]h)}(hget name of association LEDh]hget name of association LED}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j_hjhhhjhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for **Description** mac80211 creates a association LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device. **Return** The name of the LED trigger. ``NULL`` if not configured for LEDs.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubj)}(hhh]j)}(hI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjh]hstruct ieee80211_hw *hw}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h,the hardware to get the LED trigger name forh]h,the hardware to get the LED trigger name for}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hj) h]h Description}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj' ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubh)}(hXmac80211 creates a association LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device.h](hmac80211 creates a association LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or }(hj? hhhNhNubj)}(h``NULL``h]hNULL}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj? ubhY if not configured for LEDs) of the trigger so you can automatically link the LED device.}(hj? hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubh)}(h **Return**h]j)}(hjb h]hReturn}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj` ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubh)}(hAThe name of the LED trigger. ``NULL`` if not configured for LEDs.h](hThe name of the LED trigger. }(hjx hhhNhNubj)}(h``NULL``h]hNULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx ubh if not configured for LEDs.}(hjx hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)ieee80211_get_radio_led_name (C function)c.ieee80211_get_radio_led_namehNtauh1hhhhhhNhNubh)}(hhh](h)}(hCconst char * ieee80211_get_radio_led_name (struct ieee80211_hw *hw)h]j)}(hAconst char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)h](j )}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj hhhj hMubj)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj hhhj hMubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj,)}(hieee80211_get_radio_led_nameh]j2)}(hieee80211_get_radio_led_nameh]hieee80211_get_radio_led_name}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj hhhj hMubj/)}(h(struct ieee80211_hw *hw)h]j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj+ hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj< hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj9 ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj> modnameN classnameNjrju)}jx]j{)}jnj sbc.ieee80211_get_radio_led_nameasbuh1hhj ubj)}(h h]h }(hj\ hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hj h]h*}(hjj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(hhwh]hhw}(hjw hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj ubah}(h]h ]h"]h$]h&]jIjJuh1j.hj hhhj hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj hhhj hMubah}(h]j ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj hMhj hhubj`)}(hhh]h)}(hget name of radio LEDh]hget name of radio LED}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj hhubah}(h]h ]h"]h$]h&]uh1j_hj hhhj hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj jj jjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for **Description** mac80211 creates a radio change LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device. **Return** The name of the LED trigger. ``NULL`` if not configured for LEDs.h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubj)}(hhh]j)}(hI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for h](j)}(h``struct ieee80211_hw *hw``h]j)}(hj h]hstruct ieee80211_hw *hw}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubj)}(hhh]h)}(h,the hardware to get the LED trigger name forh]h,the hardware to get the LED trigger name for}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(hXmac80211 creates a radio change LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or ``NULL`` if not configured for LEDs) of the trigger so you can automatically link the LED device.h](hmac80211 creates a radio change LED trigger for each wireless hardware that can be used to drive LEDs if your driver registers a LED device. This function returns the name (or }(hj3 hhhNhNubj)}(h``NULL``h]hNULL}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3 ubhY if not configured for LEDs) of the trigger so you can automatically link the LED device.}(hj3 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(h **Return**h]j)}(hjV h]hReturn}(hjX hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(hAThe name of the LED trigger. ``NULL`` if not configured for LEDs.h](hThe name of the LED trigger. }(hjl hhhNhNubj)}(h``NULL``h]hNULL}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl ubh if not configured for LEDs.}(hjl hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h-ieee80211_create_tpt_led_trigger (C function)"c.ieee80211_create_tpt_led_triggerhNtauh1hhhhhhNhNubh)}(hhh](h)}(hconst char * ieee80211_create_tpt_led_trigger (struct ieee80211_hw *hw, unsigned int flags, const struct ieee80211_tpt_blink *blink_table, unsigned int blink_table_len)h]j)}(hconst char *ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, unsigned int flags, const struct ieee80211_tpt_blink *blink_table, unsigned int blink_table_len)h](j )}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj hhhj hMubj)}(hcharh]hchar}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj hhhj hMubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj,)}(h ieee80211_create_tpt_led_triggerh]j2)}(h ieee80211_create_tpt_led_triggerh]h ieee80211_create_tpt_led_trigger}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj hhhj hMubj/)}(hz(struct ieee80211_hw *hw, unsigned int flags, const struct ieee80211_tpt_blink *blink_table, unsigned int blink_table_len)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj0 hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj- ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj2 modnameN classnameNjrju)}jx]j{)}jnj sb"c.ieee80211_create_tpt_led_triggerasbuh1hhj ubj)}(h h]h }(hjP hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hj h]h*}(hj^ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(hhwh]hhw}(hjk hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj ubj5)}(hunsigned int flagsh](j)}(hunsignedh]hunsigned}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hinth]hint}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj2)}(hflagsh]hflags}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj ubj5)}(h-const struct ieee80211_tpt_blink *blink_tableh](j )}(hjh]hconst}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj )}(hj h]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubh)}(hhh]j2)}(hieee80211_tpt_blinkh]hieee80211_tpt_blink}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj modnameN classnameNjrju)}jx]jL "c.ieee80211_create_tpt_led_triggerasbuh1hhj ubj)}(h h]h }(hj, hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hj h]h*}(hj: hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(h blink_tableh]h blink_table}(hjG hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj ubj5)}(hunsigned int blink_table_lenh](j)}(hunsignedh]hunsigned}(hj` hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ ubj)}(h h]h }(hjn hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj\ ubj)}(hinth]hint}(hj| hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\ ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj\ ubj2)}(hblink_table_lenh]hblink_table_len}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj\ ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj hhhj hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj hhhj hMubah}(h]j ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj hMhj hhubj`)}(hhh]h)}(hcreate throughput LED triggerh]hcreate throughput LED trigger}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj hhubah}(h]h ]h"]h$]h&]uh1j_hj hhhj hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj jj jjjuh1hhhhhhNhNubj)}(hX/**Parameters** ``struct ieee80211_hw *hw`` the hardware to create the trigger for ``unsigned int flags`` trigger flags, see :c:type:`enum ieee80211_tpt_led_trigger_flags ` ``const struct ieee80211_tpt_blink *blink_table`` the blink table -- needs to be ordered by throughput ``unsigned int blink_table_len`` size of the blink table **Return** ``NULL`` (in case of error, or if no LED triggers are configured) or the name of the new trigger. **Note** This function must be called before ieee80211_register_hw().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubj)}(hhh](j)}(hC``struct ieee80211_hw *hw`` the hardware to create the trigger for h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjh]hstruct ieee80211_hw *hw}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubj)}(hhh]h)}(h&the hardware to create the trigger forh]h&the hardware to create the trigger for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h{``unsigned int flags`` trigger flags, see :c:type:`enum ieee80211_tpt_led_trigger_flags ` h](j)}(h``unsigned int flags``h]j)}(hj<h]hunsigned int flags}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj6ubj)}(hhh]h)}(hctrigger flags, see :c:type:`enum ieee80211_tpt_led_trigger_flags `h](htrigger flags, see }(hjUhhhNhNubh)}(hP:c:type:`enum ieee80211_tpt_led_trigger_flags `h]j)}(hj_h]h$enum ieee80211_tpt_led_trigger_flags}(hjahhhNhNubah}(h]h ](xrefj|c-typeeh"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]refdoc"driver-api/80211/mac80211-advanced refdomainj|reftypetype refexplicitrefwarnjrju)}jx]sb reftargetieee80211_tpt_led_trigger_flagsuh1hhjQhMhjUubeh}(h]h ]h"]h$]h&]uh1hhjQhMhjRubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhjQhMhj ubj)}(hg``const struct ieee80211_tpt_blink *blink_table`` the blink table -- needs to be ordered by throughput h](j)}(h1``const struct ieee80211_tpt_blink *blink_table``h]j)}(hjh]h-const struct ieee80211_tpt_blink *blink_table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h4the blink table -- needs to be ordered by throughputh]h4the blink table -- needs to be ordered by throughput}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubj)}(h9``unsigned int blink_table_len`` size of the blink table h](j)}(h ``unsigned int blink_table_len``h]j)}(hjh]hunsigned int blink_table_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hsize of the blink tableh]hsize of the blink table}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(ha``NULL`` (in case of error, or if no LED triggers are configured) or the name of the new trigger.h](j)}(h``NULL``h]hNULL}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubhY (in case of error, or if no LED triggers are configured) or the name of the new trigger.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(h**Note**h]j)}(hjCh]hNote}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.hhMhj ubh)}(h` for a given device is called to enable hardware acceleration of encryption and decryption. The callback takes a **sta** parameter that will be NULL for default keys or keys used for transmission only, or point to the station information for the peer for individual keys. Multiple transmission keys with the same key index may be used when VLANs are configured for an access point.h](hThe set_key() callback in the }(hjhhhNhNubh)}(h.:c:type:`struct ieee80211_ops `h]j)}(hjh]hstruct ieee80211_ops}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_opsuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjubhq for a given device is called to enable hardware acceleration of encryption and decryption. The callback takes a }(hjhhhNhNubj)}(h**sta**h]hsta}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX parameter that will be NULL for default keys or keys used for transmission only, or point to the station information for the peer for individual keys. Multiple transmission keys with the same key index may be used when VLANs are configured for an access point.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjwhhubh)}(hWhen transmitting, the TX control data will use the **hw_key_idx** selected by the driver by modifying the :c:type:`struct ieee80211_key_conf ` pointed to by the **key** parameter to the set_key() function.h](h4When transmitting, the TX control data will use the }(hjhhhNhNubj)}(h**hw_key_idx**h]h hw_key_idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) selected by the driver by modifying the }(hjhhhNhNubh)}(h8:c:type:`struct ieee80211_key_conf `h]j)}(hjh]hstruct ieee80211_key_conf}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jieee80211_key_confuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjubh pointed to by the }(hjhhhNhNubj)}(h**key**h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh% parameter to the set_key() function.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjwhhubh)}(hXThe set_key() call for the ``SET_KEY`` command should return 0 if the key is now in use, -``EOPNOTSUPP`` or -``ENOSPC`` if it couldn't be added; if you return 0 then hw_key_idx must be assigned to the hardware key index. You are free to use the full u8 range.h](hThe set_key() call for the }(hj1hhhNhNubj)}(h ``SET_KEY``h]hSET_KEY}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh4 command should return 0 if the key is now in use, -}(hj1hhhNhNubj)}(h``EOPNOTSUPP``h]h EOPNOTSUPP}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh or -}(hj1hhhNhNubj)}(h ``ENOSPC``h]hENOSPC}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh if it couldn’t be added; if you return 0 then hw_key_idx must be assigned to the hardware key index. You are free to use the full u8 range.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hXNote that in the case that the **IEEE80211_HW_SW_CRYPTO_CONTROL** flag is set, mac80211 will not automatically fall back to software crypto if enabling hardware crypto failed. The set_key() call may also return the value 1 to permit this specific key/algorithm to be done in software.h](hNote that in the case that the }(hjvhhhNhNubj)}(h"**IEEE80211_HW_SW_CRYPTO_CONTROL**h]hIEEE80211_HW_SW_CRYPTO_CONTROL}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubh flag is set, mac80211 will not automatically fall back to software crypto if enabling hardware crypto failed. The set_key() call may also return the value 1 to permit this specific key/algorithm to be done in software.}(hjvhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(h5When the cmd is ``DISABLE_KEY`` then it must succeed.h](hWhen the cmd is }(hjhhhNhNubj)}(h``DISABLE_KEY``h]h DISABLE_KEY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh then it must succeed.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hNote that it is permissible to not decrypt a frame even if a key for it has been uploaded to hardware. The stack will not make any decision based on whether a key has been uploaded or not but rather based on the receive flags.h]hNote that it is permissible to not decrypt a frame even if a key for it has been uploaded to hardware. The stack will not make any decision based on whether a key has been uploaded or not but rather based on the receive flags.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hThe :c:type:`struct ieee80211_key_conf ` structure pointed to by the **key** parameter is guaranteed to be valid until another call to set_key() removes it, but it can only be used as a cookie to differentiate keys.h](hThe }(hjhhhNhNubh)}(h8:c:type:`struct ieee80211_key_conf `h]j)}(hjh]hstruct ieee80211_key_conf}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jieee80211_key_confuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjubh structure pointed to by the }(hjhhhNhNubj)}(h**key**h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter is guaranteed to be valid until another call to set_key() removes it, but it can only be used as a cookie to differentiate keys.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjwhhubh)}(hX?In TKIP some HW need to be provided a phase 1 key, for RX decryption acceleration (i.e. iwlwifi). Those drivers should provide update_tkip_key handler. The update_tkip_key() call updates the driver with the new phase 1 key. This happens every time the iv16 wraps around (every 65536 packets). The set_key() call will happen only once for each key (unless the AP did rekeying); it will not include a valid phase 1 key. The valid phase 1 key is provided by update_tkip_key only. The trigger that makes mac80211 call this handler is software decryption with wrap around of iv16.h]hX?In TKIP some HW need to be provided a phase 1 key, for RX decryption acceleration (i.e. iwlwifi). Those drivers should provide update_tkip_key handler. The update_tkip_key() call updates the driver with the new phase 1 key. This happens every time the iv16 wraps around (every 65536 packets). The set_key() call will happen only once for each key (unless the AP did rekeying); it will not include a valid phase 1 key. The valid phase 1 key is provided by update_tkip_key only. The trigger that makes mac80211 call this handler is software decryption with wrap around of iv16.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hThe set_default_unicast_key() call updates the default WEP key index configured to the hardware for WEP encryption type. This is required for devices that support offload of data packets (e.g. ARP responses).h]hThe set_default_unicast_key() call updates the default WEP key index configured to the hardware for WEP encryption type. This is required for devices that support offload of data packets (e.g. ARP responses).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hMac80211 drivers should set the **NL80211_EXT_FEATURE_CAN_REPLACE_PTK0** flag when they are able to replace in-use PTK keys according to the following requirements: 1) They do not hand over frames decrypted with the old key to mac80211h](h Mac80211 drivers should set the }(hj)hhhNhNubj)}(h(**NL80211_EXT_FEATURE_CAN_REPLACE_PTK0**h]h$NL80211_EXT_FEATURE_CAN_REPLACE_PTK0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh flag when they are able to replace in-use PTK keys according to the following requirements: 1) They do not hand over frames decrypted with the old key to mac80211}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.hhM hjwhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_key_flags (C enum)c.ieee80211_key_flagshNtauh1hhjwhhhNhNubh)}(hhh](h)}(hieee80211_key_flagsh]j)}(henum ieee80211_key_flagsh](j )}(hj|h]henum}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMXubj)}(h h]h }(hjqhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj_hhhjphMXubj,)}(hieee80211_key_flagsh]j2)}(hj]h]hieee80211_key_flags}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj_hhhjphMXubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj[hhhjphMXubah}(h]jVah ](jWjXeh"]h$]h&]j\j])j^huh1hhjphMXhjXhhubj`)}(hhh]h)}(h key flagsh]h key flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMfhjhhubah}(h]h ]h"]h$]h&]uh1j_hjXhhhjphMXubeh}(h]h ](j|enumeh"]h$]h&]jj|jjjjjjjuh1hhhhjwhNhNubj)}(hX **Constants** ``IEEE80211_KEY_FLAG_GENERATE_IV_MGMT`` This flag should be set by the driver for a CCMP/GCMP key to indicate that is requires IV generation only for management frames (MFP). ``IEEE80211_KEY_FLAG_GENERATE_IV`` This flag should be set by the driver to indicate that it requires IV generation for this particular key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. ``IEEE80211_KEY_FLAG_GENERATE_MMIC`` This flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software. ``IEEE80211_KEY_FLAG_PAIRWISE`` Set by mac80211, this flag indicates that the key is pairwise rather then a shared key. ``IEEE80211_KEY_FLAG_SW_MGMT_TX`` This flag should be set by the driver for a CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames (MFP) to be done in software. ``IEEE80211_KEY_FLAG_PUT_IV_SPACE`` This flag should be set by the driver if space should be prepared for the IV, but the IV itself should not be generated. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_IV** on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. ``IEEE80211_KEY_FLAG_RX_MGMT`` This key will be used to decrypt received management frames. The flag can help drivers that have a hardware crypto implementation that doesn't deal with management frames properly by allowing them to not upload the keys to hardware and fall back to software crypto. Note that this flag deals only with RX, if your crypto engine can't deal with TX you can also set the ``IEEE80211_KEY_FLAG_SW_MGMT_TX`` flag to encrypt such frames in SW. ``IEEE80211_KEY_FLAG_RESERVE_TAILROOM`` This flag should be set by the driver for a key to indicate that sufficient tailroom must always be reserved for ICV or MIC, even when HW encryption is enabled. ``IEEE80211_KEY_FLAG_PUT_MIC_SPACE`` This flag should be set by the driver for a TKIP key if it only requires MIC space. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_MMIC** on the same key. ``IEEE80211_KEY_FLAG_NO_AUTO_TX`` Key needs explicit Tx activation. ``IEEE80211_KEY_FLAG_GENERATE_MMIE`` This flag should be set by the driver for a AES_CMAC or a AES_GMAC key to indicate that it requires sequence number generation only ``IEEE80211_KEY_FLAG_SPP_AMSDU`` SPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)h](h)}(h **Constants**h]j)}(hjh]h Constants}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMjhjubj)}(hhh](j)}(h``IEEE80211_KEY_FLAG_GENERATE_IV_MGMT`` This flag should be set by the driver for a CCMP/GCMP key to indicate that is requires IV generation only for management frames (MFP). h](j)}(h'``IEEE80211_KEY_FLAG_GENERATE_IV_MGMT``h]j)}(hjh]h#IEEE80211_KEY_FLAG_GENERATE_IV_MGMT/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMohjubj)}(hhh]h)}(hThis flag should be set by the driver for a CCMP/GCMP key to indicate that is requires IV generation only for management frames (MFP).h]hThis flag should be set by the driver for a CCMP/GCMP key to indicate that is requires IV generation only for management frames (MFP).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMmhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMohjubj)}(h``IEEE80211_KEY_FLAG_GENERATE_IV`` This flag should be set by the driver to indicate that it requires IV generation for this particular key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. h](j)}(h"``IEEE80211_KEY_FLAG_GENERATE_IV``h]j)}(hj h]hIEEE80211_KEY_FLAG_GENERATE_IV}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMuhjubj)}(hhh]h)}(hThis flag should be set by the driver to indicate that it requires IV generation for this particular key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC.h]hThis flag should be set by the driver to indicate that it requires IV generation for this particular key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMrhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj5hMuhjubj)}(h``IEEE80211_KEY_FLAG_GENERATE_MMIC`` This flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software. h](j)}(h$``IEEE80211_KEY_FLAG_GENERATE_MMIC``h]j)}(hjZh]h IEEE80211_KEY_FLAG_GENERATE_MMIC}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMzhjTubj)}(hhh]h)}(hgThis flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software.h]hgThis flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMxhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMzhjubj)}(hx``IEEE80211_KEY_FLAG_PAIRWISE`` Set by mac80211, this flag indicates that the key is pairwise rather then a shared key. h](j)}(h``IEEE80211_KEY_FLAG_PAIRWISE``h]j)}(hjh]hIEEE80211_KEY_FLAG_PAIRWISE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM~hjubj)}(hhh]h)}(hWSet by mac80211, this flag indicates that the key is pairwise rather then a shared key.h]hWSet by mac80211, this flag indicates that the key is pairwise rather then a shared key.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM}hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM~hjubj)}(h``IEEE80211_KEY_FLAG_SW_MGMT_TX`` This flag should be set by the driver for a CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames (MFP) to be done in software. h](j)}(h!``IEEE80211_KEY_FLAG_SW_MGMT_TX``h]j)}(hjh]hIEEE80211_KEY_FLAG_SW_MGMT_TX}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hThis flag should be set by the driver for a CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames (MFP) to be done in software.h]hThis flag should be set by the driver for a CCMP/GCMP key if it requires CCMP/GCMP encryption of management frames (MFP) to be done in software.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hXN``IEEE80211_KEY_FLAG_PUT_IV_SPACE`` This flag should be set by the driver if space should be prepared for the IV, but the IV itself should not be generated. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_IV** on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC. h](j)}(h#``IEEE80211_KEY_FLAG_PUT_IV_SPACE``h]j)}(hjh]hIEEE80211_KEY_FLAG_PUT_IV_SPACE}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hX)This flag should be set by the driver if space should be prepared for the IV, but the IV itself should not be generated. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_IV** on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC.h](hThis flag should be set by the driver if space should be prepared for the IV, but the IV itself should not be generated. Do not set together with }(hj!hhhNhNubj)}(h"**IEEE80211_KEY_FLAG_GENERATE_IV**h]hIEEE80211_KEY_FLAG_GENERATE_IV}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubhu on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hX``IEEE80211_KEY_FLAG_RX_MGMT`` This key will be used to decrypt received management frames. The flag can help drivers that have a hardware crypto implementation that doesn't deal with management frames properly by allowing them to not upload the keys to hardware and fall back to software crypto. Note that this flag deals only with RX, if your crypto engine can't deal with TX you can also set the ``IEEE80211_KEY_FLAG_SW_MGMT_TX`` flag to encrypt such frames in SW. h](j)}(h``IEEE80211_KEY_FLAG_RX_MGMT``h]j)}(hjTh]hIEEE80211_KEY_FLAG_RX_MGMT}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjNubj)}(hhh]h)}(hXThis key will be used to decrypt received management frames. The flag can help drivers that have a hardware crypto implementation that doesn't deal with management frames properly by allowing them to not upload the keys to hardware and fall back to software crypto. Note that this flag deals only with RX, if your crypto engine can't deal with TX you can also set the ``IEEE80211_KEY_FLAG_SW_MGMT_TX`` flag to encrypt such frames in SW.h](hXtThis key will be used to decrypt received management frames. The flag can help drivers that have a hardware crypto implementation that doesn’t deal with management frames properly by allowing them to not upload the keys to hardware and fall back to software crypto. Note that this flag deals only with RX, if your crypto engine can’t deal with TX you can also set the }(hjmhhhNhNubj)}(h!``IEEE80211_KEY_FLAG_SW_MGMT_TX``h]hIEEE80211_KEY_FLAG_SW_MGMT_TX}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh# flag to encrypt such frames in SW.}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjjubah}(h]h ]h"]h$]h&]uh1jhjNubeh}(h]h ]h"]h$]h&]uh1jhjihMhjubj)}(h``IEEE80211_KEY_FLAG_RESERVE_TAILROOM`` This flag should be set by the driver for a key to indicate that sufficient tailroom must always be reserved for ICV or MIC, even when HW encryption is enabled. h](j)}(h'``IEEE80211_KEY_FLAG_RESERVE_TAILROOM``h]j)}(hjh]h#IEEE80211_KEY_FLAG_RESERVE_TAILROOM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hThis flag should be set by the driver for a key to indicate that sufficient tailroom must always be reserved for ICV or MIC, even when HW encryption is enabled.h]hThis flag should be set by the driver for a key to indicate that sufficient tailroom must always be reserved for ICV or MIC, even when HW encryption is enabled.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``IEEE80211_KEY_FLAG_PUT_MIC_SPACE`` This flag should be set by the driver for a TKIP key if it only requires MIC space. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_MMIC** on the same key. h](j)}(h$``IEEE80211_KEY_FLAG_PUT_MIC_SPACE``h]j)}(hjh]h IEEE80211_KEY_FLAG_PUT_MIC_SPACE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hThis flag should be set by the driver for a TKIP key if it only requires MIC space. Do not set together with **IEEE80211_KEY_FLAG_GENERATE_MMIC** on the same key.h](hmThis flag should be set by the driver for a TKIP key if it only requires MIC space. Do not set together with }(hjhhhNhNubj)}(h$**IEEE80211_KEY_FLAG_GENERATE_MMIC**h]h IEEE80211_KEY_FLAG_GENERATE_MMIC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh on the same key.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hD``IEEE80211_KEY_FLAG_NO_AUTO_TX`` Key needs explicit Tx activation. h](j)}(h!``IEEE80211_KEY_FLAG_NO_AUTO_TX``h]j)}(hj&h]hIEEE80211_KEY_FLAG_NO_AUTO_TX}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj ubj)}(hhh]h)}(h!Key needs explicit Tx activation.h]h!Key needs explicit Tx activation.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhjubj)}(h``IEEE80211_KEY_FLAG_GENERATE_MMIE`` This flag should be set by the driver for a AES_CMAC or a AES_GMAC key to indicate that it requires sequence number generation only h](j)}(h$``IEEE80211_KEY_FLAG_GENERATE_MMIE``h]j)}(hj_h]h IEEE80211_KEY_FLAG_GENERATE_MMIE}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjYubj)}(hhh]h)}(hThis flag should be set by the driver for a AES_CMAC or a AES_GMAC key to indicate that it requires sequence number generation onlyh]hThis flag should be set by the driver for a AES_CMAC or a AES_GMAC key to indicate that it requires sequence number generation only}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthMhjubj)}(hu``IEEE80211_KEY_FLAG_SPP_AMSDU`` SPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)h](j)}(h ``IEEE80211_KEY_FLAG_SPP_AMSDU``h]j)}(hjh]hIEEE80211_KEY_FLAG_SPP_AMSDU}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hTSPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)h]hTSPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjwhhubh)}(hThese flags are used for communication about keys between the driver and mac80211, with the **flags** parameter of :c:type:`struct ieee80211_key_conf `.h](h\These flags are used for communication about keys between the driver and mac80211, with the }(hjhhhNhNubj)}(h **flags**h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter of }(hjhhhNhNubh)}(h8:c:type:`struct ieee80211_key_conf `h]j)}(hj h]hstruct ieee80211_key_conf}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jieee80211_key_confuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMghjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj*hMghjwhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_key_conf (C struct)c.ieee80211_key_confhNtauh1hhjwhhhNhNubh)}(hhh](h)}(hieee80211_key_confh]j)}(hstruct ieee80211_key_confh](j )}(hj h]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMmubj)}(h h]h }(hj\hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjJhhhj[hMmubj,)}(hieee80211_key_confh]j2)}(hjHh]hieee80211_key_conf}(hjnhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjJhhhj[hMmubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjFhhhj[hMmubah}(h]jAah ](jWjXeh"]h$]h&]j\j])j^huh1hhj[hMmhjChhubj`)}(hhh]h)}(hkey informationh]hkey information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j_hjChhhj[hMmubeh}(h]h ](j|structeh"]h$]h&]jj|jjjjjjjuh1hhhhjwhNhNubj)}(hXw**Definition**:: struct ieee80211_key_conf { atomic64_t tx_pn; u32 cipher; u8 icv_len; u8 iv_len; u8 hw_key_idx; s8 keyidx; u16 flags; s8 link_id; u8 keylen; u8 key[]; }; **Members** ``tx_pn`` PN used for TX keys, may be used by the driver as well if it needs to do software PN assignment by itself (e.g. due to TSO) ``cipher`` The key's cipher suite selector. ``icv_len`` The ICV length for this key type ``iv_len`` The IV length for this key type ``hw_key_idx`` To be set by the driver, this is the key index the driver wants to be given when a frame is transmitted and needs to be encrypted in hardware. ``keyidx`` the key index (0-7) ``flags`` key flags, see :c:type:`enum ieee80211_key_flags `. ``link_id`` the link ID, 0 for non-MLO, or -1 for pairwise keys ``keylen`` key material length ``key`` key material. For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block: - Temporal Encryption Key (128 bits) - Temporal Authenticator Tx MIC Key (64 bits) - Temporal Authenticator Rx MIC Key (64 bits)h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hstruct ieee80211_key_conf { atomic64_t tx_pn; u32 cipher; u8 icv_len; u8 iv_len; u8 hw_key_idx; s8 keyidx; u16 flags; s8 link_id; u8 keylen; u8 key[]; };h]hstruct ieee80211_key_conf { atomic64_t tx_pn; u32 cipher; u8 icv_len; u8 iv_len; u8 hw_key_idx; s8 keyidx; u16 flags; s8 link_id; u8 keylen; u8 key[]; };}hjsbah}(h]h ]h"]h$]h&]jIjJuh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh](j)}(h``tx_pn`` PN used for TX keys, may be used by the driver as well if it needs to do software PN assignment by itself (e.g. due to TSO) h](j)}(h ``tx_pn``h]j)}(hjh]htx_pn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h{PN used for TX keys, may be used by the driver as well if it needs to do software PN assignment by itself (e.g. due to TSO)h]h{PN used for TX keys, may be used by the driver as well if it needs to do software PN assignment by itself (e.g. due to TSO)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h,``cipher`` The key's cipher suite selector. h](j)}(h ``cipher``h]j)}(hj7h]hcipher}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj1ubj)}(hhh]h)}(h The key's cipher suite selector.h]h"The key’s cipher suite selector.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubj)}(h-``icv_len`` The ICV length for this key type h](j)}(h ``icv_len``h]j)}(hjph]hicv_len}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjjubj)}(hhh]h)}(h The ICV length for this key typeh]h The ICV length for this key type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h+``iv_len`` The IV length for this key type h](j)}(h ``iv_len``h]j)}(hjh]hiv_len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hThe IV length for this key typeh]hThe IV length for this key type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``hw_key_idx`` To be set by the driver, this is the key index the driver wants to be given when a frame is transmitted and needs to be encrypted in hardware. h](j)}(h``hw_key_idx``h]j)}(hjh]h hw_key_idx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hTo be set by the driver, this is the key index the driver wants to be given when a frame is transmitted and needs to be encrypted in hardware.h]hTo be set by the driver, this is the key index the driver wants to be given when a frame is transmitted and needs to be encrypted in hardware.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``keyidx`` the key index (0-7) h](j)}(h ``keyidx``h]j)}(hjh]hkeyidx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hthe key index (0-7)h]hthe key index (0-7)}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hMhj2ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj1hMhjubj)}(hS``flags`` key flags, see :c:type:`enum ieee80211_key_flags `. h](j)}(h ``flags``h]j)}(hjUh]hflags}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjOubj)}(hhh]h)}(hHkey flags, see :c:type:`enum ieee80211_key_flags `.h](hkey flags, see }(hjnhhhNhNubh)}(h8:c:type:`enum ieee80211_key_flags `h]j)}(hjxh]henum ieee80211_key_flags}(hjzhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jieee80211_key_flagsuh1hhjjhMhjnubh.}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjjhMhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjubj)}(h@``link_id`` the link ID, 0 for non-MLO, or -1 for pairwise keys h](j)}(h ``link_id``h]j)}(hjh]hlink_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h3the link ID, 0 for non-MLO, or -1 for pairwise keysh]h3the link ID, 0 for non-MLO, or -1 for pairwise keys}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``keylen`` key material length h](j)}(h ``keylen``h]j)}(hjh]hkeylen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hkey material lengthh]hkey material length}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h``key`` key material. For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block: - Temporal Encryption Key (128 bits) - Temporal Authenticator Tx MIC Key (64 bits) - Temporal Authenticator Rx MIC Key (64 bits)h](j)}(h``key``h]j)}(hj#h]hkey}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hkey material. For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block: - Temporal Encryption Key (128 bits) - Temporal Authenticator Tx MIC Key (64 bits) - Temporal Authenticator Rx MIC Key (64 bits)h]hkey material. For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block: - Temporal Encryption Key (128 bits) - Temporal Authenticator Tx MIC Key (64 bits) - Temporal Authenticator Rx MIC Key (64 bits)}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubh)}(h**Description**h]j)}(hjfh]h Description}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjwhhubh)}(hThis key information is given by mac80211 to the driver by the set_key() callback in :c:type:`struct ieee80211_ops `.h](hUThis key information is given by mac80211 to the driver by the set_key() callback in }(hj|hhhNhNubh)}(h.:c:type:`struct ieee80211_ops `h]j)}(hjh]hstruct ieee80211_ops}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_opsuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj|ubh.}(hj|hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjwhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hset_key_cmd (C enum) c.set_key_cmdhNtauh1hhjwhhhNhNubh)}(hhh](h)}(h set_key_cmdh]j)}(henum set_key_cmdh](j )}(hj|h]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhMubj,)}(h set_key_cmdh]j2)}(hjh]h set_key_cmd}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjhhhjhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhjhMubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhMhjhhubj`)}(hhh]h)}(h key commandh]h key command}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j_hjhhhjhMubeh}(h]h ](j|enumeh"]h$]h&]jj|jj!jj!jjjuh1hhhhjwhNhNubj)}(hS**Constants** ``SET_KEY`` a key is set ``DISABLE_KEY`` a key must be disabledh](h)}(h **Constants**h]j)}(hj+h]h Constants}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj%ubj)}(hhh](j)}(h``SET_KEY`` a key is set h](j)}(h ``SET_KEY``h]j)}(hjJh]hSET_KEY}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjDubj)}(hhh]h)}(h a key is seth]h a key is set}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj_hMhj`ubah}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ]h"]h$]h&]uh1jhj_hMhjAubj)}(h&``DISABLE_KEY`` a key must be disabledh](j)}(h``DISABLE_KEY``h]j)}(hjh]h DISABLE_KEY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj}ubj)}(hhh]h)}(ha key must be disabledh]ha key must be disabled}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhjhMhjAubeh}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM hjwhhubh)}(hUsed with the set_key() callback in :c:type:`struct ieee80211_ops `, this indicates whether a key is being removed or added.h](h$Used with the set_key() callback in }(hjhhhNhNubh)}(h.:c:type:`struct ieee80211_ops `h]j)}(hjh]hstruct ieee80211_ops}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_opsuh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubh9, this indicates whether a key is being removed or added.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjwhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&ieee80211_get_tkip_p1k_iv (C function)c.ieee80211_get_tkip_p1k_ivhNtauh1hhjwhhhNhNubh)}(hhh](h)}(hWvoid ieee80211_get_tkip_p1k_iv (struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)h]j)}(hVvoid ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)h](j)}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj#hhhj5hMubj,)}(hieee80211_get_tkip_p1k_ivh]j2)}(hieee80211_get_tkip_p1k_ivh]hieee80211_get_tkip_p1k_iv}(hjHhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjDubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj#hhhj5hMubj/)}(h8(struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)h](j5)}(h"struct ieee80211_key_conf *keyconfh](j )}(hj h]hstruct}(hjdhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj`ubh)}(hhh]j2)}(hieee80211_key_confh]hieee80211_key_conf}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]j{)}jnjJsbc.ieee80211_get_tkip_p1k_ivasbuh1hhj`ubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj`ubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj2)}(hkeyconfh]hkeyconf}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj`ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj\ubj5)}(hu32 iv32h](h)}(hhh]j2)}(hu32h]hu32}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]jc.ieee80211_get_tkip_p1k_ivasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubj2)}(hiv32h]hiv32}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj\ubj5)}(hu16 *p1kh](h)}(hhh]j2)}(hu16h]hu16}(hj!hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj#modnameN classnameNjrju)}jx]jc.ieee80211_get_tkip_p1k_ivasbuh1hhjubj)}(h h]h }(hj?hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubj)}(hj h]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(hp1kh]hp1k}(hjZhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj\ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj#hhhj5hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhj5hMubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhj5hMhjhhubj`)}(hhh]h)}(hget a TKIP phase 1 key for IV32h]hget a TKIP phase 1 key for IV32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j_hjhhhj5hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjjjjjjuh1hhhhjwhNhNubj)}(hX"**Parameters** ``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key ``u32 iv32`` IV32 to get the P1K for ``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values **Description** This function returns the TKIP phase 1 key for the given IV32.h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh](j)}(hM``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key h](j)}(h&``struct ieee80211_key_conf *keyconf``h]j)}(hjh]h"struct ieee80211_key_conf *keyconf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(h%the parameter passed with the set keyh]h%the parameter passed with the set key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h%``u32 iv32`` IV32 to get the P1K for h](j)}(h ``u32 iv32``h]j)}(hjh]hu32 iv32}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubj)}(hhh]h)}(hIV32 to get the P1K forh]hIV32 to get the P1K for}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hH``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values h](j)}(h ``u16 *p1k``h]j)}(hj7h]hu16 *p1k}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj1ubj)}(hhh]h)}(h:a buffer to which the key will be written, as 5 u16 valuesh]h:a buffer to which the key will be written, as 5 u16 values}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]uh1jhjLhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubh)}(h>This function returns the TKIP phase 1 key for the given IV32.h]h>This function returns the TKIP phase 1 key for the given IV32.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#ieee80211_get_tkip_p1k (C function)c.ieee80211_get_tkip_p1khNtauh1hhjwhhhNhNubh)}(hhh](h)}(h_void ieee80211_get_tkip_p1k (struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u16 *p1k)h]j)}(h^void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u16 *p1k)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM(ubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhhhjhM(ubj,)}(hieee80211_get_tkip_p1kh]j2)}(hieee80211_get_tkip_p1kh]hieee80211_get_tkip_p1k}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjhhhjhM(ubj/)}(hC(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u16 *p1k)h](j5)}(h"struct ieee80211_key_conf *keyconfh](j )}(hj h]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubh)}(hhh]j2)}(hieee80211_key_confh]hieee80211_key_conf}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]j{)}jnjsbc.ieee80211_get_tkip_p1kasbuh1hhjubj)}(h h]h }(hj2hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubj)}(hj h]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(hkeyconfh]hkeyconf}(hjMhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubj5)}(hstruct sk_buff *skbh](j )}(hj h]hstruct}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(h h]h }(hjshhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjbubh)}(hhh]j2)}(hsk_buffh]hsk_buff}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]j.c.ieee80211_get_tkip_p1kasbuh1hhjbubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjbubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj2)}(hskbh]hskb}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubj5)}(hu16 *p1kh](h)}(hhh]j2)}(hu16h]hu16}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]j.c.ieee80211_get_tkip_p1kasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(hp1kh]hp1k}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjhhhjhM(ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhjhM(ubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhM(hjhhubj`)}(hhh]h)}(hget a TKIP phase 1 keyh]hget a TKIP phase 1 key}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhj9hhubah}(h]h ]h"]h$]h&]uh1j_hjhhhjhM(ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjTjjTjjjuh1hhhhjwhNhNubj)}(hXy**Parameters** ``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key ``struct sk_buff *skb`` the packet to take the IV32 value from that will be encrypted with this P1K ``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values **Description** This function returns the TKIP phase 1 key for the IV32 taken from the given packet.h](h)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM"hjXubj)}(hhh](j)}(hM``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key h](j)}(h&``struct ieee80211_key_conf *keyconf``h]j)}(hj}h]h"struct ieee80211_key_conf *keyconf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM#hjwubj)}(hhh]h)}(h%the parameter passed with the set keyh]h%the parameter passed with the set key}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM#hjubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjhM#hjtubj)}(hd``struct sk_buff *skb`` the packet to take the IV32 value from that will be encrypted with this P1K h](j)}(h``struct sk_buff *skb``h]j)}(hjh]hstruct sk_buff *skb}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM%hjubj)}(hhh]h)}(hKthe packet to take the IV32 value from that will be encrypted with this P1Kh]hKthe packet to take the IV32 value from that will be encrypted with this P1K}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM$hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM%hjtubj)}(hH``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values h](j)}(h ``u16 *p1k``h]j)}(hjh]hu16 *p1k}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM&hjubj)}(hhh]h)}(h:a buffer to which the key will be written, as 5 u16 valuesh]h:a buffer to which the key will be written, as 5 u16 values}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM&hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM&hjtubeh}(h]h ]h"]h$]h&]uh1jhjXubh)}(h**Description**h]j)}(hj+h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhM(hjXubh)}(hTThis function returns the TKIP phase 1 key for the IV32 taken from the given packet.h]hTThis function returns the TKIP phase 1 key for the IV32 taken from the given packet.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMhjXubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#ieee80211_get_tkip_p2k (C function)c.ieee80211_get_tkip_p2khNtauh1hhjwhhhNhNubh)}(hhh](h)}(h^void ieee80211_get_tkip_p2k (struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u8 *p2k)h]j)}(h]void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u8 *p2k)h](j)}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMKubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjlhhhj~hMKubj,)}(hieee80211_get_tkip_p2kh]j2)}(hieee80211_get_tkip_p2kh]hieee80211_get_tkip_p2k}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjlhhhj~hMKubj/)}(hB(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u8 *p2k)h](j5)}(h"struct ieee80211_key_conf *keyconfh](j )}(hj h]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubh)}(hhh]j2)}(hieee80211_key_confh]hieee80211_key_conf}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjmodnameN classnameNjrju)}jx]j{)}jnjsbc.ieee80211_get_tkip_p2kasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjubj)}(hj h]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj2)}(hkeyconfh]hkeyconf}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubj5)}(hstruct sk_buff *skbh](j )}(hj h]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj, hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubh)}(hhh]j2)}(hsk_buffh]hsk_buff}(hj= hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj: ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj? modnameN classnameNjrju)}jx]jc.ieee80211_get_tkip_p2kasbuh1hhj ubj)}(h h]h }(hj[ hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hj h]h*}(hji hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(hskbh]hskb}(hjv hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubj5)}(hu8 *p2kh](h)}(hhh]j2)}(hu8h]hu8}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj modnameN classnameNjrju)}jx]jc.ieee80211_get_tkip_p2kasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj2)}(hp2kh]hp2k}(hj hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjlhhhj~hMKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhhj~hMKubah}(h]jcah ](jWjXeh"]h$]h&]j\j])j^huh1hhj~hMKhjehhubj`)}(hhh]h)}(hget a TKIP phase 2 keyh]hget a TKIP phase 2 key}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMAhj hhubah}(h]h ]h"]h$]h&]uh1j_hjehhhj~hMKubeh}(h]h ](j|functioneh"]h$]h&]jj|jj !jj !jjjuh1hhhhjwhNhNubj)}(hXk**Parameters** ``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key ``struct sk_buff *skb`` the packet to take the IV32/IV16 values from that will be encrypted with this key ``u8 *p2k`` a buffer to which the key will be written, 16 bytes **Description** This function computes the TKIP RC4 key for the IV values in the packet.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMEhj!ubj)}(hhh](j)}(hM``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key h](j)}(h&``struct ieee80211_key_conf *keyconf``h]j)}(hj6!h]h"struct ieee80211_key_conf *keyconf}(hj8!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4!ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMFhj0!ubj)}(hhh]h)}(h%the parameter passed with the set keyh]h%the parameter passed with the set key}(hjO!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjK!hMFhjL!ubah}(h]h ]h"]h$]h&]uh1jhj0!ubeh}(h]h ]h"]h$]h&]uh1jhjK!hMFhj-!ubj)}(hj``struct sk_buff *skb`` the packet to take the IV32/IV16 values from that will be encrypted with this key h](j)}(h``struct sk_buff *skb``h]j)}(hjo!h]hstruct sk_buff *skb}(hjq!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm!ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMHhji!ubj)}(hhh]h)}(hQthe packet to take the IV32/IV16 values from that will be encrypted with this keyh]hQthe packet to take the IV32/IV16 values from that will be encrypted with this key}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMGhj!ubah}(h]h ]h"]h$]h&]uh1jhji!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMHhj-!ubj)}(h@``u8 *p2k`` a buffer to which the key will be written, 16 bytes h](j)}(h ``u8 *p2k``h]j)}(hj!h]hu8 *p2k}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMIhj!ubj)}(hhh]h)}(h3a buffer to which the key will be written, 16 bytesh]h3a buffer to which the key will be written, 16 bytes}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hMIhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hMIhj-!ubeh}(h]h ]h"]h$]h&]uh1jhj!ubh)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMKhj!ubh)}(hHThis function computes the TKIP RC4 key for the IV values in the packet.h]hHThis function computes the TKIP RC4 key for the IV values in the packet.}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.hhMBhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjwhhhNhNubeh}(h]hardware-crypto-accelerationah ]h"]hardware crypto accelerationah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hPowersave supporth]hPowersave support}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhK+ubh)}(h;mac80211 has support for various powersave implementations.h]h;mac80211 has support for various powersave implementations.}(hj)"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXFirst, it can support hardware that handles all powersaving by itself; such hardware should simply set the ``IEEE80211_HW_SUPPORTS_PS`` hardware flag. In that case, it will be told about the desired powersave mode with the ``IEEE80211_CONF_PS`` flag depending on the association status. The hardware must take care of sending nullfunc frames when necessary, i.e. when entering and leaving powersave mode. The hardware is required to look at the AID in beacons and signal to the AP that it woke up when it finds traffic directed to it.h](hkFirst, it can support hardware that handles all powersaving by itself; such hardware should simply set the }(hj8"hhhNhNubj)}(h``IEEE80211_HW_SUPPORTS_PS``h]hIEEE80211_HW_SUPPORTS_PS}(hj@"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8"ubhX hardware flag. In that case, it will be told about the desired powersave mode with the }(hj8"hhhNhNubj)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hjR"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8"ubhX" flag depending on the association status. The hardware must take care of sending nullfunc frames when necessary, i.e. when entering and leaving powersave mode. The hardware is required to look at the AID in beacons and signal to the AP that it woke up when it finds traffic directed to it.}(hj8"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXC``IEEE80211_CONF_PS`` flag enabled means that the powersave mode defined in IEEE 802.11-2007 section 11.2 is enabled. This is not to be confused with hardware wakeup and sleep states. Driver is responsible for waking up the hardware before issuing commands to the hardware and putting it back to sleep at appropriate times.h](j)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hjo"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk"ubhX. flag enabled means that the powersave mode defined in IEEE 802.11-2007 section 11.2 is enabled. This is not to be confused with hardware wakeup and sleep states. Driver is responsible for waking up the hardware before issuing commands to the hardware and putting it back to sleep at appropriate times.}(hjk"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hWhen PS is enabled, hardware needs to wakeup for beacons and receive the buffered multicast/broadcast frames after the beacon. Also it must be possible to send frames and receive the acknowledment frame.h]hWhen PS is enabled, hardware needs to wakeup for beacons and receive the buffered multicast/broadcast frames after the beacon. Also it must be possible to send frames and receive the acknowledment frame.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXOther hardware designs cannot send nullfunc frames by themselves and also need software support for parsing the TIM bitmap. This is also supported by mac80211 by combining the ``IEEE80211_HW_SUPPORTS_PS`` and ``IEEE80211_HW_PS_NULLFUNC_STACK`` flags. The hardware is of course still required to pass up beacons. The hardware is still required to handle waking up for multicast traffic; if it cannot the driver must handle that as best as it can; mac80211 is too slow to do that.h](hOther hardware designs cannot send nullfunc frames by themselves and also need software support for parsing the TIM bitmap. This is also supported by mac80211 by combining the }(hj"hhhNhNubj)}(h``IEEE80211_HW_SUPPORTS_PS``h]hIEEE80211_HW_SUPPORTS_PS}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh and }(hj"hhhNhNubj)}(h"``IEEE80211_HW_PS_NULLFUNC_STACK``h]hIEEE80211_HW_PS_NULLFUNC_STACK}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh flags. The hardware is of course still required to pass up beacons. The hardware is still required to handle waking up for multicast traffic; if it cannot the driver must handle that as best as it can; mac80211 is too slow to do that.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXfDynamic powersave is an extension to normal powersave in which the hardware stays awake for a user-specified period of time after sending a frame so that reply frames need not be buffered and therefore delayed to the next wakeup. It's a compromise of getting good enough latency when there's data traffic and still saving significantly power in idle periods.h]hXjDynamic powersave is an extension to normal powersave in which the hardware stays awake for a user-specified period of time after sending a frame so that reply frames need not be buffered and therefore delayed to the next wakeup. It’s a compromise of getting good enough latency when there’s data traffic and still saving significantly power in idle periods.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXDynamic powersave is simply supported by mac80211 enabling and disabling PS based on traffic. Driver needs to only set ``IEEE80211_HW_SUPPORTS_PS`` flag and mac80211 will handle everything automatically. Additionally, hardware having support for the dynamic PS feature may set the ``IEEE80211_HW_SUPPORTS_DYNAMIC_PS`` flag to indicate that it can support dynamic PS mode itself. The driver needs to look at the **dynamic_ps_timeout** hardware configuration value and use it that value whenever ``IEEE80211_CONF_PS`` is set. In this case mac80211 will disable dynamic PS feature in stack and will just keep ``IEEE80211_CONF_PS`` enabled whenever user has enabled powersave.h](hwDynamic powersave is simply supported by mac80211 enabling and disabling PS based on traffic. Driver needs to only set }(hj"hhhNhNubj)}(h``IEEE80211_HW_SUPPORTS_PS``h]hIEEE80211_HW_SUPPORTS_PS}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh flag and mac80211 will handle everything automatically. Additionally, hardware having support for the dynamic PS feature may set the }(hj"hhhNhNubj)}(h$``IEEE80211_HW_SUPPORTS_DYNAMIC_PS``h]h IEEE80211_HW_SUPPORTS_DYNAMIC_PS}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh^ flag to indicate that it can support dynamic PS mode itself. The driver needs to look at the }(hj"hhhNhNubj)}(h**dynamic_ps_timeout**h]hdynamic_ps_timeout}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh= hardware configuration value and use it that value whenever }(hj"hhhNhNubj)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh[ is set. In this case mac80211 will disable dynamic PS feature in stack and will just keep z}(hj"hhhNhNubj)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hj)#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh- enabled whenever user has enabled powersave.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hXDriver informs U-APSD client support by enabling ``IEEE80211_VIF_SUPPORTS_UAPSD`` flag. The mode is configured through the uapsd parameter in conf_tx() operation. Hardware needs to send the QoS Nullfunc frames and stay awake until the service period has ended. To utilize U-APSD, dynamic powersave is disabled for voip AC and all frames from that AC are transmitted with powersave enabled.h](h1Driver informs U-APSD client support by enabling }(hjB#hhhNhNubj)}(h ``IEEE80211_VIF_SUPPORTS_UAPSD``h]hIEEE80211_VIF_SUPPORTS_UAPSD}(hjJ#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjB#ubhX4 flag. The mode is configured through the uapsd parameter in conf_tx() operation. Hardware needs to send the QoS Nullfunc frames and stay awake until the service period has ended. To utilize U-APSD, dynamic powersave is disabled for voip AC and all frames from that AC are transmitted with powersave enabled.}(hjB#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubh)}(hVNote: U-APSD client mode is not yet supported with ``IEEE80211_HW_PS_NULLFUNC_STACK``.h](h3Note: U-APSD client mode is not yet supported with }(hjc#hhhNhNubj)}(h"``IEEE80211_HW_PS_NULLFUNC_STACK``h]hIEEE80211_HW_PS_NULLFUNC_STACK}(hjk#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc#ubh.}(hjc#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.hhM hj"hhubeh}(h]powersave-supportah ]h"]powersave supportah$]h&]uh1hhhhhhhhK+ubh)}(hhh](h)}(hBeacon filter supporth]hBeacon filter support}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hhhhhK1ubh)}(hXSome hardware have beacon filter support to reduce host cpu wakeups which will reduce system power consumption. It usually works so that the firmware creates a checksum of the beacon but omits all constantly changing elements (TSF, TIM etc). Whenever the checksum changes the beacon is forwarded to the host, otherwise it will be just dropped. That way the host will only receive beacons where some relevant information (for example ERP protection or WMM settings) have changed.h]hXSome hardware have beacon filter support to reduce host cpu wakeups which will reduce system power consumption. It usually works so that the firmware creates a checksum of the beacon but omits all constantly changing elements (TSF, TIM etc). Whenever the checksum changes the beacon is forwarded to the host, otherwise it will be just dropped. That way the host will only receive beacons where some relevant information (for example ERP protection or WMM settings) have changed.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM hj#hhubh)}(hXqBeacon filter support is advertised with the ``IEEE80211_VIF_BEACON_FILTER`` interface capability. The driver needs to enable beacon filter support whenever power save is enabled, that is ``IEEE80211_CONF_PS`` is set. When power save is enabled, the stack will not check for beacon loss and the driver needs to notify about loss of beacons with ieee80211_beacon_loss().h](h-Beacon filter support is advertised with the }(hj#hhhNhNubj)}(h``IEEE80211_VIF_BEACON_FILTER``h]hIEEE80211_VIF_BEACON_FILTER}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubhp interface capability. The driver needs to enable beacon filter support whenever power save is enabled, that is }(hj#hhhNhNubj)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh is set. When power save is enabled, the stack will not check for beacon loss and the driver needs to notify about loss of beacons with ieee80211_beacon_loss().}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM( hj#hhubh)}(hX The time (or number of beacons missed) until the firmware notifies the driver of a beacon loss event (which in turn causes the driver to call ieee80211_beacon_loss()) should be configurable and will be controlled by mac80211 and the roaming algorithm in the future.h]hX The time (or number of beacons missed) until the firmware notifies the driver of a beacon loss event (which in turn causes the driver to call ieee80211_beacon_loss()) should be configurable and will be controlled by mac80211 and the roaming algorithm in the future.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM. hj#hhubh)}(hXSince there may be constantly changing information elements that nothing in the software stack cares about, we will, in the future, have mac80211 tell the driver which information elements are interesting in the sense that we want to see changes in them. This will includeh]hXSince there may be constantly changing information elements that nothing in the software stack cares about, we will, in the future, have mac80211 tell the driver which information elements are interesting in the sense that we want to see changes in them. This will include}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM3 hj#hhubh block_quote)}(hX- a list of information element IDs - a list of OUIs for the vendor information element h]h bullet_list)}(hhh](h list_item)}(h!a list of information element IDsh]h)}(hj $h]h!a list of information element IDs}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM8 hj $ubah}(h]h ]h"]h$]h&]uh1j$hj$ubj $)}(h2a list of OUIs for the vendor information element h]h)}(h1a list of OUIs for the vendor information elementh]h1a list of OUIs for the vendor information element}(hj&$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM9 hj"$ubah}(h]h ]h"]h$]h&]uh1j$hj$ubeh}(h]h ]h"]h$]h&]bullet-uh1j$hj$hM8 hj#ubah}(h]h ]h"]h$]h&]uh1j#hj$hM8 hj#hhubh)}(hX?Ideally, the hardware would filter out any beacons without changes in the requested elements, but if it cannot support that it may, at the expense of some efficiency, filter out only a subset. For example, if the device doesn't support checking for OUIs it should pass up all changes in all vendor information elements.h]hXAIdeally, the hardware would filter out any beacons without changes in the requested elements, but if it cannot support that it may, at the expense of some efficiency, filter out only a subset. For example, if the device doesn’t support checking for OUIs it should pass up all changes in all vendor information elements.}(hjI$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhM; hj#hhubh)}(hNote that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon.h]hNote that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon.}(hjX$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhMA hj#hhubh)}(hXSome hardware supports an "ignore list" instead. Just make sure nothing that was requested is on the ignore list, and include commonly changing information element IDs in the ignore list, for example 11 (BSS load) and the various vendor-assigned IEs with unknown contents (128, 129, 133-136, 149, 150, 155, 156, 173, 176, 178, 179, 219); for forward compatibility it could also include some currently unused IDs.h]hXSome hardware supports an “ignore list” instead. Just make sure nothing that was requested is on the ignore list, and include commonly changing information element IDs in the ignore list, for example 11 (BSS load) and the various vendor-assigned IEs with unknown contents (128, 129, 133-136, 149, 150, 155, 156, 173, 176, 178, 179, 219); for forward compatibility it could also include some currently unused IDs.}(hjg$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhMD hj#hhubh)}(hXIn addition to these capabilities, hardware should support notifying the host of changes in the beacon RSSI. This is relevant to implement roaming when no traffic is flowing (when traffic is flowing we see the RSSI of the received data packets). This can consist of notifying the host when the RSSI changes significantly or when it drops below or rises above configurable thresholds. In the future these thresholds will also be configured by mac80211 (which gets them from userspace) to implement them as the roaming algorithm requires.h]hXIn addition to these capabilities, hardware should support notifying the host of changes in the beacon RSSI. This is relevant to implement roaming when no traffic is flowing (when traffic is flowing we see the RSSI of the received data packets). This can consist of notifying the host when the RSSI changes significantly or when it drops below or rises above configurable thresholds. In the future these thresholds will also be configured by mac80211 (which gets them from userspace) to implement them as the roaming algorithm requires.}(hjv$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhML hj#hhubh)}(hIf the hardware cannot implement this, the driver should ask it to periodically pass beacon frames to the host so that software can do the signal strength threshold checking.h]hIf the hardware cannot implement this, the driver should ask it to periodically pass beacon frames to the host so that software can do the signal strength threshold checking.}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.hhMU hj#hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"ieee80211_beacon_loss (C function)c.ieee80211_beacon_losshNtauh1hhj#hhhNhNubh)}(hhh](h)}(h6void ieee80211_beacon_loss (struct ieee80211_vif *vif)h]j)}(h5void ieee80211_beacon_loss(struct ieee80211_vif *vif)h](j)}(hvoidh]hvoid}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhMEubj)}(h h]h }(hj$hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj$hhhj$hMEubj,)}(hieee80211_beacon_lossh]j2)}(hieee80211_beacon_lossh]hieee80211_beacon_loss}(hj$hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj$ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj$hhhj$hMEubj/)}(h(struct ieee80211_vif *vif)h]j5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj$ubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hj%hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj%ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj %modnameN classnameNjrju)}jx]j{)}jnj$sbc.ieee80211_beacon_lossasbuh1hhj$ubj)}(h h]h }(hj(%hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj$ubj)}(hj h]h*}(hj6%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj2)}(hvifh]hvif}(hjC%hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj$ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj$ubah}(h]h ]h"]h$]h&]jIjJuh1j.hj$hhhj$hMEubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj$hhhj$hMEubah}(h]j$ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj$hMEhj$hhubj`)}(hhh]h)}(h(inform hardware does not receive beaconsh]h(inform hardware does not receive beacons}(hjm%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhM=hjj%hhubah}(h]h ]h"]h$]h&]uh1j_hj$hhhj$hMEubeh}(h]h ](j|functioneh"]h$]h&]jj|jj%jj%jjjuh1hhhhj#hNhNubj)}(hX_**Parameters** ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. **Description** When beacon filtering is enabled with ``IEEE80211_VIF_BEACON_FILTER`` and ``IEEE80211_CONF_PS`` is set, the driver needs to inform whenever the hardware is not receiving beacons with this function.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhMAhj%ubj)}(hhh]j)}(hv``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. h](j)}(h``struct ieee80211_vif *vif``h]j)}(hj%h]hstruct ieee80211_vif *vif}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhM?hj%ubj)}(hhh]h)}(hW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.h](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hj%h]hstruct ieee80211_vif}(hj%hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhj%hM?hj%ubh) pointer from the add_interface callback.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj%hM?hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hM?hj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubh)}(h**Description**h]j)}(hj&h]h Description}(hj &hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhMAhj%ubh)}(hWhen beacon filtering is enabled with ``IEEE80211_VIF_BEACON_FILTER`` and ``IEEE80211_CONF_PS`` is set, the driver needs to inform whenever the hardware is not receiving beacons with this function.h](h&When beacon filtering is enabled with }(hj&hhhNhNubj)}(h``IEEE80211_VIF_BEACON_FILTER``h]hIEEE80211_VIF_BEACON_FILTER}(hj&&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubh and }(hj&hhhNhNubj)}(h``IEEE80211_CONF_PS``h]hIEEE80211_CONF_PS}(hj8&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&ubhf is set, the driver needs to inform whenever the hardware is not receiving beacons with this function.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.hhMAhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj#hhhNhNubeh}(h]beacon-filter-supportah ]h"]beacon filter supportah$]h&]uh1hhhhhhhhK1ubh)}(hhh](h)}(hMultiple queues and QoS supporth]hMultiple queues and QoS support}(hjc&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`&hhhhhK:ubh)}(hTBDh]hTBD}(hjq&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK``IEEE80211_FRAME_RELEASE_PSPOLL`` frame released for PS-Poll h](j)}(h"``IEEE80211_FRAME_RELEASE_PSPOLL``h]j)}(hj+h]hIEEE80211_FRAME_RELEASE_PSPOLL}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj+ubj)}(hhh]h)}(hframe released for PS-Pollh]hframe released for PS-Poll}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+hMhj+ubj)}(h_``IEEE80211_FRAME_RELEASE_UAPSD`` frame(s) released due to frame received on trigger-enabled ACh](j)}(h!``IEEE80211_FRAME_RELEASE_UAPSD``h]j)}(hj+h]hIEEE80211_FRAME_RELEASE_UAPSD}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj+ubj)}(hhh]h)}(h=frame(s) released due to frame received on trigger-enabled ACh]h=frame(s) released due to frame received on trigger-enabled AC}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ,hMhj,ubah}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]uh1jhj ,hMhj+ubeh}(h]h ]h"]h$]h&]uh1jhj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(ieee80211_sta_ps_transition (C function)c.ieee80211_sta_ps_transitionhNtauh1hhj)hhhNhNubh)}(hhh](h)}(hGint ieee80211_sta_ps_transition (struct ieee80211_sta *sta, bool start)h]j)}(hFint ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start)h](j)}(hinth]hint}(hjQ,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM,hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMsubj)}(h h]h }(hj`,hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjM,hhhj_,hMsubj,)}(hieee80211_sta_ps_transitionh]j2)}(hieee80211_sta_ps_transitionh]hieee80211_sta_ps_transition}(hjr,hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjn,ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjM,hhhj_,hMsubj/)}(h'(struct ieee80211_sta *sta, bool start)h](j5)}(hstruct ieee80211_sta *stah](j )}(hj h]hstruct}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj,ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hj,hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj,ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj,modnameN classnameNjrju)}jx]j{)}jnjt,sbc.ieee80211_sta_ps_transitionasbuh1hhj,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj,ubj)}(hj h]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj2)}(hstah]hsta}(hj,hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj,ubj5)}(h bool starth](j)}(hboolh]hbool}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj,ubj2)}(hstarth]hstart}(hj-hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj,ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj,ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjM,hhhj_,hMsubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjI,hhhj_,hMsubah}(h]jD,ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj_,hMshjF,hhubj`)}(hhh]h)}(hPS transition for connected stah]hPS transition for connected sta}(hjF-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMchjC-hhubah}(h]h ]h"]h$]h&]uh1j_hjF,hhhj_,hMsubeh}(h]h ](j|functioneh"]h$]h&]jj|jj^-jj^-jjjuh1hhhhj)hNhNubj)}(hX **Parameters** ``struct ieee80211_sta *sta`` currently connected sta ``bool start`` start or stop PS **Description** When operating in AP mode with the ``IEEE80211_HW_AP_LINK_PS`` flag set, use this function to inform mac80211 about a connected station entering/leaving PS mode. This function may not be called in IRQ context or with softirqs enabled. Calls to this function for a single hardware must be synchronized against each other. **Return** 0 on success. -EINVAL when the requested PS mode is already set.h](h)}(h**Parameters**h]j)}(hjh-h]h Parameters}(hjj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf-ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMghjb-ubj)}(hhh](j)}(h6``struct ieee80211_sta *sta`` currently connected sta h](j)}(h``struct ieee80211_sta *sta``h]j)}(hj-h]hstruct ieee80211_sta *sta}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMnhj-ubj)}(hhh]h)}(hcurrently connected stah]hcurrently connected sta}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMnhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMnhj~-ubj)}(h ``bool start`` start or stop PS h](j)}(h``bool start``h]j)}(hj-h]h bool start}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMohj-ubj)}(hhh]h)}(hstart or stop PSh]hstart or stop PS}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMohj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1jhj-hMohj~-ubeh}(h]h ]h"]h$]h&]uh1jhjb-ubh)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMqhjb-ubh)}(hWhen operating in AP mode with the ``IEEE80211_HW_AP_LINK_PS`` flag set, use this function to inform mac80211 about a connected station entering/leaving PS mode.h](h#When operating in AP mode with the }(hj.hhhNhNubj)}(h``IEEE80211_HW_AP_LINK_PS``h]hIEEE80211_HW_AP_LINK_PS}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubhc flag set, use this function to inform mac80211 about a connected station entering/leaving PS mode.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMdhjb-ubh)}(hHThis function may not be called in IRQ context or with softirqs enabled.h]hHThis function may not be called in IRQ context or with softirqs enabled.}(hj2.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhhjb-ubh)}(hUCalls to this function for a single hardware must be synchronized against each other.h]hUCalls to this function for a single hardware must be synchronized against each other.}(hjA.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMjhjb-ubh)}(h **Return**h]j)}(hjR.h]hReturn}(hjT.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP.ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMmhjb-ubh)}(h@0 on success. -EINVAL when the requested PS mode is already set.h]h@0 on success. -EINVAL when the requested PS mode is already set.}(hjh.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMqhjb-ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h+ieee80211_sta_ps_transition_ni (C function) c.ieee80211_sta_ps_transition_nihNtauh1hhj)hhhNhNubh)}(hhh](h)}(hJint ieee80211_sta_ps_transition_ni (struct ieee80211_sta *sta, bool start)h]j)}(hIint ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta, bool start)h](j)}(hinth]hint}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMubj)}(h h]h }(hj.hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj.hhhj.hMubj,)}(hieee80211_sta_ps_transition_nih]j2)}(hieee80211_sta_ps_transition_nih]hieee80211_sta_ps_transition_ni}(hj.hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj.ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj.hhhj.hMubj/)}(h'(struct ieee80211_sta *sta, bool start)h](j5)}(hstruct ieee80211_sta *stah](j )}(hj h]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj.ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hj.hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj.ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj.modnameN classnameNjrju)}jx]j{)}jnj.sb c.ieee80211_sta_ps_transition_niasbuh1hhj.ubj)}(h h]h }(hj/hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj.ubj)}(hj h]h*}(hj /hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj2)}(hstah]hsta}(hj-/hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj.ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj.ubj5)}(h bool starth](j)}(hj-h]hbool}(hjF/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjB/ubj)}(h h]h }(hjS/hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjB/ubj2)}(hstarth]hstart}(hja/hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjB/ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj.ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj.hhhj.hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj.hhhj.hMubah}(h]j.ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj.hMhj.hhubj`)}(hhh]h)}(h4PS transition for connected sta (in process context)h]h4PS transition for connected sta (in process context)}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMvhj/hhubah}(h]h ]h"]h$]h&]uh1j_hj.hhhj.hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj/jj/jjjuh1hhhhj)hNhNubj)}(hXE**Parameters** ``struct ieee80211_sta *sta`` currently connected sta ``bool start`` start or stop PS **Description** Like ieee80211_sta_ps_transition() but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies. **Return** Like ieee80211_sta_ps_transition().h](h)}(h**Parameters**h]j)}(hj/h]h Parameters}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMzhj/ubj)}(hhh](j)}(h6``struct ieee80211_sta *sta`` currently connected sta h](j)}(h``struct ieee80211_sta *sta``h]j)}(hj/h]hstruct ieee80211_sta *sta}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM}hj/ubj)}(hhh]h)}(hcurrently connected stah]hcurrently connected sta}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/hM}hj/ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj/hM}hj/ubj)}(h ``bool start`` start or stop PS h](j)}(h``bool start``h]j)}(hj0h]h bool start}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM~hj/ubj)}(hhh]h)}(hstart or stop PSh]hstart or stop PS}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj0hM~hj0ubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhj0hM~hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/ubh)}(h**Description**h]j)}(hj@0h]h Description}(hjB0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>0ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj/ubh)}(hLike ieee80211_sta_ps_transition() but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies.h]hLike ieee80211_sta_ps_transition() but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies.}(hjV0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMwhj/ubh)}(h **Return**h]j)}(hjg0h]hReturn}(hji0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje0ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM{hj/ubh)}(h#Like ieee80211_sta_ps_transition().h]h#Like ieee80211_sta_ps_transition().}(hj}0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'ieee80211_sta_set_buffered (C function)c.ieee80211_sta_set_bufferedhNtauh1hhj)hhhNhNubh)}(hhh](h)}(hRvoid ieee80211_sta_set_buffered (struct ieee80211_sta *sta, u8 tid, bool buffered)h]j)}(hQvoid ieee80211_sta_set_buffered(struct ieee80211_sta *sta, u8 tid, bool buffered)h](j)}(hvoidh]hvoid}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMubj)}(h h]h }(hj0hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj0hhhj0hMubj,)}(hieee80211_sta_set_bufferedh]j2)}(hieee80211_sta_set_bufferedh]hieee80211_sta_set_buffered}(hj0hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj0ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj0hhhj0hMubj/)}(h2(struct ieee80211_sta *sta, u8 tid, bool buffered)h](j5)}(hstruct ieee80211_sta *stah](j )}(hj h]hstruct}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(h h]h }(hj0hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj0ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hj1hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj1ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj 1modnameN classnameNjrju)}jx]j{)}jnj0sbc.ieee80211_sta_set_bufferedasbuh1hhj0ubj)}(h h]h }(hj'1hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj0ubj)}(hj h]h*}(hj51hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj2)}(hstah]hsta}(hjB1hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj0ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj0ubj5)}(hu8 tidh](h)}(hhh]j2)}(hu8h]hu8}(hj^1hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj[1ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj`1modnameN classnameNjrju)}jx]j#1c.ieee80211_sta_set_bufferedasbuh1hhjW1ubj)}(h h]h }(hj|1hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjW1ubj2)}(htidh]htid}(hj1hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjW1ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj0ubj5)}(h bool bufferedh](j)}(hj-h]hbool}(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj1ubj2)}(hbufferedh]hbuffered}(hj1hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj1ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj0ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj0hhhj0hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj0hhhj0hMubah}(h]j0ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj0hMhj0hhubj`)}(hhh]h)}(h,inform mac80211 about driver-buffered framesh]h,inform mac80211 about driver-buffered frames}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj1hhubah}(h]h ]h"]h$]h&]uh1j_hj0hhhj0hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj2jj2jjjuh1hhhhj)hNhNubj)}(hX**Parameters** ``struct ieee80211_sta *sta`` :c:type:`struct ieee80211_sta ` pointer for the sleeping station ``u8 tid`` the TID that has buffered frames ``bool buffered`` indicates whether or not frames are buffered for this TID **Description** If a driver buffers frames for a powersave station instead of passing them back to mac80211 for retransmission, the station may still need to be told that there are buffered frames via the TIM bit. This function informs mac80211 whether or not there are frames that are buffered in the driver for a given TID; mac80211 can then use this data to set the TIM bit (NOTE: This may call back into the driver's set_tim call! Beware of the locking!) If all frames are released to the station (due to PS-poll or uAPSD) then the driver needs to inform mac80211 that there no longer are frames buffered. However, when the station wakes up mac80211 assumes that all buffered frames will be transmitted and clears this data, drivers need to make sure they inform mac80211 about all buffered frames on the sleep transition (sta_notify() with ``STA_NOTIFY_SLEEP``). Note that technically mac80211 only needs to know this per AC, not per TID, but since driver buffering will inevitably happen per TID (since it is related to aggregation) it is easier to make mac80211 map the TID to the AC as required instead of keeping track in all drivers that use this API.h](h)}(h**Parameters**h]j)}(hj 2h]h Parameters}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubj)}(hhh](j)}(hn``struct ieee80211_sta *sta`` :c:type:`struct ieee80211_sta ` pointer for the sleeping station h](j)}(h``struct ieee80211_sta *sta``h]j)}(hj)2h]hstruct ieee80211_sta *sta}(hj+2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'2ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj#2ubj)}(hhh]h)}(hO:c:type:`struct ieee80211_sta ` pointer for the sleeping stationh](h)}(h.:c:type:`struct ieee80211_sta `h]j)}(hjH2h]hstruct ieee80211_sta}(hjJ2hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjF2ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_stauh1hhj>2hMhjB2ubh! pointer for the sleeping station}(hjB2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj>2hMhj?2ubah}(h]h ]h"]h$]h&]uh1jhj#2ubeh}(h]h ]h"]h$]h&]uh1jhj>2hMhj 2ubj)}(h,``u8 tid`` the TID that has buffered frames h](j)}(h ``u8 tid``h]j)}(hj2h]hu8 tid}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj{2ubj)}(hhh]h)}(h the TID that has buffered framesh]h the TID that has buffered frames}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj{2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj 2ubj)}(hL``bool buffered`` indicates whether or not frames are buffered for this TID h](j)}(h``bool buffered``h]j)}(hj2h]h bool buffered}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubj)}(hhh]h)}(h9indicates whether or not frames are buffered for this TIDh]h9indicates whether or not frames are buffered for this TID}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2hMhj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhj2hMhj 2ubeh}(h]h ]h"]h$]h&]uh1jhj2ubh)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubh)}(hIf a driver buffers frames for a powersave station instead of passing them back to mac80211 for retransmission, the station may still need to be told that there are buffered frames via the TIM bit.h]hIf a driver buffers frames for a powersave station instead of passing them back to mac80211 for retransmission, the station may still need to be told that there are buffered frames via the TIM bit.}(hj 3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubh)}(hThis function informs mac80211 whether or not there are frames that are buffered in the driver for a given TID; mac80211 can then use this data to set the TIM bit (NOTE: This may call back into the driver's set_tim call! Beware of the locking!)h]hThis function informs mac80211 whether or not there are frames that are buffered in the driver for a given TID; mac80211 can then use this data to set the TIM bit (NOTE: This may call back into the driver’s set_tim call! Beware of the locking!)}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubh)}(hXIf all frames are released to the station (due to PS-poll or uAPSD) then the driver needs to inform mac80211 that there no longer are frames buffered. However, when the station wakes up mac80211 assumes that all buffered frames will be transmitted and clears this data, drivers need to make sure they inform mac80211 about all buffered frames on the sleep transition (sta_notify() with ``STA_NOTIFY_SLEEP``).h](hXIf all frames are released to the station (due to PS-poll or uAPSD) then the driver needs to inform mac80211 that there no longer are frames buffered. However, when the station wakes up mac80211 assumes that all buffered frames will be transmitted and clears this data, drivers need to make sure they inform mac80211 about all buffered frames on the sleep transition (sta_notify() with }(hj)3hhhNhNubj)}(h``STA_NOTIFY_SLEEP``h]hSTA_NOTIFY_SLEEP}(hj13hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)3ubh).}(hj)3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubh)}(hX%Note that technically mac80211 only needs to know this per AC, not per TID, but since driver buffering will inevitably happen per TID (since it is related to aggregation) it is easier to make mac80211 map the TID to the AC as required instead of keeping track in all drivers that use this API.h]hX%Note that technically mac80211 only needs to know this per AC, not per TID, but since driver buffering will inevitably happen per TID (since it is related to aggregation) it is easier to make mac80211 map the TID to the AC as required instead of keeping track in all drivers that use this API.}(hjJ3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!ieee80211_beacon_get (C function)c.ieee80211_beacon_gethNtauh1hhj)hhhNhNubh)}(hhh](h)}(hpstruct sk_buff * ieee80211_beacon_get (struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)h]j)}(hnstruct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)h](j )}(hj h]hstruct}(hjy3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju3hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhju3hhhj3hM ubh)}(hhh]j2)}(hsk_buffh]hsk_buff}(hj3hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj3ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj3modnameN classnameNjrju)}jx]j{)}jnieee80211_beacon_getsbc.ieee80211_beacon_getasbuh1hhju3hhhj3hM ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhju3hhhj3hM ubj)}(hj h]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhju3hhhj3hM ubj,)}(hieee80211_beacon_geth]j2)}(hj3h]hieee80211_beacon_get}(hj3hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj3ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hju3hhhj3hM ubj/)}(hJ(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj3ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj4hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj4ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj4modnameN classnameNjrju)}jx]j3c.ieee80211_beacon_getasbuh1hhj3ubj)}(h h]h }(hj/4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj3ubj)}(hj h]h*}(hj=4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj2)}(hhwh]hhw}(hjJ4hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj3ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj3ubj5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hjc4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_4ubj)}(h h]h }(hjp4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj_4ubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hj4hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj~4ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj4modnameN classnameNjrju)}jx]j3c.ieee80211_beacon_getasbuh1hhj_4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj_4ubj)}(hj h]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_4ubj2)}(hvifh]hvif}(hj4hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj_4ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj3ubj5)}(hunsigned int link_idh](j)}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj4ubj)}(hinth]hint}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj4ubj2)}(hlink_idh]hlink_id}(hj 5hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj4ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj3ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hju3hhhj3hM ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjq3hhhj3hM ubah}(h]jl3ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj3hM hjn3hhubj`)}(hhh]h)}(hbeacon generation functionh]hbeacon generation function}(hj55hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj25hhubah}(h]h ]h"]h$]h&]uh1j_hjn3hhhj3hM ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjM5jjM5jjjuh1hhhhj)hNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` pointer obtained from ieee80211_alloc_hw(). ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. ``unsigned int link_id`` the link id to which the beacon belongs (or 0 for an AP STA that is not associated with AP MLD). **Description** See ieee80211_beacon_get_tim(). **Return** See ieee80211_beacon_get_tim().h](h)}(h**Parameters**h]j)}(hjW5h]h Parameters}(hjY5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU5ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhjQ5ubj)}(hhh](j)}(hH``struct ieee80211_hw *hw`` pointer obtained from ieee80211_alloc_hw(). h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjv5h]hstruct ieee80211_hw *hw}(hjx5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjt5ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhjp5ubj)}(hhh]h)}(h+pointer obtained from ieee80211_alloc_hw().h]h+pointer obtained from ieee80211_alloc_hw().}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jhjp5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhjm5ubj)}(hv``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. h](j)}(h``struct ieee80211_vif *vif``h]j)}(hj5h]hstruct ieee80211_vif *vif}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj5ubj)}(hhh]h)}(hW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.h](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hj5h]hstruct ieee80211_vif}(hj5hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhj5hMhj5ubh) pointer from the add_interface callback.}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj5hMhj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1jhj5hMhjm5ubj)}(hz``unsigned int link_id`` the link id to which the beacon belongs (or 0 for an AP STA that is not associated with AP MLD). h](j)}(h``unsigned int link_id``h]j)}(hj6h]hunsigned int link_id}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj6ubj)}(hhh]h)}(h`the link id to which the beacon belongs (or 0 for an AP STA that is not associated with AP MLD).h]h`the link id to which the beacon belongs (or 0 for an AP STA that is not associated with AP MLD).}(hj 6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj6ubah}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]uh1jhj6hMhjm5ubeh}(h]h ]h"]h$]h&]uh1jhjQ5ubh)}(h**Description**h]j)}(hjC6h]h Description}(hjE6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA6ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhjQ5ubh)}(hSee ieee80211_beacon_get_tim().h]hSee ieee80211_beacon_get_tim().}(hjY6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhjQ5ubh)}(h **Return**h]j)}(hjj6h]hReturn}(hjl6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh6ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM hjQ5ubh)}(hSee ieee80211_beacon_get_tim().h]hSee ieee80211_beacon_get_tim().}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhM hjQ5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&ieee80211_get_buffered_bc (C function)c.ieee80211_get_buffered_bchNtauh1hhj)hhhNhNubh)}(hhh](h)}(h_struct sk_buff * ieee80211_get_buffered_bc (struct ieee80211_hw *hw, struct ieee80211_vif *vif)h]j)}(h]struct sk_buff *ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif)h](j )}(hj h]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj6hhhj6hMubh)}(hhh]j2)}(hsk_buffh]hsk_buff}(hj6hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj6ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj6modnameN classnameNjrju)}jx]j{)}jnieee80211_get_buffered_bcsbc.ieee80211_get_buffered_bcasbuh1hhj6hhhj6hMubj)}(h h]h }(hj6hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj6hhhj6hMubj)}(hj h]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6hhhj6hMubj,)}(hieee80211_get_buffered_bch]j2)}(hj6h]hieee80211_get_buffered_bc}(hj7hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj 7ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj6hhhj6hMubj/)}(h4(struct ieee80211_hw *hw, struct ieee80211_vif *vif)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj)7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%7ubj)}(h h]h }(hj67hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj%7ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjG7hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjD7ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjI7modnameN classnameNjrju)}jx]j6c.ieee80211_get_buffered_bcasbuh1hhj%7ubj)}(h h]h }(hje7hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj%7ubj)}(hj h]h*}(hjs7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%7ubj2)}(hhwh]hhw}(hj7hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj%7ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj!7ubj5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj7ubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hj7hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj7ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj7modnameN classnameNjrju)}jx]j6c.ieee80211_get_buffered_bcasbuh1hhj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj7ubj)}(hj h]h*}(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj2)}(hvifh]hvif}(hj7hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj7ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj!7ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj6hhhj6hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj6hhhj6hMubah}(h]j6ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj6hMhj6hhubj`)}(hhh]h)}(h1accessing buffered broadcast and multicast framesh]h1accessing buffered broadcast and multicast frames}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj8hhubah}(h]h ]h"]h$]h&]uh1j_hj6hhhj6hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj28jj28jjjuh1hhhhj)hNhNubj)}(hX0**Parameters** ``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw(). ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. **Description** Function for accessing buffered broadcast and multicast frames. If hardware/firmware does not implement buffering of broadcast/multicast frames when power saving is used, 802.11 code buffers them in the host memory. The low-level driver uses this function to fetch next buffered frame. In most cases, this is used when generating beacon frame. **Return** A pointer to the next buffered skb or NULL if no more buffered frames are available. **Note** buffered frames are returned only after DTIM beacon frame was generated with ieee80211_beacon_get() and the low-level driver must thus call ieee80211_beacon_get() first. ieee80211_get_buffered_bc() returns NULL if the previous generated beacon was not DTIM, so the low-level driver does not need to check for DTIM beacons separately and should be able to use common code for all beacons.h](h)}(h**Parameters**h]j)}(hj<8h]h Parameters}(hj>8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:8ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubj)}(hhh](j)}(hK``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw(). h](j)}(h``struct ieee80211_hw *hw``h]j)}(hj[8h]hstruct ieee80211_hw *hw}(hj]8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY8ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhjU8ubj)}(hhh]h)}(h.pointer as obtained from ieee80211_alloc_hw().h]h.pointer as obtained from ieee80211_alloc_hw().}(hjt8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjp8hMhjq8ubah}(h]h ]h"]h$]h&]uh1jhjU8ubeh}(h]h ]h"]h$]h&]uh1jhjp8hMhjR8ubj)}(hv``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. h](j)}(h``struct ieee80211_vif *vif``h]j)}(hj8h]hstruct ieee80211_vif *vif}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj8ubj)}(hhh]h)}(hW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.h](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hj8h]hstruct ieee80211_vif}(hj8hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhj8hMhj8ubh) pointer from the add_interface callback.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj8hMhj8ubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8hMhjR8ubeh}(h]h ]h"]h$]h&]uh1jhj68ubh)}(h**Description**h]j)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubh)}(hXWFunction for accessing buffered broadcast and multicast frames. If hardware/firmware does not implement buffering of broadcast/multicast frames when power saving is used, 802.11 code buffers them in the host memory. The low-level driver uses this function to fetch next buffered frame. In most cases, this is used when generating beacon frame.h]hXWFunction for accessing buffered broadcast and multicast frames. If hardware/firmware does not implement buffering of broadcast/multicast frames when power saving is used, 802.11 code buffers them in the host memory. The low-level driver uses this function to fetch next buffered frame. In most cases, this is used when generating beacon frame.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubh)}(h **Return**h]j)}(hj9h]hReturn}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubh)}(hTA pointer to the next buffered skb or NULL if no more buffered frames are available.h]hTA pointer to the next buffered skb or NULL if no more buffered frames are available.}(hj+9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubh)}(h**Note**h]j)}(hj<9h]hNote}(hj>9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:9ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubh)}(hXbuffered frames are returned only after DTIM beacon frame was generated with ieee80211_beacon_get() and the low-level driver must thus call ieee80211_beacon_get() first. ieee80211_get_buffered_bc() returns NULL if the previous generated beacon was not DTIM, so the low-level driver does not need to check for DTIM beacons separately and should be able to use common code for all beacons.h]hXbuffered frames are returned only after DTIM beacon frame was generated with ieee80211_beacon_get() and the low-level driver must thus call ieee80211_beacon_get() first. ieee80211_get_buffered_bc() returns NULL if the previous generated beacon was not DTIM, so the low-level driver does not need to check for DTIM beacons separately and should be able to use common code for all beacons.}(hjR9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMhj68ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&ieee80211_sta_block_awake (C function)c.ieee80211_sta_block_awakehNtauh1hhj)hhhNhNubh)}(hhh](h)}(hbvoid ieee80211_sta_block_awake (struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)h]j)}(havoid ieee80211_sta_block_awake(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)h](j)}(hvoidh]hvoid}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}9hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMbubj)}(h h]h }(hj9hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj}9hhhj9hMbubj,)}(hieee80211_sta_block_awakeh]j2)}(hieee80211_sta_block_awakeh]hieee80211_sta_block_awake}(hj9hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj9ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj}9hhhj9hMbubj/)}(hC(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj9ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj9hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj9ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj9modnameN classnameNjrju)}jx]j{)}jnj9sbc.ieee80211_sta_block_awakeasbuh1hhj9ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj9ubj)}(hj h]h*}(hj :hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj2)}(hhwh]hhw}(hj:hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj9ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj9ubj5)}(hstruct ieee80211_sta *pubstah](j )}(hj h]hstruct}(hj0:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,:ubj)}(h h]h }(hj=:hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj,:ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hjN:hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjK:ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjP:modnameN classnameNjrju)}jx]j9c.ieee80211_sta_block_awakeasbuh1hhj,:ubj)}(h h]h }(hjl:hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj,:ubj)}(hj h]h*}(hjz:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,:ubj2)}(hpubstah]hpubsta}(hj:hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj,:ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj9ubj5)}(h bool blockh](j)}(hj-h]hbool}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj:ubj2)}(hblockh]hblock}(hj:hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj:ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj9ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj}9hhhj9hMbubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjy9hhhj9hMbubah}(h]jt9ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj9hMbhjv9hhubj`)}(hhh]h)}(hblock station from waking uph]hblock station from waking up}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMFhj:hhubah}(h]h ]h"]h$]h&]uh1j_hjv9hhhj9hMbubeh}(h]h ](j|functioneh"]h$]h&]jj|jj:jj:jjjuh1hhhhj)hNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware ``struct ieee80211_sta *pubsta`` the station ``bool block`` whether to block or unblock **Description** Some devices require that all frames that are on the queues for a specific station that went to sleep are flushed before a poll response or frames after the station woke up can be delivered to that it. Note that such frames must be rejected by the driver as filtered, with the appropriate status flag. This function allows implementing this mode in a race-free manner. To do this, a driver must keep track of the number of frames still enqueued for a specific station. If this number is not zero when the station goes to sleep, the driver must call this function to force mac80211 to consider the station to be asleep regardless of the station's actual state. Once the number of outstanding frames reaches zero, the driver must call this function again to unblock the station. That will cause mac80211 to be able to send ps-poll responses, and if the station queried in the meantime then frames will also be sent out as a result of this. Additionally, the driver will be notified that the station woke up some time after it is unblocked, regardless of whether the station actually woke up while blocked or not.h](h)}(h**Parameters**h]j)}(hj;h]h Parameters}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMJhj;ubj)}(hhh](j)}(h)``struct ieee80211_hw *hw`` the hardware h](j)}(h``struct ieee80211_hw *hw``h]j)}(hj&;h]hstruct ieee80211_hw *hw}(hj(;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$;ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMGhj ;ubj)}(hhh]h)}(h the hardwareh]h the hardware}(hj?;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;;hMGhj<;ubah}(h]h ]h"]h$]h&]uh1jhj ;ubeh}(h]h ]h"]h$]h&]uh1jhj;;hMGhj;ubj)}(h-``struct ieee80211_sta *pubsta`` the station h](j)}(h ``struct ieee80211_sta *pubsta``h]j)}(hj_;h]hstruct ieee80211_sta *pubsta}(hja;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj];ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMHhjY;ubj)}(hhh]h)}(h the stationh]h the station}(hjx;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjt;hMHhju;ubah}(h]h ]h"]h$]h&]uh1jhjY;ubeh}(h]h ]h"]h$]h&]uh1jhjt;hMHhj;ubj)}(h+``bool block`` whether to block or unblock h](j)}(h``bool block``h]j)}(hj;h]h bool block}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMIhj;ubj)}(hhh]h)}(hwhether to block or unblockh]hwhether to block or unblock}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMIhj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;hMIhj;ubeh}(h]h ]h"]h$]h&]uh1jhj;ubh)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMKhj;ubh)}(hX-Some devices require that all frames that are on the queues for a specific station that went to sleep are flushed before a poll response or frames after the station woke up can be delivered to that it. Note that such frames must be rejected by the driver as filtered, with the appropriate status flag.h]hX-Some devices require that all frames that are on the queues for a specific station that went to sleep are flushed before a poll response or frames after the station woke up can be delivered to that it. Note that such frames must be rejected by the driver as filtered, with the appropriate status flag.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMKhj;ubh)}(hBThis function allows implementing this mode in a race-free manner.h]hBThis function allows implementing this mode in a race-free manner.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMQhj;ubh)}(hXTo do this, a driver must keep track of the number of frames still enqueued for a specific station. If this number is not zero when the station goes to sleep, the driver must call this function to force mac80211 to consider the station to be asleep regardless of the station's actual state. Once the number of outstanding frames reaches zero, the driver must call this function again to unblock the station. That will cause mac80211 to be able to send ps-poll responses, and if the station queried in the meantime then frames will also be sent out as a result of this. Additionally, the driver will be notified that the station woke up some time after it is unblocked, regardless of whether the station actually woke up while blocked or not.h]hXTo do this, a driver must keep track of the number of frames still enqueued for a specific station. If this number is not zero when the station goes to sleep, the driver must call this function to force mac80211 to consider the station to be asleep regardless of the station’s actual state. Once the number of outstanding frames reaches zero, the driver must call this function again to unblock the station. That will cause mac80211 to be able to send ps-poll responses, and if the station queried in the meantime then frames will also be sent out as a result of this. Additionally, the driver will be notified that the station woke up some time after it is unblocked, regardless of whether the station actually woke up while blocked or not.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMThj;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_sta_eosp (C function)c.ieee80211_sta_eosphNtauh1hhj)hhhNhNubh)}(hhh](h)}(h6void ieee80211_sta_eosp (struct ieee80211_sta *pubsta)h]j)}(h5void ieee80211_sta_eosp(struct ieee80211_sta *pubsta)h](j)}(hvoidh]hvoid}(hj6<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2<hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMxubj)}(h h]h }(hjE<hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj2<hhhjD<hMxubj,)}(hieee80211_sta_eosph]j2)}(hieee80211_sta_eosph]hieee80211_sta_eosp}(hjW<hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjS<ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj2<hhhjD<hMxubj/)}(h(struct ieee80211_sta *pubsta)h]j5)}(hstruct ieee80211_sta *pubstah](j )}(hj h]hstruct}(hjs<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjo<ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hj<hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj<ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj<modnameN classnameNjrju)}jx]j{)}jnjY<sbc.ieee80211_sta_eospasbuh1hhjo<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjo<ubj)}(hj h]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjo<ubj2)}(hpubstah]hpubsta}(hj<hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjo<ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjk<ubah}(h]h ]h"]h$]h&]jIjJuh1j.hj2<hhhjD<hMxubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj.<hhhjD<hMxubah}(h]j)<ah ](jWjXeh"]h$]h&]j\j])j^huh1hhjD<hMxhj+<hhubj`)}(hhh]h)}(hnotify mac80211 about end of SPh]hnotify mac80211 about end of SP}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMfhj<hhubah}(h]h ]h"]h$]h&]uh1j_hj+<hhhjD<hMxubeh}(h]h ](j|functioneh"]h$]h&]jj|jj=jj=jjjuh1hhhhj)hNhNubj)}(hX**Parameters** ``struct ieee80211_sta *pubsta`` the station **Description** When a device transmits frames in a way that it can't tell mac80211 in the TX status about the EOSP, it must clear the ``IEEE80211_TX_STATUS_EOSP`` bit and call this function instead. This applies for PS-Poll as well as uAPSD. Note that just like with _tx_status() and _rx() drivers must not mix calls to irqsafe/non-irqsafe versions, this function must not be mixed with those either. Use the all irqsafe, or all non-irqsafe, don't mix! NB: the _irqsafe version of this function doesn't exist, no driver needs it right now. Don't call this function if you'd need the _irqsafe version, look at the git history and restore the _irqsafe version!h](h)}(h**Parameters**h]j)}(hj=h]h Parameters}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMjhj=ubj)}(hhh]j)}(h-``struct ieee80211_sta *pubsta`` the station h](j)}(h ``struct ieee80211_sta *pubsta``h]j)}(hj7=h]hstruct ieee80211_sta *pubsta}(hj9=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5=ubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMghj1=ubj)}(hhh]h)}(h the stationh]h the station}(hjP=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjL=hMghjM=ubah}(h]h ]h"]h$]h&]uh1jhj1=ubeh}(h]h ]h"]h$]h&]uh1jhjL=hMghj.=ubah}(h]h ]h"]h$]h&]uh1jhj=ubh)}(h**Description**h]j)}(hjr=h]h Description}(hjt=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp=ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMihj=ubh)}(hWhen a device transmits frames in a way that it can't tell mac80211 in the TX status about the EOSP, it must clear the ``IEEE80211_TX_STATUS_EOSP`` bit and call this function instead. This applies for PS-Poll as well as uAPSD.h](hyWhen a device transmits frames in a way that it can’t tell mac80211 in the TX status about the EOSP, it must clear the }(hj=hhhNhNubj)}(h``IEEE80211_TX_STATUS_EOSP``h]hIEEE80211_TX_STATUS_EOSP}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubhO bit and call this function instead. This applies for PS-Poll as well as uAPSD.}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMihj=ubh)}(hNote that just like with _tx_status() and _rx() drivers must not mix calls to irqsafe/non-irqsafe versions, this function must not be mixed with those either. Use the all irqsafe, or all non-irqsafe, don't mix!h]hNote that just like with _tx_status() and _rx() drivers must not mix calls to irqsafe/non-irqsafe versions, this function must not be mixed with those either. Use the all irqsafe, or all non-irqsafe, don’t mix!}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMnhj=ubj)}(hhh]j)}(hNB: the _irqsafe version of this function doesn't exist, no driver needs it right now. Don't call this function if you'd need the _irqsafe version, look at the git history and restore the _irqsafe version!h](j)}(h;NB: the _irqsafe version of this function doesn't exist, noh]h=NB: the _irqsafe version of this function doesn’t exist, no}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMuhj=ubj)}(hhh]h)}(hdriver needs it right now. Don't call this function if you'd need the _irqsafe version, look at the git history and restore the _irqsafe version!h]hdriver needs it right now. Don’t call this function if you’d need the _irqsafe version, look at the git history and restore the _irqsafe version!}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.hhMthj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ]h"]h$]h&]uh1jhj=hMuhj=ubah}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj)hhhNhNubeh}(h]support-for-powersaving-clientsah ]h"]support for powersaving clientsah$]h&]uh1hhjZ)hhhhhKLubeh}(h]access-point-mode-supportah ]h"]access point mode supportah$]h&]uh1hhhhhhhhKBubh)}(hhh](h)}(h&Supporting multiple virtual interfacesh]h&Supporting multiple virtual interfaces}(hj >hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj >hhhhhK]ubh)}(hTBDh]hTBD}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hj >hhubh)}(h?Note: WDS with identical MAC address should almost always be OKh]h?Note: WDS with identical MAC address should almost always be OK}(hj(>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahj >hhubh)}(hInsert notes about having multiple virtual interfaces with different MAC addresses here, note which configurations are supported by mac80211, add notes about supporting hw crypto with it.h]hInsert notes about having multiple virtual interfaces with different MAC addresses here, note which configurations are supported by mac80211, add notes about supporting hw crypto with it.}(hj6>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchj >hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h0ieee80211_iterate_active_interfaces (C function)%c.ieee80211_iterate_active_interfaceshNtauh1hhj >hhhNhNubh)}(hhh](h)}(hvoid ieee80211_iterate_active_interfaces (struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h]j)}(hvoid ieee80211_iterate_active_interfaces(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h](j)}(hvoidh]hvoid}(hj]>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY>hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMYubj)}(h h]h }(hjl>hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjY>hhhjk>hMYubj,)}(h#ieee80211_iterate_active_interfacesh]j2)}(h#ieee80211_iterate_active_interfacesh]h#ieee80211_iterate_active_interfaces}(hj~>hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjz>ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjY>hhhjk>hMYubj/)}(hw(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj>ubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj>hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj>ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj>modnameN classnameNjrju)}jx]j{)}jnj>sb%c.ieee80211_iterate_active_interfacesasbuh1hhj>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj>ubj)}(hj h]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj2)}(hhwh]hhw}(hj>hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj>ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj>ubj5)}(hu32 iter_flagsh](h)}(hhh]j2)}(hu32h]hu32}(hj?hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj ?ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj?modnameN classnameNjrju)}jx]j>%c.ieee80211_iterate_active_interfacesasbuh1hhj?ubj)}(h h]h }(hj-?hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj?ubj2)}(h iter_flagsh]h iter_flags}(hj;?hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj?ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj>ubj5)}(h@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)h](j)}(hvoidh]hvoid}(hjT?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(h h]h }(hjb?hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubj)}(h(h]h(}(hjp?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(hj h]h*}(hj~?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj2)}(hiteratorh]hiterator}(hj?hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjP?ubj)}(h)h]h)}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(hjr?h]h(}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(hvoidh]hvoid}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubj)}(hj h]h*}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj2)}(hdatah]hdata}(hj?hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjP?ubj)}(h,h]h,}(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubh)}(hhh]j2)}(hu8h]hu8}(hj @hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj@ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj @modnameN classnameNjrju)}jx]j>%c.ieee80211_iterate_active_interfacesasbuh1hhjP?ubj)}(h h]h }(hj(@hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubj)}(hj h]h*}(hj6@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj2)}(hmach]hmac}(hjC@hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjP?ubj)}(hj?h]h,}(hjQ@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(h h]h }(hj^@hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubj )}(hj h]hstruct}(hjl@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj)}(h h]h }(hjy@hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hj@hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj@ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj@modnameN classnameNjrju)}jx]j>%c.ieee80211_iterate_active_interfacesasbuh1hhjP?ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjP?ubj)}(hj h]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubj2)}(hvifh]hvif}(hj@hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjP?ubj)}(hj?h]h)}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP?ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj>ubj5)}(h void *datah](j)}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj@ubj)}(hj h]h*}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@ubj2)}(hdatah]hdata}(hjAhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj@ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj>ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjY>hhhjk>hMYubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjU>hhhjk>hMYubah}(h]jP>ah ](jWjXeh"]h$]h&]j\j])j^huh1hhjk>hMYhjR>hhubj`)}(hhh]h)}(hiterate active interfacesh]hiterate active interfaces}(hjhhhjk>hMYubeh}(h]h ](j|functioneh"]h$]h&]jj|jjTAjjTAjjjuh1hhhhj >hNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware struct of which the interfaces should be iterated over ``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` ``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call ``void *data`` first argument of the iterator function **Description** This function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function allows the iterator function to sleep, when the iterator function is atomic **ieee80211_iterate_active_interfaces_atomic** can be used. Does not iterate over a new interface during add_interface().h](h)}(h**Parameters**h]j)}(hj^Ah]h Parameters}(hj`AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\Aubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMOhjXAubj)}(hhh](j)}(h```struct ieee80211_hw *hw`` the hardware struct of which the interfaces should be iterated over h](j)}(h``struct ieee80211_hw *hw``h]j)}(hj}Ah]hstruct ieee80211_hw *hw}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Aubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMThjwAubj)}(hhh]h)}(hCthe hardware struct of which the interfaces should be iterated overh]hCthe hardware struct of which the interfaces should be iterated over}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhMThjAubah}(h]h ]h"]h$]h&]uh1jhjwAubeh}(h]h ]h"]h$]h&]uh1jhjAhMThjtAubj)}(h``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` h](j)}(h``u32 iter_flags``h]j)}(hjAh]hu32 iter_flags}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMUhjAubj)}(hhh]h)}(hmiteration flags, see :c:type:`enum ieee80211_interface_iteration_flags `h](hiteration flags, see }(hjAhhhNhNubh)}(hX:c:type:`enum ieee80211_interface_iteration_flags `h]j)}(hjAh]h(enum ieee80211_interface_iteration_flags}(hjAhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j#ieee80211_interface_iteration_flagsuh1hhjAhMUhjAubeh}(h]h ]h"]h$]h&]uh1hhjAhMUhjAubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1jhjAhMUhjtAubj)}(hc``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call h](j)}(hD``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)``h]j)}(hjBh]h@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Bubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMVhjBubj)}(hhh]h)}(hthe iterator function to callh]hthe iterator function to call}(hj'BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#BhMVhj$Bubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj#BhMVhjtAubj)}(h7``void *data`` first argument of the iterator function h](j)}(h``void *data``h]j)}(hjGBh]h void *data}(hjIBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEBubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMWhjABubj)}(hhh]h)}(h'first argument of the iterator functionh]h'first argument of the iterator function}(hj`BhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\BhMWhj]Bubah}(h]h ]h"]h$]h&]uh1jhjABubeh}(h]h ]h"]h$]h&]uh1jhj\BhMWhjtAubeh}(h]h ]h"]h$]h&]uh1jhjXAubh)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMYhjXAubh)}(hXZThis function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function allows the iterator function to sleep, when the iterator function is atomic **ieee80211_iterate_active_interfaces_atomic** can be used. Does not iterate over a new interface during add_interface().h](hThis function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function allows the iterator function to sleep, when the iterator function is atomic }(hjBhhhNhNubj)}(h.**ieee80211_iterate_active_interfaces_atomic**h]h*ieee80211_iterate_active_interfaces_atomic}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubhK can be used. Does not iterate over a new interface during add_interface().}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMLhjXAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj >hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h7ieee80211_iterate_active_interfaces_atomic (C function),c.ieee80211_iterate_active_interfaces_atomichNtauh1hhj >hhhNhNubh)}(hhh](h)}(hvoid ieee80211_iterate_active_interfaces_atomic (struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h]j)}(hvoid ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h](j)}(hvoidh]hvoid}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMrubj)}(h h]h }(hjBhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjBhhhjBhMrubj,)}(h*ieee80211_iterate_active_interfaces_atomich]j2)}(h*ieee80211_iterate_active_interfaces_atomich]h*ieee80211_iterate_active_interfaces_atomic}(hjBhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjBubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjBhhhjBhMrubj/)}(hw(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hj#ChhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjCubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hj4ChhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj1Cubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj6CmodnameN classnameNjrju)}jx]j{)}jnjBsb,c.ieee80211_iterate_active_interfaces_atomicasbuh1hhjCubj)}(h h]h }(hjTChhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjCubj)}(hj h]h*}(hjbChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(hhwh]hhw}(hjoChhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjCubj5)}(hu32 iter_flagsh](h)}(hhh]j2)}(hu32h]hu32}(hjChhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjCubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjCmodnameN classnameNjrju)}jx]jPC,c.ieee80211_iterate_active_interfaces_atomicasbuh1hhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjCubj2)}(h iter_flagsh]h iter_flags}(hjChhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjCubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjCubj5)}(h@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)h](j)}(hvoidh]hvoid}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjCubj)}(hjr?h]h(}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hj h]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj2)}(hiteratorh]hiterator}(hjDhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjCubj)}(hj?h]h)}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjr?h]h(}(hj!DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hvoidh]hvoid}(hj.DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjhNhNubj)}(hX **Parameters** ``struct ieee80211_hw *hw`` the hardware struct of which the interfaces should be iterated over ``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` ``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call, cannot sleep ``void *data`` first argument of the iterator function **Description** This function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function requires the iterator callback function to be atomic, if that is not desired, use **ieee80211_iterate_active_interfaces** instead. Does not iterate over a new interface during add_interface().h](h)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMihjEubj)}(hhh](j)}(h```struct ieee80211_hw *hw`` the hardware struct of which the interfaces should be iterated over h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjEh]hstruct ieee80211_hw *hw}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMmhjEubj)}(hhh]h)}(hCthe hardware struct of which the interfaces should be iterated overh]hCthe hardware struct of which the interfaces should be iterated over}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj FhMmhj Fubah}(h]h ]h"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]uh1jhj FhMmhjEubj)}(h``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` h](j)}(h``u32 iter_flags``h]j)}(hj/Fh]hu32 iter_flags}(hj1FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-Fubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMnhj)Fubj)}(hhh]h)}(hmiteration flags, see :c:type:`enum ieee80211_interface_iteration_flags `h](hiteration flags, see }(hjHFhhhNhNubh)}(hX:c:type:`enum ieee80211_interface_iteration_flags `h]j)}(hjRFh]h(enum ieee80211_interface_iteration_flags}(hjTFhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjPFubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j#ieee80211_interface_iteration_flagsuh1hhjDFhMnhjHFubeh}(h]h ]h"]h$]h&]uh1hhjDFhMnhjEFubah}(h]h ]h"]h$]h&]uh1jhj)Fubeh}(h]h ]h"]h$]h&]uh1jhjDFhMnhjEubj)}(hq``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call, cannot sleep h](j)}(hD``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)``h]j)}(hjFh]h@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMohjFubj)}(hhh]h)}(h+the iterator function to call, cannot sleeph]h+the iterator function to call, cannot sleep}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMohjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMohjEubj)}(h7``void *data`` first argument of the iterator function h](j)}(h``void *data``h]j)}(hjFh]h void *data}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMphjFubj)}(hhh]h)}(h'first argument of the iterator functionh]h'first argument of the iterator function}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMphjFubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1jhjFhMphjEubeh}(h]h ]h"]h$]h&]uh1jhjEubh)}(h**Description**h]j)}(hjFh]h Description}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMrhjEubh)}(hXUThis function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function requires the iterator callback function to be atomic, if that is not desired, use **ieee80211_iterate_active_interfaces** instead. Does not iterate over a new interface during add_interface().h](hThis function iterates over the interfaces associated with a given hardware that are currently active and calls the callback for them. This function requires the iterator callback function to be atomic, if that is not desired, use }(hjGhhhNhNubj)}(h'**ieee80211_iterate_active_interfaces**h]h#ieee80211_iterate_active_interfaces}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubhG instead. Does not iterate over a new interface during add_interface().}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.hhMfhjEubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj >hhhNhNubeh}(h]&supporting-multiple-virtual-interfacesah ]h"]&supporting multiple virtual interfacesah$]h&]uh1hhhhhhhhK]ubh)}(hhh](h)}(hStation handlingh]hStation handling}(hjDGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAGhhhhhKmubh)}(hTODOh]hTODO}(hjRGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjAGhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_sta (C struct)c.ieee80211_stahNtauh1hhjAGhhhNhNubh)}(hhh](h)}(h ieee80211_stah]j)}(hstruct ieee80211_stah](j )}(hj h]hstruct}(hjyGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuGhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMXubj)}(h h]h }(hjGhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjuGhhhjGhMXubj,)}(h ieee80211_stah]j2)}(hjsGh]h ieee80211_sta}(hjGhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjGubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjuGhhhjGhMXubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjqGhhhjGhMXubah}(h]jlGah ](jWjXeh"]h$]h&]j\j])j^huh1hhjGhMXhjnGhhubj`)}(hhh]h)}(hstation table entryh]hstation table entry}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjGhhubah}(h]h ]h"]h$]h&]uh1j_hjnGhhhjGhMXubeh}(h]h ](j|structeh"]h$]h&]jj|jjGjjGjjjuh1hhhhjAGhNhNubj)}(hX **Definition**:: struct ieee80211_sta { u8 addr[ETH_ALEN] ; u16 aid; u16 max_rx_aggregation_subframes; bool wme; u8 uapsd_queues; u8 max_sp; struct ieee80211_sta_rates __rcu *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; struct ieee80211_link_sta deflink; struct ieee80211_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; u8 drv_priv[] ; }; **Members** ``addr`` MAC address ``aid`` AID we assigned to the station if we're an AP ``max_rx_aggregation_subframes`` maximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver. ``wme`` indicates whether the STA supports QoS/WME (if local devices does, otherwise always false) ``uapsd_queues`` bitmap of queues configured for uapsd. Only valid if wme is supported. The bits order is like in IEEE80211_WMM_IE_STA_QOSINFO_AC_*. ``max_sp`` max Service Period. Only valid if wme is supported. ``rates`` rate control selection table ``tdls`` indicates whether the STA is a TDLS peer ``tdls_initiator`` indicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place. ``mfp`` indicates whether the STA uses management frame protection or not. ``mlo`` indicates whether the STA is MLO station. ``spp_amsdu`` indicates whether the STA uses SPP A-MSDU or not. ``max_amsdu_subframes`` indicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited. ``cur`` currently valid data as aggregated from the active links For non MLO STA it will point to the deflink data. For MLO STA ieee80211_sta_recalc_aggregates() must be called to update it. ``support_p2p_ps`` indicates whether the STA supports P2P PS mechanism or not. ``txq`` per-TID data TX queues; note that the last entry (``IEEE80211_NUM_TIDS``) is used for non-data frames ``valid_links`` bitmap of valid links, or 0 for non-MLO ``deflink`` This holds the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink. ``link`` reference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP. ``drv_priv`` data area for driver use, will always be aligned to sizeof(void \*), size is determined in hw information.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh:}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjGubj)}(hXIstruct ieee80211_sta { u8 addr[ETH_ALEN] ; u16 aid; u16 max_rx_aggregation_subframes; bool wme; u8 uapsd_queues; u8 max_sp; struct ieee80211_sta_rates __rcu *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; struct ieee80211_link_sta deflink; struct ieee80211_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; u8 drv_priv[] ; };h]hXIstruct ieee80211_sta { u8 addr[ETH_ALEN] ; u16 aid; u16 max_rx_aggregation_subframes; bool wme; u8 uapsd_queues; u8 max_sp; struct ieee80211_sta_rates __rcu *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; struct ieee80211_link_sta deflink; struct ieee80211_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; u8 drv_priv[] ; };}hjGsbah}(h]h ]h"]h$]h&]jIjJuh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjGubh)}(h **Members**h]j)}(hj Hh]hMembers}(hj HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjGubj)}(hhh](j)}(h``addr`` MAC address h](j)}(h``addr``h]j)}(hj(Hh]haddr}(hj*HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&Hubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj"Hubj)}(hhh]h)}(h MAC addressh]h MAC address}(hjAHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=HhM hj>Hubah}(h]h ]h"]h$]h&]uh1jhj"Hubeh}(h]h ]h"]h$]h&]uh1jhj=HhM hjHubj)}(h6``aid`` AID we assigned to the station if we're an AP h](j)}(h``aid``h]j)}(hjaHh]haid}(hjcHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Hubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj[Hubj)}(hhh]h)}(h-AID we assigned to the station if we're an APh]h/AID we assigned to the station if we’re an AP}(hjzHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvHhM hjwHubah}(h]h ]h"]h$]h&]uh1jhj[Hubeh}(h]h ]h"]h$]h&]uh1jhjvHhM hjHubj)}(h``max_rx_aggregation_subframes`` maximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver. h](j)}(h ``max_rx_aggregation_subframes``h]j)}(hjHh]hmax_rx_aggregation_subframes}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjHubj)}(hhh]h)}(humaximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver.h]humaximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM hjHubj)}(hc``wme`` indicates whether the STA supports QoS/WME (if local devices does, otherwise always false) h](j)}(h``wme``h]j)}(hjHh]hwme}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjHubj)}(hhh]h)}(hZindicates whether the STA supports QoS/WME (if local devices does, otherwise always false)h]hZindicates whether the STA supports QoS/WME (if local devices does, otherwise always false)}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1jhjHhM hjHubj)}(h``uapsd_queues`` bitmap of queues configured for uapsd. Only valid if wme is supported. The bits order is like in IEEE80211_WMM_IE_STA_QOSINFO_AC_*. h](j)}(h``uapsd_queues``h]j)}(hjIh]h uapsd_queues}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Iubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjIubj)}(hhh]h)}(hbitmap of queues configured for uapsd. Only valid if wme is supported. The bits order is like in IEEE80211_WMM_IE_STA_QOSINFO_AC_*.h]hbitmap of queues configured for uapsd. Only valid if wme is supported. The bits order is like in IEEE80211_WMM_IE_STA_QOSINFO_AC_*.}(hj'IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj$Iubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhj#IhM hjHubj)}(h?``max_sp`` max Service Period. Only valid if wme is supported. h](j)}(h ``max_sp``h]j)}(hjHIh]hmax_sp}(hjJIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFIubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjBIubj)}(hhh]h)}(h3max Service Period. Only valid if wme is supported.h]h3max Service Period. Only valid if wme is supported.}(hjaIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]IhM hj^Iubah}(h]h ]h"]h$]h&]uh1jhjBIubeh}(h]h ]h"]h$]h&]uh1jhj]IhM hjHubj)}(h'``rates`` rate control selection table h](j)}(h ``rates``h]j)}(hjIh]hrates}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj{Iubj)}(hhh]h)}(hrate control selection tableh]hrate control selection table}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM hjIubah}(h]h ]h"]h$]h&]uh1jhj{Iubeh}(h]h ]h"]h$]h&]uh1jhjIhM hjHubj)}(h2``tdls`` indicates whether the STA is a TDLS peer h](j)}(h``tdls``h]j)}(hjIh]htdls}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjIubj)}(hhh]h)}(h(indicates whether the STA is a TDLS peerh]h(indicates whether the STA is a TDLS peer}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhM hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjIhM hjHubj)}(h``tdls_initiator`` indicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place. h](j)}(h``tdls_initiator``h]j)}(hjIh]htdls_initiator}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjIubj)}(hhh]h)}(hlindicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place.h]hlindicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place.}(hj JhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj Jubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjJhM hjHubj)}(hK``mfp`` indicates whether the STA uses management frame protection or not. h](j)}(h``mfp``h]j)}(hj-Jh]hmfp}(hj/JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+Jubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj'Jubj)}(hhh]h)}(hBindicates whether the STA uses management frame protection or not.h]hBindicates whether the STA uses management frame protection or not.}(hjFJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBJhM hjCJubah}(h]h ]h"]h$]h&]uh1jhj'Jubeh}(h]h ]h"]h$]h&]uh1jhjBJhM hjHubj)}(h2``mlo`` indicates whether the STA is MLO station. h](j)}(h``mlo``h]j)}(hjfJh]hmlo}(hjhJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdJubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj`Jubj)}(hhh]h)}(h)indicates whether the STA is MLO station.h]h)indicates whether the STA is MLO station.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{JhM hj|Jubah}(h]h ]h"]h$]h&]uh1jhj`Jubeh}(h]h ]h"]h$]h&]uh1jhj{JhM hjHubj)}(h@``spp_amsdu`` indicates whether the STA uses SPP A-MSDU or not. h](j)}(h ``spp_amsdu``h]j)}(hjJh]h spp_amsdu}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjJubj)}(hhh]h)}(h1indicates whether the STA uses SPP A-MSDU or not.h]h1indicates whether the STA uses SPP A-MSDU or not.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhM hjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhM hjHubj)}(h``max_amsdu_subframes`` indicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited. h](j)}(h``max_amsdu_subframes``h]j)}(hjJh]hmax_amsdu_subframes}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjJubj)}(hhh]h)}(hzindicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited.h]hzindicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjJubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1jhjJhM hjHubj)}(h``cur`` currently valid data as aggregated from the active links For non MLO STA it will point to the deflink data. For MLO STA ieee80211_sta_recalc_aggregates() must be called to update it. h](j)}(h``cur``h]j)}(hjKh]hcur}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj Kubj)}(hhh]h)}(hcurrently valid data as aggregated from the active links For non MLO STA it will point to the deflink data. For MLO STA ieee80211_sta_recalc_aggregates() must be called to update it.h]hcurrently valid data as aggregated from the active links For non MLO STA it will point to the deflink data. For MLO STA ieee80211_sta_recalc_aggregates() must be called to update it.}(hj+KhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj(Kubah}(h]h ]h"]h$]h&]uh1jhj Kubeh}(h]h ]h"]h$]h&]uh1jhj'KhM hjHubj)}(hO``support_p2p_ps`` indicates whether the STA supports P2P PS mechanism or not. h](j)}(h``support_p2p_ps``h]j)}(hjLKh]hsupport_p2p_ps}(hjNKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJKubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjFKubj)}(hhh]h)}(h;indicates whether the STA supports P2P PS mechanism or not.h]h;indicates whether the STA supports P2P PS mechanism or not.}(hjeKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjaKhM hjbKubah}(h]h ]h"]h$]h&]uh1jhjFKubeh}(h]h ]h"]h$]h&]uh1jhjaKhM hjHubj)}(hn``txq`` per-TID data TX queues; note that the last entry (``IEEE80211_NUM_TIDS``) is used for non-data frames h](j)}(h``txq``h]j)}(hjKh]htxq}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjKubj)}(hhh]h)}(heper-TID data TX queues; note that the last entry (``IEEE80211_NUM_TIDS``) is used for non-data framesh](h2per-TID data TX queues; note that the last entry (}(hjKhhhNhNubj)}(h``IEEE80211_NUM_TIDS``h]hIEEE80211_NUM_TIDS}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh) is used for non-data frames}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjKhM hjHubj)}(h8``valid_links`` bitmap of valid links, or 0 for non-MLO h](j)}(h``valid_links``h]j)}(hjKh]h valid_links}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjKubj)}(hhh]h)}(h'bitmap of valid links, or 0 for non-MLOh]h'bitmap of valid links, or 0 for non-MLO}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhM hjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjKhM hjHubj)}(hX``deflink`` This holds the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink. h](j)}(h ``deflink``h]j)}(hj Lh]hdeflink}(hj LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjLubj)}(hhh]h)}(hThis holds the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink.h](hsThis holds the default link STA information, for non MLO STA all link specific STA information is accessed through }(hj#LhhhNhNubj)}(h **deflink**h]hdeflink}(hj+LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Lubh/ or through link[0] which points to address of }(hj#LhhhNhNubj)}(h **deflink**h]hdeflink}(hj=LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#LubhB. For MLO Link STA the first added link STA will point to deflink.}(hj#LhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj Lubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjHubj)}(hX``link`` reference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP. h](j)}(h``link``h]j)}(hjhLh]hlink}(hjjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfLubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjbLubj)}(hhh]h)}(hXreference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP.h](hreference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via }(hjLhhhNhNubj)}(h **deflink**h]hdeflink}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubhT or link[0]. For MLO STA, first link STA being added will point its link pointer to }(hjLhhhNhNubj)}(h **deflink**h]hdeflink}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj~Lubah}(h]h ]h"]h$]h&]uh1jhjbLubeh}(h]h ]h"]h$]h&]uh1jhj}LhM hjHubj)}(hw``drv_priv`` data area for driver use, will always be aligned to sizeof(void \*), size is determined in hw information.h](j)}(h ``drv_priv``h]j)}(hjLh]hdrv_priv}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjLubj)}(hhh]h)}(hjdata area for driver use, will always be aligned to sizeof(void \*), size is determined in hw information.h]hjdata area for driver use, will always be aligned to sizeof(void *), size is determined in hw information.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhM hjLubah}(h]h ]h"]h$]h&]uh1jhjLubeh}(h]h ]h"]h$]h&]uh1jhjLhM hjHubeh}(h]h ]h"]h$]h&]uh1jhjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAGhhhNhNubh)}(h**Description**h]j)}(hjMh]h Description}(hj MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjAGhhubh)}(hXA station table entry represents a station we are possibly communicating with. Since stations are RCU-managed in mac80211, any ieee80211_sta pointer you get access to must either be protected by rcu_read_lock() explicitly or implicitly, or you must take good care to not use such a pointer after a call to your sta_remove callback that removed it. This also represents the MLD STA in case of MLO association and holds pointers to various link STA'sh]hXA station table entry represents a station we are possibly communicating with. Since stations are RCU-managed in mac80211, any ieee80211_sta pointer you get access to must either be protected by rcu_read_lock() explicitly or implicitly, or you must take good care to not use such a pointer after a call to your sta_remove callback that removed it. This also represents the MLD STA in case of MLO association and holds pointers to various link STA’s}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjAGhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsta_notify_cmd (C enum)c.sta_notify_cmdhNtauh1hhjAGhhhNhNubh)}(hhh](h)}(hsta_notify_cmdh]j)}(henum sta_notify_cmdh](j )}(hj|h]henum}(hjFMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBMhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM ubj)}(h h]h }(hjTMhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjBMhhhjSMhM ubj,)}(hsta_notify_cmdh]j2)}(hj@Mh]hsta_notify_cmd}(hjfMhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjbMubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjBMhhhjSMhM ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj>MhhhjSMhM ubah}(h]j9Mah ](jWjXeh"]h$]h&]j\j])j^huh1hhjSMhM hj;Mhhubj`)}(hhh]h)}(hsta notify commandh]hsta notify command}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjMhhubah}(h]h ]h"]h$]h&]uh1j_hj;MhhhjSMhM ubeh}(h]h ](j|enumeh"]h$]h&]jj|jjMjjMjjjuh1hhhhjAGhNhNubj)}(hr**Constants** ``STA_NOTIFY_SLEEP`` a station is now sleeping ``STA_NOTIFY_AWAKE`` a sleeping station woke uph](h)}(h **Constants**h]j)}(hjMh]h Constants}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjMubj)}(hhh](j)}(h/``STA_NOTIFY_SLEEP`` a station is now sleeping h](j)}(h``STA_NOTIFY_SLEEP``h]j)}(hjMh]hSTA_NOTIFY_SLEEP}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjMubj)}(hhh]h)}(ha station is now sleepingh]ha station is now sleeping}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjMhM hjMubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjMhM hjMubj)}(h/``STA_NOTIFY_AWAKE`` a sleeping station woke uph](j)}(h``STA_NOTIFY_AWAKE``h]j)}(hjNh]hSTA_NOTIFY_AWAKE}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjMubj)}(hhh]h)}(ha sleeping station woke uph]ha sleeping station woke up}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjNubah}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ]h"]h$]h&]uh1jhjNhM hjMubeh}(h]h ]h"]h$]h&]uh1jhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAGhhhNhNubh)}(h**Description**h]j)}(hjENh]h Description}(hjGNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjAGhhubh)}(hUsed with the sta_notify() callback in :c:type:`struct ieee80211_ops `, this indicates if an associated station made a power state transition.h](h'Used with the sta_notify() callback in }(hj[NhhhNhNubh)}(h.:c:type:`struct ieee80211_ops `h]j)}(hjeNh]hstruct ieee80211_ops}(hjgNhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjcNubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_opsuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj[NubhH, this indicates if an associated station made a power state transition.}(hj[NhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjNhM hjAGhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_find_sta (C function)c.ieee80211_find_stahNtauh1hhjAGhhhNhNubh)}(hhh](h)}(hUstruct ieee80211_sta * ieee80211_find_sta (struct ieee80211_vif *vif, const u8 *addr)h]j)}(hSstruct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif, const u8 *addr)h](j )}(hj h]hstruct}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMubj)}(h h]h }(hjNhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjNhhhjNhMubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hjNhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjNubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjNmodnameN classnameNjrju)}jx]j{)}jnieee80211_find_stasbc.ieee80211_find_staasbuh1hhjNhhhjNhMubj)}(h h]h }(hjNhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjNhhhjNhMubj)}(hj h]h*}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNhhhjNhMubj,)}(hieee80211_find_stah]j2)}(hjNh]hieee80211_find_sta}(hjOhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjOubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjNhhhjNhMubj/)}(h+(struct ieee80211_vif *vif, const u8 *addr)h](j5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hj OhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(h h]h }(hj-OhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjOubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hj>OhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj;Oubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj@OmodnameN classnameNjrju)}jx]jNc.ieee80211_find_staasbuh1hhjOubj)}(h h]h }(hj\OhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjOubj)}(hj h]h*}(hjjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj2)}(hvifh]hvif}(hjwOhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjOubj5)}(hconst u8 *addrh](j )}(hjh]hconst}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(h h]h }(hjOhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjOubh)}(hhh]j2)}(hu8h]hu8}(hjOhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjOubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjOmodnameN classnameNjrju)}jx]jNc.ieee80211_find_staasbuh1hhjOubj)}(h h]h }(hjOhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjOubj)}(hj h]h*}(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj2)}(haddrh]haddr}(hjOhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjOubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjOubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjNhhhjNhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjNhhhjNhMubah}(h]jNah ](jWjXeh"]h$]h&]j\j])j^huh1hhjNhMhjNhhubj`)}(hhh]h)}(hfind a stationh]hfind a station}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hjPhhubah}(h]h ]h"]h$]h&]uh1j_hjNhhhjNhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jj)Pjj)Pjjjuh1hhhhjAGhNhNubj)}(hX/**Parameters** ``struct ieee80211_vif *vif`` virtual interface to look for station on ``const u8 *addr`` station's address **Return** The station, if found. ``NULL`` otherwise. **Note** This function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.h](h)}(h**Parameters**h]j)}(hj3Ph]h Parameters}(hj5PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Pubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj-Pubj)}(hhh](j)}(hG``struct ieee80211_vif *vif`` virtual interface to look for station on h](j)}(h``struct ieee80211_vif *vif``h]j)}(hjRPh]hstruct ieee80211_vif *vif}(hjTPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPPubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhjLPubj)}(hhh]h)}(h(virtual interface to look for station onh]h(virtual interface to look for station on}(hjkPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjgPhMhjhPubah}(h]h ]h"]h$]h&]uh1jhjLPubeh}(h]h ]h"]h$]h&]uh1jhjgPhMhjIPubj)}(h%``const u8 *addr`` station's address h](j)}(h``const u8 *addr``h]j)}(hjPh]hconst u8 *addr}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhjPubj)}(hhh]h)}(hstation's addressh]hstation’s address}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMhjPubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1jhjPhMhjIPubeh}(h]h ]h"]h$]h&]uh1jhj-Pubh)}(h **Return**h]j)}(hjPh]hReturn}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj-Pubh)}(h*The station, if found. ``NULL`` otherwise.h](hThe station, if found. }(hjPhhhNhNubj)}(h``NULL``h]hNULL}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh otherwise.}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj-Pubh)}(h**Note**h]j)}(hjPh]hNote}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj-Pubh)}(hkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.h]hkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj-Pubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAGhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)ieee80211_find_sta_by_ifaddr (C function)c.ieee80211_find_sta_by_ifaddrhNtauh1hhjAGhhhNhNubh)}(hhh](h)}(hrstruct ieee80211_sta * ieee80211_find_sta_by_ifaddr (struct ieee80211_hw *hw, const u8 *addr, const u8 *localaddr)h]j)}(hpstruct ieee80211_sta *ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw, const u8 *addr, const u8 *localaddr)h](j )}(hj h]hstruct}(hjDQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@Qhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM/ubj)}(h h]h }(hjRQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj@QhhhjQQhM/ubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hjcQhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj`Qubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjeQmodnameN classnameNjrju)}jx]j{)}jnieee80211_find_sta_by_ifaddrsbc.ieee80211_find_sta_by_ifaddrasbuh1hhj@QhhhjQQhM/ubj)}(h h]h }(hjQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj@QhhhjQQhM/ubj)}(hj h]h*}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@QhhhjQQhM/ubj,)}(hieee80211_find_sta_by_ifaddrh]j2)}(hjQh]hieee80211_find_sta_by_ifaddr}(hjQhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjQubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj@QhhhjQQhM/ubj/)}(h>(struct ieee80211_hw *hw, const u8 *addr, const u8 *localaddr)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj)}(h h]h }(hjQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjQubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjQhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjQubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjQmodnameN classnameNjrju)}jx]jQc.ieee80211_find_sta_by_ifaddrasbuh1hhjQubj)}(h h]h }(hjQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjQubj)}(hj h]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQubj2)}(hhwh]hhw}(hjRhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjQubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjQubj5)}(hconst u8 *addrh](j )}(hjh]hconst}(hj.RhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Rubj)}(h h]h }(hj;RhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj*Rubh)}(hhh]j2)}(hu8h]hu8}(hjLRhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjIRubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjNRmodnameN classnameNjrju)}jx]jQc.ieee80211_find_sta_by_ifaddrasbuh1hhj*Rubj)}(h h]h }(hjjRhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj*Rubj)}(hj h]h*}(hjxRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*Rubj2)}(haddrh]haddr}(hjRhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj*Rubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjQubj5)}(hconst u8 *localaddrh](j )}(hjh]hconst}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj)}(h h]h }(hjRhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjRubh)}(hhh]j2)}(hu8h]hu8}(hjRhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjRubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjRmodnameN classnameNjrju)}jx]jQc.ieee80211_find_sta_by_ifaddrasbuh1hhjRubj)}(h h]h }(hjRhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjRubj)}(hj h]h*}(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjRubj2)}(h localaddrh]h localaddr}(hjRhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjRubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjQubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj@QhhhjQQhM/ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjsdata->vif.addr). Use NULL for 'any'. **Return** The station, if found. ``NULL`` otherwise. **Note** This function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well. **NOTE** You may pass NULL for localaddr, but then you will just get the first STA that matches the remote address 'addr'. We can have multiple STA associated with multiple logical stations (e.g. consider a station connecting to another BSSID on the same AP hardware without disconnecting first). In this case, the result of this method with localaddr NULL is not reliable. **Description** DO NOT USE THIS FUNCTION with localaddr NULL if at all possible.h](h)}(h**Parameters**h]j)}(hjASh]h Parameters}(hjCShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Subah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhj;Subj)}(hhh](j)}(hJ``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw() h](j)}(h``struct ieee80211_hw *hw``h]j)}(hj`Sh]hstruct ieee80211_hw *hw}(hjbShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^Subah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhjZSubj)}(hhh]h)}(h-pointer as obtained from ieee80211_alloc_hw()h]h-pointer as obtained from ieee80211_alloc_hw()}(hjyShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuShMhjvSubah}(h]h ]h"]h$]h&]uh1jhjZSubeh}(h]h ]h"]h$]h&]uh1jhjuShMhjWSubj)}(h,``const u8 *addr`` remote station's address h](j)}(h``const u8 *addr``h]j)}(hjSh]hconst u8 *addr}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhjSubj)}(hhh]h)}(hremote station's addressh]hremote station’s address}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShMhjWSubj)}(hR``const u8 *localaddr`` local address (vif->sdata->vif.addr). Use NULL for 'any'. h](j)}(h``const u8 *localaddr``h]j)}(hjSh]hconst u8 *localaddr}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhMhjSubj)}(hhh]h)}(h9local address (vif->sdata->vif.addr). Use NULL for 'any'.h]h=local address (vif->sdata->vif.addr). Use NULL for ‘any’.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMhjSubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjShMhjWSubeh}(h]h ]h"]h$]h&]uh1jhj;Subh)}(h **Return**h]j)}(hj Th]hReturn}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Tubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj;Subh)}(h*The station, if found. ``NULL`` otherwise.h](hThe station, if found. }(hj#ThhhNhNubj)}(h``NULL``h]hNULL}(hj+ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#Tubh otherwise.}(hj#ThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM hj;Subh)}(h**Note**h]j)}(hjFTh]hNote}(hjHThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDTubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM"hj;Subh)}(hkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.h]hkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.}(hj\ThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM"hj;Subh)}(h**NOTE**h]j)}(hjmTh]hNOTE}(hjoThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkTubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM%hj;Subj)}(hhh]j)}(hXmYou may pass NULL for localaddr, but then you will just get the first STA that matches the remote address 'addr'. We can have multiple STA associated with multiple logical stations (e.g. consider a station connecting to another BSSID on the same AP hardware without disconnecting first). In this case, the result of this method with localaddr NULL is not reliable. h](j)}(h;You may pass NULL for localaddr, but then you will just geth]h;You may pass NULL for localaddr, but then you will just get}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM+hjTubj)}(hhh]h)}(hX0the first STA that matches the remote address 'addr'. We can have multiple STA associated with multiple logical stations (e.g. consider a station connecting to another BSSID on the same AP hardware without disconnecting first). In this case, the result of this method with localaddr NULL is not reliable.h]hX4the first STA that matches the remote address ‘addr’. We can have multiple STA associated with multiple logical stations (e.g. consider a station connecting to another BSSID on the same AP hardware without disconnecting first). In this case, the result of this method with localaddr NULL is not reliable.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM&hjTubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjThM+hjTubah}(h]h ]h"]h$]h&]uh1jhj;Subh)}(h**Description**h]j)}(hjTh]h Description}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM-hj;Subh)}(h@DO NOT USE THIS FUNCTION with localaddr NULL if at all possible.h]h@DO NOT USE THIS FUNCTION with localaddr NULL if at all possible.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.hhM-hj;Subeh}(h]h ] kernelindentah"]h$]h&]uh1jhjAGhhhNhNubeh}(h]station-handlingah ]h"]station handlingah$]h&]uh1hhhhhhhhKmubh)}(hhh](h)}(hHardware scan offloadh]hHardware scan offload}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThhhhhKyubh)}(hTBDh]hTBD}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjThhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%ieee80211_scan_completed (C function)c.ieee80211_scan_completedhNtauh1hhjThhhNhNubh)}(hhh](h)}(hXvoid ieee80211_scan_completed (struct ieee80211_hw *hw, struct cfg80211_scan_info *info)h]j)}(hWvoid ieee80211_scan_completed(struct ieee80211_hw *hw, struct cfg80211_scan_info *info)h](j)}(hvoidh]hvoid}(hj+UhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'Uhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhM ubj)}(h h]h }(hj:UhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj'Uhhhj9UhM ubj,)}(hieee80211_scan_completedh]j2)}(hieee80211_scan_completedh]hieee80211_scan_completed}(hjLUhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjHUubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj'Uhhhj9UhM ubj/)}(h:(struct ieee80211_hw *hw, struct cfg80211_scan_info *info)h](j5)}(hstruct ieee80211_hw *hwh](j )}(hj h]hstruct}(hjhUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdUubj)}(h h]h }(hjuUhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjdUubh)}(hhh]j2)}(h ieee80211_hwh]h ieee80211_hw}(hjUhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjUubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjUmodnameN classnameNjrju)}jx]j{)}jnjNUsbc.ieee80211_scan_completedasbuh1hhjdUubj)}(h h]h }(hjUhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjdUubj)}(hj h]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdUubj2)}(hhwh]hhw}(hjUhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjdUubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj`Uubj5)}(hstruct cfg80211_scan_info *infoh](j )}(hj h]hstruct}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj)}(h h]h }(hjUhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjUubh)}(hhh]j2)}(hcfg80211_scan_infoh]hcfg80211_scan_info}(hjUhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjUubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjUmodnameN classnameNjrju)}jx]jUc.ieee80211_scan_completedasbuh1hhjUubj)}(h h]h }(hjVhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjUubj)}(hj h]h*}(hj$VhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjUubj2)}(hinfoh]hinfo}(hj1VhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjUubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj`Uubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj'Uhhhj9UhM ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj#Uhhhj9UhM ubah}(h]jUah ](jWjXeh"]h$]h&]j\j])j^huh1hhj9UhM hj Uhhubj`)}(hhh]h)}(hcompleted hardware scanh]hcompleted hardware scan}(hj[VhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhMhjXVhhubah}(h]h ]h"]h$]h&]uh1j_hj Uhhhj9UhM ubeh}(h]h ](j|functioneh"]h$]h&]jj|jjsVjjsVjjjuh1hhhhjThNhNubj)}(hX**Parameters** ``struct ieee80211_hw *hw`` the hardware that finished the scan ``struct cfg80211_scan_info *info`` information about the completed scan **Description** When hardware scan offload is used (i.e. the hw_scan() callback is assigned) this function needs to be called by the driver to notify mac80211 that the scan finished. This function can be called from any context, including hardirq context.h](h)}(h**Parameters**h]j)}(hj}Vh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{Vubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhMhjwVubj)}(hhh](j)}(h@``struct ieee80211_hw *hw`` the hardware that finished the scan h](j)}(h``struct ieee80211_hw *hw``h]j)}(hjVh]hstruct ieee80211_hw *hw}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhMhjVubj)}(hhh]h)}(Qh#the hardware that finished the scanh]h#the hardware that finished the scan}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjVubj)}(hI``struct cfg80211_scan_info *info`` information about the completed scan h](j)}(h#``struct cfg80211_scan_info *info``h]j)}(hjVh]hstruct cfg80211_scan_info *info}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhMhjVubj)}(hhh]h)}(h$information about the completed scanh]h$information about the completed scan}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjVhMhjVubeh}(h]h ]h"]h$]h&]uh1jhjwVubh)}(h**Description**h]j)}(hjWh]h Description}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhM hjwVubh)}(hWhen hardware scan offload is used (i.e. the hw_scan() callback is assigned) this function needs to be called by the driver to notify mac80211 that the scan finished. This function can be called from any context, including hardirq context.h]hWhen hardware scan offload is used (i.e. the hw_scan() callback is assigned) this function needs to be called by the driver to notify mac80211 that the scan finished. This function can be called from any context, including hardirq context.}(hj&WhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.hhMhjwVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjThhhNhNubeh}(h]hardware-scan-offloadah ]h"]hardware scan offloadah$]h&]uh1hhhhhhhhKyubh)}(hhh](h)}(h Aggregationh]h Aggregation}(hjGWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDWhhhhhKubh)}(hhh](h)}(hTX A-MPDU aggregationh]hTX A-MPDU aggregation}(hjXWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjUWhhhhhKubh)}(hX1Aggregation on the TX side requires setting the hardware flag ``IEEE80211_HW_AMPDU_AGGREGATION``. The driver will then be handed packets with a flag indicating A-MPDU aggregation. The driver or device is responsible for actually aggregating the frames, as well as deciding how many and which to aggregate.h](h>Aggregation on the TX side requires setting the hardware flag }(hjfWhhhNhNubj)}(h"``IEEE80211_HW_AMPDU_AGGREGATION``h]hIEEE80211_HW_AMPDU_AGGREGATION}(hjnWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfWubh. The driver will then be handed packets with a flag indicating A-MPDU aggregation. The driver or device is responsible for actually aggregating the frames, as well as deciding how many and which to aggregate.}(hjfWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.chKhjUWhhubh)}(hXWhen TX aggregation is started by some subsystem (usually the rate control algorithm would be appropriate) by calling the ieee80211_start_tx_ba_session() function, the driver will be notified via its **ampdu_action** function, with the ``IEEE80211_AMPDU_TX_START`` action.h](hWhen TX aggregation is started by some subsystem (usually the rate control algorithm would be appropriate) by calling the ieee80211_start_tx_ba_session() function, the driver will be notified via its }(hjWhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh function, with the }(hjWhhhNhNubj)}(h``IEEE80211_AMPDU_TX_START``h]hIEEE80211_AMPDU_TX_START}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh action.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.chKhjUWhhubh)}(hXIn response to that, the driver is later required to call the ieee80211_start_tx_ba_cb_irqsafe() function, which will really start the aggregation session after the peer has also responded. If the peer responds negatively, the session will be stopped again right away. Note that it is possible for the aggregation session to be stopped before the driver has indicated that it is done setting it up, in which case it must not indicate the setup completion.h]hXIn response to that, the driver is later required to call the ieee80211_start_tx_ba_cb_irqsafe() function, which will really start the aggregation session after the peer has also responded. If the peer responds negatively, the session will be stopped again right away. Note that it is possible for the aggregation session to be stopped before the driver has indicated that it is done setting it up, in which case it must not indicate the setup completion.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.chK$hjUWhhubh)}(hAlso note that, since we also need to wait for a response from the peer, the driver is notified of the completion of the handshake by the ``IEEE80211_AMPDU_TX_OPERATIONAL`` action to the **ampdu_action** callback.h](hAlso note that, since we also need to wait for a response from the peer, the driver is notified of the completion of the handshake by the }(hjWhhhNhNubj)}(h"``IEEE80211_AMPDU_TX_OPERATIONAL``h]hIEEE80211_AMPDU_TX_OPERATIONAL}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh action to the }(hjWhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh callback.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.chK-hjUWhhubh)}(hXSimilarly, when the aggregation session is stopped by the peer or something calling ieee80211_stop_tx_ba_session(), the driver's **ampdu_action** function will be called with the action ``IEEE80211_AMPDU_TX_STOP``. In this case, the call must not fail, and the driver must later call ieee80211_stop_tx_ba_cb_irqsafe(). Note that the sta can get destroyed before the BA tear down is complete.h](hSimilarly, when the aggregation session is stopped by the peer or something calling ieee80211_stop_tx_ba_session(), the driver’s }(hjWhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh) function will be called with the action }(hjWhhhNhNubj)}(h``IEEE80211_AMPDU_TX_STOP``h]hIEEE80211_AMPDU_TX_STOP}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh. In this case, the call must not fail, and the driver must later call ieee80211_stop_tx_ba_cb_irqsafe(). Note that the sta can get destroyed before the BA tear down is complete.}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.chK2hjUWhhubhcomment)}(hAWARNING: DOCPROC directive not supported: !Cnet/mac80211/agg-tx.ch]hAWARNING: DOCPROC directive not supported: !Cnet/mac80211/agg-tx.c}hj1Xsbah}(h]h ]h"]h$]h&]jIjJuh1j/XhjUWhhhhhKubeh}(h]tx-a-mpdu-aggregationah ]h"]tx a-mpdu aggregationah$]h&]uh1hhjDWhhhhhKubh)}(hhh](h)}(hRX A-MPDU aggregationh]hRX A-MPDU aggregation}(hjJXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGXhhhhhKubh)}(hAggregation on the RX side requires only implementing the **ampdu_action** callback that is invoked to start/stop any block-ack sessions for RX aggregation.h](h:Aggregation on the RX side requires only implementing the }(hjXXhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hj`XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXXubhR callback that is invoked to start/stop any block-ack sessions for RX aggregation.}(hjXXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:142: ./net/mac80211/agg-rx.chKhjGXhhubh)}(hXWhen RX aggregation is started by the peer, the driver is notified via **ampdu_action** function, with the ``IEEE80211_AMPDU_RX_START`` action, and may reject the request in which case a negative response is sent to the peer, if it accepts it a positive response is sent.h](hGWhen RX aggregation is started by the peer, the driver is notified via }(hjyXhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyXubh function, with the }(hjyXhhhNhNubj)}(h``IEEE80211_AMPDU_RX_START``h]hIEEE80211_AMPDU_RX_START}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyXubh action, and may reject the request in which case a negative response is sent to the peer, if it accepts it a positive response is sent.}(hjyXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:142: ./net/mac80211/agg-rx.chKhjGXhhubh)}(hWhile the session is active, the device/driver are required to de-aggregate frames and pass them up one by one to mac80211, which will handle the reorder buffer.h]hWhile the session is active, the device/driver are required to de-aggregate frames and pass them up one by one to mac80211, which will handle the reorder buffer.}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:142: ./net/mac80211/agg-rx.chKhjGXhhubh)}(hWhen the aggregation session is stopped again by the peer or ourselves, the driver's **ampdu_action** function will be called with the action ``IEEE80211_AMPDU_RX_STOP``. In this case, the call must not fail.h](hWWhen the aggregation session is stopped again by the peer or ourselves, the driver’s }(hjXhhhNhNubj)}(h**ampdu_action**h]h ampdu_action}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh) function will be called with the action }(hjXhhhNhNubj)}(h``IEEE80211_AMPDU_RX_STOP``h]hIEEE80211_AMPDU_RX_STOP}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh'. In this case, the call must not fail.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:142: ./net/mac80211/agg-rx.chKhjGXhhubj0X)}(hAWARNING: DOCPROC directive not supported: !Cnet/mac80211/agg-rx.ch]hAWARNING: DOCPROC directive not supported: !Cnet/mac80211/agg-rx.c}hjXsbah}(h]h ]h"]h$]h&]jIjJuh1j/XhjGXhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$ieee80211_ampdu_mlme_action (C enum)c.ieee80211_ampdu_mlme_actionhNtauh1hhjGXhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhNubh)}(hhh](h)}(hieee80211_ampdu_mlme_actionh]j)}(h enum ieee80211_ampdu_mlme_actionh](j )}(hj|h]henum}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhM ubj)}(h h]h }(hj$YhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjYhhhj#YhM ubj,)}(hieee80211_ampdu_mlme_actionh]j2)}(hjYh]hieee80211_ampdu_mlme_action}(hj6YhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj2Yubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjYhhhj#YhM ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjYhhhj#YhM ubah}(h]jYah ](jWjXeh"]h$]h&]j\j])j^huh1hhj#YhM hj Yhhubj`)}(hhh]h)}(hA-MPDU actionsh]hA-MPDU actions}(hjXYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMehjUYhhubah}(h]h ]h"]h$]h&]uh1j_hj Yhhhj#YhM ubeh}(h]h ](j|enumeh"]h$]h&]jj|jjpYjjpYjjjuh1hhhhjGXhj YhNubj)}(hX/**Constants** ``IEEE80211_AMPDU_RX_START`` start RX aggregation ``IEEE80211_AMPDU_RX_STOP`` stop RX aggregation ``IEEE80211_AMPDU_TX_START`` start TX aggregation, the driver must either call ieee80211_start_tx_ba_cb_irqsafe() or call ieee80211_start_tx_ba_cb_irqsafe() with status ``IEEE80211_AMPDU_TX_START_DELAY_ADDBA`` to delay addba after ieee80211_start_tx_ba_cb_irqsafe is called, or just return the special status ``IEEE80211_AMPDU_TX_START_IMMEDIATE``. ``IEEE80211_AMPDU_TX_STOP_CONT`` stop TX aggregation but continue transmitting queued packets, now unaggregated. After all packets are transmitted the driver has to call ieee80211_stop_tx_ba_cb_irqsafe(). ``IEEE80211_AMPDU_TX_STOP_FLUSH`` stop TX aggregation and flush all packets, called when the station is removed. There's no need or reason to call ieee80211_stop_tx_ba_cb_irqsafe() in this case as mac80211 assumes the session is gone and removes the station. ``IEEE80211_AMPDU_TX_STOP_FLUSH_CONT`` called when TX aggregation is stopped but the driver hasn't called ieee80211_stop_tx_ba_cb_irqsafe() yet and now the connection is dropped and the station will be removed. Drivers should clean up and drop remaining packets when this is called. ``IEEE80211_AMPDU_TX_OPERATIONAL`` TX aggregation has become operationalh](h)}(h **Constants**h]j)}(hjzYh]h Constants}(hj|YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxYubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMihjtYubj)}(hhh](j)}(h2``IEEE80211_AMPDU_RX_START`` start RX aggregation h](j)}(h``IEEE80211_AMPDU_RX_START``h]j)}(hjYh]hIEEE80211_AMPDU_RX_START}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMlhjYubj)}(hhh]h)}(hstart RX aggregationh]hstart RX aggregation}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMlhjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjYhMlhjYubj)}(h0``IEEE80211_AMPDU_RX_STOP`` stop RX aggregation h](j)}(h``IEEE80211_AMPDU_RX_STOP``h]j)}(hjYh]hIEEE80211_AMPDU_RX_STOP}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMohjYubj)}(hhh]h)}(hstop RX aggregationh]hstop RX aggregation}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYhMohjYubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjYhMohjYubj)}(hX]``IEEE80211_AMPDU_TX_START`` start TX aggregation, the driver must either call ieee80211_start_tx_ba_cb_irqsafe() or call ieee80211_start_tx_ba_cb_irqsafe() with status ``IEEE80211_AMPDU_TX_START_DELAY_ADDBA`` to delay addba after ieee80211_start_tx_ba_cb_irqsafe is called, or just return the special status ``IEEE80211_AMPDU_TX_START_IMMEDIATE``. h](j)}(h``IEEE80211_AMPDU_TX_START``h]j)}(hj Zh]hIEEE80211_AMPDU_TX_START}(hj ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Zubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMwhjZubj)}(hhh]h)}(hX?start TX aggregation, the driver must either call ieee80211_start_tx_ba_cb_irqsafe() or call ieee80211_start_tx_ba_cb_irqsafe() with status ``IEEE80211_AMPDU_TX_START_DELAY_ADDBA`` to delay addba after ieee80211_start_tx_ba_cb_irqsafe is called, or just return the special status ``IEEE80211_AMPDU_TX_START_IMMEDIATE``.h](hstart TX aggregation, the driver must either call ieee80211_start_tx_ba_cb_irqsafe() or call ieee80211_start_tx_ba_cb_irqsafe() with status }(hj$ZhhhNhNubj)}(h(``IEEE80211_AMPDU_TX_START_DELAY_ADDBA``h]h$IEEE80211_AMPDU_TX_START_DELAY_ADDBA}(hj,ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Zubhd to delay addba after ieee80211_start_tx_ba_cb_irqsafe is called, or just return the special status }(hj$ZhhhNhNubj)}(h&``IEEE80211_AMPDU_TX_START_IMMEDIATE``h]h"IEEE80211_AMPDU_TX_START_IMMEDIATE}(hj>ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$Zubh.}(hj$ZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMrhj!Zubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhj ZhMwhjYubj)}(h``IEEE80211_AMPDU_TX_STOP_CONT`` stop TX aggregation but continue transmitting queued packets, now unaggregated. After all packets are transmitted the driver has to call ieee80211_stop_tx_ba_cb_irqsafe(). h](j)}(h ``IEEE80211_AMPDU_TX_STOP_CONT``h]j)}(hjiZh]hIEEE80211_AMPDU_TX_STOP_CONT}(hjkZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhM|hjcZubj)}(hhh]h)}(hstop TX aggregation but continue transmitting queued packets, now unaggregated. After all packets are transmitted the driver has to call ieee80211_stop_tx_ba_cb_irqsafe().h]hstop TX aggregation but continue transmitting queued packets, now unaggregated. After all packets are transmitted the driver has to call ieee80211_stop_tx_ba_cb_irqsafe().}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMzhjZubah}(h]h ]h"]h$]h&]uh1jhjcZubeh}(h]h ]h"]h$]h&]uh1jhj~ZhM|hjYubj)}(hX``IEEE80211_AMPDU_TX_STOP_FLUSH`` stop TX aggregation and flush all packets, called when the station is removed. There's no need or reason to call ieee80211_stop_tx_ba_cb_irqsafe() in this case as mac80211 assumes the session is gone and removes the station. h](j)}(h!``IEEE80211_AMPDU_TX_STOP_FLUSH``h]j)}(hjZh]hIEEE80211_AMPDU_TX_STOP_FLUSH}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhjZubj)}(hhh]h)}(hstop TX aggregation and flush all packets, called when the station is removed. There's no need or reason to call ieee80211_stop_tx_ba_cb_irqsafe() in this case as mac80211 assumes the session is gone and removes the station.h]hstop TX aggregation and flush all packets, called when the station is removed. There’s no need or reason to call ieee80211_stop_tx_ba_cb_irqsafe() in this case as mac80211 assumes the session is gone and removes the station.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMhjYubj)}(hX``IEEE80211_AMPDU_TX_STOP_FLUSH_CONT`` called when TX aggregation is stopped but the driver hasn't called ieee80211_stop_tx_ba_cb_irqsafe() yet and now the connection is dropped and the station will be removed. Drivers should clean up and drop remaining packets when this is called. h](j)}(h&``IEEE80211_AMPDU_TX_STOP_FLUSH_CONT``h]j)}(hjZh]h"IEEE80211_AMPDU_TX_STOP_FLUSH_CONT}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhjZubj)}(hhh]h)}(hcalled when TX aggregation is stopped but the driver hasn't called ieee80211_stop_tx_ba_cb_irqsafe() yet and now the connection is dropped and the station will be removed. Drivers should clean up and drop remaining packets when this is called.h]hcalled when TX aggregation is stopped but the driver hasn’t called ieee80211_stop_tx_ba_cb_irqsafe() yet and now the connection is dropped and the station will be removed. Drivers should clean up and drop remaining packets when this is called.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhjZubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjZhMhjYubj)}(hH``IEEE80211_AMPDU_TX_OPERATIONAL`` TX aggregation has become operationalh](j)}(h"``IEEE80211_AMPDU_TX_OPERATIONAL``h]j)}(hj[h]hIEEE80211_AMPDU_TX_OPERATIONAL}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhj[ubj)}(hhh]h)}(h%TX aggregation has become operationalh]h%TX aggregation has become operational}(hj0[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhj-[ubah}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ]h"]h$]h&]uh1jhj,[hMhjYubeh}(h]h ]h"]h$]h&]uh1jhjtYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjGXhhhj YhNubh)}(h**Description**h]j)}(hjZ[h]h Description}(hj\[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX[ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMhjGXhhubh)}(hThese flags are used with the ampdu_action() callback in :c:type:`struct ieee80211_ops ` to indicate which action is needed.h](h9These flags are used with the ampdu_action() callback in }(hjp[hhhNhNubh)}(h.:c:type:`struct ieee80211_ops `h]j)}(hjz[h]hstruct ieee80211_ops}(hj|[hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjx[ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_opsuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMfhjp[ubh$ to indicate which action is needed.}(hjp[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj[hMfhjGXhhubh)}(hNote that drivers MUST be able to deal with a TX aggregation session being stopped even before they OK'ed starting it by calling ieee80211_start_tx_ba_cb_irqsafe, because the peer might receive the addBA frame and send a delBA right away!h]hNote that drivers MUST be able to deal with a TX aggregation session being stopped even before they OK’ed starting it by calling ieee80211_start_tx_ba_cb_irqsafe, because the peer might receive the addBA frame and send a delBA right away!}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.hhMihjGXhhubeh}(h]rx-a-mpdu-aggregationah ]h"]rx a-mpdu aggregationah$]h&]uh1hhjDWhhhhhKubeh}(h] aggregationah ]h"] aggregationah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h%Spatial Multiplexing Powersave (SMPS)h]h%Spatial Multiplexing Powersave (SMPS)}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hhhhhKubh)}(hSMPS (Spatial multiplexing power save) is a mechanism to conserve power in an 802.11n implementation. For details on the mechanism and rationale, please refer to 802.11 (as amended by 802.11n-2009) "11.2.3 SM power save".h]hSMPS (Spatial multiplexing power save) is a mechanism to conserve power in an 802.11n implementation. For details on the mechanism and rationale, please refer to 802.11 (as amended by 802.11n-2009) “11.2.3 SM power save”.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.hhM] hj[hhubh)}(hXOThe mac80211 implementation is capable of sending action frames to update the AP about the station's SMPS mode, and will instruct the driver to enter the specific mode. It will also announce the requested SMPS mode during the association handshake. Hardware support for this feature is required, and can be indicated by hardware flags.h]hXQThe mac80211 implementation is capable of sending action frames to update the AP about the station’s SMPS mode, and will instruct the driver to enter the specific mode. It will also announce the requested SMPS mode during the association handshake. Hardware support for this feature is required, and can be indicated by hardware flags.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.hhMb hj[hhubh)}(hThe default mode will be "automatic", which nl80211/cfg80211 defines to be dynamic SMPS in (regular) powersave, and SMPS turned off otherwise.h]hThe default mode will be “automatic”, which nl80211/cfg80211 defines to be dynamic SMPS in (regular) powersave, and SMPS turned off otherwise.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.hhMi hj[hhubh)}(hTo support this feature, the driver must set the appropriate hardware support flags, and handle the SMPS flag to the config() operation. It will then with this mechanism be instructed to enter the requested SMPS mode while associated to an HT AP.h]hTo support this feature, the driver must set the appropriate hardware support flags, and handle the SMPS flag to the config() operation. It will then with this mechanism be instructed to enter the requested SMPS mode while associated to an HT AP.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.hhMm hj[hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hieee80211_smps_mode (C enum)c.ieee80211_smps_modehNtauh1hhj[hhhNhNubh)}(hhh](h)}(hieee80211_smps_modeh]j)}(henum ieee80211_smps_modeh](j )}(hj|h]henum}(hj'\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#\hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhM{ubj)}(h h]h }(hj5\hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj#\hhhj4\hM{ubj,)}(hieee80211_smps_modeh]j2)}(hj!\h]hieee80211_smps_mode}(hjG\hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjC\ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj#\hhhj4\hM{ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj\hhhj4\hM{ubah}(h]j\ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj4\hM{hj\hhubj`)}(hhh]h)}(h$spatial multiplexing power save modeh]h$spatial multiplexing power save mode}(hji\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjf\hhubah}(h]h ]h"]h$]h&]uh1j_hj\hhhj4\hM{ubeh}(h]h ](j|enumeh"]h$]h&]jj|jj\jj\jjjuh1hhhhj[hNhNubj)}(h**Constants** ``IEEE80211_SMPS_AUTOMATIC`` automatic ``IEEE80211_SMPS_OFF`` off ``IEEE80211_SMPS_STATIC`` static ``IEEE80211_SMPS_DYNAMIC`` dynamic ``IEEE80211_SMPS_NUM_MODES`` internal, don't useh](h)}(h **Constants**h]j)}(hj\h]h Constants}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj\ubj)}(hhh](j)}(h'``IEEE80211_SMPS_AUTOMATIC`` automatic h](j)}(h``IEEE80211_SMPS_AUTOMATIC``h]j)}(hj\h]hIEEE80211_SMPS_AUTOMATIC}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj\ubj)}(hhh]h)}(h automatich]h automatic}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj\ubj)}(h``IEEE80211_SMPS_OFF`` off h](j)}(h``IEEE80211_SMPS_OFF``h]j)}(hj\h]hIEEE80211_SMPS_OFF}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj\ubj)}(hhh]h)}(hoffh]hoff}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj\hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\hMhj\ubj)}(h!``IEEE80211_SMPS_STATIC`` static h](j)}(h``IEEE80211_SMPS_STATIC``h]j)}(hj]h]hIEEE80211_SMPS_STATIC}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj]ubj)}(hhh]h)}(hstatich]hstatic}(hj5]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1]hMhj2]ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhj1]hMhj\ubj)}(h#``IEEE80211_SMPS_DYNAMIC`` dynamic h](j)}(h``IEEE80211_SMPS_DYNAMIC``h]j)}(hjU]h]hIEEE80211_SMPS_DYNAMIC}(hjW]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjO]ubj)}(hhh]h)}(hdynamich]hdynamic}(hjn]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjj]hMhjk]ubah}(h]h ]h"]h$]h&]uh1jhjO]ubeh}(h]h ]h"]h$]h&]uh1jhjj]hMhj\ubj)}(h0``IEEE80211_SMPS_NUM_MODES`` internal, don't useh](j)}(h``IEEE80211_SMPS_NUM_MODES``h]j)}(hj]h]hIEEE80211_SMPS_NUM_MODES}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj]ubj)}(hhh]h)}(hinternal, don't useh]hinternal, don’t use}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj]ubah}(h]h ]h"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]uh1jhj]hMhj\ubeh}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj[hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#ieee80211_request_smps (C function)c.ieee80211_request_smpshNtauh1hhj[hhhNhNubh)}(hhh](h)}(hqvoid ieee80211_request_smps (struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)h]j)}(hpvoid ieee80211_request_smps(struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)h](j)}(hvoidh]hvoid}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMubj)}(h h]h }(hj]hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj]hhhj]hMubj,)}(hieee80211_request_smpsh]j2)}(hieee80211_request_smpsh]hieee80211_request_smps}(hj ^hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj^ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj]hhhj]hMubj/)}(hU(struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)h](j5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hj%^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!^ubj)}(h h]h }(hj2^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj!^ubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hjC^hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj@^ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjE^modnameN classnameNjrju)}jx]j{)}jnj ^sbc.ieee80211_request_smpsasbuh1hhj!^ubj)}(h h]h }(hjc^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj!^ubj)}(hj h]h*}(hjq^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!^ubj2)}(hvifh]hvif}(hj~^hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj!^ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj^ubj5)}(hunsigned int link_idh](j)}(hunsignedh]hunsigned}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj^ubj)}(hinth]hint}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj^ubj2)}(hlink_idh]hlink_id}(hj^hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj^ubj5)}(h"enum ieee80211_smps_mode smps_modeh](j )}(hj|h]henum}(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj^ubh)}(hhh]j2)}(hieee80211_smps_modeh]hieee80211_smps_mode}(hj_hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj_ubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj_modnameN classnameNjrju)}jx]j_^c.ieee80211_request_smpsasbuh1hhj^ubj)}(h h]h }(hj$_hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj^ubj2)}(h smps_modeh]h smps_mode}(hj2_hhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj^ubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj^ubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj]hhhj]hMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj]hhhj]hMubah}(h]j]ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj]hMhj]hhubj`)}(hhh]h)}(hrequest SM PS transitionh]hrequest SM PS transition}(hj\_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjY_hhubah}(h]h ]h"]h$]h&]uh1j_hj]hhhj]hMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjt_jjt_jjjuh1hhhhj[hNhNubj)}(hX**Parameters** ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. ``unsigned int link_id`` link ID for MLO, or 0 ``enum ieee80211_smps_mode smps_mode`` new SM PS mode **Description** This allows the driver to request an SM PS transition in managed mode. This is useful when the driver has more information than the stack about possible interference, for example by bluetooth.h](h)}(h**Parameters**h]j)}(hj~_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|_ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjx_ubj)}(hhh](j)}(hv``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback. h](j)}(h``struct ieee80211_vif *vif``h]j)}(hj_h]hstruct ieee80211_vif *vif}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj_ubj)}(hhh]h)}(hW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.h](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hj_h]hstruct ieee80211_vif}(hj_hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhj_hMhj_ubh) pointer from the add_interface callback.}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj_hMhj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj_hMhj_ubj)}(h/``unsigned int link_id`` link ID for MLO, or 0 h](j)}(h``unsigned int link_id``h]j)}(hj_h]hunsigned int link_id}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj_ubj)}(hhh]h)}(hlink ID for MLO, or 0h]hlink ID for MLO, or 0}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj `hMhj `ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhj `hMhj_ubj)}(h6``enum ieee80211_smps_mode smps_mode`` new SM PS mode h](j)}(h&``enum ieee80211_smps_mode smps_mode``h]j)}(hj.`h]h"enum ieee80211_smps_mode smps_mode}(hj0`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,`ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhj(`ubj)}(hhh]h)}(hnew SM PS modeh]hnew SM PS mode}(hjG`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC`hMhjD`ubah}(h]h ]h"]h$]h&]uh1jhj(`ubeh}(h]h ]h"]h$]h&]uh1jhjC`hMhj_ubeh}(h]h ]h"]h$]h&]uh1jhjx_ubh)}(h**Description**h]j)}(hji`h]h Description}(hjk`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg`ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjx_ubh)}(hThis allows the driver to request an SM PS transition in managed mode. This is useful when the driver has more information than the stack about possible interference, for example by bluetooth.h]hThis allows the driver to request an SM PS transition in managed mode. This is useful when the driver has more information than the stack about possible interference, for example by bluetooth.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.hhMhjx_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj[hhhNhNubh)}(hTBDh]hTBD}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[hhubh)}(hpThis part of the book describes the rate control algorithm interface and how it relates to mac80211 and drivers.h]hpThis part of the book describes the rate control algorithm interface and how it relates to mac80211 and drivers.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj[hhubeh}(h]#spatial-multiplexing-powersave-smpsah ]h"]%spatial multiplexing powersave (smps)ah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hRate Control APIh]hRate Control API}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`hhhhhKubh)}(hTBDh]hTBD}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj`hhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'ieee80211_rate_control_changed (C enum) c.ieee80211_rate_control_changedhNtauh1hhj`hhhNhNubh)}(hhh](h)}(hieee80211_rate_control_changedh]j)}(h#enum ieee80211_rate_control_changedh](j )}(hj|h]henum}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhM ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj`hhhj`hM ubj,)}(hieee80211_rate_control_changedh]j2)}(hj`h]hieee80211_rate_control_changed}(hjahhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj aubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj`hhhj`hM ubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj`hhhj`hM ubah}(h]j`ah ](jWjXeh"]h$]h&]j\j])j^huh1hhj`hM hj`hhubj`)}(hhh]h)}(hflags to indicate what changedh]hflags to indicate what changed}(hj3ahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj0ahhubah}(h]h ]h"]h$]h&]uh1j_hj`hhhj`hM ubeh}(h]h ](j|enumeh"]h$]h&]jj|jjKajjKajjjuh1hhhhj`hNhNubj)}(hXT**Constants** ``IEEE80211_RC_BW_CHANGED`` The bandwidth that can be used to transmit to this station changed. The actual bandwidth is in the station information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag changes, for HT and VHT the bandwidth field changes. ``IEEE80211_RC_SMPS_CHANGED`` The SMPS state of the station changed. ``IEEE80211_RC_SUPP_RATES_CHANGED`` The supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer. ``IEEE80211_RC_NSS_CHANGED`` N_SS (number of spatial streams) was changed by the peerh](h)}(h **Constants**h]j)}(hjUah]h Constants}(hjWahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSaubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjOaubj)}(hhh](j)}(hX``IEEE80211_RC_BW_CHANGED`` The bandwidth that can be used to transmit to this station changed. The actual bandwidth is in the station information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag changes, for HT and VHT the bandwidth field changes. h](j)}(h``IEEE80211_RC_BW_CHANGED``h]j)}(hjtah]hIEEE80211_RC_BW_CHANGED}(hjvahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjraubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjnaubj)}(hhh]h)}(hThe bandwidth that can be used to transmit to this station changed. The actual bandwidth is in the station information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag changes, for HT and VHT the bandwidth field changes.h]hThe bandwidth that can be used to transmit to this station changed. The actual bandwidth is in the station information -- for HT20/40 the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag changes, for HT and VHT the bandwidth field changes.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjaubah}(h]h ]h"]h$]h&]uh1jhjnaubeh}(h]h ]h"]h$]h&]uh1jhjahMhjkaubj)}(hE``IEEE80211_RC_SMPS_CHANGED`` The SMPS state of the station changed. h](j)}(h``IEEE80211_RC_SMPS_CHANGED``h]j)}(hjah]hIEEE80211_RC_SMPS_CHANGED}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjaubj)}(hhh]h)}(h&The SMPS state of the station changed.h]h&The SMPS state of the station changed.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMhjkaubj)}(h``IEEE80211_RC_SUPP_RATES_CHANGED`` The supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer. h](j)}(h#``IEEE80211_RC_SUPP_RATES_CHANGED``h]j)}(hjah]hIEEE80211_RC_SUPP_RATES_CHANGED}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjaubj)}(hhh]h)}(hnThe supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer.h]hnThe supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer.}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjaubah}(h]h ]h"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]uh1jhjahMhjkaubj)}(hU``IEEE80211_RC_NSS_CHANGED`` N_SS (number of spatial streams) was changed by the peerh](j)}(h``IEEE80211_RC_NSS_CHANGED``h]j)}(hj!bh]hIEEE80211_RC_NSS_CHANGED}(hj#bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjbubj)}(hhh]h)}(h8N_SS (number of spatial streams) was changed by the peerh]h8N_SS (number of spatial streams) was changed by the peer}(hj:bhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6bhMhj7bubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj6bhMhjkaubeh}(h]h ]h"]h$]h&]uh1jhjOaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h*ieee80211_start_tx_ba_session (C function)c.ieee80211_start_tx_ba_sessionhNtauh1hhj`hhhNhNubh)}(hhh](h)}(hSint ieee80211_start_tx_ba_session (struct ieee80211_sta *sta, u16 tid, u16 timeout)h]j)}(hRint ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid, u16 timeout)h](j)}(hinth]hint}(hjzbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjvbhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjvbhhhjbhMubj,)}(hieee80211_start_tx_ba_sessionh]j2)}(hieee80211_start_tx_ba_sessionh]hieee80211_start_tx_ba_session}(hjbhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjbubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjvbhhhjbhMubj/)}(h1(struct ieee80211_sta *sta, u16 tid, u16 timeout)h](j5)}(hstruct ieee80211_sta *stah](j )}(hj h]hstruct}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjbubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hjbhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjbubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjbmodnameN classnameNjrju)}jx]j{)}jnjbsbc.ieee80211_start_tx_ba_sessionasbuh1hhjbubj)}(h h]h }(hjbhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjbubj)}(hj h]h*}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbubj2)}(hstah]hsta}(hjchhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjbubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjbubj5)}(hu16 tidh](h)}(hhh]j2)}(hu16h]hu16}(hj,chhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj)cubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj.cmodnameN classnameNjrju)}jx]jbc.ieee80211_start_tx_ba_sessionasbuh1hhj%cubj)}(h h]h }(hjJchhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj%cubj2)}(htidh]htid}(hjXchhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj%cubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjbubj5)}(h u16 timeouth](h)}(hhh]j2)}(hu16h]hu16}(hjtchhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjqcubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjvcmodnameN classnameNjrju)}jx]jbc.ieee80211_start_tx_ba_sessionasbuh1hhjmcubj)}(h h]h }(hjchhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjmcubj2)}(htimeouth]htimeout}(hjchhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjmcubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjbubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjvbhhhjbhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjrbhhhjbhMubah}(h]jmbah ](jWjXeh"]h$]h&]j\j])j^huh1hhjbhMhjobhhubj`)}(hhh]h)}(hStart a tx Block Ack session.h]hStart a tx Block Ack session.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjchhubah}(h]h ]h"]h$]h&]uh1j_hjobhhhjbhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjcjjcjjjuh1hhhhj`hNhNubj)}(hX**Parameters** ``struct ieee80211_sta *sta`` the station for which to start a BA session ``u16 tid`` the TID to BA on. ``u16 timeout`` session timeout value (in TUs) **Return** success if addBA request was sent, failure otherwise **Description** Although mac80211/low level driver/user space application can estimate the need to start aggregation on a certain RA/TID, the session level will be managed by the mac80211.h](h)}(h**Parameters**h]j)}(hjch]h Parameters}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjcubj)}(hhh](j)}(hJ``struct ieee80211_sta *sta`` the station for which to start a BA session h](j)}(h``struct ieee80211_sta *sta``h]j)}(hj dh]hstruct ieee80211_sta *sta}(hj dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj dubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjdubj)}(hhh]h)}(h+the station for which to start a BA sessionh]h+the station for which to start a BA session}(hj$dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj dhMhj!dubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1jhj dhMhjdubj)}(h``u16 tid`` the TID to BA on. h](j)}(h ``u16 tid``h]j)}(hjDdh]hu16 tid}(hjFdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBdubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj>dubj)}(hhh]h)}(hthe TID to BA on.h]hthe TID to BA on.}(hj]dhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYdhMhjZdubah}(h]h ]h"]h$]h&]uh1jhj>dubeh}(h]h ]h"]h$]h&]uh1jhjYdhMhjdubj)}(h/``u16 timeout`` session timeout value (in TUs) h](j)}(h``u16 timeout``h]j)}(hj}dh]h u16 timeout}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{dubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjwdubj)}(hhh]h)}(hsession timeout value (in TUs)h]hsession timeout value (in TUs)}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjdhMhjdubah}(h]h ]h"]h$]h&]uh1jhjwdubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjdubeh}(h]h ]h"]h$]h&]uh1jhjcubh)}(h **Return**h]j)}(hjdh]hReturn}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjcubh)}(h4success if addBA request was sent, failure otherwiseh]h4success if addBA request was sent, failure otherwise}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjcubh)}(h**Description**h]j)}(hjdh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjcubh)}(hAlthough mac80211/low level driver/user space application can estimate the need to start aggregation on a certain RA/TID, the session level will be managed by the mac80211.h]hAlthough mac80211/low level driver/user space application can estimate the need to start aggregation on a certain RA/TID, the session level will be managed by the mac80211.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjcubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h-ieee80211_start_tx_ba_cb_irqsafe (C function)"c.ieee80211_start_tx_ba_cb_irqsafehNtauh1hhj`hhhNhNubh)}(hhh](h)}(hXvoid ieee80211_start_tx_ba_cb_irqsafe (struct ieee80211_vif *vif, const u8 *ra, u16 tid)h]j)}(hWvoid ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, u16 tid)h](j)}(hvoidh]hvoid}(hj$ehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ehhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMubj)}(h h]h }(hj3ehhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj ehhhj2ehMubj,)}(h ieee80211_start_tx_ba_cb_irqsafeh]j2)}(h ieee80211_start_tx_ba_cb_irqsafeh]h ieee80211_start_tx_ba_cb_irqsafe}(hjEehhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjAeubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj ehhhj2ehMubj/)}(h2(struct ieee80211_vif *vif, const u8 *ra, u16 tid)h](j5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hjaehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]eubj)}(h h]h }(hjnehhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj]eubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hjehhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj|eubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjemodnameN classnameNjrju)}jx]j{)}jnjGesb"c.ieee80211_start_tx_ba_cb_irqsafeasbuh1hhj]eubj)}(h h]h }(hjehhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj]eubj)}(hj h]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]eubj2)}(hvifh]hvif}(hjehhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj]eubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjYeubj5)}(h const u8 *rah](j )}(hjh]hconst}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj)}(h h]h }(hjehhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjeubh)}(hhh]j2)}(hu8h]hu8}(hjehhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjeubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjemodnameN classnameNjrju)}jx]je"c.ieee80211_start_tx_ba_cb_irqsafeasbuh1hhjeubj)}(h h]h }(hjfhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjeubj)}(hj h]h*}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjeubj2)}(hrah]hra}(hj*fhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjeubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjYeubj5)}(hu16 tidh](h)}(hhh]j2)}(hu16h]hu16}(hjFfhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjCfubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjHfmodnameN classnameNjrju)}jx]je"c.ieee80211_start_tx_ba_cb_irqsafeasbuh1hhj?fubj)}(h h]h }(hjdfhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj?fubj2)}(htidh]htid}(hjrfhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj?fubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjYeubeh}(h]h ]h"]h$]h&]jIjJuh1j.hj ehhhj2ehMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjehhhj2ehMubah}(h]jeah ](jWjXeh"]h$]h&]j\j])j^huh1hhj2ehMhjehhubj`)}(hhh]h)}(h$low level driver ready to aggregate.h]h$low level driver ready to aggregate.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjfhhubah}(h]h ]h"]h$]h&]uh1j_hjehhhj2ehMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjfjjfjjjuh1hhhhj`hNhNubj)}(hX**Parameters** ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback ``const u8 *ra`` receiver address of the BA session recipient. ``u16 tid`` the TID to BA on. **Description** This function must be called by low level driver once it has finished with preparations for the BA session. It can be called from any context.h](h)}(h**Parameters**h]j)}(hjfh]h Parameters}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjfubj)}(hhh](j)}(hu``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback h](j)}(h``struct ieee80211_vif *vif``h]j)}(hjfh]hstruct ieee80211_vif *vif}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjfubj)}(hhh]h)}(hV:c:type:`struct ieee80211_vif ` pointer from the add_interface callbackh](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hjfh]hstruct ieee80211_vif}(hjfhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhjfhMhjfubh( pointer from the add_interface callback}(hjfhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjfhMhjfubah}(h]h ]h"]h$]h&]uh1jhjfubeh}(h]h ]h"]h$]h&]uh1jhjfhMhjfubj)}(h?``const u8 *ra`` receiver address of the BA session recipient. h](j)}(h``const u8 *ra``h]j)}(hj5gh]h const u8 *ra}(hj7ghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3gubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj/gubj)}(hhh]h)}(h-receiver address of the BA session recipient.h]h-receiver address of the BA session recipient.}(hjNghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJghMhjKgubah}(h]h ]h"]h$]h&]uh1jhj/gubeh}(h]h ]h"]h$]h&]uh1jhjJghMhjfubj)}(h``u16 tid`` the TID to BA on. h](j)}(h ``u16 tid``h]j)}(hjngh]hu16 tid}(hjpghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlgubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjhgubj)}(hhh]h)}(hthe TID to BA on.h]hthe TID to BA on.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghMhjgubah}(h]h ]h"]h$]h&]uh1jhjhgubeh}(h]h ]h"]h$]h&]uh1jhjghMhjfubeh}(h]h ]h"]h$]h&]uh1jhjfubh)}(h**Description**h]j)}(hjgh]h Description}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjfubh)}(hThis function must be called by low level driver once it has finished with preparations for the BA session. It can be called from any context.Rh]hThis function must be called by low level driver once it has finished with preparations for the BA session. It can be called from any context.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjfubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)ieee80211_stop_tx_ba_session (C function)c.ieee80211_stop_tx_ba_sessionhNtauh1hhj`hhhNhNubh)}(hhh](h)}(hEint ieee80211_stop_tx_ba_session (struct ieee80211_sta *sta, u16 tid)h]j)}(hDint ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid)h](j)}(hinth]hint}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjghhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMubj)}(h h]h }(hjghhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjghhhjghMubj,)}(hieee80211_stop_tx_ba_sessionh]j2)}(hieee80211_stop_tx_ba_sessionh]hieee80211_stop_tx_ba_session}(hjhhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj hubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjghhhjghMubj/)}(h$(struct ieee80211_sta *sta, u16 tid)h](j5)}(hstruct ieee80211_sta *stah](j )}(hj h]hstruct}(hj+hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hubj)}(h h]h }(hj8hhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj'hubh)}(hhh]j2)}(h ieee80211_stah]h ieee80211_sta}(hjIhhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjFhubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjKhmodnameN classnameNjrju)}jx]j{)}jnjhsbc.ieee80211_stop_tx_ba_sessionasbuh1hhj'hubj)}(h h]h }(hjihhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj'hubj)}(hj h]h*}(hjwhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hubj2)}(hstah]hsta}(hjhhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj'hubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj#hubj5)}(hu16 tidh](h)}(hhh]j2)}(hu16h]hu16}(hjhhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjhubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjhmodnameN classnameNjrju)}jx]jehc.ieee80211_stop_tx_ba_sessionasbuh1hhjhubj)}(h h]h }(hjhhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjhubj2)}(htidh]htid}(hjhhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjhubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hj#hubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjghhhjghMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjghhhjghMubah}(h]jgah ](jWjXeh"]h$]h&]j\j])j^huh1hhjghMhjghhubj`)}(hhh]h)}(hStop a Block Ack session.h]hStop a Block Ack session.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjhhhubah}(h]h ]h"]h$]h&]uh1j_hjghhhjghMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjijjijjjuh1hhhhj`hNhNubj)}(hX**Parameters** ``struct ieee80211_sta *sta`` the station whose BA session to stop ``u16 tid`` the TID to stop BA. **Return** negative error if the TID is invalid, or no aggregation active **Description** Although mac80211/low level driver/user space application can estimate the need to stop aggregation on a certain RA/TID, the session level will be managed by the mac80211.h](h)}(h**Parameters**h]j)}(hjih]h Parameters}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjiubj)}(hhh](j)}(hC``struct ieee80211_sta *sta`` the station whose BA session to stop h](j)}(h``struct ieee80211_sta *sta``h]j)}(hj7ih]hstruct ieee80211_sta *sta}(hj9ihhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5iubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj1iubj)}(hhh]h)}(h$the station whose BA session to stoph]h$the station whose BA session to stop}(hjPihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLihMhjMiubah}(h]h ]h"]h$]h&]uh1jhj1iubeh}(h]h ]h"]h$]h&]uh1jhjLihMhj.iubj)}(h ``u16 tid`` the TID to stop BA. h](j)}(h ``u16 tid``h]j)}(hjpih]hu16 tid}(hjrihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjniubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjjiubj)}(hhh]h)}(hthe TID to stop BA.h]hthe TID to stop BA.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjihMhjiubah}(h]h ]h"]h$]h&]uh1jhjjiubeh}(h]h ]h"]h$]h&]uh1jhjihMhj.iubeh}(h]h ]h"]h$]h&]uh1jhjiubh)}(h **Return**h]j)}(hjih]hReturn}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjiubh)}(h>negative error if the TID is invalid, or no aggregation activeh]h>negative error if the TID is invalid, or no aggregation active}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjiubh)}(h**Description**h]j)}(hjih]h Description}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjiubh)}(hAlthough mac80211/low level driver/user space application can estimate the need to stop aggregation on a certain RA/TID, the session level will be managed by the mac80211.h]hAlthough mac80211/low level driver/user space application can estimate the need to stop aggregation on a certain RA/TID, the session level will be managed by the mac80211.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h,ieee80211_stop_tx_ba_cb_irqsafe (C function)!c.ieee80211_stop_tx_ba_cb_irqsafehNtauh1hhj`hhhNhNubh)}(hhh](h)}(hWvoid ieee80211_stop_tx_ba_cb_irqsafe (struct ieee80211_vif *vif, const u8 *ra, u16 tid)h]j)}(hVvoid ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, u16 tid)h](j)}(hvoidh]hvoid}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMubj)}(h h]h }(hj&jhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjjhhhj%jhMubj,)}(hieee80211_stop_tx_ba_cb_irqsafeh]j2)}(hieee80211_stop_tx_ba_cb_irqsafeh]hieee80211_stop_tx_ba_cb_irqsafe}(hj8jhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj4jubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjjhhhj%jhMubj/)}(h2(struct ieee80211_vif *vif, const u8 *ra, u16 tid)h](j5)}(hstruct ieee80211_vif *vifh](j )}(hj h]hstruct}(hjTjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPjubj)}(h h]h }(hjajhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjPjubh)}(hhh]j2)}(h ieee80211_vifh]h ieee80211_vif}(hjrjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjojubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjtjmodnameN classnameNjrju)}jx]j{)}jnj:jsb!c.ieee80211_stop_tx_ba_cb_irqsafeasbuh1hhjPjubj)}(h h]h }(hjjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjPjubj)}(hj h]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjPjubj2)}(hvifh]hvif}(hjjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjPjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjLjubj5)}(h const u8 *rah](j )}(hjh]hconst}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj)}(h h]h }(hjjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjjubh)}(hhh]j2)}(hu8h]hu8}(hjjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjjubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetjjmodnameN classnameNjrju)}jx]jj!c.ieee80211_stop_tx_ba_cb_irqsafeasbuh1hhjjubj)}(h h]h }(hjkhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjjubj)}(hj h]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjjubj2)}(hrah]hra}(hjkhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjjubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjLjubj5)}(hu16 tidh](h)}(hhh]j2)}(hu16h]hu16}(hj9khhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj6kubah}(h]h ]h"]h$]h&] refdomainj|reftypejn reftargetj;kmodnameN classnameNjrju)}jx]jj!c.ieee80211_stop_tx_ba_cb_irqsafeasbuh1hhj2kubj)}(h h]h }(hjWkhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj2kubj2)}(htidh]htid}(hjekhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj2kubeh}(h]h ]h"]h$]h&]noemphjIjJuh1j4hjLjubeh}(h]h ]h"]h$]h&]jIjJuh1j.hjjhhhj%jhMubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjjhhhj%jhMubah}(h]j jah ](jWjXeh"]h$]h&]j\j])j^huh1hhj%jhMhj jhhubj`)}(hhh]h)}(h)low level driver ready to stop aggregate.h]h)low level driver ready to stop aggregate.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjkhhubah}(h]h ]h"]h$]h&]uh1j_hj jhhhj%jhMubeh}(h]h ](j|functioneh"]h$]h&]jj|jjkjjkjjjuh1hhhhj`hNhNubj)}(hX**Parameters** ``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback ``const u8 *ra`` receiver address of the BA session recipient. ``u16 tid`` the desired TID to BA on. **Description** This function must be called by low level driver once it has finished with preparations for the BA session tear down. It can be called from any context.h](h)}(h**Parameters**h]j)}(hjkh]h Parameters}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjkubj)}(hhh](j)}(hu``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback h](j)}(h``struct ieee80211_vif *vif``h]j)}(hjkh]hstruct ieee80211_vif *vif}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjkubj)}(hhh]h)}(hV:c:type:`struct ieee80211_vif ` pointer from the add_interface callbackh](h)}(h.:c:type:`struct ieee80211_vif `h]j)}(hjkh]hstruct ieee80211_vif}(hjkhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjkubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_vifuh1hhjkhMhjkubh( pointer from the add_interface callback}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjkhMhjkubah}(h]h ]h"]h$]h&]uh1jhjkubeh}(h]h ]h"]h$]h&]uh1jhjkhMhjkubj)}(h?``const u8 *ra`` receiver address of the BA session recipient. h](j)}(h``const u8 *ra``h]j)}(hj(lh]h const u8 *ra}(hj*lhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&lubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj"lubj)}(hhh]h)}(h-receiver address of the BA session recipient.h]h-receiver address of the BA session recipient.}(hjAlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=lhMhj>lubah}(h]h ]h"]h$]h&]uh1jhj"lubeh}(h]h ]h"]h$]h&]uh1jhj=lhMhjkubj)}(h&``u16 tid`` the desired TID to BA on. h](j)}(h ``u16 tid``h]j)}(hjalh]hu16 tid}(hjclhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_lubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhj[lubj)}(hhh]h)}(hthe desired TID to BA on.h]hthe desired TID to BA on.}(hjzlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvlhMhjwlubah}(h]h ]h"]h$]h&]uh1jhj[lubeh}(h]h ]h"]h$]h&]uh1jhjvlhMhjkubeh}(h]h ]h"]h$]h&]uh1jhjkubh)}(h**Description**h]j)}(hjlh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjkubh)}(hThis function must be called by low level driver once it has finished with preparations for the BA session tear down. It can be called from any context.h]hThis function must be called by low level driver once it has finished with preparations for the BA session tear down. It can be called from any context.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMhjkubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj`hhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$ieee80211_tx_rate_control (C struct)c.ieee80211_tx_rate_controlhNtauh1hhj`hhhNhNubh)}(hhh](h)}(hieee80211_tx_rate_controlh]j)}(h struct ieee80211_tx_rate_controlh](j )}(hj h]hstruct}(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMKubj)}(h h]h }(hjlhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjlhhhjlhMKubj,)}(hieee80211_tx_rate_controlh]j2)}(hjlh]hieee80211_tx_rate_control}(hjmhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjlubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjlhhhjlhMKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjlhhhjlhMKubah}(h]jlah ](jWjXeh"]h$]h&]j\j])j^huh1hhjlhMKhjlhhubj`)}(hhh]h)}(h)rate control information for/from RC algoh]h)rate control information for/from RC algo}(hj#mhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMOhj mhhubah}(h]h ]h"]h$]h&]uh1j_hjlhhhjlhMKubeh}(h]h ](j|structeh"]h$]h&]jj|jj;mjj;mjjjuh1hhhhj`hNhNubj)}(hX**Definition**:: struct ieee80211_tx_rate_control { struct ieee80211_hw *hw; struct ieee80211_supported_band *sband; struct ieee80211_bss_conf *bss_conf; struct sk_buff *skb; struct ieee80211_tx_rate reported_rate; bool rts, short_preamble; u32 rate_idx_mask; u8 *rate_idx_mcs_mask; bool bss; }; **Members** ``hw`` The hardware the algorithm is invoked for. ``sband`` The band this frame is being transmitted on. ``bss_conf`` the current BSS configuration ``skb`` the skb that will be transmitted, the control information in it needs to be filled in ``reported_rate`` The rate control algorithm can fill this in to indicate which rate should be reported to userspace as the current rate and used for rate calculations in the mesh network. ``rts`` whether RTS will be used for this frame because it is longer than the RTS threshold ``short_preamble`` whether mac80211 will request short-preamble transmission if the selected rate supports it ``rate_idx_mask`` user-requested (legacy) rate mask ``rate_idx_mcs_mask`` user-requested MCS rate mask (NULL if not in use) ``bss`` whether this frame is sent out in AP or IBSS modeh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjGmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCmubh:}(hjCmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMShj?mubj)}(hX:struct ieee80211_tx_rate_control { struct ieee80211_hw *hw; struct ieee80211_supported_band *sband; struct ieee80211_bss_conf *bss_conf; struct sk_buff *skb; struct ieee80211_tx_rate reported_rate; bool rts, short_preamble; u32 rate_idx_mask; u8 *rate_idx_mcs_mask; bool bss; };h]hX:struct ieee80211_tx_rate_control { struct ieee80211_hw *hw; struct ieee80211_supported_band *sband; struct ieee80211_bss_conf *bss_conf; struct sk_buff *skb; struct ieee80211_tx_rate reported_rate; bool rts, short_preamble; u32 rate_idx_mask; u8 *rate_idx_mcs_mask; bool bss; };}hj`msbah}(h]h ]h"]h$]h&]jIjJuh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMUhj?mubh)}(h **Members**h]j)}(hjqmh]hMembers}(hjsmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjomubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMahj?mubj)}(hhh](j)}(h2``hw`` The hardware the algorithm is invoked for. h](j)}(h``hw``h]j)}(hjmh]hhw}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMRhjmubj)}(hhh]h)}(h*The hardware the algorithm is invoked for.h]h*The hardware the algorithm is invoked for.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMRhjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjmhMRhjmubj)}(h7``sband`` The band this frame is being transmitted on. h](j)}(h ``sband``h]j)}(hjmh]hsband}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMShjmubj)}(hhh]h)}(h,The band this frame is being transmitted on.h]h,The band this frame is being transmitted on.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhMShjmubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjmhMShjmubj)}(h+``bss_conf`` the current BSS configuration h](j)}(h ``bss_conf``h]j)}(hjnh]hbss_conf}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMThjmubj)}(hhh]h)}(hthe current BSS configurationh]hthe current BSS configuration}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhMThjnubah}(h]h ]h"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]uh1jhjnhMThjmubj)}(h^``skb`` the skb that will be transmitted, the control information in it needs to be filled in h](j)}(h``skb``h]j)}(hj;nh]hskb}(hj=nhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9nubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMVhj5nubj)}(hhh]h)}(hUthe skb that will be transmitted, the control information in it needs to be filled inh]hUthe skb that will be transmitted, the control information in it needs to be filled in}(hjTnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMUhjQnubah}(h]h ]h"]h$]h&]uh1jhj5nubeh}(h]h ]h"]h$]h&]uh1jhjPnhMVhjmubj)}(h``reported_rate`` The rate control algorithm can fill this in to indicate which rate should be reported to userspace as the current rate and used for rate calculations in the mesh network. h](j)}(h``reported_rate``h]j)}(hjunh]h reported_rate}(hjwnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsnubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMYhjonubj)}(hhh]h)}(hThe rate control algorithm can fill this in to indicate which rate should be reported to userspace as the current rate and used for rate calculations in the mesh network.h]hThe rate control algorithm can fill this in to indicate which rate should be reported to userspace as the current rate and used for rate calculations in the mesh network.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMWhjnubah}(h]h ]h"]h$]h&]uh1jhjonubeh}(h]h ]h"]h$]h&]uh1jhjnhMYhjmubj)}(h\``rts`` whether RTS will be used for this frame because it is longer than the RTS threshold h](j)}(h``rts``h]j)}(hjnh]hrts}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhM[hjnubj)}(hhh]h)}(hSwhether RTS will be used for this frame because it is longer than the RTS thresholdh]hSwhether RTS will be used for this frame because it is longer than the RTS threshold}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhMZhjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjnhM[hjmubj)}(hn``short_preamble`` whether mac80211 will request short-preamble transmission if the selected rate supports it h](j)}(h``short_preamble``h]j)}(hjnh]hshort_preamble}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhM]hjnubj)}(hhh]h)}(hZwhether mac80211 will request short-preamble transmission if the selected rate supports ith]hZwhether mac80211 will request short-preamble transmission if the selected rate supports it}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhM\hjnubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1jhjnhM]hjmubj)}(h4``rate_idx_mask`` user-requested (legacy) rate mask h](j)}(h``rate_idx_mask``h]j)}(hj#oh]h rate_idx_mask}(hj%ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!oubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.hhM^hjoubj)}(hhh]h)}(h!user-requested (legacy) rate maskh]h!user-requested (legacy) rate mask}(hjsta dereferences within the hardware acceleration functions. This means that sta_info_destroy() must remove the key which waits for an RCU grace period.h]hX|All key management is internally protected by a mutex. Within all other parts of mac80211, key references are, just as STA structure references, protected by RCU. Note, however, that some things are unprotected, namely the key->sta dereferences within the hardware acceleration functions. This means that sta_info_destroy() must remove the key which waits for an RCU grace period.}(hj:phhhNhNubah}(h]h ]h"]h$]h&]uh1hhf/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:190: ./net/mac80211/key.chK,hj phhubeh}(h]key-handling-basicsah ]h"]key handling basicsah$]h&]uh1hhjohhhhhKubh)}(hhh](h)}(hMORE TBDh]hMORE TBD}(hjTphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQphhhhhKubh)}(hTBDh]hTBD}(hjbphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjQphhubeh}(h]more-tbdah ]h"]more tbdah$]h&]uh1hhjohhhhhKubeh}(h] key-handlingah ]h"] key handlingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hReceive processingh]hReceive processing}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKubh)}(hTBDh]hTBD}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubeh}(h]receive-processingah ]h"]receive processingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hTransmit processingh]hTransmit processing}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKubh)}(hTBDh]hTBD}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjphhubeh}(h]transmit-processingah ]h"]transmit processingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hStation info handlingh]hStation info handling}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKubh)}(hhh](h)}(hProgramming informationh]hProgramming information}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1hhjphhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!ieee80211_sta_info_flags (C enum)c.ieee80211_sta_info_flagshNtauh1hhjphhhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhNubh)}(hhh](h)}(hieee80211_sta_info_flagsh]j)}(henum ieee80211_sta_info_flagsh](j )}(hj|h]henum}(hj qhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjqhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKubj)}(h h]h }(hjqhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjqhhhjqhKubj,)}(hieee80211_sta_info_flagsh]j2)}(hjqh]hieee80211_sta_info_flags}(hj*qhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj&qubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjqhhhjqhKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjqhhhjqhKubah}(h]jpah ](jWjXeh"]h$]h&]j\j])j^huh1hhjqhKhjphhubj`)}(hhh]h)}(hStations flagsh]hStations flags}(hjLqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjIqhhubah}(h]h ]h"]h$]h&]uh1j_hjphhhjqhKubeh}(h]h ](j|enumeh"]h$]h&]jj|jjdqjjdqjjjuh1hhhhjphjphNubj)}(hX **Constants** ``WLAN_STA_AUTH`` Station is authenticated. ``WLAN_STA_ASSOC`` Station is associated. ``WLAN_STA_PS_STA`` Station is in power-save mode ``WLAN_STA_AUTHORIZED`` Station is authorized to send/receive traffic. This bit is always checked so needs to be enabled for all stations when virtual port control is not in use. ``WLAN_STA_SHORT_PREAMBLE`` Station is capable of receiving short-preamble frames. ``WLAN_STA_WDS`` Station is one of our WDS peers. ``WLAN_STA_CLEAR_PS_FILT`` Clear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted. ``WLAN_STA_MFP`` Management frame protection is used with this STA. ``WLAN_STA_BLOCK_BA`` Used to deny ADDBA requests (both TX and RX) during suspend/resume and station removal. ``WLAN_STA_PS_DRIVER`` driver requires keeping this station in power-save mode logically to flush frames that might still be in the queues ``WLAN_STA_PSPOLL`` Station sent PS-poll while driver was keeping station in power-save mode, reply when the driver unblocks. ``WLAN_STA_TDLS_PEER`` Station is a TDLS peer. ``WLAN_STA_TDLS_PEER_AUTH`` This TDLS peer is authorized to send direct packets. This means the link is enabled. ``WLAN_STA_TDLS_INITIATOR`` We are the initiator of the TDLS link with this station. ``WLAN_STA_TDLS_CHAN_SWITCH`` This TDLS peer supports TDLS channel-switching ``WLAN_STA_TDLS_OFF_CHANNEL`` The local STA is currently off-channel with this TDLS peer ``WLAN_STA_TDLS_WIDER_BW`` This TDLS peer supports working on a wider bw on the BSS base channel. ``WLAN_STA_UAPSD`` Station requested unscheduled SP while driver was keeping station in power-save mode, reply when the driver unblocks the station. ``WLAN_STA_SP`` Station is in a service period, so don't try to reply to other uAPSD trigger frames or PS-Poll. ``WLAN_STA_4ADDR_EVENT`` 4-addr event was already sent for this frame. ``WLAN_STA_INSERTED`` This station is inserted into the hash table. ``WLAN_STA_RATE_CONTROL`` rate control was initialized for this station. ``WLAN_STA_TOFFSET_KNOWN`` toffset calculated for this station is valid. ``WLAN_STA_MPSP_OWNER`` local STA is owner of a mesh Peer Service Period. ``WLAN_STA_MPSP_RECIPIENT`` local STA is recipient of a MPSP. ``WLAN_STA_PS_DELIVER`` station woke up, but we're still blocking TX until pending frames are delivered ``WLAN_STA_USES_ENCRYPTION`` This station was configured for encryption, so drop all packets without a key later. ``WLAN_STA_DECAP_OFFLOAD`` This station uses rx decap offload ``NUM_WLAN_STA_FLAGS`` number of defined flagsh](h)}(h **Constants**h]j)}(hjnqh]h Constants}(hjpqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlqubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjhqubj)}(hhh](j)}(h,``WLAN_STA_AUTH`` Station is authenticated. h](j)}(h``WLAN_STA_AUTH``h]j)}(hjqh]h WLAN_STA_AUTH}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjqubj)}(hhh]h)}(hStation is authenticated.h]hStation is authenticated.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhKhjqubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjqhKhjqubj)}(h*``WLAN_STA_ASSOC`` Station is associated. h](j)}(h``WLAN_STA_ASSOC``h]j)}(hjqh]hWLAN_STA_ASSOC}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK"hjqubj)}(hhh]h)}(hStation is associated.h]hStation is associated.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhK"hjqubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjqhK"hjqubj)}(h2``WLAN_STA_PS_STA`` Station is in power-save mode h](j)}(h``WLAN_STA_PS_STA``h]j)}(hjqh]hWLAN_STA_PS_STA}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK%hjqubj)}(hhh]h)}(hStation is in power-save modeh]hStation is in power-save mode}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhK%hjrubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjrhK%hjqubj)}(h``WLAN_STA_AUTHORIZED`` Station is authorized to send/receive traffic. This bit is always checked so needs to be enabled for all stations when virtual port control is not in use. h](j)}(h``WLAN_STA_AUTHORIZED``h]j)}(hj8rh]hWLAN_STA_AUTHORIZED}(hj:rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6rubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK*hj2rubj)}(hhh]h)}(hStation is authorized to send/receive traffic. This bit is always checked so needs to be enabled for all stations when virtual port control is not in use.h]hStation is authorized to send/receive traffic. This bit is always checked so needs to be enabled for all stations when virtual port control is not in use.}(hjQrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK(hjNrubah}(h]h ]h"]h$]h&]uh1jhj2rubeh}(h]h ]h"]h$]h&]uh1jhjMrhK*hjqubj)}(hS``WLAN_STA_SHORT_PREAMBLE`` Station is capable of receiving short-preamble frames. h](j)}(h``WLAN_STA_SHORT_PREAMBLE``h]j)}(hjrrh]hWLAN_STA_SHORT_PREAMBLE}(hjtrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjprubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK.hjlrubj)}(hhh]h)}(h6Station is capable of receiving short-preamble frames.h]h6Station is capable of receiving short-preamble frames.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK-hjrubah}(h]h ]h"]h$]h&]uh1jhjlrubeh}(h]h ]h"]h$]h&]uh1jhjrhK.hjqubj)}(h2``WLAN_STA_WDS`` Station is one of our WDS peers. h](j)}(h``WLAN_STA_WDS``h]j)}(hjrh]h WLAN_STA_WDS}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK1hjrubj)}(hhh]h)}(h Station is one of our WDS peers.h]h Station is one of our WDS peers.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjrhK1hjrubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhjrhK1hjqubj)}(h``WLAN_STA_CLEAR_PS_FILT`` Clear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted. h](j)}(h``WLAN_STA_CLEAR_PS_FILT``h]j)}(hjrh]hWLAN_STA_CLEAR_PS_FILT}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK6hjrubj)}(hhh]h)}(hClear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted.h]hClear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK4hjrubah}(h]h ]h"]h$]h&]uh1jhjrubeh}(h]h ]h"]h$]h&]uh1jhjrhK6hjqubj)}(hD``WLAN_STA_MFP`` Management frame protection is used with this STA. h](j)}(h``WLAN_STA_MFP``h]j)}(hjsh]h WLAN_STA_MFP}(hj!shhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK9hjsubj)}(hhh]h)}(h2Management frame protection is used with this STA.h]h2Management frame protection is used with this STA.}(hj8shhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4shK9hj5subah}(h]h ]h"]h$]h&]uh1jhjsubeh}(h]h ]h"]h$]h&]uh1jhj4shK9hjqubj)}(hn``WLAN_STA_BLOCK_BA`` Used to deny ADDBA requests (both TX and RX) during suspend/resume and station removal. h](j)}(h``WLAN_STA_BLOCK_BA``h]j)}(hjXsh]hWLAN_STA_BLOCK_BA}(hjZshhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVsubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK=hjRsubj)}(hhh]h)}(hWUsed to deny ADDBA requests (both TX and RX) during suspend/resume and station removal.h]hWUsed to deny ADDBA requests (both TX and RX) during suspend/resume and station removal.}(hjqshhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK``WLAN_STA_MPSP_RECIPIENT`` local STA is recipient of a MPSP. h](j)}(h``WLAN_STA_MPSP_RECIPIENT``h]j)}(hjvh]hWLAN_STA_MPSP_RECIPIENT}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjvubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKwhjvubj)}(hhh]h)}(h!local STA is recipient of a MPSP.h]h!local STA is recipient of a MPSP.}(hj whhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhKwhjwubah}(h]h ]h"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]uh1jhjwhKwhjqubj)}(hh``WLAN_STA_PS_DELIVER`` station woke up, but we're still blocking TX until pending frames are delivered h](j)}(h``WLAN_STA_PS_DELIVER``h]j)}(hj*wh]hWLAN_STA_PS_DELIVER}(hj,whhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(wubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK{hj$wubj)}(hhh]h)}(hOstation woke up, but we're still blocking TX until pending frames are deliveredh]hQstation woke up, but we’re still blocking TX until pending frames are delivered}(hjCwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKzhj@wubah}(h]h ]h"]h$]h&]uh1jhj$wubeh}(h]h ]h"]h$]h&]uh1jhj?whK{hjqubj)}(hr``WLAN_STA_USES_ENCRYPTION`` This station was configured for encryption, so drop all packets without a key later. h](j)}(h``WLAN_STA_USES_ENCRYPTION``h]j)}(hjdwh]hWLAN_STA_USES_ENCRYPTION}(hjfwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbwubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhj^wubj)}(hhh]h)}(hTThis station was configured for encryption, so drop all packets without a key later.h]hTThis station was configured for encryption, so drop all packets without a key later.}(hj}whhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhK~hjzwubah}(h]h ]h"]h$]h&]uh1jhj^wubeh}(h]h ]h"]h$]h&]uh1jhjywhKhjqubj)}(h>``WLAN_STA_DECAP_OFFLOAD`` This station uses rx decap offload h](j)}(h``WLAN_STA_DECAP_OFFLOAD``h]j)}(hjwh]hWLAN_STA_DECAP_OFFLOAD}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjwubj)}(hhh]h)}(h"This station uses rx decap offloadh]h"This station uses rx decap offload}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhKhjwubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjqubj)}(h.``NUM_WLAN_STA_FLAGS`` number of defined flagsh](j)}(h``NUM_WLAN_STA_FLAGS``h]j)}(hjwh]hNUM_WLAN_STA_FLAGS}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjwubj)}(hhh]h)}(hnumber of defined flagsh]hnumber of defined flags}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjwubah}(h]h ]h"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]uh1jhjwhKhjqubeh}(h]h ]h"]h$]h&]uh1jhjhqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjphhhjphNubh)}(h**Description**h]j)}(hjxh]h Description}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhKhjphhubh)}(hThese flags are used with :c:type:`struct sta_info `'s **flags** member, but only indirectly with set_sta_flag() and friends.h](hThese flags are used with }(hj0xhhhNhNubh)}(h$:c:type:`struct sta_info `h]j)}(hj:xh]hstruct sta_info}(hj`, do not use directly ``ps_lock`` used for powersave (when mac80211 is the AP) related locking ``ps_tx_buf`` buffers (per AC) of frames to transmit to this station when it leaves power saving state or polls ``tx_filtered`` buffers (per AC) of frames we already tried to transmit but were filtered by hardware due to STA having entered power saving state, these are also delivered to the station when it leaves powersave or polls for frames ``driver_buffered_tids`` bitmap of TIDs the driver has data buffered on ``txq_buffered_tids`` bitmap of TIDs that mac80211 has txq data buffered on ``assoc_at`` clock boottime (in ns) of last association ``last_connected`` time (in seconds) when a station got connected ``last_seq_ctrl`` last received seq/frag number from this STA (per TID plus one for non-QoS frames) ``tid_seq`` per-TID sequence numbers for sending to this STA ``airtime`` per-AC struct airtime_info describing airtime statistics for this station ``airtime_weight`` station weight for airtime fairness calculation purposes ``ampdu_mlme`` A-MPDU state machine state ``debugfs_dir`` debug filesystem directory dentry ``cparams`` CoDel parameters for this station. ``reserved_tid`` reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED) ``amsdu_mesh_control`` track the mesh A-MSDU format used by the peer: * -1: not yet known * 0: non-mesh A-MSDU length field * 1: big-endian mesh A-MSDU length field * 2: little-endian mesh A-MSDU length field ``tdls_chandef`` a TDLS peer can have a wider chandef that is compatible to the BSS one. ``frags`` fragment cache ``cur`` storage for aggregation data :c:type:`struct ieee80211_sta ` points either here or to deflink.agg. ``deflink`` This is the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink. ``link`` reference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP. ``sta`` station information we share with the driverh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh:}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMHhjxubj)}(hXXstruct sta_info { struct list_head list, free_list; struct rcu_head rcu_head; struct rhlist_head hash_node; u8 addr[ETH_ALEN]; struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; struct ieee80211_key __rcu *ptk[NUM_DEFAULT_KEYS]; u8 ptk_idx; struct rate_control_ref *rate_ctrl; void *rate_ctrl_priv; spinlock_t rate_ctrl_lock; spinlock_t lock; struct ieee80211_fast_tx __rcu *fast_tx; struct ieee80211_fast_rx __rcu *fast_rx; #ifdef CONFIG_MAC80211_MESH; struct mesh_sta *mesh; #endif; struct work_struct drv_deliver_wk; u16 listen_interval; bool dead; bool removed; bool uploaded; enum ieee80211_sta_state sta_state; unsigned long _flags; spinlock_t ps_lock; struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; unsigned long driver_buffered_tids; unsigned long txq_buffered_tids; u64 assoc_at; long last_connected; __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1]; u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; struct airtime_info airtime[IEEE80211_NUM_ACS]; u16 airtime_weight; struct sta_ampdu_mlme ampdu_mlme; #ifdef CONFIG_MAC80211_DEBUGFS; struct dentry *debugfs_dir; #endif; struct codel_params cparams; u8 reserved_tid; s8 amsdu_mesh_control; struct cfg80211_chan_def tdls_chandef; struct ieee80211_fragment_cache frags; struct ieee80211_sta_aggregates cur; struct link_sta_info deflink; struct link_sta_info __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta sta; };h]hXXstruct sta_info { struct list_head list, free_list; struct rcu_head rcu_head; struct rhlist_head hash_node; u8 addr[ETH_ALEN]; struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; struct ieee80211_key __rcu *ptk[NUM_DEFAULT_KEYS]; u8 ptk_idx; struct rate_control_ref *rate_ctrl; void *rate_ctrl_priv; spinlock_t rate_ctrl_lock; spinlock_t lock; struct ieee80211_fast_tx __rcu *fast_tx; struct ieee80211_fast_rx __rcu *fast_rx; #ifdef CONFIG_MAC80211_MESH; struct mesh_sta *mesh; #endif; struct work_struct drv_deliver_wk; u16 listen_interval; bool dead; bool removed; bool uploaded; enum ieee80211_sta_state sta_state; unsigned long _flags; spinlock_t ps_lock; struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; unsigned long driver_buffered_tids; unsigned long txq_buffered_tids; u64 assoc_at; long last_connected; __le16 last_seq_ctrl[IEEE80211_NUM_TIDS + 1]; u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; struct airtime_info airtime[IEEE80211_NUM_ACS]; u16 airtime_weight; struct sta_ampdu_mlme ampdu_mlme; #ifdef CONFIG_MAC80211_DEBUGFS; struct dentry *debugfs_dir; #endif; struct codel_params cparams; u8 reserved_tid; s8 amsdu_mesh_control; struct cfg80211_chan_def tdls_chandef; struct ieee80211_fragment_cache frags; struct ieee80211_sta_aggregates cur; struct link_sta_info deflink; struct link_sta_info __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta sta; };}hj ysbah}(h]h ]h"]h$]h&]jIjJuh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMJhjxubh)}(h **Members**h]j)}(hjyh]hMembers}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhM}hjxubj)}(hhh](j)}(h"``list`` global linked list entry h](j)}(h``list``h]j)}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:yubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMJhj6yubj)}(hhh]h)}(hglobal linked list entryh]hglobal linked list entry}(hjUyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQyhMJhjRyubah}(h]h ]h"]h$]h&]uh1jhj6yubeh}(h]h ]h"]h$]h&]uh1jhjQyhMJhj3yubj)}(h?``free_list`` list entry for keeping track of stations to free h](j)}(h ``free_list``h]j)}(hjuyh]h free_list}(hjwyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsyubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMKhjoyubj)}(hhh]h)}(h0list entry for keeping track of stations to freeh]h0list entry for keeping track of stations to free}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMKhjyubah}(h]h ]h"]h$]h&]uh1jhjoyubeh}(h]h ]h"]h$]h&]uh1jhjyhMKhj3yubj)}(h;``rcu_head`` RCU head used for freeing this station struct h](j)}(h ``rcu_head``h]j)}(hjyh]hrcu_head}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMuhjyubj)}(hhh]h)}(h-RCU head used for freeing this station structh]h-RCU head used for freeing this station struct}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMuhjyubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMuhj3yubj)}(h'``hash_node`` hash node for rhashtable h](j)}(h ``hash_node``h]j)}(hjyh]h hash_node}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMLhjyubj)}(hhh]h)}(hhash node for rhashtableh]hhash node for rhashtable}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhMLhjyubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjyhMLhj3yubj)}(hu``addr`` station's MAC address - duplicated from public part to let the hash table work with just a single cacheline h](j)}(h``addr``h]j)}(hj zh]haddr}(hj"zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMNhjzubj)}(hhh]h)}(hkstation's MAC address - duplicated from public part to let the hash table work with just a single cachelineh]hmstation’s MAC address - duplicated from public part to let the hash table work with just a single cacheline}(hj9zhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMMhj6zubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhj5zhMNhj3yubj)}(h,``local`` pointer to the global information h](j)}(h ``local``h]j)}(hjZzh]hlocal}(hj\zhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXzubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMOhjTzubj)}(hhh]h)}(h!pointer to the global informationh]h!pointer to the global information}(hjszhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjozhMOhjpzubah}(h]h ]h"]h$]h&]uh1jhjTzubeh}(h]h ]h"]h$]h&]uh1jhjozhMOhj3yubj)}(h4``sdata`` virtual interface this station belongs to h](j)}(h ``sdata``h]j)}(hjzh]hsdata}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMPhjzubj)}(hhh]h)}(h)virtual interface this station belongs toh]h)virtual interface this station belongs to}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMPhjzubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhjzhMPhj3yubj)}(h7``ptk`` peer keys negotiated with this station, if any h](j)}(h``ptk``h]j)}(hjzh]hptk}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMQhjzubj)}(hhh]h)}(h.peer keys negotiated with this station, if anyh]h.peer keys negotiated with this station, if any}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMQhjzubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhjzhMQhj3yubj)}(h*``ptk_idx`` last installed peer key index h](j)}(h ``ptk_idx``h]j)}(hj{h]hptk_idx}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMRhjzubj)}(hhh]h)}(hlast installed peer key indexh]hlast installed peer key index}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMRhj{ubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1jhj{hMRhj3yubj)}(h/``rate_ctrl`` rate control algorithm reference h](j)}(h ``rate_ctrl``h]j)}(hj>{h]h rate_ctrl}(hj@{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<{ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMShj8{ubj)}(hhh]h)}(h rate control algorithm referenceh]h rate control algorithm reference}(hjW{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjS{hMShjT{ubah}(h]h ]h"]h$]h&]uh1jhj8{ubeh}(h]h ]h"]h$]h&]uh1jhjS{hMShj3yubj)}(h8``rate_ctrl_priv`` rate control private per-STA pointer h](j)}(h``rate_ctrl_priv``h]j)}(hjw{h]hrate_ctrl_priv}(hjy{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhju{ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMVhjq{ubj)}(hhh]h)}(h$rate control private per-STA pointerh]h$rate control private per-STA pointer}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hMVhj{ubah}(h]h ]h"]h$]h&]uh1jhjq{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMVhj3yubj)}(hu``rate_ctrl_lock`` spinlock used to protect rate control data (data inside the algorithm, so serializes calls there) h](j)}(h``rate_ctrl_lock``h]j)}(hj{h]hrate_ctrl_lock}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMUhj{ubj)}(hhh]h)}(haspinlock used to protect rate control data (data inside the algorithm, so serializes calls there)h]haspinlock used to protect rate control data (data inside the algorithm, so serializes calls there)}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMThj{ubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMUhj3yubj)}(h\``lock`` used for locking all fields that require locking, see comments in the header file. h](j)}(h``lock``h]j)}(hj{h]hlock}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMXhj{ubj)}(hhh]h)}(hRused for locking all fields that require locking, see comments in the header file.h]hRused for locking all fields that require locking, see comments in the header file.}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMWhj|ubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhj{hMXhj3yubj)}(h$``fast_tx`` TX fastpath information h](j)}(h ``fast_tx``h]j)}(hj$|h]hfast_tx}(hj&|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"|ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhj|ubj)}(hhh]h)}(hTX fastpath informationh]hTX fastpath information}(hj=|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9|hMhj:|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj9|hMhj3yubj)}(h$``fast_rx`` RX fastpath information h](j)}(h ``fast_rx``h]j)}(hj]|h]hfast_rx}(hj_|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[|ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjW|ubj)}(hhh]h)}(hRX fastpath informationh]hRX fastpath information}(hjv|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjr|hMhjs|ubah}(h]h ]h"]h$]h&]uh1jhjW|ubeh}(h]h ]h"]h$]h&]uh1jhjr|hMhj3yubj)}(h``mesh`` mesh STA information h](j)}(h``mesh``h]j)}(hj|h]hmesh}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMnhj|ubj)}(hhh]h)}(hmesh STA informationh]hmesh STA information}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMnhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj|hMnhj3yubj)}(hI``drv_deliver_wk`` used for delivering frames after driver PS unblocking h](j)}(h``drv_deliver_wk``h]j)}(hj|h]hdrv_deliver_wk}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMYhj|ubj)}(hhh]h)}(h5used for delivering frames after driver PS unblockingh]h5used for delivering frames after driver PS unblocking}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|hMYhj|ubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhj|hMYhj3yubj)}(hM``listen_interval`` listen interval of this station, when we're acting as AP h](j)}(h``listen_interval``h]j)}(hj}h]hlisten_interval}(hj }hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMZhj}ubj)}(hhh]h)}(h8listen interval of this station, when we're acting as APh]h:listen interval of this station, when we’re acting as AP}(hj!}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMZhj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hMZhj3yubj)}(h*``dead`` set to true when sta is unlinked h](j)}(h``dead``h]j)}(hjA}h]hdead}(hjC}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMphj;}ubj)}(hhh]h)}(h set to true when sta is unlinkedh]h set to true when sta is unlinked}(hjZ}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjV}hMphjW}ubah}(h]h ]h"]h$]h&]uh1jhj;}ubeh}(h]h ]h"]h$]h&]uh1jhjV}hMphj3yubj)}(h@``removed`` set to true when sta is being removed from sta_list h](j)}(h ``removed``h]j)}(hjz}h]hremoved}(hj|}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjx}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMqhjt}ubj)}(hhh]h)}(h3set to true when sta is being removed from sta_listh]h3set to true when sta is being removed from sta_list}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMqhj}ubah}(h]h ]h"]h$]h&]uh1jhjt}ubeh}(h]h ]h"]h$]h&]uh1jhj}hMqhj3yubj)}(h<``uploaded`` set to true when sta is uploaded to the driver h](j)}(h ``uploaded``h]j)}(hj}h]huploaded}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMrhj}ubj)}(hhh]h)}(h.set to true when sta is uploaded to the driverh]h.set to true when sta is uploaded to the driver}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}hMrhj}ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj}hMrhj3yubj)}(hE``sta_state`` duplicates information about station state (for debug) h](j)}(h ``sta_state``h]j)}(hj}h]h sta_state}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMthj}ubj)}(hhh]h)}(h6duplicates information about station state (for debug)h]h6duplicates information about station state (for debug)}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMthj~ubah}(h]h ]h"]h$]h&]uh1jhj}ubeh}(h]h ]h"]h$]h&]uh1jhj~hMthj3yubj)}(hr``_flags`` STA flags, see :c:type:`enum ieee80211_sta_info_flags `, do not use directly h](j)}(h ``_flags``h]j)}(hj%~h]h_flags}(hj'~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#~ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhM[hj~ubj)}(hhh]h)}(hfSTA flags, see :c:type:`enum ieee80211_sta_info_flags `, do not use directlyh](hSTA flags, see }(hj>~hhhNhNubh)}(hB:c:type:`enum ieee80211_sta_info_flags `h]j)}(hjH~h]henum ieee80211_sta_info_flags}(hjJ~hhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjF~ubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jieee80211_sta_info_flagsuh1hhj:~hM[hj>~ubh, do not use directly}(hj>~hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj:~hM[hj;~ubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jhj:~hM[hj3yubj)}(hI``ps_lock`` used for powersave (when mac80211 is the AP) related locking h](j)}(h ``ps_lock``h]j)}(hj~h]hps_lock}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhM\hj{~ubj)}(hhh]h)}(h` points either here or to deflink.agg. h](j)}(h``cur``h]j)}(hjh]hcur}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(hqstorage for aggregation data :c:type:`struct ieee80211_sta ` points either here or to deflink.agg.h](hstorage for aggregation data }(hj hhhNhNubh)}(h.:c:type:`struct ieee80211_sta `h]j)}(hjh]hstruct ieee80211_sta}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}j ieee80211_stauh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhj ubh& points either here or to deflink.agg.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj2hMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj3yubj)}(hX``deflink`` This is the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink. h](j)}(h ``deflink``h]j)}(hjOh]hdeflink}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjIubj)}(hhh]h)}(hThis is the default link STA information, for non MLO STA all link specific STA information is accessed through **deflink** or through link[0] which points to address of **deflink**. For MLO Link STA the first added link STA will point to deflink.h](hpThis is the default link STA information, for non MLO STA all link specific STA information is accessed through }(hjhhhhNhNubj)}(h **deflink**h]hdeflink}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubh/ or through link[0] which points to address of }(hjhhhhNhNubj)}(h **deflink**h]hdeflink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubhB. For MLO Link STA the first added link STA will point to deflink.}(hjhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjeubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1jhjdhMhj3yubj)}(hX``link`` reference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP. h](j)}(h``link``h]j)}(hjh]hlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(hXreference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via **deflink** or link[0]. For MLO STA, first link STA being added will point its link pointer to **deflink** address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP.h](hreference to Link Sta entries. For Non MLO STA, except 1st link, i.e link[0] all links would be assigned to NULL by default and would access link information via }(hjƃhhhNhNubj)}(h **deflink**h]hdeflink}(hj΃hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƃubhT or link[0]. For MLO STA, first link STA being added will point its link pointer to }(hjƃhhhNhNubj)}(h **deflink**h]hdeflink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjƃubh address and remaining would be allocated and the address would be assigned to link[link_id] where link_id is the id assigned by the AP.}(hjƃhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMhjÃubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjƒhMhj3yubj)}(h4``sta`` station information we share with the driverh](j)}(h``sta``h]j)}(hj h]hsta}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMrhjubj)}(hhh]h)}(h,station information we share with the driverh]h,station information we share with the driver}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMshj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMrhj3yubeh}(h]h ]h"]h$]h&]uh1jhjxubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjphhhjphNubh)}(h**Description**h]j)}(hjNh]h Description}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMvhjphhubh)}(hXThis structure collects information about a station that mac80211 is communicating with.h]hXThis structure collects information about a station that mac80211 is communicating with.}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.hhMEhjphhubeh}(h]programming-informationah ]h"]programming informationah$]h&]uh1hhjphhhhhKubh)}(hhh](h)}(hSTA information lifetime rulesh]hSTA information lifetime rules}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hhhhhKubh)}(hSTA info structures (:c:type:`struct sta_info `) are managed in a hash table for faster lookup and a list for iteration. They are managed using RCU, i.e. access to the list and hash table is protected by RCU.h](hSTA info structures (}(hjhhhNhNubh)}(h$:c:type:`struct sta_info `h]j)}(hjh]hstruct sta_info}(hjhhhNhNubah}(h]h ](jkj|c-typeeh"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]refdocjw refdomainj|reftypetype refexplicitrefwarnjrj}jsta_infouh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK hjubh) are managed in a hash table for faster lookup and a list for iteration. They are managed using RCU, i.e. access to the list and hash table is protected by RCU.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK hj{hhubh)}(hXUpon allocating a STA info structure with sta_info_alloc(), the caller owns that structure. It must then insert it into the hash table using either sta_info_insert() or sta_info_insert_rcu(); only in the latter case (which acquires an rcu read section but must not be called from within one) will the pointer still be valid after the call. Note that the caller may not do much with the STA info before inserting it; in particular, it may not start any mesh peer link management or add encryption keys.h]hXUpon allocating a STA info structure with sta_info_alloc(), the caller owns that structure. It must then insert it into the hash table using either sta_info_insert() or sta_info_insert_rcu(); only in the latter case (which acquires an rcu read section but must not be called from within one) will the pointer still be valid after the call. Note that the caller may not do much with the STA info before inserting it; in particular, it may not start any mesh peer link management or add encryption keys.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK$hj{hhubh)}(hxWhen the insertion fails (sta_info_insert()) returns non-zero), the structure will have been freed by sta_info_insert()!h]hxWhen the insertion fails (sta_info_insert()) returns non-zero), the structure will have been freed by sta_info_insert()!}(hj̈́hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK-hj{hhubh)}(hXStation entries are added by mac80211 when you establish a link with a peer. This means different things for the different type of interfaces we support. For a regular station this mean we add the AP sta when we receive an association response from the AP. For IBSS this occurs when get to know about a peer on the same IBSS. For WDS we add the sta for the peer immediately upon device open. When using AP mode we add stations for each respective station upon request from userspace through nl80211.h]hXStation entries are added by mac80211 when you establish a link with a peer. This means different things for the different type of interfaces we support. For a regular station this mean we add the AP sta when we receive an association response from the AP. For IBSS this occurs when get to know about a peer on the same IBSS. For WDS we add the sta for the peer immediately upon device open. When using AP mode we add stations for each respective station upon request from userspace through nl80211.}(hj܄hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK0hj{hhubh)}(hZIn order to remove a STA info structure, various sta_info_destroy_*() calls are available.h]hZIn order to remove a STA info structure, various sta_info_destroy_*() calls are available.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK8hj{hhubh)}(hThere is no concept of ownership on a STA entry; each structure is owned by the global hash table/list until it is removed. All users of the structure need to be RCU protected so that the structure won't be freed before they are done using it.h]hThere is no concept of ownership on a STA entry; each structure is owned by the global hash table/list until it is removed. All users of the structure need to be RCU protected so that the structure won’t be freed before they are done using it.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.chK;hj{hhubeh}(h]sta-information-lifetime-rulesah ]h"]sta information lifetime rulesah$]h&]uh1hhjphhhhhKubeh}(h]station-info-handlingah ]h"]station info handlingah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hAggregation Functionsh]hAggregation Functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htid_ampdu_tx (C struct)c.tid_ampdu_txhNtauh1hhjhhhNhNubh)}(hhh](h)}(h tid_ampdu_txh]j)}(hstruct tid_ampdu_txh](j )}(hj h]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKubj)}(h h]h }(hjQhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj?hhhjPhKubj,)}(h tid_ampdu_txh]j2)}(hj=h]h tid_ampdu_tx}(hjchhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj_ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj?hhhjPhKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShj;hhhjPhKubah}(h]j6ah ](jWjXeh"]h$]h&]j\j])j^huh1hhjPhKhj8hhubj`)}(hhh]h)}(h!TID aggregation information (Tx).h]h!TID aggregation information (Tx).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubah}(h]h ]h"]h$]h&]uh1j_hj8hhhjPhKubeh}(h]h ](j|structeh"]h$]h&]jj|jjjjjjjuh1hhhhjhNhNubj)}(hXN**Definition**:: struct tid_ampdu_tx { struct rcu_head rcu_head; struct timer_list session_timer; struct timer_list addba_resp_timer; struct sk_buff_head pending; struct sta_info *sta; unsigned long state; unsigned long last_tx; u16 timeout; u8 dialog_token; u8 stop_initiator; bool tx_stop; u16 buf_size; u16 ssn; u16 failed_bar_ssn; bool bar_pending; bool amsdu; u8 tid; }; **Members** ``rcu_head`` rcu head for freeing structure ``session_timer`` check if we keep Tx-ing on the TID (by timeout value) ``addba_resp_timer`` timer for peer's response to addba request ``pending`` pending frames queue -- use sta's spinlock to protect ``sta`` station we are attached to ``state`` session state (see above) ``last_tx`` jiffies of last tx activity ``timeout`` session timeout value to be filled in ADDBA requests ``dialog_token`` dialog token for aggregation session ``stop_initiator`` initiator of a session stop ``tx_stop`` TX DelBA frame when stopping ``buf_size`` reorder buffer size at receiver ``ssn`` starting sequence number of the session ``failed_bar_ssn`` ssn of the last failed BAR tx attempt ``bar_pending`` BAR needs to be re-sent ``amsdu`` support A-MSDU within A-MDPU ``tid`` TID numberh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hXstruct tid_ampdu_tx { struct rcu_head rcu_head; struct timer_list session_timer; struct timer_list addba_resp_timer; struct sk_buff_head pending; struct sta_info *sta; unsigned long state; unsigned long last_tx; u16 timeout; u8 dialog_token; u8 stop_initiator; bool tx_stop; u16 buf_size; u16 ssn; u16 failed_bar_ssn; bool bar_pending; bool amsdu; u8 tid; };h]hXstruct tid_ampdu_tx { struct rcu_head rcu_head; struct timer_list session_timer; struct timer_list addba_resp_timer; struct sk_buff_head pending; struct sta_info *sta; unsigned long state; unsigned long last_tx; u16 timeout; u8 dialog_token; u8 stop_initiator; bool tx_stop; u16 buf_size; u16 ssn; u16 failed_bar_ssn; bool bar_pending; bool amsdu; u8 tid; };}hj…sbah}(h]h ]h"]h$]h&]jIjJuh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubh)}(h **Members**h]j)}(hjӅh]hMembers}(hjՅhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjхubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh](j)}(h,``rcu_head`` rcu head for freeing structure h](j)}(h ``rcu_head``h]j)}(hjh]hrcu_head}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hrcu head for freeing structureh]hrcu head for freeing structure}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hH``session_timer`` check if we keep Tx-ing on the TID (by timeout value) h](j)}(h``session_timer``h]j)}(hj+h]h session_timer}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj%ubj)}(hhh]h)}(h5check if we keep Tx-ing on the TID (by timeout value)h]h5check if we keep Tx-ing on the TID (by timeout value)}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhjubj)}(h@``addba_resp_timer`` timer for peer's response to addba request h](j)}(h``addba_resp_timer``h]j)}(hjdh]haddba_resp_timer}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj^ubj)}(hhh]h)}(h*timer for peer's response to addba requesth]h,timer for peer’s response to addba request}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhKhjubj)}(hB``pending`` pending frames queue -- use sta's spinlock to protect h](j)}(h ``pending``h]j)}(hjh]hpending}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h5pending frames queue -- use sta's spinlock to protecth]h7pending frames queue -- use sta’s spinlock to protect}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h#``sta`` station we are attached to h](j)}(h``sta``h]j)}(hjֆh]hsta}(hj؆hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԆubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjІubj)}(hhh]h)}(hstation we are attached toh]hstation we are attached to}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjІubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h$``state`` session state (see above) h](j)}(h ``state``h]j)}(hjh]hstate}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj ubj)}(hhh]h)}(hsession state (see above)h]hsession state (see above)}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhjubj)}(h(``last_tx`` jiffies of last tx activity h](j)}(h ``last_tx``h]j)}(hjHh]hlast_tx}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjBubj)}(hhh]h)}(hjiffies of last tx activityh]hjiffies of last tx activity}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hKhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj]hKhjubj)}(hA``timeout`` session timeout value to be filled in ADDBA requests h](j)}(h ``timeout``h]j)}(hjh]htimeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj{ubj)}(hhh]h)}(h4session timeout value to be filled in ADDBA requestsh]h4session timeout value to be filled in ADDBA requests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h6``dialog_token`` dialog token for aggregation session h](j)}(h``dialog_token``h]j)}(hjh]h dialog_token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h$dialog token for aggregation sessionh]h$dialog token for aggregation session}(hjӇhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjχhKhjЇubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjχhKhjubj)}(h/``stop_initiator`` initiator of a session stop h](j)}(h``stop_initiator``h]j)}(hjh]hstop_initiator}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hinitiator of a session stoph]hinitiator of a session stop}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h)``tx_stop`` TX DelBA frame when stopping h](j)}(h ``tx_stop``h]j)}(hj,h]htx_stop}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj&ubj)}(hhh]h)}(hTX DelBA frame when stoppingh]hTX DelBA frame when stopping}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjAhKhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhKhjubj)}(h-``buf_size`` reorder buffer size at receiver h](j)}(h ``buf_size``h]j)}(hjeh]hbuf_size}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj_ubj)}(hhh]h)}(hreorder buffer size at receiverh]hreorder buffer size at receiver}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhKhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhKhjubj)}(h0``ssn`` starting sequence number of the session h](j)}(h``ssn``h]j)}(hjh]hssn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h'starting sequence number of the sessionh]h'starting sequence number of the session}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h9``failed_bar_ssn`` ssn of the last failed BAR tx attempt h](j)}(h``failed_bar_ssn``h]j)}(hj׈h]hfailed_bar_ssn}(hjوhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjՈubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjшubj)}(hhh]h)}(h%ssn of the last failed BAR tx attempth]h%ssn of the last failed BAR tx attempt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjшubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h(``bar_pending`` BAR needs to be re-sent h](j)}(h``bar_pending``h]j)}(hjh]h bar_pending}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj ubj)}(hhh]h)}(hBAR needs to be re-senth]hBAR needs to be re-sent}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj&ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjubj)}(h'``amsdu`` support A-MSDU within A-MDPU h](j)}(h ``amsdu``h]j)}(hjIh]hamsdu}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjCubj)}(hhh]h)}(hsupport A-MSDU within A-MDPUh]hsupport A-MSDU within A-MDPU}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj^hKhj_ubah}(h]h ]h"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]uh1jhj^hKhjubj)}(h``tid`` TID numberh](j)}(h``tid``h]j)}(hjh]htid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj|ubj)}(hhh]h)}(h TID numberh]h TID number}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubah}(h]h ]h"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(h**Description**h]j)}(hjʼnh]h Description}(hjljhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjÉubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hqThis structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.h]hsThis structure’s lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.}(hjۉhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hThe TX path can access it under RCU lock-free if, and only if, the state has the flag ``HT_AGG_STATE_OPERATIONAL`` set. Otherwise, the TX path must also acquire the spinlock and re-check the state, see comments in the tx code touching it.h](hVThe TX path can access it under RCU lock-free if, and only if, the state has the flag }(hjhhhNhNubj)}(h``HT_AGG_STATE_OPERATIONAL``h]hHT_AGG_STATE_OPERATIONAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh| set. Otherwise, the TX path must also acquire the spinlock and re-check the state, see comments in the tx code touching it.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](htid_ampdu_rx (C struct)c.tid_ampdu_rxhNtauh1hhjhhhNhNubh)}(hhh](h)}(h tid_ampdu_rxh]j)}(hstruct tid_ampdu_rxh](j )}(hj h]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKubj)}(h h]h }(hj2hhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhj hhhj1hKubj,)}(h tid_ampdu_rxh]j2)}(hjh]h tid_ampdu_rx}(hjDhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hj@ubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hj hhhj1hKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjhhhj1hKubah}(h]jah ](jWjXeh"]h$]h&]j\j])j^huh1hhj1hKhjhhubj`)}(hhh]h)}(h!TID aggregation information (Rx).h]h!TID aggregation information (Rx).}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjchhubah}(h]h ]h"]h$]h&]uh1j_hjhhhj1hKubeh}(h]h ](j|structeh"]h$]h&]jj|jj~jj~jjjuh1hhhhjhNhNubj)}(hX**Definition**:: struct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; struct sk_buff_head *reorder_buf; unsigned long *reorder_time; struct sta_info *sta; struct timer_list session_timer; struct timer_list reorder_timer; unsigned long last_rx; u16 head_seq_num; u16 stored_mpdu_num; u16 ssn; u16 buf_size; u16 timeout; u8 tid; u8 auto_seq:1,removed:1, started:1; }; **Members** ``rcu_head`` RCU head used for freeing this struct ``reorder_lock`` serializes access to reorder buffer, see below. ``reorder_buf_filtered`` bitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing frames ``reorder_buf`` buffer to reorder incoming aggregated MPDUs. An MPDU may be an A-MSDU with individually reported subframes. ``reorder_time`` jiffies when skb was added ``sta`` station we are attached to ``session_timer`` check if peer keeps Tx-ing on the TID (by timeout value) ``reorder_timer`` releases expired frames from the reorder buffer. ``last_rx`` jiffies of last rx activity ``head_seq_num`` head sequence number in reordering buffer. ``stored_mpdu_num`` number of MPDUs in reordering buffer ``ssn`` Starting Sequence Number expected to be aggregated. ``buf_size`` buffer size for incoming A-MPDUs ``timeout`` reset timer value (in TUs). ``tid`` TID number ``auto_seq`` used for offloaded BA sessions to automatically pick head_seq_and and ssn. ``removed`` this session is removed (but might have been found due to RCU) ``started`` this session has started (head ssn or higher was received)h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hXstruct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; struct sk_buff_head *reorder_buf; unsigned long *reorder_time; struct sta_info *sta; struct timer_list session_timer; struct timer_list reorder_timer; unsigned long last_rx; u16 head_seq_num; u16 stored_mpdu_num; u16 ssn; u16 buf_size; u16 timeout; u8 tid; u8 auto_seq:1,removed:1, started:1; };h]hXstruct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; struct sk_buff_head *reorder_buf; unsigned long *reorder_time; struct sta_info *sta; struct timer_list session_timer; struct timer_list reorder_timer; unsigned long last_rx; u16 head_seq_num; u16 stored_mpdu_num; u16 ssn; u16 buf_size; u16 timeout; u8 tid; u8 auto_seq:1,removed:1, started:1; };}hjsbah}(h]h ]h"]h$]h&]jIjJuh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh](j)}(h3``rcu_head`` RCU head used for freeing this struct h](j)}(h ``rcu_head``h]j)}(hjӊh]hrcu_head}(hjՊhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjъubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj͊ubj)}(hhh]h)}(h%RCU head used for freeing this structh]h%RCU head used for freeing this struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhj͊ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(hA``reorder_lock`` serializes access to reorder buffer, see below. h](j)}(h``reorder_lock``h]j)}(hj h]h reorder_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h/serializes access to reorder buffer, see below.h]h/serializes access to reorder buffer, see below.}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hKhj"ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj!hKhjʊubj)}(h``reorder_buf_filtered`` bitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing frames h](j)}(h``reorder_buf_filtered``h]j)}(hjEh]hreorder_buf_filtered}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj?ubj)}(hhh]h)}(htbitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing framesh]htbitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing frames}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj[ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1jhjZhKhjʊubj)}(h|``reorder_buf`` buffer to reorder incoming aggregated MPDUs. An MPDU may be an A-MSDU with individually reported subframes. h](j)}(h``reorder_buf``h]j)}(hjh]h reorder_buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjyubj)}(hhh]h)}(hkbuffer to reorder incoming aggregated MPDUs. An MPDU may be an A-MSDU with individually reported subframes.h]hkbuffer to reorder incoming aggregated MPDUs. An MPDU may be an A-MSDU with individually reported subframes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(h,``reorder_time`` jiffies when skb was added h](j)}(h``reorder_time``h]j)}(hjh]h reorder_time}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hjiffies when skb was addedh]hjiffies when skb was added}(hjҋhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj΋hKhjϋubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj΋hKhjʊubj)}(h#``sta`` station we are attached to h](j)}(h``sta``h]j)}(hjh]hsta}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hstation we are attached toh]hstation we are attached to}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(hK``session_timer`` check if peer keeps Tx-ing on the TID (by timeout value) h](j)}(h``session_timer``h]j)}(hj+h]h session_timer}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj%ubj)}(hhh]h)}(h8check if peer keeps Tx-ing on the TID (by timeout value)h]h8check if peer keeps Tx-ing on the TID (by timeout value)}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hKhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhjʊubj)}(hC``reorder_timer`` releases expired frames from the reorder buffer. h](j)}(h``reorder_timer``h]j)}(hjdh]h reorder_timer}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj^ubj)}(hhh]h)}(h0releases expired frames from the reorder buffer.h]h0releases expired frames from the reorder buffer.}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjyhKhjzubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhjyhKhjʊubj)}(h(``last_rx`` jiffies of last rx activity h](j)}(h ``last_rx``h]j)}(hjh]hlast_rx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hjiffies of last rx activityh]hjiffies of last rx activity}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(h<``head_seq_num`` head sequence number in reordering buffer. h](j)}(h``head_seq_num``h]j)}(hj֌h]h head_seq_num}(hj،hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjԌubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjЌubj)}(hhh]h)}(h*head sequence number in reordering buffer.h]h*head sequence number in reordering buffer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjЌubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(h9``stored_mpdu_num`` number of MPDUs in reordering buffer h](j)}(h``stored_mpdu_num``h]j)}(hjh]hstored_mpdu_num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj ubj)}(hhh]h)}(h$number of MPDUs in reordering bufferh]h$number of MPDUs in reordering buffer}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hKhj%ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj$hKhjʊubj)}(h<``ssn`` Starting Sequence Number expected to be aggregated. h](j)}(h``ssn``h]j)}(hjHh]hssn}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjBubj)}(hhh]h)}(h3Starting Sequence Number expected to be aggregated.h]h3Starting Sequence Number expected to be aggregated.}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hKhj^ubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1jhj]hKhjʊubj)}(h.``buf_size`` buffer size for incoming A-MPDUs h](j)}(h ``buf_size``h]j)}(hjh]hbuf_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj{ubj)}(hhh]h)}(h buffer size for incoming A-MPDUsh]h buffer size for incoming A-MPDUs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(h(``timeout`` reset timer value (in TUs). h](j)}(h ``timeout``h]j)}(hjh]htimeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(hreset timer value (in TUs).h]hreset timer value (in TUs).}(hjӍhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjύhKhjЍubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjύhKhjʊubj)}(h``tid`` TID number h](j)}(h``tid``h]j)}(hjh]htid}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h TID numberh]h TID number}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubj)}(hX``auto_seq`` used for offloaded BA sessions to automatically pick head_seq_and and ssn. h](j)}(h ``auto_seq``h]j)}(hj,h]hauto_seq}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj&ubj)}(hhh]h)}(hJused for offloaded BA sessions to automatically pick head_seq_and and ssn.h]hJused for offloaded BA sessions to automatically pick head_seq_and and ssn.}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhKhjʊubj)}(hK``removed`` this session is removed (but might have been found due to RCU) h](j)}(h ``removed``h]j)}(hjfh]hremoved}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhj`ubj)}(hhh]h)}(h>this session is removed (but might have been found due to RCU)h]h>this session is removed (but might have been found due to RCU)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj{hKhj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1jhj{hKhjʊubj)}(hF``started`` this session has started (head ssn or higher was received)h](j)}(h ``started``h]j)}(hjh]hstarted}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubj)}(hhh]h)}(h:this session has started (head ssn or higher was received)h]h:this session has started (head ssn or higher was received)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjʊubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hqThis structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.h]hsThis structure’s lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hThe **reorder_lock** is used to protect the members of this struct, except for **timeout**, **buf_size** and **dialog_token**, which are constant across the lifetime of the struct (the dialog token being used only for debugging).h](hThe }(hjhhhNhNubj)}(h**reorder_lock**h]h reorder_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh; is used to protect the members of this struct, except for }(hjhhhNhNubj)}(h **timeout**h]htimeout}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, }(hjhhhNhNubj)}(h **buf_size**h]hbuf_size}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h**dialog_token**h]h dialog_token}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhh, which are constant across the lifetime of the struct (the dialog token being used only for debugging).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKhjhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hsta_ampdu_mlme (C struct)c.sta_ampdu_mlmehNtauh1hhjhhhNhNubh)}(hhh](h)}(hsta_ampdu_mlmeh]j)}(hstruct sta_ampdu_mlmeh](j )}(hj h]hstruct}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]j'ah"]h$]h&]uh1jhjshhhjhKubj,)}(hsta_ampdu_mlmeh]j2)}(hjqh]hsta_ampdu_mlme}(hjhhhNhNubah}(h]h ]j=ah"]h$]h&]uh1j1hjubah}(h]h ](jDjEeh"]h$]h&]jIjJuh1j+hjshhhjhKubeh}(h]h ]h"]h$]h&]jIjJjQuh1jjRjShjohhhjhKubah}(h]jjah ](jWjXeh"]h$]h&]j\j])j^huh1hhjhKhjlhhubj`)}(hhh]h)}(hSTA aggregation information.h]hSTA aggregation information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjhhubah}(h]h ]h"]h$]h&]uh1j_hjlhhhjhKubeh}(h]h ](j|structeh"]h$]h&]jj|jjяjjяjjjuh1hhhhjhNhNubj)}(hX**Definition**:: struct sta_ampdu_mlme { struct tid_ampdu_rx __rcu *tid_rx[IEEE80211_NUM_TIDS]; u8 tid_rx_token[IEEE80211_NUM_TIDS]; unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_manage_offl[BITS_TO_LONGS(2 * IEEE80211_NUM_TIDS)]; unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; struct wiphy_work work; struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; struct tid_ampdu_tx *tid_start_tx[IEEE80211_NUM_TIDS]; unsigned long last_addba_req_time[IEEE80211_NUM_TIDS]; u8 addba_req_num[IEEE80211_NUM_TIDS]; u8 dialog_token_allocator; }; **Members** ``tid_rx`` aggregation info for Rx per TID -- RCU protected ``tid_rx_token`` dialog tokens for valid aggregation sessions ``tid_rx_timer_expired`` bitmap indicating on which TIDs the RX timer expired until the work for it runs ``tid_rx_stop_requested`` bitmap indicating which BA sessions per TID the driver requested to close until the work for it runs ``tid_rx_manage_offl`` bitmap indicating which BA sessions were requested to be treated as started/stopped due to offloading ``agg_session_valid`` bitmap indicating which TID has a rx BA session open on ``unexpected_agg`` bitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a session ``work`` work struct for starting/stopping aggregation ``tid_tx`` aggregation info for Tx per TID ``tid_start_tx`` sessions where start was requested, not just protected by wiphy mutex but also sta->lock ``last_addba_req_time`` timestamp of the last addBA request. ``addba_req_num`` number of times addBA request has been sent. ``dialog_token_allocator`` dialog token enumerator for each new session;h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjݏhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjُubh:}(hjُhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjՏubj)}(hXstruct sta_ampdu_mlme { struct tid_ampdu_rx __rcu *tid_rx[IEEE80211_NUM_TIDS]; u8 tid_rx_token[IEEE80211_NUM_TIDS]; unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_manage_offl[BITS_TO_LONGS(2 * IEEE80211_NUM_TIDS)]; unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; struct wiphy_work work; struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; struct tid_ampdu_tx *tid_start_tx[IEEE80211_NUM_TIDS]; unsigned long last_addba_req_time[IEEE80211_NUM_TIDS]; u8 addba_req_num[IEEE80211_NUM_TIDS]; u8 dialog_token_allocator; };h]hXstruct sta_ampdu_mlme { struct tid_ampdu_rx __rcu *tid_rx[IEEE80211_NUM_TIDS]; u8 tid_rx_token[IEEE80211_NUM_TIDS]; unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long tid_rx_manage_offl[BITS_TO_LONGS(2 * IEEE80211_NUM_TIDS)]; unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; struct wiphy_work work; struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; struct tid_ampdu_tx *tid_start_tx[IEEE80211_NUM_TIDS]; unsigned long last_addba_req_time[IEEE80211_NUM_TIDS]; u8 addba_req_num[IEEE80211_NUM_TIDS]; u8 dialog_token_allocator; };}hjsbah}(h]h ]h"]h$]h&]jIjJuh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hjՏubh)}(h **Members**h]j)}(hjh]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjՏubj)}(hhh](j)}(h<``tid_rx`` aggregation info for Rx per TID -- RCU protected h](j)}(h ``tid_rx``h]j)}(hj&h]htid_rx}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhj ubj)}(hhh]h)}(h0aggregation info for Rx per TID -- RCU protectedh]h0aggregation info for Rx per TID -- RCU protected}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hMhj<ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj;hMhjubj)}(h>``tid_rx_token`` dialog tokens for valid aggregation sessions h](j)}(h``tid_rx_token``h]j)}(hj_h]h tid_rx_token}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjYubj)}(hhh]h)}(h,dialog tokens for valid aggregation sessionsh]h,dialog tokens for valid aggregation sessions}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjthMhjuubah}(h]h ]h"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]uh1jhjthMhjubj)}(hi``tid_rx_timer_expired`` bitmap indicating on which TIDs the RX timer expired until the work for it runs h](j)}(h``tid_rx_timer_expired``h]j)}(hjh]htid_rx_timer_expired}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hjubj)}(hhh]h)}(hObitmap indicating on which TIDs the RX timer expired until the work for it runsh]hObitmap indicating on which TIDs the RX timer expired until the work for it runs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h``tid_rx_stop_requested`` bitmap indicating which BA sessions per TID the driver requested to close until the work for it runs h](j)}(h``tid_rx_stop_requested``h]j)}(hjҐh]htid_rx_stop_requested}(hjԐhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjАubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hj̐ubj)}(hhh]h)}(hdbitmap indicating which BA sessions per TID the driver requested to close until the work for it runsh]hdbitmap indicating which BA sessions per TID the driver requested to close until the work for it runs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hjubah}(h]h ]h"]h$]h&]uh1jhj̐ubeh}(h]h ]h"]h$]h&]uh1jhjhM hjubj)}(h}``tid_rx_manage_offl`` bitmap indicating which BA sessions were requested to be treated as started/stopped due to offloading h](j)}(h``tid_rx_manage_offl``h]j)}(hj h]htid_rx_manage_offl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(hebitmap indicating which BA sessions were requested to be treated as started/stopped due to offloadingh]hebitmap indicating which BA sessions were requested to be treated as started/stopped due to offloading}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhM hj"ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj!hMhjubj)}(hN``agg_session_valid`` bitmap indicating which TID has a rx BA session open on h](j)}(h``agg_session_valid``h]j)}(hjFh]hagg_session_valid}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhj@ubj)}(hhh]h)}(h7bitmap indicating which TID has a rx BA session open onh]h7bitmap indicating which TID has a rx BA session open on}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj\ubah}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ]h"]h$]h&]uh1jhj[hMhjubj)}(h``unexpected_agg`` bitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a session h](j)}(h``unexpected_agg``h]j)}(hjh]hunexpected_agg}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjyubj)}(hhh]h)}(hobitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a sessionh]hobitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a session}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjyubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(h7``work`` work struct for starting/stopping aggregation h](j)}(h``work``h]j)}(hjh]hwork}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(h-work struct for starting/stopping aggregationh]h-work struct for starting/stopping aggregation}(hjґhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjΑhMhjϑubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjΑhMhjubj)}(h+``tid_tx`` aggregation info for Tx per TID h](j)}(h ``tid_tx``h]j)}(hjh]htid_tx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(haggregation info for Tx per TIDh]haggregation info for Tx per TID}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hj``tid_start_tx`` sessions where start was requested, not just protected by wiphy mutex but also sta->lock h](j)}(h``tid_start_tx``h]j)}(hj+h]h tid_start_tx}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhj%ubj)}(hhh]h)}(hXsessions where start was requested, not just protected by wiphy mutex but also sta->lockh]hXsessions where start was requested, not just protected by wiphy mutex but also sta->lock}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj@hMhjubj)}(h=``last_addba_req_time`` timestamp of the last addBA request. h](j)}(h``last_addba_req_time``h]j)}(hjeh]hlast_addba_req_time}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhj_ubj)}(hhh]h)}(h$timestamp of the last addBA request.h]h$timestamp of the last addBA request.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]uh1jhjzhMhjubj)}(h?``addba_req_num`` number of times addBA request has been sent. h](j)}(h``addba_req_num``h]j)}(hjh]h addba_req_num}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubj)}(hhh]h)}(h,number of times addBA request has been sent.h]h,number of times addBA request has been sent.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(hH``dialog_token_allocator`` dialog token enumerator for each new session;h](j)}(h``dialog_token_allocator``h]j)}(hjגh]hdialog_token_allocator}(hjْhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjՒubah}(h]h ]h"]h$]h&]uh1jhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjђubj)}(hhh]h)}(h-dialog token enumerator for each new session;h]h-dialog token enumerator for each new session;}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjђubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjՏubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjhhhNhNubeh}(h]aggregation-functionsah ]h"]aggregation functionsah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSynchronisation Functionsh]hSynchronisation Functions}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKubh)}(hTBDh]hTBD}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubh)}(hLocking, lots of RCUh]hLocking, lots of RCU}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]synchronisation-functionsah ]h"]synchronisation functionsah$]h&]uh1hhhhhhhhKubeh}(h]mac80211-subsystem-advancedah ]h"]mac80211 subsystem (advanced)ah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jZjWjtjqj"j"j#j#j]&jZ&jW)jT)j>j>j=j=j>Gj;GjTjTjAWj>Wj[j[jDXjAXj[j[j`j`jojoj}pjzpjNpjKpjupjrpjpjpjpjpjjjxjujj jjjRjOu nametypes}(jZjtj"j#j]&jW)j>j=j>GjTjAWj[jDXj[j`joj}pjNpjupjpjpjjxjjjRuh}(jWhjqhhhjmjrjjjjjjj j j j j"jwjVj[jAjFjjjjjjjcjhj#j"jZ&j#j$j$jT)j`&j&j&j>jZ)j=j)j/+j4+jD,jI,j.j.j0j0jl3jq3j6j6jt9jy9j)<j.<j;Gj >jP>jU>jBjBjTjAGjlGjqGj9Mj>MjNjNj7QjWjTjUj#Uj[jDWjAXjUWj[jGXjYjYj`j[j\j\j]j]joj`j`j`jmbjrbjejejgjgj jjjjljljzpjojKpj pjrpjQpjpjpjpjpjjpjujpjpjqjxjxj j{jjj6j;jjjjjojOj u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.