€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ6/translations/zh_CN/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/zh_TW/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/it_IT/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/ja_JP/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/ko_KR/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/pt_BR/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ6/translations/sp_SP/driver-api/80211/mac80211-advanced”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒmac80211 subsystem (advanced)”h]”hŒmac80211 subsystem (advanced)”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced.rst”h´KubhŒ paragraph”“”)�”}”(hŒ·Information 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]”hŒ·Information 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.”…”�”}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒ LED support”h]”hŒ LED support”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhÛh²hh³hÊh´K ubhÌ)�”}”(hŒØMac80211 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]”hŒØMac80211 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.”…”�”}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hhÛh²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œieee80211_tpt_blink (C struct)”Œc.ieee80211_tpt_blink”hNt”auh1húhhÛh²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒieee80211_tpt_blink”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct ieee80211_tpt_blink”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jhjh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1j.hjh²hh³j-h´KubhŒ desc_name”“”)�”}”(hŒieee80211_tpt_blink”h]”hŒ desc_sig_name”“”)�”}”(hjh]”hŒieee80211_tpt_blink”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jEhjAubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”Œ xml:space”Œpreserve”uh1j?hjh²hh³j-h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^Œ add_permalink”ˆuh1jŒsphinx_line_type”Œ declarator”hjh²hh³j-h´Kubah}”(h]”j ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jh³j-h´Khj h²hubhŒ desc_content”“”)�”}”(hhh]”hÌ)�”}”(hŒthroughput blink description”h]”hŒthroughput blink description”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MOhjuh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj h²hh³j-h´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”j�Œobjtype”j‘Œdesctype”j‘Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j h²hhhÛh³Nh´NubhŒ 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]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¡ubhŒ:”…”�”}”(hj¡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MShj�ubhŒ literal_block”“”)�”}”(hŒGstruct ieee80211_tpt_blink { int throughput; int blink_time; };”h]”hŒGstruct ieee80211_tpt_blink { int throughput; int blink_time; };”…”�”}”hjÂsbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MUhj�ubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hjÓh]”hŒMembers”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MZhj�ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ&``throughput`` throughput in Kbit/sec ”h]”(hŒterm”“”)�”}”(hŒ``throughput``”h]”hŒliteral”“”)�”}”(hjøh]”hŒ throughput”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MQhjðubhŒ definition”“”)�”}”(hhh]”hÌ)�”}”(hŒthroughput in Kbit/sec”h]”hŒthroughput in Kbit/sec”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´MQhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjðubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´MQhjëubjï)�”}”(hŒS``blink_time`` blink time in milliseconds (full cycle, ie. one off + one on period)”h]”(jõ)�”}”(hŒ``blink_time``”h]”jû)�”}”(hj5h]”hŒ blink_time”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MRhj/ubj)�”}”(hhh]”hÌ)�”}”(hŒDblink time in milliseconds (full cycle, ie. one off + one on period)”h]”hŒDblink time in milliseconds (full cycle, ie. one off + one on period)”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jJh´MRhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jJh´MRhjëubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj�ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ(ieee80211_tpt_led_trigger_flags (C enum)”Œ!c.ieee80211_tpt_led_trigger_flags”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_tpt_led_trigger_flags”h]”j)�”}”(hŒ$enum ieee80211_tpt_led_trigger_flags”h]”(j)�”}”(hŒenum”h]”hŒenum”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjŠh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MYubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjŠh²hh³jœh´MYubj@)�”}”(hŒieee80211_tpt_led_trigger_flags”h]”jF)�”}”(hjˆh]”hŒieee80211_tpt_led_trigger_flags”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj«ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjŠh²hh³jœh´MYubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj†h²hh³jœh´MYubah}”(h]”j�ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jœh´MYhjƒh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒthroughput trigger flags”h]”hŒthroughput trigger flags”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MZhjÎh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjƒh²hh³jœh´MYubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–jéj—jéj˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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 AP”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hjóh]”hŒ Constants”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjñubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M^hjíubjê)�”}”(hhh]”(jï)�”}”(hŒ>``IEEE80211_TPT_LEDTRIG_FL_RADIO`` enable blinking with radio ”h]”(jõ)�”}”(hŒ"``IEEE80211_TPT_LEDTRIG_FL_RADIO``”h]”jû)�”}”(hjh]”hŒIEEE80211_TPT_LEDTRIG_FL_RADIO”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mahj ubj)�”}”(hhh]”hÌ)�”}”(hŒenable blinking with radio”h]”hŒenable blinking with radio”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j'h´Mahj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j'h´Mahj ubjï)�”}”(hŒ?``IEEE80211_TPT_LEDTRIG_FL_WORK`` enable blinking when working ”h]”(jõ)�”}”(hŒ!``IEEE80211_TPT_LEDTRIG_FL_WORK``”h]”jû)�”}”(hjKh]”hŒIEEE80211_TPT_LEDTRIG_FL_WORK”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MdhjEubj)�”}”(hhh]”hÌ)�”}”(hŒenable blinking when working”h]”hŒenable blinking when working”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j`h´Mdhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjEubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j`h´Mdhj ubjï)�”}”(hŒ‚``IEEE80211_TPT_LEDTRIG_FL_CONNECTED`` enable blinking when at least one interface is connected in some way, including being an AP”h]”(jõ)�”}”(hŒ&``IEEE80211_TPT_LEDTRIG_FL_CONNECTED``”h]”jû)�”}”(hj„h]”hŒ"IEEE80211_TPT_LEDTRIG_FL_CONNECTED”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mghj~ubj)�”}”(hhh]”hÌ)�”}”(hŒ[enable blinking when at least one interface is connected in some way, including being an AP”h]”hŒ[enable blinking when at least one interface is connected in some way, including being an AP”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j™h´Mghjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j™h´Mghj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjíubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ&ieee80211_get_tx_led_name (C function)”Œc.ieee80211_get_tx_led_name”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(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)�”}”(hŒconst”h]”hŒconst”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjÙh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mrubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÙh²hh³jëh´MrubhŒdesc_sig_keyword_type”“”)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1júhjÙh²hh³jëh´Mrubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÙh²hh³jëh´MrubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jhjÙh²hh³jëh´Mrubj@)�”}”(hŒieee80211_get_tx_led_name”h]”jF)�”}”(hŒieee80211_get_tx_led_name”h]”hŒieee80211_get_tx_led_name”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj*ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjÙh²hh³jëh´MrubhŒdesc_parameterlist”“”)�”}”(hŒ(struct ieee80211_hw *hw)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjJubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjJubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjiubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”Œ identifier”Œ reftarget”jnŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”j‡Œ ASTIdentifier”“”)�”}”j‚j0sbŒc.ieee80211_get_tx_led_name”†”asbuh1hhjJubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjJubj)�”}”(hjh]”hŒ*”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjJubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjJubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjDubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjÙh²hh³jëh´Mrubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÕh²hh³jëh´Mrubah}”(h]”jÐah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jëh´MrhjÒh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget name of TX LED”h]”hŒget name of TX LED”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MrhjÖh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÒh²hh³jëh´Mrubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jñj—jñj˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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¦)�”}”(hjûh]”hŒ Parameters”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjùubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mvhjõubjê)�”}”(hhh]”jï)�”}”(hŒI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjh]”hŒstruct ieee80211_hw *hw”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Myhjubj)�”}”(hhh]”hÌ)�”}”(hŒ,the hardware to get the LED trigger name for”h]”hŒ,the hardware to get the LED trigger name for”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j/h´Myhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j/h´Myhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhjõubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjUh]”hŒ Description”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjSubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M{hjõubhÌ)�”}”(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]”(hŒ¬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 ”…”�”}”(hjkh²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjkubhŒY if not configured for LEDs) of the trigger so you can automatically link the LED device.”…”�”}”(hjkh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MshjõubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjŽh]”hŒReturn”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MxhjõubhÌ)�”}”(hŒAThe name of the LED trigger. ``NULL`` if not configured for LEDs.”h]”(hŒThe name of the LED trigger. ”…”�”}”(hj¤h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¤ubhŒ if not configured for LEDs.”…”�”}”(hj¤h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M{hjõubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ&ieee80211_get_rx_led_name (C function)”Œc.ieee80211_get_rx_led_name”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(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)�”}”(hjßh]”hŒconst”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjáh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M‡ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjáh²hh³jòh´M‡ubjû)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjáh²hh³jòh´M‡ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjáh²hh³jòh´M‡ubj)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjáh²hh³jòh´M‡ubj@)�”}”(hŒieee80211_get_rx_led_name”h]”jF)�”}”(hŒieee80211_get_rx_led_name”h]”hŒieee80211_get_rx_led_name”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj*ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjáh²hh³jòh´M‡ubjC)�”}”(hŒ(struct ieee80211_hw *hw)”h]”jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjFubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjFubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjeubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jjŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j0sbŒc.ieee80211_get_rx_led_name”†”asbuh1hhjFubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjFubj)�”}”(hjh]”hŒ*”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjFubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjFubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjBubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjáh²hh³jòh´M‡ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÝh²hh³jòh´M‡ubah}”(h]”jØah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jòh´M‡hjÚh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget name of RX LED”h]”hŒget name of RX LED”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M‡hjÊh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÚh²hh³jòh´M‡ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jåj—jåj˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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¦)�”}”(hjïh]”hŒ Parameters”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjíubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M‹hjéubjê)�”}”(hhh]”jï)�”}”(hŒI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjh]”hŒstruct ieee80211_hw *hw”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MŽhjubj)�”}”(hhh]”hÌ)�”}”(hŒ,the hardware to get the LED trigger name for”h]”hŒ,the hardware to get the LED trigger name for”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j#h´MŽhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j#h´MŽhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhjéubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjIh]”hŒ Description”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M�hjéubhÌ)�”}”(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]”(hŒ«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 ”…”�”}”(hj_h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj_ubhŒY if not configured for LEDs) of the trigger so you can automatically link the LED device.”…”�”}”(hj_h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MˆhjéubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hj‚h]”hŒReturn”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M�hjéubhÌ)�”}”(hŒAThe name of the LED trigger. ``NULL`` if not configured for LEDs.”h]”(hŒThe name of the LED trigger. ”…”�”}”(hj˜h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj˜ubhŒ if not configured for LEDs.”…”�”}”(hj˜h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M�hjéubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ)ieee80211_get_assoc_led_name (C function)”Œc.ieee80211_get_assoc_led_name”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒCconst char * ieee80211_get_assoc_led_name (struct ieee80211_hw *hw)”h]”j)�”}”(hŒAconst char *ieee80211_get_assoc_led_name(struct ieee80211_hw *hw)”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjÕh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mœubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÕh²hh³jæh´Mœubjû)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjÕh²hh³jæh´Mœubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÕh²hh³jæh´Mœubj)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjÕh²hh³jæh´Mœubj@)�”}”(hŒieee80211_get_assoc_led_name”h]”jF)�”}”(hŒieee80211_get_assoc_led_name”h]”hŒieee80211_get_assoc_led_name”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjÕh²hh³jæh´MœubjC)�”}”(hŒ(struct ieee80211_hw *hw)”h]”jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj:ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj:ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjYubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j^Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j$sbŒc.ieee80211_get_assoc_led_name”†”asbuh1hhj:ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj:ubj)�”}”(hjh]”hŒ*”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj:ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj:ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj6ubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjÕh²hh³jæh´Mœubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÑh²hh³jæh´Mœubah}”(h]”jÌah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jæh´MœhjÎh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget name of association LED”h]”hŒget name of association LED”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´Mœhj¾h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÎh²hh³jæh´Mœubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jÙj—jÙj˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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¦)�”}”(hjãh]”hŒ Parameters”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjáubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M hjÝubjê)�”}”(hhh]”jï)�”}”(hŒI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hj h]”hŒstruct ieee80211_hw *hw”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M£hjüubj)�”}”(hhh]”hÌ)�”}”(hŒ,the hardware to get the LED trigger name for”h]”hŒ,the hardware to get the LED trigger name for”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j h´M£hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjüubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j h´M£hjùubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhjÝubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj= h]”hŒ Description”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj; ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M¥hjÝubhÌ)�”}”(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]”(hŒ¯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 ”…”�”}”(hjS h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjS ubhŒY if not configured for LEDs) of the trigger so you can automatically link the LED device.”…”�”}”(hjS h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M�hjÝubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjv h]”hŒReturn”…”�”}”(hjx h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjt ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M¢hjÝubhÌ)�”}”(hŒAThe name of the LED trigger. ``NULL`` if not configured for LEDs.”h]”(hŒThe name of the LED trigger. ”…”�”}”(hjŒ h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj” h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjŒ ubhŒ if not configured for LEDs.”…”�”}”(hjŒ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M¥hjÝubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ)ieee80211_get_radio_led_name (C function)”Œc.ieee80211_get_radio_led_name”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒCconst char * ieee80211_get_radio_led_name (struct ieee80211_hw *hw)”h]”j)�”}”(hŒAconst char *ieee80211_get_radio_led_name(struct ieee80211_hw *hw)”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjÉ h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M±ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÉ h²hh³jÚ h´M±ubjû)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjÉ h²hh³jÚ h´M±ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÉ h²hh³jÚ h´M±ubj)�”}”(hjh]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjÉ h²hh³jÚ h´M±ubj@)�”}”(hŒieee80211_get_radio_led_name”h]”jF)�”}”(hŒieee80211_get_radio_led_name”h]”hŒieee80211_get_radio_led_name”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjÉ h²hh³jÚ h´M±ubjC)�”}”(hŒ(struct ieee80211_hw *hw)”h]”jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj. ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj. ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjM ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jR Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j sbŒc.ieee80211_get_radio_led_name”†”asbuh1hhj. ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjp h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj. ubj)�”}”(hjh]”hŒ*”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj. ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj. ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj* ubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjÉ h²hh³jÚ h´M±ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÅ h²hh³jÚ h´M±ubah}”(h]”jÀ ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÚ h´M±hj h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget name of radio LED”h]”hŒget name of radio LED”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M±hj² h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj h²hh³jÚ h´M±ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jÍ j—jÍ j˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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Ù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÕ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MµhjÑ ubjê)�”}”(hhh]”jï)�”}”(hŒI``struct ieee80211_hw *hw`` the hardware to get the LED trigger name for ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjö h]”hŒstruct ieee80211_hw *hw”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjô ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M¸hjð ubj)�”}”(hhh]”hÌ)�”}”(hŒ,the hardware to get the LED trigger name for”h]”hŒ,the hardware to get the LED trigger name for”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j h´M¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjð ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j h´M¸hjí ubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhjÑ ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj1 h]”hŒ Description”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj/ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MºhjÑ 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]”(hŒ°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 ”…”�”}”(hjG h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjG ubhŒY if not configured for LEDs) of the trigger so you can automatically link the LED device.”…”�”}”(hjG h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M²hjÑ ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjj h]”hŒReturn”…”�”}”(hjl h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjh ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´M·hjÑ ubhÌ)�”}”(hŒAThe name of the LED trigger. ``NULL`` if not configured for LEDs.”h]”(hŒThe name of the LED trigger. ”…”�”}”(hj€ h²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjˆ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj€ ubhŒ if not configured for LEDs.”…”�”}”(hj€ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MºhjÑ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hhÛh²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ-ieee80211_create_tpt_led_trigger (C function)”Œ"c.ieee80211_create_tpt_led_trigger”hNt”auh1húhhÛh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ¨const 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)�”}”(hŒ¦const 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)�”}”(hjßh]”hŒconst”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj½ h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÆubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj½ h²hh³jÎ h´MÆubjû)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjÝ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj½ h²hh³jÎ h´MÆubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjë h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj½ h²hh³jÎ h´MÆubj)�”}”(hjh]”hŒ*”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj½ h²hh³jÎ h´MÆubj@)�”}”(hŒ ieee80211_create_tpt_led_trigger”h]”jF)�”}”(hŒ ieee80211_create_tpt_led_trigger”h]”hŒ ieee80211_create_tpt_led_trigger”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj½ h²hh³jÎ h´MÆubjC)�”}”(hŒz(struct ieee80211_hw *hw, unsigned int flags, const struct ieee80211_tpt_blink *blink_table, unsigned int blink_table_len)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj" ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj" ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjD h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjA ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jF Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j sbŒ"c.ieee80211_create_tpt_led_trigger”†”asbuh1hhj" ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjd h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj" ubj)�”}”(hjh]”hŒ*”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj" ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj" ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj ubjI)�”}”(hŒunsigned int flags”h]”(jû)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj” ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj” ubjû)�”}”(hŒint”h]”hŒint”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj” ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj” ubjF)�”}”(hŒflags”h]”hŒflags”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj” ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj ubjI)�”}”(hŒ-const struct ieee80211_tpt_blink *blink_table”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjå ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjå ubj)�”}”(hj h]”hŒstruct”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjå ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjå ubh)�”}”(hhh]”jF)�”}”(hŒieee80211_tpt_blink”h]”hŒieee80211_tpt_blink”…”�”}”(hj" h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j$ Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j` Œ"c.ieee80211_create_tpt_led_trigger”†”asbuh1hhjå ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjå ubj)�”}”(hjh]”hŒ*”…”�”}”(hjN h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjå ubjF)�”}”(hŒ blink_table”h]”hŒ blink_table”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjå ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj ubjI)�”}”(hŒunsigned int blink_table_len”h]”(jû)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjp ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‚ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjp ubjû)�”}”(hŒint”h]”hŒint”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjp ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjž h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjp ubjF)�”}”(hŒblink_table_len”h]”hŒblink_table_len”…”�”}”(hj¬ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjp ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj½ h²hh³jÎ h´MÆubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj¹ h²hh³jÎ h´MÆubah}”(h]”j´ ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÎ h´MÆhj¶ h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒcreate throughput LED trigger”h]”hŒcreate throughput LED trigger”…”�”}”(hjÖ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÆhjÓ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj¶ h²hh³jÎ h´MÆubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jî j—jî j˜‰j™‰jš‰uh1j h²hhhÛh³Nh´Nubjœ)�”}”(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ú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjö ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÊhjò ubjê)�”}”(hhh]”(jï)�”}”(hŒC``struct ieee80211_hw *hw`` the hardware to create the trigger for ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjh]”hŒstruct ieee80211_hw *hw”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÇhjubj)�”}”(hhh]”hÌ)�”}”(hŒ&the hardware to create the trigger for”h]”hŒ&the hardware to create the trigger for”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j,h´MÇhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j,h´MÇhjubjï)�”}”(hŒ{``unsigned int flags`` trigger flags, see :c:type:`enum ieee80211_tpt_led_trigger_flags ` ”h]”(jõ)�”}”(hŒ``unsigned int flags``”h]”jû)�”}”(hjPh]”hŒunsigned int flags”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÈhjJubj)�”}”(hhh]”hÌ)�”}”(hŒctrigger flags, see :c:type:`enum ieee80211_tpt_led_trigger_flags `”h]”(hŒtrigger flags, see ”…”�”}”(hjih²hh³Nh´Nubh)�”}”(hŒP:c:type:`enum ieee80211_tpt_led_trigger_flags `”h]”jû)�”}”(hjsh]”hŒ$enum ieee80211_tpt_led_trigger_flags”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”(Œxref”j�Œc-type”eh"]”h$]”h&]”uh1júhjqubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ"driver-api/80211/mac80211-advanced”Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‰)�”}”jŒ]”sbŒ reftarget”Œieee80211_tpt_led_trigger_flags”uh1hh³jeh´MÈhjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jeh´MÈhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jeh´MÈhjubjï)�”}”(hŒg``const struct ieee80211_tpt_blink *blink_table`` the blink table -- needs to be ordered by throughput ”h]”(jõ)�”}”(hŒ1``const struct ieee80211_tpt_blink *blink_table``”h]”jû)�”}”(hj®h]”hŒ-const struct ieee80211_tpt_blink *blink_table”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÉhj¨ubj)�”}”(hhh]”hÌ)�”}”(hŒ4the blink table -- needs to be ordered by throughput”h]”hŒ4the blink table -- needs to be ordered by throughput”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÃh´MÉhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÃh´MÉhjubjï)�”}”(hŒ9``unsigned int blink_table_len`` size of the blink table ”h]”(jõ)�”}”(hŒ ``unsigned int blink_table_len``”h]”jû)�”}”(hjçh]”hŒunsigned int blink_table_len”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÊhjáubj)�”}”(hhh]”hÌ)�”}”(hŒsize of the blink table”h]”hŒsize of the blink table”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jüh´MÊhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjáubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jüh´MÊhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjò ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hj"h]”hŒReturn”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÌhjò ubhÌ)�”}”(hŒa``NULL`` (in case of error, or if no LED triggers are configured) or the name of the new trigger.”h]”(jû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj8ubhŒY (in case of error, or if no LED triggers are configured) or the name of the new trigger.”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÌhjò ubhÌ)�”}”(hŒ**Note**”h]”j¦)�”}”(hjWh]”hŒNote”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjUubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:17: ./include/net/mac80211.h”h´MÏhjò 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]”(hŒThe set_key() callback in the ”…”�”}”(hj«h²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_ops `”h]”jû)�”}”(hjµh]”hŒstruct ieee80211_ops”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj³ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_ops”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M‹ hj«ubhŒq for a given device is called to enable hardware acceleration of encryption and decryption. The callback takes a ”…”�”}”(hj«h²hh³Nh´Nubj¦)�”}”(hŒ**sta**”h]”hŒsta”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj«ubhX 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.”…”�”}”(hj«h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÒh´M‹ hj‹h²hubhÌ)�”}”(hŒâWhen 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]”(hŒ4When transmitting, the TX control data will use the ”…”�”}”(hjïh²hh³Nh´Nubj¦)�”}”(hŒ**hw_key_idx**”h]”hŒ hw_key_idx”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjïubhŒ) selected by the driver by modifying the ”…”�”}”(hjïh²hh³Nh´Nubh)�”}”(hŒ8:c:type:`struct ieee80211_key_conf `”h]”jû)�”}”(hj h]”hŒstruct ieee80211_key_conf”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œieee80211_key_conf”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M“ hjïubhŒ pointed to by the ”…”�”}”(hjïh²hh³Nh´Nubj¦)�”}”(hŒ**key**”h]”hŒkey”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjïubhŒ% parameter to the set_key() function.”…”�”}”(hjïh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j(h´M“ hj‹h²hubhÌ)�”}”(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]”(hŒThe set_key() call for the ”…”�”}”(hjEh²hh³Nh´Nubjû)�”}”(hŒ ``SET_KEY``”h]”hŒSET_KEY”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjEubhŒ4 command should return 0 if the key is now in use, -”…”�”}”(hjEh²hh³Nh´Nubjû)�”}”(hŒ``EOPNOTSUPP``”h]”hŒ EOPNOTSUPP”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjEubhŒ or -”…”�”}”(hjEh²hh³Nh´Nubjû)�”}”(hŒ ``ENOSPC``”h]”hŒENOSPC”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjEubhŒŽ 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.”…”�”}”(hjEh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M— hj‹h²hubhÌ)�”}”(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]”(hŒNote that in the case that the ”…”�”}”(hjŠh²hh³Nh´Nubj¦)�”}”(hŒ"**IEEE80211_HW_SW_CRYPTO_CONTROL**”h]”hŒIEEE80211_HW_SW_CRYPTO_CONTROL”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjŠubhŒÛ 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.”…”�”}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´Mœ hj‹h²hubhÌ)�”}”(hŒ5When the cmd is ``DISABLE_KEY`` then it must succeed.”h]”(hŒWhen the cmd is ”…”�”}”(hj«h²hh³Nh´Nubjû)�”}”(hŒ``DISABLE_KEY``”h]”hŒ DISABLE_KEY”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«ubhŒ then it must succeed.”…”�”}”(hj«h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M¡ hj‹h²hubhÌ)�”}”(hŒâNote 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]”hŒâNote 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.”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M£ hj‹h²hubhÌ)�”}”(hŒëThe :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]”(hŒThe ”…”�”}”(hjÛh²hh³Nh´Nubh)�”}”(hŒ8:c:type:`struct ieee80211_key_conf `”h]”jû)�”}”(hjåh]”hŒstruct ieee80211_key_conf”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjãubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œieee80211_key_conf”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M¨ hjÛubhŒ structure pointed to by the ”…”�”}”(hjÛh²hh³Nh´Nubj¦)�”}”(hŒ**key**”h]”hŒkey”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÛubhŒ‹ 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.”…”�”}”(hjÛh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M¨ hj‹h²hubhÌ)�”}”(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.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M­ hj‹h²hubhÌ)�”}”(hŒÐThe 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]”hŒÐThe 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).”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M· hj‹h²hubhÌ)�”}”(hŒëMac80211 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 mac80211”h]”(hŒ Mac80211 drivers should set the ”…”�”}”(hj=h²hh³Nh´Nubj¦)�”}”(hŒ(**NL80211_EXT_FEATURE_CAN_REPLACE_PTK0**”h]”hŒ$NL80211_EXT_FEATURE_CAN_REPLACE_PTK0”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj=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=h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:30: ./include/net/mac80211.h”h´M» hj‹h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_key_flags (C enum)”Œc.ieee80211_key_flags”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_key_flags”h]”j)�”}”(hŒenum ieee80211_key_flags”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjsh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjsh²hh³j„h´Kubj@)�”}”(hŒieee80211_key_flags”h]”jF)�”}”(hjqh]”hŒieee80211_key_flags”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj“ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjsh²hh³j„h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjoh²hh³j„h´Kubah}”(h]”jjah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j„h´Khjlh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ key flags”h]”hŒ key flags”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M2 hj¶h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjlh²hh³j„h´Kubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–jÑj—jÑj˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(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¦)�”}”(hjÛh]”hŒ Constants”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M6 hjÕub•jê)�”}”(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û)�”}”(hjúh]”hŒ#IEEE80211_KEY_FLAG_GENERATE_IV_MGMT”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M; hjôubj)�”}”(hhh]”hÌ)�”}”(hŒ†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]”hŒ†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).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M9 hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjôubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´M; hjñubjï)�”}”(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û)�”}”(hj4h]”hŒIEEE80211_KEY_FLAG_GENERATE_IV”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MA hj.ubj)�”}”(hhh]”hÌ)�”}”(hŒÍ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]”hŒÍ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.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M> hjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jIh´MA hjñubjï)�”}”(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û)�”}”(hjnh]”hŒ IEEE80211_KEY_FLAG_GENERATE_MMIC”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MF hjhubj)�”}”(hhh]”hÌ)�”}”(hŒgThis flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software.”h]”hŒgThis flag should be set by the driver for a TKIP key if it requires Michael MIC generation in software.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MD hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jƒh´MF hjñubjï)�”}”(hŒx``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û)�”}”(hj¨h]”hŒIEEE80211_KEY_FLAG_PAIRWISE”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MJ hj¢ubj)�”}”(hhh]”hÌ)�”}”(hŒWSet by mac80211, this flag indicates that the key is pairwise rather then a shared key.”h]”hŒWSet by mac80211, this flag indicates that the key is pairwise rather then a shared key.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MI hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j½h´MJ hjñubjï)�”}”(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û)�”}”(hjâh]”hŒIEEE80211_KEY_FLAG_SW_MGMT_TX”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MO hjÜubj)�”}”(hhh]”hÌ)�”}”(hŒ�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]”hŒ�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.”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MM hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j÷h´MO hjñubjï)�”}”(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]”hŒIEEE80211_KEY_FLAG_PUT_IV_SPACE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MW hjubj)�”}”(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]”(hŒ’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 ”…”�”}”(hj5h²hh³Nh´Nubj¦)�”}”(hŒ"**IEEE80211_KEY_FLAG_GENERATE_IV**”h]”hŒIEEE80211_KEY_FLAG_GENERATE_IV”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj5ubhŒu on the same key. Setting this flag does not necessarily mean that SKBs will have sufficient tailroom for ICV or MIC.”…”�”}”(hj5h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MR hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j1h´MW hjñubjï)�”}”(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û)�”}”(hjhh]”hŒIEEE80211_KEY_FLAG_RX_MGMT”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M` hjbubj)�”}”(hhh]”hÌ)�”}”(hX´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]”(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 ”…”�”}”(hj�h²hh³Nh´Nubjû)�”}”(hŒ!``IEEE80211_KEY_FLAG_SW_MGMT_TX``”h]”hŒIEEE80211_KEY_FLAG_SW_MGMT_TX”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ubhŒ# flag to encrypt such frames in SW.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MZ hj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjbubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j}h´M` hjñubjï)�”}”(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û)�”}”(hj´h]”hŒ#IEEE80211_KEY_FLAG_RESERVE_TAILROOM”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Me hj®ubj)�”}”(hhh]”hÌ)�”}”(hŒ 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]”hŒ 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.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mc hjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÉh´Me hjñubjï)�”}”(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û)�”}”(hjîh]”hŒ IEEE80211_KEY_FLAG_PUT_MIC_SPACE”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mj hjèubj)�”}”(hhh]”hÌ)�”}”(hŒ¢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]”(hŒmThis flag should be set by the driver for a TKIP key if it only requires MIC space. Do not set together with ”…”�”}”(hjh²hh³Nh´Nubj¦)�”}”(hŒ$**IEEE80211_KEY_FLAG_GENERATE_MMIC**”h]”hŒ IEEE80211_KEY_FLAG_GENERATE_MMIC”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjubhŒ on the same key.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mh hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjèubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´Mj hjñubjï)�”}”(hŒD``IEEE80211_KEY_FLAG_NO_AUTO_TX`` Key needs explicit Tx activation. ”h]”(jõ)�”}”(hŒ!``IEEE80211_KEY_FLAG_NO_AUTO_TX``”h]”jû)�”}”(hj:h]”hŒIEEE80211_KEY_FLAG_NO_AUTO_TX”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mm hj4ubj)�”}”(hhh]”hÌ)�”}”(hŒ!Key needs explicit Tx activation.”h]”hŒ!Key needs explicit Tx activation.”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jOh´Mm hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jOh´Mm hjñubjï)�”}”(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û)�”}”(hjsh]”hŒ IEEE80211_KEY_FLAG_GENERATE_MMIE”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjqubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mr hjmubj)�”}”(hhh]”hÌ)�”}”(hŒƒ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]”hŒƒ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”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mp hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jˆh´Mr hjñubjï)�”}”(hŒu``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û)�”}”(hj­h]”hŒIEEE80211_KEY_FLAG_SPP_AMSDU”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mu hj§ubj)�”}”(hhh]”hÌ)�”}”(hŒTSPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)”h]”hŒTSPP A-MSDUs can be used with this key (set by mac80211 from the sta->spp_amsdu flag)”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÂh´Mu hjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÂh´Mu hjñubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjÕubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjïh]”hŒ Description”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjíubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mx hj‹h²hubhÌ)�”}”(hŒ¬These 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 ”…”�”}”(hjh²hh³Nh´Nubj¦)�”}”(hŒ **flags**”h]”hŒflags”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjubhŒ parameter of ”…”�”}”(hjh²hh³Nh´Nubh)�”}”(hŒ8:c:type:`struct ieee80211_key_conf `”h]”jû)�”}”(hj!h]”hŒstruct ieee80211_key_conf”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œieee80211_key_conf”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M3 hjubhŒ.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j>h´M3 hj‹h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_key_conf (C struct)”Œc.ieee80211_key_conf”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_key_conf”h]”j)�”}”(hŒstruct ieee80211_key_conf”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj^h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M9 ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj^h²hh³joh´M9 ubj@)�”}”(hŒieee80211_key_conf”h]”jF)�”}”(hj\h]”hŒieee80211_key_conf”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj~ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj^h²hh³joh´M9 ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjZh²hh³joh´M9 ubah}”(h]”jUah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³joh´M9 hjWh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒkey information”h]”hŒkey information”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mp hj¡h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjWh²hh³joh´M9 ubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–j¼j—j¼j˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(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”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÄubhŒ:”…”�”}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mt hjÀubjÁ)�”}”(hŒÁ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[]; };”h]”hŒÁ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[]; };”…”�”}”hjásbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mv hjÀubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hjòh]”hŒMembers”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjðubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mƒ hjÀubjê)�”}”(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]”hŒtx_pn”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M{ hj ubj)�”}”(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)”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mz hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j&h´M{ hjubjï)�”}”(hŒ,``cipher`` The key's cipher suite selector. ”h]”(jõ)�”}”(hŒ ``cipher``”h]”jû)�”}”(hjKh]”hŒcipher”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´My hjEubj)�”}”(hhh]”hÌ)�”}”(hŒ The key's cipher suite selector.”h]”hŒ"The key’s cipher suite selector.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j`h´My hjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjEubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j`h´My hjubjï)�”}”(hŒ-``icv_len`` The ICV length for this key type ”h]”(jõ)�”}”(hŒ ``icv_len``”h]”jû)�”}”(hj„h]”hŒicv_len”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‚ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M„ hj~ubj)�”}”(hhh]”hÌ)�”}”(hŒ The ICV length for this key type”h]”hŒ The ICV length for this key type”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j™h´M„ hjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j™h´M„ hjubjï)�”}”(hŒ+``iv_len`` The IV length for this key type ”h]”(jõ)�”}”(hŒ ``iv_len``”h]”jû)�”}”(hj½h]”hŒiv_len”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M… hj·ubj)�”}”(hhh]”hÌ)�”}”(hŒThe IV length for this key type”h]”hŒThe IV length for this key type”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÒh´M… hjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj·ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÒh´M… hjubjï)�”}”(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û)�”}”(hjöh]”hŒ hw_key_idx”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjôubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mx hjðubj)�”}”(hhh]”hÌ)�”}”(hŒŽ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]”hŒŽ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.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mv hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjðubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j h´Mx hjubjï)�”}”(hŒ``keyidx`` the key index (0-7) ”h]”(jõ)�”}”(hŒ ``keyidx``”h]”jû)�”}”(hj0h]”hŒkeyidx”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M} hj*ubj)�”}”(hhh]”hÌ)�”}”(hŒthe key index (0-7)”h]”hŒthe key index (0-7)”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jEh´M} hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jEh´M} hjubjï)�”}”(hŒS``flags`` key flags, see :c:type:`enum ieee80211_key_flags `. ”h]”(jõ)�”}”(hŒ ``flags``”h]”jû)�”}”(hjih]”hŒflags”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjgubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M| hjcubj)�”}”(hhh]”hÌ)�”}”(hŒHkey flags, see :c:type:`enum ieee80211_key_flags `.”h]”(hŒkey flags, see ”…”�”}”(hj‚h²hh³Nh´Nubh)�”}”(hŒ8:c:type:`enum ieee80211_key_flags `”h]”jû)�”}”(hjŒh]”hŒenum ieee80211_key_flags”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjŠubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œieee80211_key_flags”uh1hh³j~h´M| hj‚ubhŒ.”…”�”}”(hj‚h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j~h´M| hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjcubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j~h´M| hjubjï)�”}”(hŒ@``link_id`` the link ID, 0 for non-MLO, or -1 for pairwise keys ”h]”(jõ)�”}”(hŒ ``link_id``”h]”jû)�”}”(hjÅh]”hŒlink_id”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÃubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M† hj¿ubj)�”}”(hhh]”hÌ)�”}”(hŒ3the link ID, 0 for non-MLO, or -1 for pairwise keys”h]”hŒ3the link ID, 0 for non-MLO, or -1 for pairwise keys”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÚh´M† hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¿ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÚh´M† hjubjï)�”}”(hŒ``keylen`` key material length ”h]”(jõ)�”}”(hŒ ``keylen``”h]”jû)�”}”(hjþh]”hŒkeylen”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M~ hjøubj)�”}”(hhh]”hÌ)�”}”(hŒkey material length”h]”hŒkey material length”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M~ hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjøubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´M~ hjubjï)�”}”(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û)�”}”(hj7h]”hŒkey”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M‚ hj1ubj)�”}”(hhh]”hÌ)�”}”(hŒÑ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ŒÑ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)”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M hjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jLh´M‚ hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjÀubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjzh]”hŒ Description”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjxubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M† hj‹h²hubhÌ)�”}”(hŒ„This key information is given by mac80211 to the driver by the set_key() callback in :c:type:`struct ieee80211_ops `.”h]”(hŒUThis key information is given by mac80211 to the driver by the set_key() callback in ”…”�”}”(hj�h²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_ops `”h]”jû)�”}”(hjšh]”hŒstruct ieee80211_ops”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj˜ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_ops”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mq hj�ubhŒ.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j·h´Mq hj‹h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒset_key_cmd (C enum)”Œ c.set_key_cmd”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ set_key_cmd”h]”j)�”}”(hŒenum set_key_cmd”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj×h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mw ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj×h²hh³jèh´Mw ubj@)�”}”(hŒ set_key_cmd”h]”jF)�”}”(hjÕh]”hŒ set_key_cmd”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj÷ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj×h²hh³jèh´Mw ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÓh²hh³jèh´Mw ubah}”(h]”jÎah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jèh´Mw hjÐh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ key command”h]”hŒ key command”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MÁ hjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÐh²hh³jèh´Mw ubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–j5j—j5j˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(hŒS**Constants** ``SET_KEY`` a key is set ``DISABLE_KEY`` a key must be disabled”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hj?h]”hŒ Constants”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MÅ hj9ubjê)�”}”(hhh]”(jï)�”}”(hŒ``SET_KEY`` a key is set ”h]”(jõ)�”}”(hŒ ``SET_KEY``”h]”jû)�”}”(hj^h]”hŒSET_KEY”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MÈ hjXubj)�”}”(hhh]”hÌ)�”}”(hŒ a key is set”h]”hŒ a key is set”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jsh´MÈ hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjXubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jsh´MÈ hjUubjï)�”}”(hŒ&``DISABLE_KEY`` a key must be disabled”h]”(jõ)�”}”(hŒ``DISABLE_KEY``”h]”jû)�”}”(hj—h]”hŒ DISABLE_KEY”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MÊ hj‘ubj)�”}”(hhh]”hÌ)�”}”(hŒa key must be disabled”h]”hŒa key must be disabled”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MË hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¬h´MÊ hjUubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj9ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjÚh]”hŒ Description”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjØubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MÍ hj‹h²hubhÌ)�”}”(hŒ‹Used 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 ”…”�”}”(hjðh²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_ops `”h]”jû)�”}”(hjúh]”hŒstruct ieee80211_ops”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjøubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_ops”uh1hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M hjðubhŒ9, this indicates whether a key is being removed or added.”…”�”}”(hjðh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M hj‹h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ&ieee80211_get_tkip_p1k_iv (C function)”Œc.ieee80211_get_tkip_p1k_iv”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒWvoid ieee80211_get_tkip_p1k_iv (struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)”h]”j)�”}”(hŒVvoid ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj7h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj7h²hh³jIh´Mubj@)�”}”(hŒieee80211_get_tkip_p1k_iv”h]”jF)�”}”(hŒieee80211_get_tkip_p1k_iv”h]”hŒieee80211_get_tkip_p1k_iv”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjXubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj7h²hh³jIh´MubjC)�”}”(hŒ8(struct ieee80211_key_conf *keyconf, u32 iv32, u16 *p1k)”h]”(jI)�”}”(hŒ"struct ieee80211_key_conf *keyconf”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjtubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjtubh)�”}”(hhh]”jF)�”}”(hŒieee80211_key_conf”h]”hŒieee80211_key_conf”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj“ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j˜Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j^sbŒc.ieee80211_get_tkip_p1k_iv”†”asbuh1hhjtubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjtubj)�”}”(hjh]”hŒ*”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjtubjF)�”}”(hŒkeyconf”h]”hŒkeyconf”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjtubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjpubjI)�”}”(hŒu32 iv32”h]”(h)�”}”(hhh]”jF)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjêubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jïŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j²Œc.ieee80211_get_tkip_p1k_iv”†”asbuh1hhjæubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjæubjF)�”}”(hŒiv32”h]”hŒiv32”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjæubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjpubjI)�”}”(hŒu16 *p1k”h]”(h)�”}”(hhh]”jF)�”}”(hŒu16”h]”hŒu16”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj2ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j7Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j²Œc.ieee80211_get_tkip_p1k_iv”†”asbuh1hhj.ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj.ubj)�”}”(hjh]”hŒ*”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj.ubjF)�”}”(hŒp1k”h]”hŒp1k”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj.ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjpubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj7h²hh³jIh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj3h²hh³jIh´Mubah}”(h]”j.ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jIh´Mhj0h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget a TKIP phase 1 key for IV32”h]”hŒget a TKIP phase 1 key for IV32”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhj•h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj0h²hh³jIh´Mubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j°j—j°j˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(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¦)�”}”(hjºh]”hŒ Parameters”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhj´ubjê)�”}”(hhh]”(jï)�”}”(hŒM``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”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MhjÓubj)�”}”(hhh]”hÌ)�”}”(hŒ%the parameter passed with the set key”h]”hŒ%the parameter passed with the set key”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jîh´Mhjïubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jîh´MhjÐubjï)�”}”(hŒ%``u32 iv32`` IV32 to get the P1K for ”h]”(jõ)�”}”(hŒ ``u32 iv32``”h]”jû)�”}”(hjh]”hŒu32 iv32”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhj ubj)�”}”(hhh]”hÌ)�”}”(hŒIV32 to get the P1K for”h]”hŒIV32 to get the P1K for”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j'h´Mhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j'h´MhjÐubjï)�”}”(hŒH``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values ”h]”(jõ)�”}”(hŒ ``u16 *p1k``”h]”jû)�”}”(hjKh]”hŒu16 *p1k”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MhjEubj)�”}”(hhh]”hÌ)�”}”(hŒ:a buffer to which the key will be written, as 5 u16 values”h]”hŒ:a buffer to which the key will be written, as 5 u16 values”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j`h´Mhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjEubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j`h´MhjÐubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj´ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj†h]”hŒ Description”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhj´ubhÌ)�”}”(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.”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhj´ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ#ieee80211_get_tkip_p1k (C function)”Œc.ieee80211_get_tkip_p1k”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(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û)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjÇh²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÇh²hh³jÙh´Mubj@)�”}”(hŒieee80211_get_tkip_p1k”h]”jF)�”}”(hŒieee80211_get_tkip_p1k”h]”hŒieee80211_get_tkip_p1k”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjèubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjÇh²hh³jÙh´MubjC)�”}”(hŒC(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u16 *p1k)”h]”(jI)�”}”(hŒ"struct ieee80211_key_conf *keyconf”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjubh)�”}”(hhh]”jF)�”}”(hŒieee80211_key_conf”h]”hŒieee80211_key_conf”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj#ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j(Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jîsbŒc.ieee80211_get_tkip_p1k”†”asbuh1hhjubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjubj)�”}”(hjh]”hŒ*”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjubjF)�”}”(hŒkeyconf”h]”hŒkeyconf”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjubjI)�”}”(hŒstruct sk_buff *skb”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjvubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjvubh)�”}”(hhh]”jF)�”}”(hŒsk_buff”h]”hŒsk_buff”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj•ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jšŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jBŒc.ieee80211_get_tkip_p1k”†”asbuh1hhjvubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjvubj)�”}”(hjh]”hŒ*”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjvubjF)�”}”(hŒskb”h]”hŒskb”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjvubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjubjI)�”}”(hŒu16 *p1k”h]”(h)�”}”(hhh]”jF)�”}”(hŒu16”h]”hŒu16”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjêubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jïŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jBŒc.ieee80211_get_tkip_p1k”†”asbuh1hhjæubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjæubj)�”}”(hjh]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjæubjF)�”}”(hŒp1k”h]”hŒp1k”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjæubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjÇh²hh³jÙh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÃh²hh³jÙh´Mubah}”(h]”j¾ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÙh´MhjÀh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget a TKIP phase 1 key”h]”hŒget a TKIP phase 1 key”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MhjMh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÀh²hh³jÙh´Mubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jhj—jhj˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(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¦)�”}”(hjrh]”hŒ Parameters”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjpubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M hjlubjê)�”}”(hhh]”(jï)�”}”(hŒM``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”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M!hj‹ubj)�”}”(hhh]”hÌ)�”}”(hŒ%the parameter passed with the set key”h]”hŒ%the parameter passed with the set key”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¦h´M!hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¦h´M!hjˆubjï)�”}”(hŒd``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û)�”}”(hjÊh]”hŒstruct sk_buff *skb”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M#hjÄubj)�”}”(hhh]”hÌ)�”}”(hŒKthe packet to take the IV32 value from that will be encrypted with this P1K”h]”hŒKthe packet to take the IV32 value from that will be encrypted with this P1K”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M"hjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jßh´M#hjˆubjï)�”}”(hŒH``u16 *p1k`` a buffer to which the key will be written, as 5 u16 values ”h]”(jõ)�”}”(hŒ ``u16 *p1k``”h]”jû)�”}”(hjh]”hŒu16 *p1k”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M$hjþubj)�”}”(hhh]”hÌ)�”}”(hŒ:a buffer to which the key will be written, as 5 u16 values”h]”hŒ:a buffer to which the key will be written, as 5 u16 values”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M$hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´M$hjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjlubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj?h]”hŒ Description”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M&hjlubhÌ)�”}”(hŒTThis function returns the TKIP phase 1 key for the IV32 taken from the given packet.”h]”hŒTThis function returns the TKIP phase 1 key for the IV32 taken from the given packet.”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´Mhjlubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ#ieee80211_get_tkip_p2k (C function)”Œc.ieee80211_get_tkip_p2k”hNt”auh1húhj‹h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(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û)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj€h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj€h²hh³j’h´M?ubj@)�”}”(hŒieee80211_get_tkip_p2k”h]”jF)�”}”(hŒieee80211_get_tkip_p2k”h]”hŒieee80211_get_tkip_p2k”…”�”}”(hj¥h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj¡ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj€h²hh³j’h´M?ubjC)�”}”(hŒB(struct ieee80211_key_conf *keyconf, struct sk_buff *skb, u8 *p2k)”h]”(jI)�”}”(hŒ"struct ieee80211_key_conf *keyconf”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj½ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj½ubh)�”}”(hhh]”jF)�”}”(hŒieee80211_key_conf”h]”hŒieee80211_key_conf”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÜubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jáŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j§sbŒc.ieee80211_get_tkip_p2k”†”asbuh1hhj½ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj½ubj)�”}”(hjh]”hŒ*”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj½ubjF)�”}”(hŒkeyconf”h]”hŒkeyconf”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj½ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¹ubjI)�”}”(hŒstruct sk_buff *skb”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj3 h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj/ ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj@ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj/ ubh)�”}”(hhh]”jF)�”}”(hŒsk_buff”h]”hŒsk_buff”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjN ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jS Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jûŒc.ieee80211_get_tkip_p2k”†”asbuh1hhj/ ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj/ ubj)�”}”(hjh]”hŒ*”…”�”}”(hj} h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj/ ubjF)�”}”(hŒskb”h]”hŒskb”…”�”}”(hjŠ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj/ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¹ubjI)�”}”(hŒu8 *p2k”h]”(h)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj£ ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j¨ Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jûŒc.ieee80211_get_tkip_p2k”†”asbuh1hhjŸ ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÄ h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjŸ ubj)�”}”(hjh]”hŒ*”…”�”}”(hjÒ h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjŸ ubjF)�”}”(hŒp2k”h]”hŒp2k”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjŸ ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¹ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj€h²hh³j’h´M?ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj|h²hh³j’h´M?ubah}”(h]”jwah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j’h´M?hjyh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒget a TKIP phase 2 key”h]”hŒget a TKIP phase 2 key”…”�”}”(hj !h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M?hj!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjyh²hh³j’h´M?ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j!!j—j!!j˜‰j™‰jš‰uh1j h²hhj‹h³Nh´Nubjœ)�”}”(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-!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj)!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MChj%!ubjê)�”}”(hhh]”(jï)�”}”(hŒM``struct ieee80211_key_conf *keyconf`` the parameter passed with the set key ”h]”(jõ)�”}”(hŒ&``struct ieee80211_key_conf *keyconf``”h]”jû)�”}”(hjJ!h]”hŒ"struct ieee80211_key_conf *keyconf”…”�”}”(hjL!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjH!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MDhjD!ubj)�”}”(hhh]”hÌ)�”}”(hŒ%the parameter passed with the set key”h]”hŒ%the parameter passed with the set key”…”�”}”(hjc!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j_!h´MDhj`!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjD!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j_!h´MDhjA!ubjï)�”}”(hŒj``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û)�”}”(hjƒ!h]”hŒstruct sk_buff *skb”…”�”}”(hj…!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MFhj}!ubj)�”}”(hhh]”hÌ)�”}”(hŒQthe packet to take the IV32/IV16 values from that will be encrypted with this key”h]”hŒQthe packet to take the IV32/IV16 values from that will be encrypted with this key”…”�”}”(hjœ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MEhj™!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj}!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j˜!h´MFhjA!ubjï)�”}”(hŒ@``u8 *p2k`` a buffer to which the key will be written, 16 bytes ”h]”(jõ)�”}”(hŒ ``u8 *p2k``”h]”jû)�”}”(hj½!h]”hŒu8 *p2k”…”�”}”(hj¿!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj»!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MGhj·!ubj)�”}”(hhh]”hÌ)�”}”(hŒ3a buffer to which the key will be written, 16 bytes”h]”hŒ3a buffer to which the key will be written, 16 bytes”…”�”}”(hjÖ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÒ!h´MGhjÓ!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj·!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÒ!h´MGhjA!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj%!ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjø!h]”hŒ Description”…”�”}”(hjú!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjö!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´MIhj%!ubhÌ)�”}”(hŒHThis function computes the TKIP RC4 key for the IV values in the packet.”h]”hŒHThis function computes the TKIP RC4 key for the IV values in the packet.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:33: ./include/net/mac80211.h”h´M@hj%!ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj‹h²hh³Nh´Nubeh}”(h]”Œhardware-crypto-acceleration”ah ]”h"]”Œhardware crypto acceleration”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒPowersave support”h]”hŒPowersave support”…”�”}”(hj/"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj,"h²hh³hÊh´K+ubhÌ)�”}”(hŒ;mac80211 has support for various powersave implementations.”h]”hŒ;mac80211 has support for various powersave implementations.”…”�”}”(hj="h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´MÌ hj,"h²hubhÌ)�”}”(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]”(hŒkFirst, it can support hardware that handles all powersaving by itself; such hardware should simply set the ”…”�”}”(hjL"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_HW_SUPPORTS_PS``”h]”hŒIEEE80211_HW_SUPPORTS_PS”…”�”}”(hjT"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjL"ubhŒX hardware flag. In that case, it will be told about the desired powersave mode with the ”…”�”}”(hjL"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_CONF_PS``”h]”hŒIEEE80211_CONF_PS”…”�”}”(hjf"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjL"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.”…”�”}”(hjL"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´MÎ hj,"h²hubhÌ)�”}”(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]”hŒIEEE80211_CONF_PS”…”�”}”(hjƒ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj"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.”…”�”}”(hj"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´M× hj,"h²hubhÌ)�”}”(hŒËWhen 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]”hŒËWhen 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œ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´MÝ hj,"h²hubhÌ)�”}”(hXÞOther 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]”(hŒ°Other 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«"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_HW_SUPPORTS_PS``”h]”hŒIEEE80211_HW_SUPPORTS_PS”…”�”}”(hj³"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«"ubhŒ and ”…”�”}”(hj«"h²hh³Nh´Nubjû)�”}”(hŒ"``IEEE80211_HW_PS_NULLFUNC_STACK``”h]”hŒIEEE80211_HW_PS_NULLFUNC_STACK”…”�”}”(hjÅ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«"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«"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´Má hj,"h²hubhÌ)�”}”(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Þ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´Mé hj,"h²hubhÌ)�”}”(hX Dynamic 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]”(hŒwDynamic powersave is simply supported by mac80211 enabling and disabling PS based on traffic. Driver needs to only set ”…”�”}”(hjí"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_HW_SUPPORTS_PS``”h]”hŒIEEE80211_HW_SUPPORTS_PS”…”�”}”(hjõ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjí"ubhŒ† flag and mac80211 will handle everything automatically. Additionally, hardware having support for the dynamic PS feature may set the ”…”�”}”(hjí"h²hh³Nh´Nubjû)�”}”(hŒ$``IEEE80211_HW_SUPPORTS_DYNAMIC_PS``”h]”hŒ IEEE80211_HW_SUPPORTS_DYNAMIC_PS”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjí"ubhŒ^ flag to indicate that it can support dynamic PS mode itself. The driver needs to look at the ”…”�”}”(hjí"h²hh³N•h´Nubj¦)�”}”(hŒ**dynamic_ps_timeout**”h]”hŒdynamic_ps_timeout”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjí"ubhŒ= hardware configuration value and use it that value whenever ”…”�”}”(hjí"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_CONF_PS``”h]”hŒIEEE80211_CONF_PS”…”�”}”(hj+#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjí"ubhŒ[ is set. In this case mac80211 will disable dynamic PS feature in stack and will just keep ”…”�”}”(hjí"h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_CONF_PS``”h]”hŒIEEE80211_CONF_PS”…”�”}”(hj=#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjí"ubhŒ- enabled whenever user has enabled powersave.”…”�”}”(hjí"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´Mð hj,"h²hubhÌ)�”}”(hX…Driver 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]”(hŒ1Driver informs U-APSD client support by enabling ”…”�”}”(hjV#h²hh³Nh´Nubjû)�”}”(hŒ ``IEEE80211_VIF_SUPPORTS_UAPSD``”h]”hŒIEEE80211_VIF_SUPPORTS_UAPSD”…”�”}”(hj^#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjV#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.”…”�”}”(hjV#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´Mû hj,"h²hubhÌ)�”}”(hŒVNote: U-APSD client mode is not yet supported with ``IEEE80211_HW_PS_NULLFUNC_STACK``.”h]”(hŒ3Note: U-APSD client mode is not yet supported with ”…”�”}”(hjw#h²hh³Nh´Nubjû)�”}”(hŒ"``IEEE80211_HW_PS_NULLFUNC_STACK``”h]”hŒIEEE80211_HW_PS_NULLFUNC_STACK”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjw#ubhŒ.”…”�”}”(hjw#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:45: ./include/net/mac80211.h”h´Mhj,"h²hubeh}”(h]”Œpowersave-support”ah ]”h"]”Œpowersave support”ah$]”h&]”uh1hµhh·h²hh³hÊh´K+ubh¶)�”}”(hhh]”(h»)�”}”(hŒBeacon filter support”h]”hŒBeacon filter support”…”�”}”(hj£#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj #h²hh³hÊh´K1ubhÌ)�”}”(hXÞSome 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]”hXÞSome 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±#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M hj #h²hubhÌ)�”}”(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À#h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_VIF_BEACON_FILTER``”h]”hŒIEEE80211_VIF_BEACON_FILTER”…”�”}”(hjÈ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÀ#ubhŒp interface capability. The driver needs to enable beacon filter support whenever power save is enabled, that is ”…”�”}”(hjÀ#h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_CONF_PS``”h]”hŒIEEE80211_CONF_PS”…”�”}”(hjÚ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÀ#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À#h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´Mhj #h²hubhÌ)�”}”(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ó#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´Mhj #h²hubhÌ)�”}”(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”h]”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$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´Mhj #h²hubhŒ block_quote”“”)�”}”(hŒX- 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 IDs”h]”hÌ)�”}”(hj $h]”hŒ!a list of information element IDs”…”�”}”(hj"$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M!hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj$ubj$)�”}”(hŒ2a list of OUIs for the vendor information element ”h]”hÌ)�”}”(hŒ1a list of OUIs for the vendor information element”h]”hŒ1a list of OUIs for the vendor information element”…”�”}”(hj:$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M"hj6$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj$ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j$h³j/$h´M!hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$h³j/$h´M!hj #h²hubhÌ)�”}”(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.”…”�”}”(hj]$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M$hj #h²hubhÌ)�”}”(hŒNote that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon.”h]”hŒNote that change, for the sake of simplification, also includes information elements appearing or disappearing from the beacon.”…”�”}”(hjl$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M*hj #h²hubhÌ)�”}”(hXœSome 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]”hX Some 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.”…”�”}”(hj{$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M-hj #h²hubhÌ)�”}”(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.”…”�”}”(hjŠ$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M5hj #h²hubhÌ)�”}”(hŒ®If 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]”hŒ®If 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™$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:51: ./include/net/mac80211.h”h´M>hj #h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ"ieee80211_beacon_loss (C function)”Œc.ieee80211_beacon_loss”hNt”auh1húhj #h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ6void ieee80211_beacon_loss (struct ieee80211_vif *vif)”h]”j)�”}”(hŒ5void ieee80211_beacon_loss(struct ieee80211_vif *vif)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÁ$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj½$h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mnubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÐ$h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj½$h²hh³jÏ$h´Mnubj@)�”}”(hŒieee80211_beacon_loss”h]”jF)�”}”(hŒieee80211_beacon_loss”h]”hŒieee80211_beacon_loss”…”�”}”(hjâ$h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÞ$ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj½$h²hh³jÏ$h´MnubjC)�”}”(hŒ(struct ieee80211_vif *vif)”h]”jI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjþ$h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjú$ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj %h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjú$ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j%Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jä$sbŒc.ieee80211_beacon_loss”†”asbuh1hhjú$ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj<%h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjú$ubj)�”}”(hjh]”hŒ*”…”�”}”(hjJ%h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjú$ubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hjW%h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjú$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjö$ubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj½$h²hh³jÏ$h´Mnubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj¹$h²hh³jÏ$h´Mnubah}”(h]”j´$ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÏ$h´Mnhj¶$h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ(inform hardware does not receive beacons”h]”hŒ(inform hardware does not receive beacons”…”�”}”(hj�%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mnhj~%h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj¶$h²hh³jÏ$h´Mnubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j™%j—j™%j˜‰j™‰jš‰uh1j h²hhj #h³Nh´Nubjœ)�”}”(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¥%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¡%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mrhj�%ubjê)�”}”(hhh]”jï)�”}”(hŒv``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]”hŒstruct ieee80211_vif *vif”…”�”}”(hjÄ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÀ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mphj¼%ubj)�”}”(hhh]”hÌ)�”}”(hŒW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hjá%h]”hŒstruct ieee80211_vif”…”�”}”(hjã%h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjß%ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³j×%h´MphjÛ%ubhŒ) pointer from the add_interface callback.”…”�”}”(hjÛ%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j×%h´MphjØ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j×%h´Mphj¹%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhj�%ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj&h]”hŒ Description”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mrhj�%ubhÌ)�”}”(hŒÅ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Œ&When beacon filtering is enabled with ”…”�”}”(hj2&h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_VIF_BEACON_FILTER``”h]”hŒIEEE80211_VIF_BEACON_FILTER”…”�”}”(hj:&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj2&ubhŒ and ”…”�”}”(hj2&h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_CONF_PS``”h]”hŒIEEE80211_CONF_PS”…”�”}”(hjL&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj2&ubhŒf is set, the driver needs to inform whenever the hardware is not receiving beacons with this function.”…”�”}”(hj2&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:54: ./include/net/mac80211.h”h´Mqhj�%ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj #h²hh³Nh´Nubeh}”(h]”Œbeacon-filter-support”ah ]”h"]”Œbeacon filter support”ah$]”h&]”uh1hµhh·h²hh³hÊh´K1ubh¶)�”}”(hhh]”(h»)�”}”(hŒMultiple queues and QoS support”h]”hŒMultiple queues and QoS support”…”�”}”(hjw&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjt&h²hh³hÊh´K:ubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hj…&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K*h²hh³Nh´Nubj¦)�”}”(hŒ**allow_buffered_frames**”h]”hŒallow_buffered_frames”…”�”}”(hjF*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj>*ubhŒb callback; this callback is optional. mac80211 will then transmit the frames as usual and set the ”…”�”}”(hj>*h²hh³Nh´Nubjû)�”}”(hŒ!``IEEE80211_TX_CTL_NO_PS_BUFFER``”h]”hŒIEEE80211_TX_CTL_NO_PS_BUFFER”…”�”}”(hjX*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj>*ubhŒb on each frame. The last frame in the service period (or the only response to a PS-Poll) also has ”…”�”}”(hj>*h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_TX_STATUS_EOSP``”h]”hŒIEEE80211_TX_STATUS_EOSP”…”�”}”(hjj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj>*ubhŒh set to indicate that it ends the service period; as this frame must have TX status report it also sets ”…”�”}”(hj>*h²hh³Nh´Nubjû)�”}”(hŒ"``IEEE80211_TX_CTL_REQ_TX_STATUS``”h]”hŒIEEE80211_TX_CTL_REQ_TX_STATUS”…”�”}”(hj|*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj>*ubhŒ„. When TX status is reported for this frame, the service period is marked has having ended and a new one can be started by the peer.”…”�”}”(hj>*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´M¤hj©)h²hubhÌ)�”}”(hŒAdditionally, non-bufferable MMPDUs can also be transmitted by mac80211 with the ``IEEE80211_TX_CTL_NO_PS_BUFFER`` set in them.”h]”(hŒQAdditionally, non-bufferable MMPDUs can also be transmitted by mac80211 with the ”…”�”}”(hj•*h²hh³Nh´Nubjû)�”}”(hŒ!``IEEE80211_TX_CTL_NO_PS_BUFFER``”h]”hŒIEEE80211_TX_CTL_NO_PS_BUFFER”…”�”}”(hj�*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj•*ubhŒ set in them.”…”�”}”(hj•*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´M³hj©)h²hubhÌ)�”}”(hX«Another race condition can happen on some devices like iwlwifi when there are frames queued for the station and it wakes up or polls; the frames that are already queued could end up being transmitted first instead, causing reordering and/or wrong processing of the EOSP. The cause is that allowing frames to be transmitted to a certain station is out-of-band communication to the device. To allow this problem to be solved, the driver can call ieee80211_sta_block_awake() if frames are buffered when it is notified that the station went to sleep. When all these frames have been filtered (see above), it must call the function again to indicate that the station is no longer blocked.”h]”hX«Another race condition can happen on some devices like iwlwifi when there are frames queued for the station and it wakes up or polls; the frames that are already queued could end up being transmitted first instead, causing reordering and/or wrong processing of the EOSP. The cause is that allowing frames to be transmitted to a certain station is out-of-band communication to the device. To allow this problem to be solved, the driver can call ieee80211_sta_block_awake() if frames are buffered when it is notified that the station went to sleep. When all these frames have been filtered (see above), it must call the function again to indicate that the station is no longer blocked.”…”�”}”(hj¶*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´M¶hj©)h²hubhÌ)�”}”(hXpIf the driver buffers frames in the driver for aggregation in any way, it must use the ieee80211_sta_set_buffered() call when it is notified of the station going to sleep to inform mac80211 of any TIDs that have frames buffered. Note that when a station wakes up this information is reset (hence the requirement to call it when informed of the station going to sleep). Then, when a service period starts for any reason, **release_buffered_frames** is called with the number of frames to be released and which TIDs they are to come from. In this case, the driver is responsible for setting the EOSP (for uAPSD) and MORE_DATA bits in the released frames. To help the **more_data** parameter is passed to tell the driver if there is more data on other TIDs -- the TIDs to release frames from are ignored since mac80211 doesn't know how many frames the buffers for those TIDs contain.”h]”(hX¤If the driver buffers frames in the driver for aggregation in any way, it must use the ieee80211_sta_set_buffered() call when it is notified of the station going to sleep to inform mac80211 of any TIDs that have frames buffered. Note that when a station wakes up this information is reset (hence the requirement to call it when informed of the station going to sleep). Then, when a service period starts for any reason, ”…”�”}”(hjÅ*h²hh³Nh´Nubj¦)�”}”(hŒ**release_buffered_frames**”h]”hŒrelease_buffered_frames”…”�”}”(hjÍ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÅ*ubhŒÚ is called with the number of frames to be released and which TIDs they are to come from. In this case, the driver is responsible for setting the EOSP (for uAPSD) and MORE_DATA bits in the released frames. To help the ”…”�”}”(hjÅ*h²hh³Nh´Nubj¦)�”}”(hŒ **more_data**”h]”hŒ more_data”…”�”}”(hjß*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÅ*ubhŒÌ parameter is passed to tell the driver if there is more data on other TIDs -- the TIDs to release frames from are ignored since mac80211 doesn’t know how many frames the buffers for those TIDs contain.”…”�”}”(hjÅ*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´MÂhj©)h²hubhÌ)�”}”(hX³If the driver also implement GO mode, where absence periods may shorten service periods (or abort PS-Poll responses), it must filter those response frames except in the case of frames that are buffered in the driver -- those must remain buffered to avoid reordering. Because it is possible that no frames are released in this case, the driver must call ieee80211_sta_eosp() to indicate to mac80211 that the service period ended anyway.”h]”hX³If the driver also implement GO mode, where absence periods may shorten service periods (or abort PS-Poll responses), it must filter those response frames except in the case of frames that are buffered in the driver -- those must remain buffered to avoid reordering. Because it is possible that no frames are released in this case, the driver must call ieee80211_sta_eosp() to indicate to mac80211 that the service period ended anyway.”…”�”}”(hjø*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´MÑhj©)h²hubhÌ)�”}”(hXFFinally, if frames from multiple TIDs are released from mac80211 but the driver might reorder them, it must clear & set the flags appropriately (only the last frame may have ``IEEE80211_TX_STATUS_EOSP``) and also take care of the EOSP and MORE_DATA bits in the frame. The driver may also use ieee80211_sta_eosp() in this case.”h]”(hŒ®Finally, if frames from multiple TIDs are released from mac80211 but the driver might reorder them, it must clear & set the flags appropriately (only the last frame may have ”…”�”}”(hj+h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_TX_STATUS_EOSP``”h]”hŒIEEE80211_TX_STATUS_EOSP”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj+ubhŒ|) and also take care of the EOSP and MORE_DATA bits in the frame. The driver may also use ieee80211_sta_eosp() in this case.”…”�”}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´MÙhj©)h²hubhÌ)�”}”(hŒåNote that if the driver ever buffers frames other than QoS-data frames, it must take care to never send a non-QoS-data frame as the last frame in a service period, adding a QoS-nulldata frame after a non-QoS-data frame if needed.”h]”hŒåNote that if the driver ever buffers frames other than QoS-data frames, it must take care to never send a non-QoS-data frame as the last frame in a service period, adding a QoS-nulldata frame after a non-QoS-data frame if needed.”…”�”}”(hj(+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:78: ./include/net/mac80211.h”h´Mßhj©)h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ%ieee80211_frame_release_type (C enum)”Œc.ieee80211_frame_release_type”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_frame_release_type”h]”j)�”}”(hŒ!enum ieee80211_frame_release_type”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hjP+h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjL+h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj^+h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjL+h²hh³j]+h´Kubj@)�”}”(hŒieee80211_frame_release_type”h]”jF)�”}”(hjJ+h]”hŒieee80211_frame_release_type”…”�”}”(hjp+h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjl+ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjL+h²hh³j]+h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjH+h²hh³j]+h´Kubah}”(h]”jC+ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j]+h´KhjE+h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒframe release reason”h]”hŒframe release reason”…”�”}”(hj’+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M–hj�+h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjE+h²hh³j]+h´Kubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–jª+j—jª+j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(hŒ³**Constants** ``IEEE80211_FRAME_RELEASE_PSPOLL`` frame released for PS-Poll ``IEEE80211_FRAME_RELEASE_UAPSD`` frame(s) released due to frame received on trigger-enabled AC”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hj´+h]”hŒ Constants”…”�”}”(hj¶+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj²+ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mšhj®+ubjê)�”}”(hhh]”(jï)�”}”(hŒ>``IEEE80211_FRAME_RELEASE_PSPOLL`` frame released for PS-Poll ”h]”(jõ)�”}”(hŒ"``IEEE80211_FRAME_RELEASE_PSPOLL``”h]”jû)�”}”(hjÓ+h]”hŒIEEE80211_FRAME_RELEASE_PSPOLL”…”�”}”(hjÕ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÑ+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M�hjÍ+ubj)�”}”(hhh]”hÌ)�”}”(hŒframe released for PS-Poll”h]”hŒframe released for PS-Poll”…”�”}”(hjì+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jè+h´M�hjé+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÍ+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jè+h´M�hjÊ+ubjï)�”}”(hŒ_``IEEE80211_FRAME_RELEASE_UAPSD`` frame(s) released due to frame received on trigger-enabled AC”h]”(jõ)�”}”(hŒ!``IEEE80211_FRAME_RELEASE_UAPSD``”h]”jû)�”}”(hj ,h]”hŒIEEE80211_FRAME_RELEASE_UAPSD”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj ,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M hj,ubj)�”}”(hhh]”hÌ)�”}”(hŒ=frame(s) released due to frame received on trigger-enabled AC”h]”hŒ=frame(s) released due to frame received on trigger-enabled AC”…”�”}”(hj%,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j!,h´M hj",ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j!,h´M hjÊ+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj®+ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ(ieee80211_sta_ps_transition (C function)”Œc.ieee80211_sta_ps_transition”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒGint ieee80211_sta_ps_transition (struct ieee80211_sta *sta, bool start)”h]”j)�”}”(hŒFint ieee80211_sta_ps_transition(struct ieee80211_sta *sta, bool start)”h]”(jû)�”}”(hŒint”h]”hŒint”…”�”}”(hje,h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhja,h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mqubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjt,h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hja,h²hh³js,h´Mqubj@)�”}”(hŒieee80211_sta_ps_transition”h]”jF)�”}”(hŒieee80211_sta_ps_transition”h]”hŒieee80211_sta_ps_transition”…”�”}”(hj†,h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj‚,ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hja,h²hh³js,h´MqubjC)�”}”(hŒ'(struct ieee80211_sta *sta, bool start)”h]”(jI)�”}”(hŒstruct ieee80211_sta *sta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj¢,h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjž,ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¯,h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjž,ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hjÀ,h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj½,ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jÂ,Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jˆ,sbŒc.ieee80211_sta_ps_transition”†”asbuh1hhjž,ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjà,h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjž,ubj)�”}”(hjh]”hŒ*”…”�”}”(hjî,h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjž,ubjF)�”}”(hŒsta”h]”hŒsta”…”�”}”(hjû,h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjž,ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjš,ubjI)�”}”(hŒ bool start”h]”(jû)�”}”(hŒbool”h]”hŒbool”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj-ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"-h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj-ubjF)�”}”(hŒstart”h]”hŒstart”…”�”}”(hj0-h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj-ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjš,ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhja,h²hh³js,h´Mqubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj],h²hh³js,h´Mqubah}”(h]”jX,ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³js,h´MqhjZ,h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒPS transition for connected sta”h]”hŒPS transition for connected sta”…”�”}”(hjZ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MqhjW-h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjZ,h²hh³js,h´Mqubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jr-j—jr-j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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¦)�”}”(hj|-h]”hŒ Parameters”…”�”}”(hj~-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjz-ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Muhjv-ubjê)�”}”(hhh]”(jï)�”}”(hŒ6``struct ieee80211_sta *sta`` currently connected sta ”h]”(jõ)�”}”(hŒ``struct ieee80211_sta *sta``”h]”jû)�”}”(hj›-h]”hŒstruct ieee80211_sta *sta”…”�”}”(hj�-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj™-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M|hj•-ubj)�”}”(hhh]”hÌ)�”}”(hŒcurrently connected sta”h]”hŒcurrently connected sta”…”�”}”(hj´-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j°-h´M|hj±-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj•-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j°-h´M|hj’-ubjï)�”}”(hŒ ``bool start`` start or stop PS ”h]”(jõ)�”}”(hŒ``bool start``”h]”jû)�”}”(hjÔ-h]”hŒ bool start”…”�”}”(hjÖ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÒ-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M}hjÎ-ubj)�”}”(hhh]”hÌ)�”}”(hŒstart or stop PS”h]”hŒstart or stop PS”…”�”}”(hjí-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jé-h´M}hjê-ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÎ-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jé-h´M}hj’-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjv-ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj.h]”hŒ Description”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj .ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhjv-ubhÌ)�”}”(hŒ¡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.”h]”(hŒ#When operating in AP mode with the ”…”�”}”(hj%.h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_HW_AP_LINK_PS``”h]”hŒIEEE80211_HW_AP_LINK_PS”…”�”}”(hj-.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj%.ubhŒc flag set, use this function to inform mac80211 about a connected station entering/leaving PS mode.”…”�”}”(hj%.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mrhjv-ubhÌ)�”}”(hŒHThis function may not be called in IRQ context or with softirqs enabled.”h]”hŒHThis function may not be called in IRQ context or with softirqs enabled.”…”�”}”(hjF.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mvhjv-ubhÌ)�”}”(hŒUCalls to this function for a single hardware must be synchronized against each other.”h]”hŒUCalls to this function for a single hardware must be synchronized against each other.”…”�”}”(hjU.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mxhjv-ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjf.h]”hŒReturn”…”�”}”(hjh.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjd.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M{hjv-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.”…”�”}”(hj|.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhjv-ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ+ieee80211_sta_ps_transition_ni (C function)”Œ c.ieee80211_sta_ps_transition_ni”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒJint ieee80211_sta_ps_transition_ni (struct ieee80211_sta *sta, bool start)”h]”j)�”}”(hŒIint ieee80211_sta_ps_transition_ni(struct ieee80211_sta *sta, bool start)”h]”(jû)�”}”(hŒint”h]”hŒint”…”�”}”(hj«.h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj§.h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M„ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjº.h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj§.h²hh³j¹.h´M„ubj@)�”}”(hŒieee80211_sta_ps_transition_ni”h]”jF)�”}”(hŒieee80211_sta_ps_transition_ni”h]”hŒieee80211_sta_ps_transition_ni”…”�”}”(hjÌ.h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÈ.ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj§.h²hh³j¹.h´M„ubjC)�”}”(hŒ'(struct ieee80211_sta *sta, bool start)”h]”(jI)�”}”(hŒstruct ieee80211_sta *sta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjè.h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjä.ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjõ.h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjä.ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj/ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j/Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jÎ.sbŒ c.ieee80211_sta_ps_transition_ni”†”asbuh1hhjä.ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj&/h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjä.ubj)�”}”(hjh]”hŒ*”…”�”}”(hj4/h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjä.ubjF)�”}”(hŒsta”h]”hŒsta”…”�”}”(hjA/h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjä.ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjà.ubjI)�”}”(hŒ bool start”h]”(jû)�”}”(hj-h]”hŒbool”…”�”}”(hjZ/h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjV/ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjg/h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjV/ubjF)�”}”(hŒstart”h]”hŒstart”…”�”}”(hju/h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjV/ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjà.ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj§.h²hh³j¹.h´M„ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj£.h²hh³j¹.h´M„ubah}”(h]”jž.ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j¹.h´M„hj .h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ4PS transition for connected sta (in process context)”h]”hŒ4PS transition for connected sta (in process context)”…”�”}”(hjŸ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M„hjœ/h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj .h²hh³j¹.h´M„ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j·/j—j·/j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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Ã/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¿/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mˆhj»/ubjê)�”}”(hhh]”(jï)�”}”(hŒ6``struct ieee80211_sta *sta`` currently connected sta ”h]”(jõ)�”}”(hŒ``struct ieee80211_sta *sta``”h]”jû)�”}”(hjà/h]”hŒstruct ieee80211_sta *sta”…”�”}”(hjâ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÞ/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M‹hjÚ/ubj)�”}”(hhh]”hÌ)�”}”(hŒcurrently connected sta”h]”hŒcurrently connected sta”…”�”}”(hjù/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jõ/h´M‹hjö/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÚ/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jõ/h´M‹hj×/ubjï)�”}”(hŒ ``bool start`` start or stop PS ”h]”(jõ)�”}”(hŒ``bool start``”h]”jû)�”}”(hj0h]”hŒ bool start”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŒhj0ubj)�”}”(hhh]”hÌ)�”}”(hŒstart or stop PS”h]”hŒstart or stop PS”…”�”}”(hj20h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j.0h´MŒhj/0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j.0h´MŒhj×/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj»/ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjT0h]”hŒ Description”…”�”}”(hjV0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjR0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŽhj»/ubhÌ)�”}”(hŒ—Like ieee80211_sta_ps_transition() but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies.”h]”hŒ—Like ieee80211_sta_ps_transition() but can be called in process context (internally disables bottom halves). Concurrent call restriction still applies.”…”�”}”(hjj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M…hj»/ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hj{0h]”hŒReturn”…”�”}”(hj}0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjy0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M‰hj»/ubhÌ)�”}”(hŒ#Like ieee80211_sta_ps_transition().”h]”hŒ#Like ieee80211_sta_ps_transition().”…”�”}”(hj‘0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŽhj»/ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ'ieee80211_sta_set_buffered (C function)”Œc.ieee80211_sta_set_buffered”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒRvoid ieee80211_sta_set_buffered (struct ieee80211_sta *sta, u8 tid, bool buffered)”h]”j)�”}”(hŒQvoid ieee80211_sta_set_buffered(struct ieee80211_sta *sta, u8 tid, bool buffered)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÀ0h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj¼0h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÂubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏ0h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¼0h²hh³jÎ0h´MÂubj@)�”}”(hŒieee80211_sta_set_buffered”h]”jF)�”}”(hŒieee80211_sta_set_buffered”h]”hŒieee80211_sta_set_buffered”…”�”}”(hjá0h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÝ0ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj¼0h²hh³jÎ0h´MÂubjC)�”}”(hŒ2(struct ieee80211_sta *sta, u8 tid, bool buffered)”h]”(jI)�”}”(hŒstruct ieee80211_sta *sta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjý0h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjù0ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj 1h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjù0ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj1ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j1Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jã0sbŒc.ieee80211_sta_set_buffered”†”asbuh1hhjù0ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj;1h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjù0ubj)�”}”(hjh]”hŒ*”…”�”}”(hjI1h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjù0ubjF)�”}”(hŒsta”h]”hŒsta”…”�”}”(hjV1h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjù0ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjõ0ubjI)�”}”(hŒu8 tid”h]”(h)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjr1h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjo1ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jt1Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j71Œc.ieee80211_sta_set_buffered”†”asbuh1hhjk1ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�1h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjk1ubjF)�”}”(hŒtid”h]”hŒtid”…”�”}”(hjž1h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjk1ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjõ0ubjI)�”}”(hŒ bool buffered”h]”(jû)�”}”(hj-h]”hŒbool”…”�”}”(hj·1h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj³1ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÄ1h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj³1ubjF)�”}”(hŒbuffered”h]”hŒbuffered”…”�”}”(hjÒ1h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj³1ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjõ0ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj¼0h²hh³jÎ0h´MÂubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj¸0h²hh³jÎ0h´MÂubah}”(h]”j³0ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÎ0h´MÂhjµ0h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ,inform mac80211 about driver-buffered frames”h]”hŒ,inform mac80211 about driver-buffered frames”…”�”}”(hjü1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÂhjù1h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjµ0h²hh³jÎ0h´MÂubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j2j—j2j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ•)�”}”(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¦)�”}”(hj2h]”hŒ Parameters”…”�”}”(hj 2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÆhj2ubjê)�”}”(hhh]”(jï)�”}”(hŒn``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]”hŒstruct ieee80211_sta *sta”…”�”}”(hj?2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj;2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÃhj72ubj)�”}”(hhh]”hÌ)�”}”(hŒO:c:type:`struct ieee80211_sta ` pointer for the sleeping station”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_sta `”h]”jû)�”}”(hj\2h]”hŒstruct ieee80211_sta”…”�”}”(hj^2h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjZ2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_sta”uh1hh³jR2h´MÃhjV2ubhŒ! pointer for the sleeping station”…”�”}”(hjV2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jR2h´MÃhjS2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj72ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jR2h´MÃhj42ubjï)�”}”(hŒ,``u8 tid`` the TID that has buffered frames ”h]”(jõ)�”}”(hŒ ``u8 tid``”h]”jû)�”}”(hj•2h]”hŒu8 tid”…”�”}”(hj—2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj“2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÄhj�2ubj)�”}”(hhh]”hÌ)�”}”(hŒ the TID that has buffered frames”h]”hŒ the TID that has buffered frames”…”�”}”(hj®2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jª2h´MÄhj«2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jª2h´MÄhj42ubjï)�”}”(hŒL``bool buffered`` indicates whether or not frames are buffered for this TID ”h]”(jõ)�”}”(hŒ``bool buffered``”h]”jû)�”}”(hjÎ2h]”hŒ bool buffered”…”�”}”(hjÐ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÌ2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÅhjÈ2ubj)�”}”(hhh]”hÌ)�”}”(hŒ9indicates whether or not frames are buffered for this TID”h]”hŒ9indicates whether or not frames are buffered for this TID”…”�”}”(hjç2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jã2h´MÅhjä2ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈ2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jã2h´MÅhj42ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj2ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj 3h]”hŒ Description”…”�”}”(hj 3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÇhj2ubhÌ)�”}”(hŒÅ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.”h]”hŒÅ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.”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÆhj2ubhÌ)�”}”(hŒô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!)”h]”hŒö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!)”…”�”}”(hj.3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÊhj2ubhÌ)�”}”(hX˜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``).”h]”(hX‚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 ”…”�”}”(hj=3h²hh³Nh´Nubjû)�”}”(hŒ``STA_NOTIFY_SLEEP``”h]”hŒSTA_NOTIFY_SLEEP”…”�”}”(hjE3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj=3ubhŒ).”…”�”}”(hj=3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÏhj2ubhÌ)�”}”(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.”…”�”}”(hj^3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MÖhj2ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ!ieee80211_beacon_get (C function)”Œc.ieee80211_beacon_get”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒpstruct sk_buff * ieee80211_beacon_get (struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)”h]”j)�”}”(hŒnstruct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj�3h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj‰3h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj›3h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‰3h²hh³jš3h´Mubh)�”}”(hhh]”jF)�”}”(hŒsk_buff”h]”hŒsk_buff”…”�”}”(hj¬3h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj©3ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j®3Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚Œieee80211_beacon_get”sbŒc.ieee80211_beacon_get”†”asbuh1hhj‰3h²hh³jš3h´Mubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍ3h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‰3h²hh³jš3h´Mubj)�”}”(hjh]”hŒ*”…”�”}”(hjÛ3h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj‰3h²hh³jš3h´Mubj@)�”}”(hŒieee80211_beacon_get”h]”jF)�”}”(hjÊ3h]”hŒieee80211_beacon_get”…”�”}”(hjì3h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjè3ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj‰3h²hh³jš3h´MubjC)�”}”(hŒJ(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj4ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hj%4h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj"4ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j'4Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jÈ3Œc.ieee80211_beacon_get”†”asbuh1hhj4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjC4h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj4ubj)�”}”(hjh]”hŒ*”…”�”}”(hjQ4h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj4ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj^4h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj4ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÿ3ubjI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjw4h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjs4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„4h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjs4ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hj•4h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj’4ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j—4Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jÈ3Œc.ieee80211_beacon_get”†”asbuh1hhjs4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³4h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjs4ubj)�”}”(hjh]”hŒ*”…”�”}”(hjÁ4h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjs4ubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hjÎ4h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjs4ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÿ3ubjI)�”}”(hŒunsigned int link_id”h]”(jû)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjç4h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjã4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjõ4h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjã4ubjû)�”}”(hŒint”h]”hŒint”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjã4ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjã4ubjF)�”}”(hŒlink_id”h]”hŒlink_id”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjã4ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÿ3ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj‰3h²hh³jš3h´Mubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj…3h²hh³jš3h´Mubah}”(h]”j€3ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jš3h´Mhj‚3h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒbeacon generation function”h]”hŒbeacon generation function”…”�”}”(hjI5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MhjF5h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj‚3h²hh³jš3h´Mubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–ja5j—ja5j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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¦)�”}”(hjk5h]”hŒ Parameters”…”�”}”(hjm5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hji5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhje5ubjê)�”}”(hhh]”(jï)�”}”(hŒH``struct ieee80211_hw *hw`` pointer obtained from ieee80211_alloc_hw(). ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjŠ5h]”hŒstruct ieee80211_hw *hw”…”�”}”(hjŒ5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjˆ5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhj„5ubj)�”}”(hhh]”hÌ)�”}”(hŒ+pointer obtained from ieee80211_alloc_hw().”h]”hŒ+pointer obtained from ieee80211_alloc_hw().”…”�”}”(hj£5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jŸ5h´Mhj 5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj„5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jŸ5h´Mhj�5ubjï)�”}”(hŒv``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Ã5h]”hŒstruct ieee80211_vif *vif”…”�”}”(hjÅ5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÁ5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhj½5ubj)�”}”(hhh]”hÌ)�”}”(hŒW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hjâ5h]”hŒstruct ieee80211_vif”…”�”}”(hjä5h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjà5ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³jØ5h´MhjÜ5ubhŒ) pointer from the add_interface callback.”…”�”}”(hjÜ5h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jØ5h´MhjÙ5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj½5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jØ5h´Mhj�5ubjï)�”}”(hŒz``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]”hŒunsigned int link_id”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhj6ubj)�”}”(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).”…”�”}”(hj46h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhj16ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j06h´Mhj�5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhje5ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjW6h]”hŒ Description”…”�”}”(hjY6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjU6ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhje5ubhÌ)�”}”(hŒSee ieee80211_beacon_get_tim().”h]”hŒSee ieee80211_beacon_get_tim().”…”�”}”(hjm6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhje5ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hj~6h]”hŒReturn”…”�”}”(hj€6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj|6ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhje5ubhÌ)�”}”(hŒSee ieee80211_beacon_get_tim().”h]”hŒSee ieee80211_beacon_get_tim().”…”�”}”(hj”6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mhje5ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ&ieee80211_get_buffered_bc (C function)”Œc.ieee80211_get_buffered_bc”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(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]”hŒstruct”…”�”}”(hjÃ6h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj¿6h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Møubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÑ6h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¿6h²hh³jÐ6h´Møubh)�”}”(hhh]”jF)�”}”(hŒsk_buff”h]”hŒsk_buff”…”�”}”(hjâ6h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjß6ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jä6Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚Œieee80211_get_buffered_bc”sbŒc.ieee80211_get_buffered_bc”†”asbuh1hhj¿6h²hh³jÐ6h´Møubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¿6h²hh³jÐ6h´Møubj)�”}”(hjh]”hŒ*”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj¿6h²hh³jÐ6h´Møubj@)�”}”(hŒieee80211_get_buffered_bc”h]”jF)�”}”(hj7h]”hŒieee80211_get_buffered_bc”…”�”}”(hj"7h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj7ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj¿6h²hh³jÐ6h´MøubjC)�”}”(hŒ4(struct ieee80211_hw *hw, struct ieee80211_vif *vif)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj=7h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj97ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJ7h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj97ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hj[7h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjX7ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j]7Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jþ6Œc.ieee80211_get_buffered_bc”†”asbuh1hhj97ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjy7h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj97ubj)�”}”(hjh]”hŒ*”…”�”}”(hj‡7h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj97ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj”7h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj97ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj57ubjI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj­7h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj©7ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjº7h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj©7ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hjË7h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÈ7ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jÍ7Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jþ6Œc.ieee80211_get_buffered_bc”†”asbuh1hhj©7ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjé7h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj©7ubj)�”}”(hjh]”hŒ*”…”�”}”(hj÷7h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj©7ubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj©7ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj57ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj¿6h²hh³jÐ6h´Møubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj»6h²hh³jÐ6h´Møubah}”(h]”j¶6ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÐ6h´Møhj¸6h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ1accessing buffered broadcast and multicast frames”h]”hŒ1accessing buffered broadcast and multicast frames”…”�”}”(hj.8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Møhj+8h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj¸6h²hh³jÐ6h´Møubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jF8j—jF8j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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¦)�”}”(hjP8h]”hŒ Parameters”…”�”}”(hjR8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjN8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MühjJ8ubjê)�”}”(hhh]”(jï)�”}”(hŒK``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw(). ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjo8h]”hŒstruct ieee80211_hw *hw”…”�”}”(hjq8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjm8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mùhji8ubj)�”}”(hhh]”hÌ)�”}”(hŒ.pointer as obtained from ieee80211_alloc_hw().”h]”hŒ.pointer as obtained from ieee80211_alloc_hw().”…”�”}”(hjˆ8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j„8h´Mùhj…8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhji8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j„8h´Mùhjf8ubjï)�”}”(hŒv``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¨8h]”hŒstruct ieee80211_vif *vif”…”�”}”(hjª8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¦8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Múhj¢8ubj)�”}”(hhh]”hÌ)�”}”(hŒW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hjÇ8h]”hŒstruct ieee80211_vif”…”�”}”(hjÉ8h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjÅ8ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³j½8h´MúhjÁ8ubhŒ) pointer from the add_interface callback.”…”�”}”(hjÁ8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j½8h´Múhj¾8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¢8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j½8h´Múhjf8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjJ8ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj9h]”hŒ Description”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MühjJ8ubhÌ)�”}”(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.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MûhjJ8ubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hj)9h]”hŒReturn”…”�”}”(hj+9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj'9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MhjJ8ubhÌ)�”}”(hŒTA pointer to the next buffered skb or NULL if no more buffered frames are available.”h]”hŒTA pointer to the next buffered skb or NULL if no more buffered frames are available.”…”�”}”(hj?9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MhjJ8ubhÌ)�”}”(hŒ**Note**”h]”j¦)�”}”(hjP9h]”hŒNote”…”�”}”(hjR9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjN9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MhjJ8ubhÌ)�”}”(hXƒ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]”hXƒ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.”…”�”}”(hjf9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MhjJ8ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ&ieee80211_sta_block_awake (C function)”Œc.ieee80211_sta_block_awake”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒbvoid ieee80211_sta_block_awake (struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)”h]”j)�”}”(hŒavoid ieee80211_sta_block_awake(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj•9h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj‘9h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mlubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¤9h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‘9h²hh³j£9h´Mlubj@)�”}”(hŒieee80211_sta_block_awake”h]”jF)�”}”(hŒieee80211_sta_block_awake”h]”hŒieee80211_sta_block_awake”…”�”}”(hj¶9h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj²9ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj‘9h²hh³j£9h´MlubjC)�”}”(hŒC(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta, bool block)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjÒ9h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjÎ9ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjß9h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÎ9ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjð9h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjí9ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jò9Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j¸9sbŒc.ieee80211_sta_block_awake”†”asbuh1hhjÎ9ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÎ9ubj)�”}”(hjh]”hŒ*”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjÎ9ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj+:h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÎ9ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÊ9ubjI)�”}”(hŒstruct ieee80211_sta *pubsta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjD:h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj@:ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjQ:h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj@:ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hjb:h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj_:ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jd:Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j :Œc.ieee80211_sta_block_awake”†”asbuh1hhj@:ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj€:h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj@:ubj)�”}”(hjh]”hŒ*”…”�”}”(hjŽ:h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj@:ubjF)�”}”(hŒpubsta”h]”hŒpubsta”…”�”}”(hj›:h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj@:ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÊ9ubjI)�”}”(hŒ bool block”h]”(jû)�”}”(hj-h]”hŒbool”…”�”}”(hj´:h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj°:ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÁ:h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj°:ubjF)�”}”(hŒblock”h]”hŒblock”…”�”}”(hjÏ:h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj°:ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjÊ9ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj‘9h²hh³j£9h´Mlubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj�9h²hh³j£9h´Mlubah}”(h]”jˆ9ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j£9h´MlhjŠ9h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒblock station from waking up”h]”hŒblock station from waking up”…”�”}”(hjù:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mlhjö:h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjŠ9h²hh³j£9h´Mlubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j;j—j;j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mphj;ubjê)�”}”(hhh]”(jï)�”}”(hŒ)``struct ieee80211_hw *hw`` the hardware ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hj:;h]”hŒstruct ieee80211_hw *hw”…”�”}”(hj<;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj8;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mmhj4;ubj)�”}”(hhh]”hÌ)�”}”(hŒ the hardware”h]”hŒ the hardware”…”�”}”(hjS;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jO;h´MmhjP;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj4;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jO;h´Mmhj1;ubjï)�”}”(hŒ-``struct ieee80211_sta *pubsta`` the station ”h]”(jõ)�”}”(hŒ ``struct ieee80211_sta *pubsta``”h]”jû)�”}”(hjs;h]”hŒstruct ieee80211_sta *pubsta”…”�”}”(hju;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjq;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mnhjm;ubj)�”}”(hhh]”hÌ)�”}”(hŒ the station”h]”hŒ the station”…”�”}”(hjŒ;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jˆ;h´Mnhj‰;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjm;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jˆ;h´Mnhj1;ubjï)�”}”(hŒ+``bool block`` whether to block or unblock ”h]”(jõ)�”}”(hŒ``bool block``”h]”jû)�”}”(hj¬;h]”hŒ bool block”…”�”}”(hj®;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjª;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mohj¦;ubj)�”}”(hhh]”hÌ)�”}”(hŒwhether to block or unblock”h]”hŒwhether to block or unblock”…”�”}”(hjÅ;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÁ;h´MohjÂ;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¦;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÁ;h´Mohj1;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj;ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjç;h]”hŒ Description”…”�”}”(hjé;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjå;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mqhj;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ý;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mphj;ubhÌ)�”}”(hŒBThis function allows implementing this mode in a race-free manner.”h]”hŒBThis function allows implementing this mode in a race-free manner.”…”�”}”(hj <h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Mvhj;ubhÌ)�”}”(hXå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]”hXç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.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´Myhj;ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_sta_eosp (C function)”Œc.ieee80211_sta_eosp”hNt”auh1húhj©)h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ6void ieee80211_sta_eosp (struct ieee80211_sta *pubsta)”h]”j)�”}”(hŒ5void ieee80211_sta_eosp(struct ieee80211_sta *pubsta)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjJ<h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjF<h²hh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŒubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjY<h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjF<h²hh³jX<h´MŒubj@)�”}”(hŒieee80211_sta_eosp”h]”jF)�”}”(hŒieee80211_sta_eosp”h]”hŒieee80211_sta_eosp”…”�”}”(hjk<h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjg<ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjF<h²hh³jX<h´MŒubjC)�”}”(hŒ(struct ieee80211_sta *pubsta)”h]”jI)�”}”(hŒstruct ieee80211_sta *pubsta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj‡<h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjƒ<ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj”<h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjƒ<ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hj¥<h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj¢<ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j§<Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jm<sbŒc.ieee80211_sta_eosp”†”asbuh1hhjƒ<ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÅ<h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjƒ<ubj)�”}”(hjh]”hŒ*”…”�”}”(hjÓ<h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjƒ<ubjF)�”}”(hŒpubsta”h]”hŒpubsta”…”�”}”(hjà<h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjƒ<ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj<ubah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjF<h²hh³jX<h´MŒubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjB<h²hh³jX<h´MŒubah}”(h]”j=<ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jX<h´MŒhj?<h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒnotify mac80211 about end of SP”h]”hŒnotify mac80211 about end of SP”…”�”}”(hj =h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŒhj=h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj?<h²hh³jX<h´MŒubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j"=j—j"=j˜‰j™‰jš‰uh1j h²hhj©)h³Nh´Nubjœ)�”}”(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.=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj*=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M�hj&=ubjê)�”}”(hhh]”jï)�”}”(hŒ-``struct ieee80211_sta *pubsta`` the station ”h]”(jõ)�”}”(hŒ ``struct ieee80211_sta *pubsta``”h]”jû)�”}”(hjK=h]”hŒstruct ieee80211_sta *pubsta”…”�”}”(hjM=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjI=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M�hjE=ubj)�”}”(hhh]”hÌ)�”}”(hŒ the station”h]”hŒ the station”…”�”}”(hjd=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j`=h´M�hja=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjE=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j`=h´M�hjB=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhj&=ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj†=h]”hŒ Description”…”�”}”(hjˆ=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj„=ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M�hj&=ubhÌ)�”}”(hŒâ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.”h]”(hŒyWhen 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œ=h²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_TX_STATUS_EOSP``”h]”hŒIEEE80211_TX_STATUS_EOSP”…”�”}”(hj¤=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjœ=ubhŒO bit and call this function instead. This applies for PS-Poll as well as uAPSD.”…”�”}”(hjœ=h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MŽhj&=ubhÌ)�”}”(hŒÒ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!”h]”hŒÔ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!”…”�”}”(hj½=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M“hj&=ubjê)�”}”(hhh]”jï)�”}”(hŒÍ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]”(jõ)�”}”(hŒ;NB: the _irqsafe version of this function doesn't exist, no”h]”hŒ=NB: the _irqsafe version of this function doesn’t exist, no”…”�”}”(hjÓ=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´MšhjÏ=ubj)�”}”(hhh]”hÌ)�”}”(hŒ‘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Œ•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!”…”�”}”(hjå=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:81: ./include/net/mac80211.h”h´M™hjâ=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏ=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³já=h´MšhjÌ=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhj&=ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj©)h²hh³Nh´Nubeh}”(h]”Œsupport-for-powersaving-clients”ah ]”h"]”Œsupport for powersaving clients”ah$]”h&]”uh1hµhjn)h²hh³hÊh´KLubeh}”(h]”Œaccess-point-mode-support”ah ]”h"]”Œaccess point mode support”ah$]”h&]”uh1hµhh·h²hh³hÊh´KBubh¶)�”}”(hhh]”(h»)�”}”(hŒ&Supporting multiple virtual interfaces”h]”hŒ&Supporting multiple virtual interfaces”…”�”}”(hj >h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj>h²hh³hÊh´K]ubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hj.>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K_hj>h²hubhÌ)�”}”(hŒ?Note: WDS with identical MAC address should almost always be OK”h]”hŒ?Note: WDS with identical MAC address should almost always be OK”…”�”}”(hj<>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kahj>h²hubhÌ)�”}”(hŒ»Insert 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]”hŒ»Insert 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.”…”�”}”(hjJ>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kchj>h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ0ieee80211_iterate_active_interfaces (C function)”Œ%c.ieee80211_iterate_active_interfaces”hNt”auh1húhj>h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ void 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)�”}”(hŒŸvoid 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û)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjq>h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjm>h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´M>ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj€>h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjm>h²hh³j>h´M>ubj@)�”}”(hŒ#ieee80211_iterate_active_interfaces”h]”jF)�”}”(hŒ#ieee80211_iterate_active_interfaces”h]”hŒ#ieee80211_iterate_active_interfaces”…”�”}”(hj’>h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjŽ>ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjm>h²hh³j>h´M>ubjC)�”}”(hŒw(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj®>h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjª>ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj»>h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjª>ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjÌ>h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÉ>ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jÎ>Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚j”>sbŒ%c.ieee80211_iterate_active_interfaces”†”asbuh1hhjª>ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjì>h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjª>ubj)�”}”(hjh]”hŒ*”…”�”}”(hjú>h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjª>ubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjª>ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¦>ubjI)�”}”(hŒu32 iter_flags”h]”(h)�”}”(hhh]”jF)�”}”(hŒu32”h]”hŒu32”…”�”}”(hj#?h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj ?ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j%?Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jè>Œ%c.ieee80211_iterate_active_interfaces”†”asbuh1hhj?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjA?h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj?ubjF)�”}”(hŒ iter_flags”h]”hŒ iter_flags”…”�”}”(hjO?h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj?ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¦>ubjI)�”}”(hŒ@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjh?h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjv?h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubj)�”}”(hŒ(”h]”hŒ(”…”�”}”(hj„?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubj)�”}”(hjh]”hŒ*”…”�”}”(hj’?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubjF)�”}”(hŒiterator”h]”hŒiterator”…”�”}”(hjŸ?h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjd?ubj)�”}”(hŒ)”h]”hŒ)”…”�”}”(hj­?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubj)�”}”(hj†?h]”hŒ(”…”�”}”(hj»?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubjû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÈ?h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÖ?h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubj)�”}”(hjh]”hŒ*”…”�”}”(hjä?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubjF)�”}”(hŒdata”h]”hŒdata”…”�”}”(hjñ?h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjd?ubj)�”}”(hŒ,”h]”hŒ,”…”�”}”(hjÿ?h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj @h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj@ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j @Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jè>Œ%c.ieee80211_iterate_active_interfaces”†”asbuh1hhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj<@h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubj)�”}”(hjh]”hŒ*”…”�”}”(hjJ@h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubjF)�”}”(hŒmac”h]”hŒmac”…”�”}”(hjW@h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjd?ubj)�”}”(hj@h]”hŒ,”…”�”}”(hje@h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjr@h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubj)�”}”(hj h]”hŒstruct”…”�”}”(hj€@h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�@h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hjž@h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj›@ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j @Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jè>Œ%c.ieee80211_iterate_active_interfaces”†”asbuh1hhjd?ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¼@h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjd?ubj)�”}”(hjh]”hŒ*”…”�”}”(hjÊ@h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hj×@h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjd?ubj)�”}”(hj¯?h]”hŒ)”…”�”}”(hjå@h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjd?ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¦>ubjI)�”}”(hŒ void *data”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjý@h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjù@ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj Ah²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjù@ubj)�”}”(hjh]”hŒ*”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjù@ubjF)�”}”(hŒdata”h]”hŒdata”…”�”}”(hj&Ah²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjù@ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj¦>ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjm>h²hh³j>h´M>ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghji>h²hh³j>h´M>ubah}”(h]”jd>ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j>h´M>hjf>h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒiterate active interfaces”h]”hŒiterate active interfaces”…”�”}”(hjPAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´M>hjMAh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjf>h²hh³j>h´M>ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jhAj—jhAj˜‰j™‰jš‰uh1j h²hhj>h³Nh´Nubjœ)�”}”(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¦)�”}”(hjrAh]”hŒ Parameters”…”�”}”(hjtAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjpAubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MBhjlAubjê)�”}”(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]”hŒstruct ieee80211_hw *hw”…”�”}”(hj“Ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�Aubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MGhj‹Aubj)�”}”(hhh]”hÌ)�”}”(hŒCthe hardware struct of which the interfaces should be iterated over”h]”hŒCthe hardware struct of which the interfaces should be iterated over”…”�”}”(hjªAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¦Ah´MGhj§Aubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‹Aubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¦Ah´MGhjˆAubjï)�”}”(hŒ�``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` ”h]”(jõ)�”}”(hŒ``u32 iter_flags``”h]”jû)�”}”(hjÊAh]”hŒu32 iter_flags”…”�”}”(hjÌAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÈAubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MHhjÄAubj)�”}”(hhh]”hÌ)�”}”(hŒmiteration flags, see :c:type:`enum ieee80211_interface_iteration_flags `”h]”(hŒiteration flags, see ”…”�”}”(hjãAh²hh³Nh´Nubh)�”}”(hŒX:c:type:`enum ieee80211_interface_iteration_flags `”h]”jû)�”}”(hjíAh]”hŒ(enum ieee80211_interface_iteration_flags”…”�”}”(hjïAh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjëAubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ#ieee80211_interface_iteration_flags”uh1hh³jßAh´MHhjãAubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jßAh´MHhjàAubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄAubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jßAh´MHhjˆAubjï)�”}”(hŒc``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call ”h]”(jõ)�”}”(hŒD``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)``”h]”jû)�”}”(hj"Bh]”hŒ@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)”…”�”}”(hj$Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj Bubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MIhjBubj)�”}”(hhh]”hÌ)�”}”(hŒthe iterator function to call”h]”hŒthe iterator function to call”…”�”}”(hj;Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j7Bh´MIhj8Bubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j7Bh´MIhjˆAubjï)�”}”(hŒ7``void *data`` first argument of the iterator function ”h]”(jõ)�”}”(hŒ``void *data``”h]”jû)�”}”(hj[Bh]”hŒ void *data”…”�”}”(hj]Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjYBubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MJhjUBubj)�”}”(hhh]”hÌ)�”}”(hŒ'first argument of the iterator function”h]”hŒ'first argument of the iterator function”…”�”}”(hjtBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jpBh´MJhjqBubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjUBubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jpBh´MJhjˆAubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjlAubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj–Bh]”hŒ Description”…”�”}”(hj˜Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj”Bubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MLhjlAubhÌ)�”}”(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]”(hŒá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 ”…”�”}”(hj¬Bh²hh³Nh´Nubj¦)�”}”(hŒ.**ieee80211_iterate_active_interfaces_atomic**”h]”hŒ*ieee80211_iterate_active_interfaces_atomic”…”�”}”(hj´Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¬BubhŒK can be used. Does not iterate over a new interface during add_interface().”…”�”}”(hj¬Bh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´M?hjlAubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj>h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ7ieee80211_iterate_active_interfaces_atomic (C function)”Œ,c.ieee80211_iterate_active_interfaces_atomic”hNt”auh1húhj>h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ§void 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)�”}”(hŒ¦void 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û)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjíBh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjéBh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MXubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjüBh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjéBh²hh³jûBh´MXubj@)�”}”(hŒ*ieee80211_iterate_active_interfaces_atomic”h]”jF)�”}”(hŒ*ieee80211_iterate_active_interfaces_atomic”h]”hŒ*ieee80211_iterate_active_interfaces_atomic”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj Cubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjéBh²hh³jûBh´MXubjC)�”}”(hŒw(struct ieee80211_hw *hw, u32 iter_flags, void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif), void *data)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj*Ch²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj&Cubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7Ch²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj&Cubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjHCh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjECubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jJCŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jCsbŒ,c.ieee80211_iterate_active_interfaces_atomic”†”asbuh1hhj&Cubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjhCh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj&Cubj)�”}”(hjh]”hŒ*”…”�”}”(hjvCh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj&CubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hjƒCh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj&Cubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj"CubjI)�”}”(hŒu32 iter_flags”h]”(h)�”}”(hhh]”jF)�”}”(hŒu32”h]”hŒu32”…”�”}”(hjŸCh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjœCubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j¡CŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jdCŒ,c.ieee80211_iterate_active_interfaces_atomic”†”asbuh1hhj˜Cubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj½Ch²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj˜CubjF)�”}”(hŒ iter_flags”h]”hŒ iter_flags”…”�”}”(hjËCh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj˜Cubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj"CubjI)�”}”(hŒ@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjäCh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjòCh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubj)�”}”(hj†?h]”hŒ(”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubj)�”}”(hjh]”hŒ*”…”�”}”(hj Dh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubjF)�”}”(hŒiterator”h]”hŒiterator”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjàCubj)�”}”(hj¯?h]”hŒ)”…”�”}”(hj(Dh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubj)�”}”(hj†?h]”hŒ(”…”�”}”(hj5Dh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubjû)�”}”(hŒvoid”h]”hŒvoid”…”�”•J}”(hjBDh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjPDh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubj)�”}”(hjh]”hŒ*”…”�”}”(hj^Dh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubjF)�”}”(hŒdata”h]”hŒdata”…”�”}”(hjkDh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjàCubj)�”}”(hj@h]”hŒ,”…”�”}”(hjyDh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj†Dh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj—Dh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj”Dubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j™DŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jdCŒ,c.ieee80211_iterate_active_interfaces_atomic”†”asbuh1hhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjµDh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubj)�”}”(hjh]”hŒ*”…”�”}”(hjÃDh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubjF)�”}”(hŒmac”h]”hŒmac”…”�”}”(hjÐDh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjàCubj)�”}”(hj@h]”hŒ,”…”�”}”(hjÞDh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjëDh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubj)�”}”(hj h]”hŒstruct”…”�”}”(hjùDh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjEubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jEŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jdCŒ,c.ieee80211_iterate_active_interfaces_atomic”†”asbuh1hhjàCubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5Eh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjàCubj)�”}”(hjh]”hŒ*”…”�”}”(hjCEh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hjPEh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjàCubj)�”}”(hj¯?h]”hŒ)”…”�”}”(hj^Eh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjàCubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj"CubjI)�”}”(hŒ void *data”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjvEh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjrEubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„Eh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjrEubj)�”}”(hjh]”hŒ*”…”�”}”(hj’Eh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjrEubjF)�”}”(hŒdata”h]”hŒdata”…”�”}”(hjŸEh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjrEubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj"Cubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjéBh²hh³jûBh´MXubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjåBh²hh³jûBh´MXubah}”(h]”jàBah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jûBh´MXhjâBh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒiterate active interfaces”h]”hŒiterate active interfaces”…”�”}”(hjÉEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MXhjÆEh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjâBh²hh³jûBh´MXubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jáEj—jáEj˜‰j™‰jš‰uh1j h²hhj>h³Nh´Nubjœ)�”}”(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¦)�”}”(hjëEh]”hŒ Parameters”…”�”}”(hjíEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjéEubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´M\hjåEubjê)�”}”(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 Fh]”hŒstruct ieee80211_hw *hw”…”�”}”(hj Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´M`hjFubj)�”}”(hhh]”hÌ)�”}”(hŒCthe hardware struct of which the interfaces should be iterated over”h]”hŒCthe hardware struct of which the interfaces should be iterated over”…”�”}”(hj#Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jFh´M`hj Fubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjFubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jFh´M`hjFubjï)�”}”(hŒ�``u32 iter_flags`` iteration flags, see :c:type:`enum ieee80211_interface_iteration_flags ` ”h]”(jõ)�”}”(hŒ``u32 iter_flags``”h]”jû)�”}”(hjCFh]”hŒu32 iter_flags”…”�”}”(hjEFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjAFubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´Mahj=Fubj)�”}”(hhh]”hÌ)�”}”(hŒmiteration flags, see :c:type:`enum ieee80211_interface_iteration_flags `”h]”(hŒiteration flags, see ”…”�”}”(hj\Fh²hh³Nh´Nubh)�”}”(hŒX:c:type:`enum ieee80211_interface_iteration_flags `”h]”jû)�”}”(hjfFh]”hŒ(enum ieee80211_interface_iteration_flags”…”�”}”(hjhFh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjdFubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ#ieee80211_interface_iteration_flags”uh1hh³jXFh´Mahj\Fubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jXFh´MahjYFubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj=Fubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jXFh´MahjFubjï)�”}”(hŒq``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)`` the iterator function to call, cannot sleep ”h]”(jõ)�”}”(hŒD``void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)``”h]”jû)�”}”(hj›Fh]”hŒ@void (*iterator)(void *data, u8 *mac, struct ieee80211_vif *vif)”…”�”}”(hj�Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj™Fubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´Mbhj•Fubj)�”}”(hhh]”hÌ)�”}”(hŒ+the iterator function to call, cannot sleep”h]”hŒ+the iterator function to call, cannot sleep”…”�”}”(hj´Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j°Fh´Mbhj±Fubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj•Fubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j°Fh´MbhjFubjï)�”}”(hŒ7``void *data`` first argument of the iterator function ”h]”(jõ)�”}”(hŒ``void *data``”h]”jû)�”}”(hjÔFh]”hŒ void *data”…”�”}”(hjÖFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÒFubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MchjÎFubj)�”}”(hhh]”hÌ)�”}”(hŒ'first argument of the iterator function”h]”hŒ'first argument of the iterator function”…”�”}”(hjíFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jéFh´MchjêFubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÎFubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jéFh´MchjFubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjåEubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjGh]”hŒ Description”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj Gubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MehjåEubhÌ)�”}”(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]”(hŒç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 ”…”�”}”(hj%Gh²hh³Nh´Nubj¦)�”}”(hŒ'**ieee80211_iterate_active_interfaces**”h]”hŒ#ieee80211_iterate_active_interfaces”…”�”}”(hj-Gh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj%GubhŒG instead. Does not iterate over a new interface during add_interface().”…”�”}”(hj%Gh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:103: ./include/net/mac80211.h”h´MYhjåEubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj>h²hh³Nh´Nubeh}”(h]”Œ&supporting-multiple-virtual-interfaces”ah ]”h"]”Œ&supporting multiple virtual interfaces”ah$]”h&]”uh1hµhh·h²hh³hÊh´K]ubh¶)�”}”(hhh]”(h»)�”}”(hŒStation handling”h]”hŒStation handling”…”�”}”(hjXGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjUGh²hh³hÊh´KmubhÌ)�”}”(hŒTODO”h]”hŒTODO”…”�”}”(hjfGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KohjUGh²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_sta (C struct)”Œc.ieee80211_sta”hNt”auh1húhjUGh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ ieee80211_sta”h]”j)�”}”(hŒstruct ieee80211_sta”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj�Gh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj‰Gh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj›Gh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‰Gh²hh³jšGh´Kubj@)�”}”(hŒ ieee80211_sta”h]”jF)�”}”(hj‡Gh]”hŒ ieee80211_sta”…”�”}”(hj­Gh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj©Gubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj‰Gh²hh³jšGh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj…Gh²hh³jšGh´Kubah}”(h]”j€Gah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jšGh´Khj‚Gh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒstation table entry”h]”hŒstation table entry”…”�”}”(hjÏGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mn hjÌGh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj‚Gh²hh³jšGh´Kubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–jçGj—jçGj˜‰j™‰jš‰uh1j h²hhjUGh³Nh´Nubjœ)�”}”(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 *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; u16 eml_cap; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; u16 ext_mld_capa_ops; bool epp_peer; struct ieee80211_link_sta deflink; struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta *nmi; struct ieee80211_nan_peer_sched *nan_sched; 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. ``eml_cap`` EML capabilities of this MLO station ``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 ``ext_mld_capa_ops`` the MLD's extended MLD capabilities and operations ``epp_peer`` indicates that the peer is an EPP peer. ``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. ``nmi`` For NDI stations, pointer to the NMI station of the peer. ``nan_sched`` NAN peer schedule for this station. Valid only for NMI stations. ``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”…”�”}”(hjóGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjïGubhŒ:”…”�”}”(hjïGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mr hjëGubjÁ)�”}”(hXÈ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 *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; u16 eml_cap; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; u16 ext_mld_capa_ops; bool epp_peer; struct ieee80211_link_sta deflink; struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta *nmi; struct ieee80211_nan_peer_sched *nan_sched; u8 drv_priv[]; };”h]”hXÈ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 *rates; bool tdls; bool tdls_initiator; bool mfp; bool mlo; bool spp_amsdu; u8 max_amsdu_subframes; u16 eml_cap; struct ieee80211_sta_aggregates *cur; bool support_p2p_ps; struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; u16 valid_links; u16 ext_mld_capa_ops; bool epp_peer; struct ieee80211_link_sta deflink; struct ieee80211_link_sta *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta *nmi; struct ieee80211_nan_peer_sched *nan_sched; u8 drv_priv[]; };”…”�”}”hj Hsbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mt hjëGubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hjHh]”hŒMembers”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjHubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M� hjëGubjê)�”}”(hhh]”(jï)�”}”(hŒ``addr`` MAC address ”h]”(jõ)�”}”(hŒ``addr``”h]”jû)�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj:Hubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mz hj6Hubj)�”}”(hhh]”hÌ)�”}”(hŒ MAC address”h]”hŒ MAC address”…”�”}”(hjUHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jQHh´Mz hjRHubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6Hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jQHh´Mz hj3Hubjï)�”}”(hŒ6``aid`` AID we assigned to the station if we're an AP ”h]”(jõ)�”}”(hŒ``aid``”h]”jû)�”}”(hjuHh]”hŒaid”…”�”}”(hjwHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjsHubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M{ hjoHubj)�”}”(hhh]”hÌ)�”}”(hŒ-AID we assigned to the station if we're an AP”h]”hŒ/AID we assigned to the station if we’re an AP”…”�”}”(hjŽHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jŠHh´M{ hj‹Hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjoHubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jŠHh´M{ hj3Hubjï)�”}”(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û)�”}”(hj®Hh]”hŒmax_rx_aggregation_subframes”…”�”}”(hj°Hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¬Hubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M~ hj¨Hubj)�”}”(hhh]”hÌ)�”}”(hŒumaximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver.”h]”hŒumaximal amount of frames in a single AMPDU that this station is allowed to transmit to us. Can be modified by driver.”…”�”}”(hjÇHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M| hjÄHubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨Hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÃHh´M~ hj3Hubjï)�”}”(hŒc``wme`` indicates whether the STA supports QoS/WME (if local devices does, otherwise always false) ”h]”(jõ)�”}”(hŒ``wme``”h]”jû)�”}”(hjèHh]”hŒwme”…”�”}”(hjêHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjæHubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M€ hjâHubj)�”}”(hhh]”hÌ)�”}”(hŒZindicates whether the STA supports QoS/WME (if local devices does, otherwise always false)”h]”hŒZindicates whether the STA supports QoS/WME (if local devices does, otherwise always false)”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M hjþHubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâHubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jýHh´M€ hj3Hubjï)�”}”(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û)�”}”(hj"Ih]”hŒ uapsd_queues”…”�”}”(hj$Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj Iubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M… hjIubj)�”}”(hhh]”hÌ)�”}”(hŒƒ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]”hŒƒbitmap of queues configured for uapsd. Only valid if wme is supported. The bits order is like in IEEE80211_WMM_IE_STA_QOSINFO_AC_*.”…”�”}”(hj;Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mƒ hj8Iubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j7Ih´M… hj3Hubjï)�”}”(hŒ?``max_sp`` max Service Period. Only valid if wme is supported. ”h]”(jõ)�”}”(hŒ ``max_sp``”h]”jû)�”}”(hj\Ih]”hŒmax_sp”…”�”}”(hj^Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjZIubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M† hjVIubj)�”}”(hhh]”hÌ)�”}”(hŒ3max Service Period. Only valid if wme is supported.”h]”hŒ3max Service Period. Only valid if wme is supported.”…”�”}”(hjuIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jqIh´M† hjrIubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjVIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jqIh´M† hj3Hubjï)�”}”(hŒ'``rates`` rate control selection table ”h]”(jõ)�”}”(hŒ ``rates``”h]”jû)�”}”(hj•Ih]”hŒrates”…”�”}”(hj—Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj“Iubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M‡ hj�Iubj)�”}”(hhh]”hÌ)�”}”(hŒrate control selection table”h]”hŒrate control selection table”…”�”}”(hj®Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jªIh´M‡ hj«Iubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�Iubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jªIh´M‡ hj3Hubjï)�”}”(hŒ2``tdls`` indicates whether the STA is a TDLS peer ”h]”(jõ)�”}”(hŒ``tdls``”h]”jû)�”}”(hjÎIh]”hŒtdls”…”�”}”(hjÐIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÌIubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mˆ hjÈIubj)�”}”(hhh]”hÌ)�”}”(hŒ(indicates whether the STA is a TDLS peer”h]”hŒ(indicates whether the STA is a TDLS peer”…”�”}”(hjçIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jãIh´Mˆ hjäIubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈIubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jãIh´Mˆ hj3Hubjï)�”}”(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û)�”}”(hjJh]”hŒtdls_initiator”…”�”}”(hj Jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MŠ hjJubj)�”}”(hhh]”hÌ)�”}”(hŒlindicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place.”h]”hŒlindicates the STA is an initiator of the TDLS link. Only valid if the STA is a TDLS peer in the first place.”…”�”}”(hj Jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M‰ hjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jJh´MŠ hj3Hubjï)�”}”(hŒK``mfp`` indicates whether the STA uses management frame protection or not. ”h]”(jõ)�”}”(hŒ``mfp``”h]”jû)�”}”(hjAJh]”hŒmfp”…”�”}”(hjCJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj?Jubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M‹ hj;Jubj)�”}”(hhh]”hÌ)�”}”(hŒBindicates whether the STA uses management frame protection or not.”h]”hŒBindicates whether the STA uses management frame protection or not.”…”�”}”(hjZJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jVJh´M‹ hjWJubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;Jubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jVJh´M‹ hj3Hubjï)�”}”(hŒ2``mlo`` indicates whether the STA is MLO station. ”h]”(jõ)�”}”(hŒ``mlo``”h]”jû)�”}”(hjzJh]”hŒmlo”…”�”}”(hj|Jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjxJubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MŒ hjtJubj)�”}”(hhh]”hÌ)�”}”(hŒ)indicates whether the STA is MLO station.”h]”hŒ)indicates whether the STA is MLO station.”…”�”}”(hj“Jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j�Jh´MŒ hj�Jubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjtJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j�Jh´MŒ hj3Hubjï)�”}”(hŒ@``spp_amsdu`` indicates whether the STA uses SPP A-MSDU or not. ”h]”(jõ)�”}”(hŒ ``spp_amsdu``”h]”jû)�”}”(hj³Jh]”hŒ spp_amsdu”…”�”}”(hjµJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj±Jubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M£ hj­Jubj)�”}”(hhh]”hÌ)�”}”(hŒ1indicates whether the STA uses SPP A-MSDU or not.”h]”hŒ1indicates whether the STA uses SPP A-MSDU or not.”…”�”}”(hjÌJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÈJh´M£ hjÉJubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj­Jubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÈJh´M£ hj3Hubjï)�”}”(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û)�”}”(hjìJh]”hŒmax_amsdu_subframes”…”�”}”(hjîJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjêJubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M� hjæJubj)�”}”(hhh]”hÌ)�”}”(hŒzindicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited.”h]”hŒzindicates the maximal number of MSDUs in a single A-MSDU. Taken from the Extended Capabilities element. 0 means unlimited.”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M� hjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjæJubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jKh´M� hj3Hubjï)�”}”(hŒ1``eml_cap`` EML capabilities of this MLO station ”h]”(jõ)�”}”(hŒ ``eml_cap``”h]”jû)�”}”(hj&Kh]”hŒeml_cap”…”�”}”(hj(Kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj$Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M� hj Kubj)�”}”(hhh]”hÌ)�”}”(hŒ$EML capabilities of this MLO station”h]”hŒ$EML capabilities of this MLO station”…”�”}”(hj?Kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j;Kh´M� hj`, this indicates if an associated station made a power state transition.”h]”(hŒ'Used with the sta_notify() callback in ”…”�”}”(hj³Oh²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_ops `”h]”jû)�”}”(hj½Oh]”hŒstruct ieee80211_ops”…”�”}”(hj¿Oh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj»Oubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_ops”uh1hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´Mç hj³OubhŒH, this indicates if an associated station made a power state transition.”…”�”}”(hj³Oh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÚOh´Mç hjUGh²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_find_sta (C function)”Œc.ieee80211_find_sta”hNt”auh1húhjUGh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒUstruct ieee80211_sta * ieee80211_find_sta (struct ieee80211_vif *vif, const u8 *addr)”h]”j)�”}”(hŒSstruct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif, const u8 *addr)”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjþOh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjúOh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M2ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj Ph²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjúOh²hh³j Ph´M2ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_sta”h]”hŒ ieee80211_sta”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjPubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jPŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚Œieee80211_find_sta”sbŒc.ieee80211_find_sta”†”asbuh1hhjúOh²hh³j Ph´M2ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj>Ph²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjúOh²hh³j Ph´M2ubj)�”}”(hjh]”hŒ*”…”�”}”(hjLPh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjúOh²hh³j Ph´M2ubj@)�”}”(hŒieee80211_find_sta”h]”jF)�”}”(hj;Ph]”hŒieee80211_find_sta”…”�”}”(hj]Ph²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjYPubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjúOh²hh³j Ph´M2ubjC)�”}”(hŒ+(struct ieee80211_vif *vif, const u8 *addr)”h]”(jI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjxPh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjtPubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…Ph²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjtPubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hj–Ph²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj“Pubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j˜PŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j9PŒc.ieee80211_find_sta”†”asbuh1hhjtPubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj´Ph²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjtPubj)�”}”(hjh]”hŒ*”…”�”}”(hjÂPh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjtPubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hjÏPh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjtPubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjpPubjI)�”}”(hŒconst u8 *addr”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjèPh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjäPubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjõPh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjäPubh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjQubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jQŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j9PŒc.ieee80211_find_sta”†”asbuh1hhjäPubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj$Qh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjäPubj)�”}”(hjh]”hŒ*”…”�”}”(hj2Qh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjäPubjF)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hj?Qh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjäPubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjpPubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjúOh²hh³j Ph´M2ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjöOh²hh³j Ph´M2ubah}”(h]”jñOah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j Ph´M2hjóOh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒfind a station”h]”hŒfind a station”…”�”}”(hjiQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M2hjfQh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjóOh²hh³j Ph´M2ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j�Qj—j�Qj˜‰j™‰jš‰uh1j h²hhjUGh³Nh´Nubjœ)�”}”(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¦)�”}”(hj‹Qh]”hŒ Parameters”…”�”}”(hj�Qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj‰Qubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M6hj…Qubjê)�”}”(hhh]”(jï)�”}”(hŒG``struct ieee80211_vif *vif`` virtual interface to look for station on ”h]”(jõ)�”}”(hŒ``struct ieee80211_vif *vif``”h]”jû)�”}”(hjªQh]”hŒstruct ieee80211_vif *vif”…”�”}”(hj¬Qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¨Qubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M4hj¤Qubj)�”}”(hhh]”hÌ)�”}”(hŒ(virtual interface to look for station on”h]”hŒ(virtual interface to look for station on”…”�”}”(hjÃQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¿Qh´M4hjÀQubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¤Qubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¿Qh´M4hj¡Qubjï)�”}”(hŒ%``const u8 *addr`` station's address ”h]”(jõ)�”}”(hŒ``const u8 *addr``”h]”jû)�”}”(hjãQh]”hŒconst u8 *addr”…”�”}”(hjåQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjáQubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M5hjÝQubj)�”}”(hhh]”hÌ)�”}”(hŒstation's address”h]”hŒstation’s address”…”�”}”(hjüQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jøQh´M5hjùQubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÝQubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jøQh´M5hj¡Qubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj…QubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjRh]”hŒReturn”…”�”}”(hj Rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M7hj…QubhÌ)�”}”(hŒ*The station, if found. ``NULL`` otherwise.”h]”(hŒThe station, if found. ”…”�”}”(hj4Rh²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hj(struct ieee80211_hw *hw, const u8 *addr, const u8 *localaddr)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjSubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#Sh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjSubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hj4Sh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj1Subah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j6SŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j×RŒc.ieee80211_find_sta_by_ifaddr”†”asbuh1hhjSubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjRSh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjSubj)�”}”(hjh]”hŒ*”…”�”}”(hj`Sh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjSubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hjmSh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjSubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjSubjI)�”}”(hŒconst u8 *addr”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hj†Sh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj‚Subj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“Sh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‚Subh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj¤Sh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj¡Subah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j¦SŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j×RŒc.ieee80211_find_sta_by_ifaddr”†”asbuh1hhj‚Subj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÂSh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‚Subj)�”}”(hjh]”hŒ*”…”�”}”(hjÐSh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj‚SubjF)�”}”(hŒaddr”h]”hŒaddr”…”�”}”(hjÝSh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj‚Subeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjSubjI)�”}”(hŒconst u8 *localaddr”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjöSh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjòSubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjòSubh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjTubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jTŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j×RŒc.ieee80211_find_sta_by_ifaddr”†”asbuh1hhjòSubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj2Th²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjòSubj)�”}”(hjh]”hŒ*”…”�”}”(hj@Th²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjòSubjF)�”}”(hŒ localaddr”h]”hŒ localaddr”…”�”}”(hjMTh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjòSubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjSubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj˜Rh²hh³j©Rh´M@ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj”Rh²hh³j©Rh´M@ubah}”(h]”j�Rah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j©Rh´M@hj‘Rh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒfind a station on hardware”h]”hŒfind a station on hardware”…”�”}”(hjwTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´M@hjtTh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj‘Rh²hh³j©Rh´M@ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j�Tj—j�Tj˜‰j™‰jš‰uh1j h²hhjUGh³Nh´Nubjœ)�”}”(hXf**Parameters** ``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw() ``const u8 *addr`` remote station's address ``const u8 *localaddr`` local address (vif->sdata->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. DO NOT USE THIS FUNCTION with localaddr NULL if at all possible.”h]”(hÌ)�”}”(hŒ**Parameters**”h]”j¦)�”}”(hj™Th]”hŒ Parameters”…”�”}”(hj›Th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj—Tubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MDhj“Tubjê)�”}”(hhh]”(jï)�”}”(hŒJ``struct ieee80211_hw *hw`` pointer as obtained from ieee80211_alloc_hw() ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hj¸Th]”hŒstruct ieee80211_hw *hw”…”�”}”(hjºTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¶Tubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MBhj²Tubj)�”}”(hhh]”hÌ)�”}”(hŒ-pointer as obtained from ieee80211_alloc_hw()”h]”hŒ-pointer as obtained from ieee80211_alloc_hw()”…”�”}”(hjÑTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÍTh´MBhjÎTubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj²Tubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÍTh´MBhj¯Tubjï)�”}”(hŒ,``const u8 *addr`` remote station's address ”h]”(jõ)�”}”(hŒ``const u8 *addr``”h]”jû)�”}”(hjñTh]”hŒconst u8 *addr”…”�”}”(hjóTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjïTubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MChjëTubj)�”}”(hhh]”hÌ)�”}”(hŒremote station's address”h]”hŒremote station’s address”…”�”}”(hj Uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jUh´MChjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjëTubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jUh´MChj¯Tubjï)�”}”(hŒR``const u8 *localaddr`` local address (vif->sdata->vif.addr). Use NULL for 'any'. ”h]”(jõ)�”}”(hŒ``const u8 *localaddr``”h]”jû)�”}”(hj*Uh]”hŒconst u8 *localaddr”…”�”}”(hj,Uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj(Uubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MDhj$Uubj)�”}”(hhh]”hÌ)�”}”(hŒ9local address (vif->sdata->vif.addr). Use NULL for 'any'.”h]”hŒ=local address (vif->sdata->vif.addr). Use NULL for ‘any’.”…”�”}”(hjCUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j?Uh´MDhj@Uubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$Uubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j?Uh´MDhj¯Tubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj“TubhÌ)�”}”(hŒ **Return**”h]”j¦)�”}”(hjeUh]”hŒReturn”…”�”}”(hjgUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjcUubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MFhj“TubhÌ)�”}”(hŒ*The station, if found. ``NULL`` otherwise.”h]”(hŒThe station, if found. ”…”�”}”(hj{Uh²hh³Nh´Nubjû)�”}”(hŒ``NULL``”h]”hŒNULL”…”�”}”(hjƒUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj{UubhŒ otherwise.”…”�”}”(hj{Uh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MFhj“TubhÌ)�”}”(hŒ**Note**”h]”j¦)�”}”(hjžUh]”hŒNote”…”�”}”(hj Uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjœUubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MHhj“TubhÌ)�”}”(hŒkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.”h]”hŒkThis function must be called under RCU lock and the resulting pointer is only valid under RCU lock as well.”…”�”}”(hj´Uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MHhj“TubhÌ)�”}”(hŒ**NOTE**”h]”j¦)�”}”(hjÅUh]”hŒNOTE”…”�”}”(hjÇUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÃUubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MKhj“Tubjê)�”}”(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 get”h]”hŒ;You may pass NULL for localaddr, but then you will just get”…”�”}”(hjâUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MQhjÞUubj)�”}”(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.”…”�”•}”(hjôUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MLhjñUubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞUubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jðUh´MQhjÛUubah}”(h]”h ]”h"]”h$]”h&]”uh1jéhj“TubhÌ)�”}”(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.”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:113: ./include/net/mac80211.h”h´MShj“Tubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjUGh²hh³Nh´Nubeh}”(h]”Œstation-handling”ah ]”h"]”Œstation handling”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kmubh¶)�”}”(hhh]”(h»)�”}”(hŒHardware scan offload”h]”hŒHardware scan offload”…”�”}”(hj6Vh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj3Vh²hh³hÊh´KyubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hjDVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K{hj3Vh²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ%ieee80211_scan_completed (C function)”Œc.ieee80211_scan_completed”hNt”auh1húhj3Vh²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒXvoid ieee80211_scan_completed (struct ieee80211_hw *hw, struct cfg80211_scan_info *info)”h]”j)�”}”(hŒWvoid ieee80211_scan_completed(struct ieee80211_hw *hw, struct cfg80211_scan_info *info)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjkVh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjgVh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´Móubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjzVh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjgVh²hh³jyVh´Móubj@)�”}”(hŒieee80211_scan_completed”h]”jF)�”}”(hŒieee80211_scan_completed”h]”hŒieee80211_scan_completed”…”�”}”(hjŒVh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjˆVubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjgVh²hh³jyVh´MóubjC)�”}”(hŒ:(struct ieee80211_hw *hw, struct cfg80211_scan_info *info)”h]”(jI)�”}”(hŒstruct ieee80211_hw *hw”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj¨Vh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj¤Vubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjµVh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¤Vubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_hw”h]”hŒ ieee80211_hw”…”�”}”(hjÆVh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÃVubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jÈVŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jŽVsbŒc.ieee80211_scan_completed”†”asbuh1hhj¤Vubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjæVh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj¤Vubj)�”}”(hjh]”hŒ*”…”�”}”(hjôVh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj¤VubjF)�”}”(hŒhw”h]”hŒhw”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj¤Vubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj VubjI)�”}”(hŒstruct cfg80211_scan_info *info”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjWubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj'Wh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjWubh)�”}”(hhh]”jF)�”}”(hŒcfg80211_scan_info”h]”hŒcfg80211_scan_info”…”�”}”(hj8Wh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj5Wubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j:WŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jâVŒc.ieee80211_scan_completed”†”asbuh1hhjWubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjVWh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjWubj)�”}”(hjh]”hŒ*”…”�”}”(hjdWh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjWubjF)�”}”(hŒinfo”h]”hŒinfo”…”�”}”(hjqWh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjWubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj Vubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjgVh²hh³jyVh´Móubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjcVh²hh³jyVh´Móubah}”(h]”j^Vah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jyVh´Móhj`Vh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒcompleted hardware scan”h]”hŒcompleted hardware scan”…”�”}”(hj›Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´Móhj˜Wh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj`Vh²hh³jyVh´Móubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j³Wj—j³Wj˜‰j™‰jš‰uh1j h²hhj3Vh³Nh´Nubjœ)�”}”(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½Wh]”hŒ Parameters”…”�”}”(hj¿Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj»Wubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´M÷hj·Wubjê)�”}”(hhh]”(jï)�”}”(hŒ@``struct ieee80211_hw *hw`` the hardware that finished the scan ”h]”(jõ)�”}”(hŒ``struct ieee80211_hw *hw``”h]”jû)�”}”(hjÜWh]”hŒstruct ieee80211_hw *hw”…”�”}”(hjÞWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÚWubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´MúhjÖWubj)�”}”(hhh]”hÌ)�”}”(hŒ#the hardware that finished the scan”h]”hŒ#the hardware that finished the scan”…”�”}”(hjõWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jñWh´MúhjòWubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÖWubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jñWh´MúhjÓWubjï)�”}”(hŒI``struct cfg80211_scan_info *info`` information about the completed scan ”h]”(jõ)�”}”(hŒ#``struct cfg80211_scan_info *info``”h]”jû)�”}”(hjXh]”hŒstruct cfg80211_scan_info *info”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´MûhjXubj)�”}”(hhh]”hÌ)�”}”(hŒ$information about the completed scan”h]”hŒ$information about the completed scan”…”�”}”(hj.Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j*Xh´Mûhj+Xubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjXubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j*Xh´MûhjÓWubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj·WubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjPXh]”hŒ Description”…”�”}”(hjRXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjNXubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´Mýhj·WubhÌ)�”}”(hŒï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Œï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.”…”�”}”(hjfXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:125: ./include/net/mac80211.h”h´Môhj·Wubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj3Vh²hh³Nh´Nubeh}”(h]”Œhardware-scan-offload”ah ]”h"]”Œhardware scan offload”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kyubh¶)�”}”(hhh]”(h»)�”}”(hŒ Aggregation”h]”hŒ Aggregation”…”�”}”(hj‡Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj„Xh²hh³hÊh´K�ubh¶)�”}”(hhh]”(h»)�”}”(hŒTX A-MPDU aggregation”h]”hŒTX A-MPDU aggregation”…”�”}”(hj˜Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj•Xh²hh³hÊh´K„ubhÌ)�”}”(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 ”…”�”}”(hj¦Xh²hh³Nh´Nubjû)�”}”(hŒ"``IEEE80211_HW_AMPDU_AGGREGATION``”h]”hŒIEEE80211_HW_AMPDU_AGGREGATION”…”�”}”(hj®Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¦XubhŒÑ. 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.”…”�”}”(hj¦Xh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.c”h´Khj•Xh²hubhÌ)�”}”(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]”(hŒÈWhen 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 ”…”�”}”(hjÇXh²hh³Nh´Nubj¦)�”}”(hŒ**ampdu_action**”h]”hŒ ampdu_action”…”�”}”(hjÏXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÇXubhŒ function, with the ”…”�”}”(hjÇXh²hh³Nh´Nubjû)�”}”(hŒ``IEEE80211_AMPDU_TX_START``”h]”hŒIEEE80211_AMPDU_TX_START”…”�”}”(hjáXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÇXubhŒ action.”…”�”}”(hjÇXh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.c”h´Khj•Xh²hubhÌ)�”}”(hXÇIn 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]”hXÇIn 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.”…”�”}”(hjúXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.c”h´K$hj•Xh²hubhÌ)�”}”(hŒÕAlso 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]”(hŒŠAlso 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 ”…”�”}”(hj Yh²hh³Nh´Nubjû)�”}”(hŒ"``IEEE80211_AMPDU_TX_OPERATIONAL``”h]”hŒIEEE80211_AMPDU_TX_OPERATIONAL”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj YubhŒ action to the ”…”�”}”(hj Yh²hh³Nh´Nubj¦)�”}”(hŒ**ampdu_action**”h]”hŒ ampdu_action”…”�”}”(hj#Yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj YubhŒ callback.”…”�”}”(hj Yh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œi/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:134: ./net/mac80211/agg-tx.c”h´K-hj•Xh²hubhÌ)�”}”(hX‡Similarly, 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]”(hŒƒSimilarly, when the aggregation session is stopped by the peer or something calling ieee80211_stop_tx_ba_session(), the driver’s ”…”�”}”(hj` to indicate which action is needed.”h]”(hŒ9These flags are used with the ampdu_action() callback in ”…”�”}”(hj°\h²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_ops `”h]”jû)�”}”(hjº\h]”hŒstruct ieee80211_ops”…”�”}”(hj¼\h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj¸\ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_ops”uh1hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.h”h´MOhj°\ubhŒ$ to indicate which action is needed.”…”�”}”(hj°\h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j×\h´MOhj‡Yh²hubhÌ)�”}”(hŒîNote 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]”hŒðNote 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â\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:147: ./include/net/mac80211.h”h´MRhj‡Yh²hubeh}”(h]”Œrx-a-mpdu-aggregation”ah ]”h"]”Œrx a-mpdu aggregation”ah$]”h&]”uh1hµhj„Xh²hh³hÊh´KŒubeh}”(h]”Œ aggregation”ah ]”h"]”Œ aggregation”ah$]”h&]”uh1hµhh·h²hh³hÊh´K�ubh¶)�”}”(hhh]”(h»)�”}”(hŒ%Spatial Multiplexing Powersave (SMPS)”h]”hŒ%Spatial Multiplexing Powersave (SMPS)”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj]h²hh³hÊh´K—ubhÌ)�”}”(hŒÝSMPS (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]”hŒáSMPS (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]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.h”h´MFhj]h²hubhÌ)�”}”(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!]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.h”h´MKhj]h²hubhÌ)�”}”(hŒŽThe default mode will be "automatic", which nl80211/cfg80211 defines to be dynamic SMPS in (regular) powersave, and SMPS turned off otherwise.”h]”hŒ’The default mode will be “automaticâ€�, which nl80211/cfg80211 defines to be dynamic SMPS in (regular) powersave, and SMPS turned off otherwise.”…”�”}”(hj0]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.h”h´MRhj]h²hubhÌ)�”}”(hŒöTo 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]”hŒöTo 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?]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:153: ./include/net/mac80211.h”h´MVhj]h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒieee80211_smps_mode (C enum)”Œc.ieee80211_smps_mode”hNt”auh1húhj]h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_smps_mode”h]”j)�”}”(hŒenum ieee80211_smps_mode”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hjg]h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjc]h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hju]h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjc]h²hh³jt]h´Kubj@)�”}”(hŒieee80211_smps_mode”h]”jF)�”}”(hja]h]”hŒieee80211_smps_mode”…”�”}”(hj‡]h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjƒ]ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjc]h²hh³jt]h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj_]h²hh³jt]h´Kubah}”(h]”jZ]ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jt]h´Khj\]h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ$spatial multiplexing power save mode”h]”hŒ$spatial multiplexing power save mode”…”�”}”(hj©]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´M]hj¦]h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj\]h²hh³jt]h´Kubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–jÁ]j—jÁ]j˜‰j™‰jš‰uh1j h²hhj]h³Nh´Nubjœ)�”}”(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 use”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hjË]h]”hŒ Constants”…”�”}”(hjÍ]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÉ]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´MahjÅ]ubjê)�”}”(hhh]”(jï)�”}”(hŒ'``IEEE80211_SMPS_AUTOMATIC`` automatic ”h]”(jõ)�”}”(hŒ``IEEE80211_SMPS_AUTOMATIC``”h]”jû)�”}”(hjê]h]”hŒIEEE80211_SMPS_AUTOMATIC”…”�”}”(hjì]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjè]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mdhjä]ubj)�”}”(hhh]”hÌ)�”}”(hŒ automatic”h]”hŒ automatic”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÿ]h´Mdhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjä]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÿ]h´Mdhjá]ubjï)�”}”(hŒ``IEEE80211_SMPS_OFF`` off ”h]”(jõ)�”}”(hŒ``IEEE80211_SMPS_OFF``”h]”jû)�”}”(hj#^h]”hŒIEEE80211_SMPS_OFF”…”�”}”(hj%^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj!^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mghj^ubj)�”}”(hhh]”hÌ)�”}”(hŒoff”h]”hŒoff”…”�”}”(hj<^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j8^h´Mghj9^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j8^h´Mghjá]ubjï)�”}”(hŒ!``IEEE80211_SMPS_STATIC`` static ”h]”(jõ)�”}”(hŒ``IEEE80211_SMPS_STATIC``”h]”jû)�”}”(hj\^h]”hŒIEEE80211_SMPS_STATIC”…”�”}”(hj^^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjZ^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´MjhjV^ubj)�”}”(hhh]”hÌ)�”}”(hŒstatic”h]”hŒstatic”…”�”}”(hju^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jq^h´Mjhjr^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjV^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jq^h´Mjhjá]ubjï)�”}”(hŒ#``IEEE80211_SMPS_DYNAMIC`` dynamic ”h]”(jõ)�”}”(hŒ``IEEE80211_SMPS_DYNAMIC``”h]”jû)�”}”(hj•^h]”hŒIEEE80211_SMPS_DYNAMIC”…”�”}”(hj—^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj“^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mmhj�^ubj)�”}”(hhh]”hÌ)�”}”(hŒdynamic”h]”hŒdynamic”…”�”}”(hj®^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jª^h´Mmhj«^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jª^h´Mmhjá]ubjï)�”}”(hŒ0``IEEE80211_SMPS_NUM_MODES`` internal, don't use”h]”(jõ)�”}”(hŒ``IEEE80211_SMPS_NUM_MODES``”h]”jû)�”}”(hjÎ^h]”hŒIEEE80211_SMPS_NUM_MODES”…”�”}”(hjÐ^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÌ^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´MohjÈ^ubj)�”}”(hhh]”hÌ)�”}”(hŒinternal, don't use”h]”hŒinternal, don’t use”…”�”}”(hjç^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mphjä^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈ^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jã^h´Mohjá]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjÅ]ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj]h²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ#ieee80211_request_smps (C function)”Œc.ieee80211_request_smps”hNt”auh1húhj]h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒqvoid ieee80211_request_smps (struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)”h]”j)�”}”(hŒpvoid ieee80211_request_smps(struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj(_h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj$_h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mðubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj7_h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj$_h²hh³j6_h´Mðubj@)�”}”(hŒieee80211_request_smps”h]”jF)�”}”(hŒieee80211_request_smps”h]”hŒieee80211_request_smps”…”�”}”(hjI_h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjE_ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj$_h²hh³j6_h´MðubjC)�”}”(hŒU(struct ieee80211_vif *vif, unsigned int link_id, enum ieee80211_smps_mode smps_mode)”h]”(jI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hje_h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhja_ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjr_h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hja_ubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hjƒ_h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj€_ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j…_Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jK_sbŒc.ieee80211_request_smps”†”asbuh1hhja_ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj£_h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hja_ubj)�”}”(hjh]”hŒ*”…”�”}”(hj±_h²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhja_ubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hj¾_h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhja_ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj]_ubjI)�”}”(hŒunsigned int link_id”h]”(jû)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj×_h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjÓ_ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjå_h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÓ_ubjû)�”}”(hŒint”h]”hŒint”…”�”}”(hjó_h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjÓ_ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÓ_ubjF)�”}”(hŒlink_id”h]”hŒlink_id”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjÓ_ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj]_ubjI)�”}”(hŒ"enum ieee80211_smps_mode smps_mode”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hj(`h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj$`ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5`h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj$`ubh)�”}”(hhh]”jF)�”}”(hŒieee80211_smps_mode”h]”hŒieee80211_smps_mode”…”�”}”(hjF`h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjC`ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”jH`Œmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jŸ_Œc.ieee80211_request_smps”†”asbuh1hhj$`ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjd`h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj$`ubjF)�”}”(hŒ smps_mode”h]”hŒ smps_mode”…”�”}”(hjr`h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj$`ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhj]_ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhj$_h²hh³j6_h´Mðubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj _h²hh³j6_h´Mðubah}”(h]”j_ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j6_h´Mðhj_h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒrequest SM PS transition”h]”hŒrequest SM PS transition”…”�”}”(hjœ`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mðhj™`h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj_h²hh³j6_h´Mðubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–j´`j—j´`j˜‰j™‰jš‰uh1j h²hhj]h³Nh´Nubjœ)�”}”(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À`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¼`ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Môhj¸`ubjê)�”}”(hhh]”(jï)�”}”(hŒv``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]”hŒstruct ieee80211_vif *vif”…”�”}”(hjß`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÛ`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mñhj×`ubj)�”}”(hhh]”hÌ)�”}”(hŒW:c:type:`struct ieee80211_vif ` pointer from the add_interface callback.”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hjü`h]”hŒstruct ieee80211_vif”…”�”}”(hjþ`h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjú`ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³jò`h´Mñhjö`ubhŒ) pointer from the add_interface callback.”…”�”}”(hjö`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jò`h´Mñhjó`ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj×`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jò`h´MñhjÔ`ubjï)�”}”(hŒ/``unsigned int link_id`` link ID for MLO, or 0 ”h]”(jõ)�”}”(hŒ``unsigned int link_id``”h]”jû)�”}”(hj5ah]”hŒunsigned int link_id”…”�”}”(hj7ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj3aubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mòhj/aubj)�”}”(hhh]”hÌ)�”}”(hŒlink ID for MLO, or 0”h]”hŒlink ID for MLO, or 0”…”�”}”(hjNah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jJah´MòhjKaubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj/aubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jJah´MòhjÔ`ubjï)�”}”(hŒ6``enum ieee80211_smps_mode smps_mode`` new SM PS mode ”h]”(jõ)�”}”(hŒ&``enum ieee80211_smps_mode smps_mode``”h]”jû)�”}”(hjnah]”hŒ"enum ieee80211_smps_mode smps_mode”…”�”}”(hjpah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjlaubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Móhjhaubj)�”}”(hhh]”hÌ)�”}”(hŒnew SM PS mode”h]”hŒnew SM PS mode”…”�”}”(hj‡ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jƒah´Móhj„aubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhaubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jƒah´MóhjÔ`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj¸`ubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj©ah]”hŒ Description”…”�”}”(hj«ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj§aubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Mõhj¸`ubhÌ)�”}”(hŒÀ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ŒÀ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.”…”�”}”(hj¿ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:156: ./include/net/mac80211.h”h´Môhj¸`ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hj]h²hh³Nh´NubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hjÕah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¡hj]h²hubhÌ)�”}”(hŒpThis part of the book describes the rate control algorithm interface and how it relates to mac80211 and drivers.”h]”hŒpThis part of the book describes the rate control algorithm interface and how it relates to mac80211 and drivers.”…”�”}”(hjãah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K£hj]h²hubeh}”(h]”Œ#spatial-multiplexing-powersave-smps”ah ]”h"]”Œ%spatial multiplexing powersave (smps)”ah$]”h&]”uh1hµhh·h²hh³hÊh´K—ubh¶)�”}”(hhh]”(h»)�”}”(hŒRate Control API”h]”hŒRate Control API”…”�”}”(hjüah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjùah²hh³hÊh´K§ubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hj bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K©hjùah²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ'ieee80211_rate_control_changed (C enum)”Œ c.ieee80211_rate_control_changed”hNt”auh1húhjùah²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_rate_control_changed”h]”j)�”}”(hŒ#enum ieee80211_rate_control_changed”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hj1bh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj-bh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj?bh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj-bh²hh³j>bh´Kubj@)�”}”(hŒieee80211_rate_control_changed”h]”jF)�”}”(hj+bh]”hŒieee80211_rate_control_changed”…”�”}”(hjQbh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjMbubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj-bh²hh³j>bh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj)bh²hh³j>bh´Kubah}”(h]”j$bah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j>bh´Khj&bh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒflags to indicate what changed”h]”hŒflags to indicate what changed”…”�”}”(hjsbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M¡hjpbh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj&bh²hh³j>bh´Kubeh}”(h]”h ]”(j�Œenum”eh"]”h$]”h&]”j•j�j–j‹bj—j‹bj˜‰j™‰jš‰uh1j h²hhjùah³Nh´Nubjœ)�”}”(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 peer”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hj•bh]”hŒ Constants”…”�”}”(hj—bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj“bubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M¥hj�bubjê)�”}”(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û)�”}”(hj´bh]”hŒIEEE80211_RC_BW_CHANGED”…”�”}”(hj¶bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj²bubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M«hj®bubj)�”}”(hhh]”hÌ)�”}”(hŒä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]”hŒä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.”…”�”}”(hjÍbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M¨hjÊbubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj®bubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÉbh´M«hj«bubjï)�”}”(hŒE``IEEE80211_RC_SMPS_CHANGED`` The SMPS state of the station changed. ”h]”(jõ)�”}”(hŒ``IEEE80211_RC_SMPS_CHANGED``”h]”jû)�”}”(hjîbh]”hŒIEEE80211_RC_SMPS_CHANGED”…”�”}”(hjðbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjìbubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M®hjèbubj)�”}”(hhh]”hÌ)�”}”(hŒ&The SMPS state of the station changed.”h]”hŒ&The SMPS state of the station changed.”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jch´M®hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjèbubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jch´M®hj«bubjï)�”}”(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û)�”}”(hj'ch]”hŒIEEE80211_RC_SUPP_RATES_CHANGED”…”�”}”(hj)ch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj%cubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M³hj!cubj)�”}”(hhh]”hÌ)�”}”(hŒnThe supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer.”h]”hŒnThe supported rate set of this peer changed (in IBSS mode) due to discovering more information about the peer.”…”�”}”(hj@ch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M±hj=cubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj!cubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j` 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¦)�”}”(hjþgh]”hŒ Parameters”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjügubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´Mhjøgubjê)�”}”(hhh]”(jï)�”}”(hŒu``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback ”h]”(jõ)�”}”(hŒ``struct ieee80211_vif *vif``”h]”jû)�”}”(hjhh]”hŒstruct ieee80211_vif *vif”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M hjhubj)�”}”(hhh]”hÌ)�”}”(hŒV:c:type:`struct ieee80211_vif ` pointer from the add_interface callback”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj:hubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³j2hh´M hj6hubhŒ( pointer from the add_interface callback”…”�”}”(hj6hh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j2hh´M hj3hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j2hh´M hjhubjï)�”}”(hŒ?``const u8 *ra`` receiver address of the BA session recipient. ”h]”(jõ)�”}”(hŒ``const u8 *ra``”h]”jû)�”}”(hjuhh]”hŒ const u8 *ra”…”�”}”(hjwhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjshubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M hjohubj)�”}”(hhh]”hÌ)�”}”(hŒ-receiver address of the BA session recipient.”h]”hŒ-receiver address of the BA session recipient.”…”�”}”(hjŽhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jŠhh´M hj‹hubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjohubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jŠhh´M hjhubjï)�”}”(hŒ``u16 tid`` the TID to BA on. ”h]”(jõ)�”}”(hŒ ``u16 tid``”h]”jû)�”}”(hj®hh]”hŒu16 tid”…”�”}”(hj°hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¬hubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´Mhj¨hubj)�”}”(hhh]”hÌ)�”}”(hŒthe TID to BA on.”h]”hŒthe TID to BA on.”…”�”}”(hjÇhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÃhh´MhjÄhubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÃhh´Mhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjøgubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjéhh]”hŒ Description”…”�”}”(hjëhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjçhubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´MhjøgubhÌ)�”}”(hŒŽ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ŒŽ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.”…”�”}”(hjÿhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´Mhjøgubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjùah²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ)ieee80211_stop_tx_ba_session (C function)”Œc.ieee80211_stop_tx_ba_session”hNt”auh1húhjùah²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒEint ieee80211_stop_tx_ba_session (struct ieee80211_sta *sta, u16 tid)”h]”j)�”}”(hŒDint ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid)”h]”(jû)�”}”(hŒint”h]”hŒint”…”�”}”(hj.ih²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhj*ih²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´Mubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj=ih²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj*ih²hh³jnegative error if the TID is invalid, or no aggregation active”h]”hŒ>negative error if the TID is invalid, or no aggregation active”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´MhjRjubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjkh]”hŒ Description”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´MhjRjubhÌ)�”}”(hŒ«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Œ«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.”…”�”}”(hj(kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´MhjRjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjùah²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ,ieee80211_stop_tx_ba_cb_irqsafe (C function)”Œ!c.ieee80211_stop_tx_ba_cb_irqsafe”hNt”auh1húhjùah²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒWvoid ieee80211_stop_tx_ba_cb_irqsafe (struct ieee80211_vif *vif, const u8 *ra, u16 tid)”h]”j)�”}”(hŒVvoid ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, const u8 *ra, u16 tid)”h]”(jû)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjWkh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1júhjSkh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M%ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjfkh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjSkh²hh³jekh´M%ubj@)�”}”(hŒieee80211_stop_tx_ba_cb_irqsafe”h]”jF)�”}”(hŒieee80211_stop_tx_ba_cb_irqsafe”h]”hŒieee80211_stop_tx_ba_cb_irqsafe”…”�”}”(hjxkh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjtkubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjSkh²hh³jekh´M%ubjC)�”}”(hŒ2(struct ieee80211_vif *vif, const u8 *ra, u16 tid)”h]”(jI)�”}”(hŒstruct ieee80211_vif *vif”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj”kh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj�kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¡kh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj�kubh)�”}”(hhh]”jF)�”}”(hŒ ieee80211_vif”h]”hŒ ieee80211_vif”…”�”}”(hj²kh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj¯kubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j´kŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”j�)�”}”j‚jzksbŒ!c.ieee80211_stop_tx_ba_cb_irqsafe”†”asbuh1hhj�kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÒkh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj�kubj)�”}”(hjh]”hŒ*”…”�”}”(hjàkh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhj�kubjF)�”}”(hŒvif”h]”hŒvif”…”�”}”(hjíkh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj�kubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjŒkubjI)�”}”(hŒ const u8 *ra”h]”(j)�”}”(hjßh]”hŒconst”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjlubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjlubh)�”}”(hhh]”jF)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj$lh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj!lubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j&lŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jÎkŒ!c.ieee80211_stop_tx_ba_cb_irqsafe”†”asbuh1hhjlubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjBlh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjlubj)�”}”(hjh]”hŒ*”…”�”}”(hjPlh²hh³Nh´Nubah}”(h]”h ]”j&ah"]”h$]”h&]”uh1jhjlubjF)�”}”(hŒra”h]”hŒra”…”�”}”(hj]lh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjlubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjŒkubjI)�”}”(hŒu16 tid”h]”(h)�”}”(hhh]”jF)�”}”(hŒu16”h]”hŒu16”…”�”}”(hjylh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjvlubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”j�Œreftype”j‚Œ reftarget”j{lŒmodname”NŒ classname”Nj†j‰)�”}”jŒ]”jÎkŒ!c.ieee80211_stop_tx_ba_cb_irqsafe”†”asbuh1hhjrlubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj—lh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjrlubjF)�”}”(hŒtid”h]”hŒtid”…”�”}”(hj¥lh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjrlubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj]j^uh1jHhjŒkubeh}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jBhjSkh²hh³jekh´M%ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjOkh²hh³jekh´M%ubah}”(h]”jJkah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jekh´M%hjLkh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ)low level driver ready to stop aggregate.”h]”hŒ)low level driver ready to stop aggregate.”…”�”}”(hjÏlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M%hjÌlh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjLkh²hh³jekh´M%ubeh}”(h]”h ]”(j�Œfunction”eh"]”h$]”h&]”j•j�j–jçlj—jçlj˜‰j™‰jš‰uh1j h²hhjùah³Nh´Nubjœ)�”}”(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¦)�”}”(hjñlh]”hŒ Parameters”…”�”}”(hjólh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjïlubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M)hjëlubjê)�”}”(hhh]”(jï)�”}”(hŒu``struct ieee80211_vif *vif`` :c:type:`struct ieee80211_vif ` pointer from the add_interface callback ”h]”(jõ)�”}”(hŒ``struct ieee80211_vif *vif``”h]”jû)�”}”(hjmh]”hŒstruct ieee80211_vif *vif”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjmubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M&hj mubj)�”}”(hhh]”hÌ)�”}”(hŒV:c:type:`struct ieee80211_vif ` pointer from the add_interface callback”h]”(h)�”}”(hŒ.:c:type:`struct ieee80211_vif `”h]”jû)�”}”(hj/mh]”hŒstruct ieee80211_vif”…”�”}”(hj1mh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj-mubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_vif”uh1hh³j%mh´M&hj)mubhŒ( pointer from the add_interface callback”…”�”}”(hj)mh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j%mh´M&hj&mubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj mubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j%mh´M&hjmubjï)�”}”(hŒ?``const u8 *ra`` receiver address of the BA session recipient. ”h]”(jõ)�”}”(hŒ``const u8 *ra``”h]”jû)�”}”(hjhmh]”hŒ const u8 *ra”…”�”}”(hjjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjfmubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M'hjbmubj)�”}”(hhh]”hÌ)�”}”(hŒ-receiver address of the BA session recipient.”h]”hŒ-receiver address of the BA session recipient.”…”�”}”(hj�mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j}mh´M'hj~mubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjbmubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j}mh´M'hjmubjï)�”}”(hŒ&``u16 tid`` the desired TID to BA on. ”h]”(jõ)�”}”(hŒ ``u16 tid``”h]”jû)�”}”(hj¡mh]”hŒu16 tid”…”�”}”(hj£mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjŸmubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M(hj›mubj)�”}”(hhh]”hÌ)�”}”(hŒthe desired TID to BA on.”h]”hŒthe desired TID to BA on.”…”�”}”(hjºmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¶mh´M(hj·mubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj›mubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¶mh´M(hjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjëlubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjÜmh]”hŒ Description”…”�”}”(hjÞmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjÚmubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M*hjëlubhÌ)�”}”(hŒ˜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Œ˜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.”…”�”}”(hjòmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M)hjëlubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjùah²hh³Nh´Nubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ$ieee80211_tx_rate_control (C struct)”Œc.ieee80211_tx_rate_control”hNt”auh1húhjùah²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_tx_rate_control”h]”j)�”}”(hŒ struct ieee80211_tx_rate_control”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj!nh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjnh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M0ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj/nh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjnh²hh³j.nh´M0ubj@)�”}”(hŒieee80211_tx_rate_control”h]”jF)�”}”(hjnh]”hŒieee80211_tx_rate_control”…”�”}”(hjAnh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj=nubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjnh²hh³j.nh´M0ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjnh²hh³j.nh´M0ubah}”(h]”jnah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j.nh´M0hjnh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ)rate control information for/from RC algo”h]”hŒ)rate control information for/from RC algo”…”�”}”(hjcnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M€hj`nh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjnh²hh³j.nh´M0ubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–j{nj—j{nj˜‰j™‰jš‰uh1j h²hhjùah³Nh´Nubjœ)�”}”(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 mode”h]”(hÌ)�”}”(hŒ**Definition**::”h]”(j¦)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj‡nh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjƒnubhŒ:”…”�”}”(hjƒnh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M„hjnubjÁ)�”}”(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 nsbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M†hjnubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hj±nh]”hŒMembers”…”�”}”(hj³nh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¯nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M’hjnubjê)�”}”(hhh]”(jï)�”}”(hŒ2``hw`` The hardware the algorithm is invoked for. ”h]”(jõ)�”}”(hŒ``hw``”h]”jû)�”}”(hjÐnh]”hŒhw”…”�”}”(hjÒnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÎnubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´MƒhjÊnubj)�”}”(hhh]”hÌ)�”}”(hŒ*The hardware the algorithm is invoked for.”h]”hŒ*The hardware the algorithm is invoked for.”…”�”}”(hjénh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jånh´Mƒhjænubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÊnubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jånh´MƒhjÇnubjï)�”}”(hŒ7``sband`` The band this frame is being transmitted on. ”h]”(jõ)�”}”(hŒ ``sband``”h]”jû)�”}”(hj oh]”hŒsband”…”�”}”(hj oh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M„hjoubj)�”}”(hhh]”hÌ)�”}”(hŒ,The band this frame is being transmitted on.”h]”hŒ,The band this frame is being transmitted on.”…”�”}”(hj"oh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³joh´M„hjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjoubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³joh´M„hjÇnubjï)�”}”(hŒ+``bss_conf`` the current BSS configuration ”h]”(jõ)�”}”(hŒ ``bss_conf``”h]”jû)�”}”(hjBoh]”hŒbss_conf”…”�”}”(hjDoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj@oubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M…hjph´MŽhjÇnubjï)�”}”(hŒ4``rate_idx_mask`` user-requested (legacy) rate mask ”h]”(jõ)�”}”(hŒ``rate_idx_mask``”h]”jû)�”}”(hjcph]”hŒ rate_idx_mask”…”�”}”(hjeph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjapubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M�hj]pubj)�”}”(hhh]”hÌ)�”}”(hŒ!user-requested (legacy) rate mask”h]”hŒ!user-requested (legacy) rate mask”…”�”}”(hj|ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jxph´M�hjypubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj]pubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jxph´M�hjÇnubjï)�”}”(hŒH``rate_idx_mcs_mask`` user-requested MCS rate mask (NULL if not in use) ”h]”(jõ)�”}”(hŒ``rate_idx_mcs_mask``”h]”jû)�”}”(hjœph]”hŒrate_idx_mcs_mask”…”�”}”(hjžph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjšpubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M�hj–pubj)�”}”(hhh]”hÌ)�”}”(hŒ1user-requested MCS rate mask (NULL if not in use)”h]”hŒ1user-requested MCS rate mask (NULL if not in use)”…”�”}”(hjµph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j±ph´M�hj²pubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj–pubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j±ph´M�hjÇnubjï)�”}”(hŒ9``bss`` whether this frame is sent out in AP or IBSS mode”h]”(jõ)�”}”(hŒ``bss``”h]”jû)�”}”(hjÕph]”hŒbss”…”�”}”(hj×ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÓpubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M�hjÏpubj)�”}”(hhh]”hÌ)�”}”(hŒ1whether this frame is sent out in AP or IBSS mode”h]”hŒ1whether this frame is sent out in AP or IBSS mode”…”�”}”(hjîph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:171: ./include/net/mac80211.h”h´M‘hjëpubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÏpubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jêph´M�hjÇnubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjnubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjùah²hh³Nh´NubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K´hjùah²hubhÌ)�”}”(hŒ3This part of the book describes mac80211 internals.”h]”hŒ3This part of the book describes mac80211 internals.”…”�”}”(hj$qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K¶hjùah²hubeh}”(h]”Œrate-control-api”ah ]”h"]”Œrate control api”ah$]”h&]”uh1hµhh·h²hh³hÊh´K§ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Key handling”h]”hŒ Key handling”…”�”}”(hj=qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj:qh²hh³hÊh´K¹ubh¶)�”}”(hhh]”(h»)�”}”(hŒKey handling basics”h]”hŒKey handling basics”…”�”}”(hjNqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjKqh²hh³hÊh´K¼ubhÌ)�”}”(hŒ½Key handling in mac80211 is done based on per-interface (sub_if_data) keys and per-station keys. Since each station belongs to an interface, each station key also belongs to that interface.”h]”hŒ½Key handling in mac80211 is done based on per-interface (sub_if_data) keys and per-station keys. Since each station belongs to an interface, each station key also belongs to that interface.”…”�”}”(hj\qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:190: ./net/mac80211/key.c”h´K hjKqh²hubhÌ)�”}”(hX¡Hardware acceleration is done on a best-effort basis for algorithms that are implemented in software, for each key the hardware is asked to enable that key for offloading but if it cannot do that the key is simply kept for software encryption (unless it is for an algorithm that isn't implemented in software). There is currently no way of knowing whether a key is handled in SW or HW except by looking into debugfs.”h]”hX£Hardware acceleration is done on a best-effort basis for algorithms that are implemented in software, for each key the hardware is asked to enable that key for offloading but if it cannot do that the key is simply kept for software encryption (unless it is for an algorithm that isn’t implemented in software). There is currently no way of knowing whether a key is handled in SW or HW except by looking into debugfs.”…”�”}”(hjkqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:190: ./net/mac80211/key.c”h´K$hjKqh²hubhÌ)�”}”(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.”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.”…”�”}”(hjzqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œf/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:190: ./net/mac80211/key.c”h´K,hjKqh²hubeh}”(h]”Œkey-handling-basics”ah ]”h"]”Œkey handling basics”ah$]”h&]”uh1hµhj:qh²hh³hÊh´K¼ubh¶)�”}”(hhh]”(h»)�”}”(hŒMORE TBD”h]”hŒMORE TBD”…”�”}”(hj”qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj‘qh²hh³hÊh´KÂubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hj¢qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÄhj‘qh²hubeh}”(h]”Œmore-tbd”ah ]”h"]”Œmore tbd”ah$]”h&]”uh1hµhj:qh²hh³hÊh´KÂubeh}”(h]”Œ key-handling”ah ]”h"]”Œ key handling”ah$]”h&]”uh1hµhh·h²hh³hÊh´K¹ubh¶)�”}”(hhh]”(h»)�”}”(hŒReceive processing”h]”hŒReceive processing”…”�”}”(hjÃqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÀqh²hh³hÊh´KÇubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hjÑqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÉhjÀqh²hubeh}”(h]”Œreceive-processing”ah ]”h"]”Œreceive processing”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÇubh¶)�”}”(hhh]”(h»)�”}”(hŒTransmit processing”h]”hŒTransmit processing”…”�”}”(hjêqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjçqh²hh³hÊh´KÌubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hjøqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KÎhjçqh²hubeh}”(h]”Œtransmit-processing”ah ]”h"]”Œtransmit processing”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÌubh¶)�”}”(hhh]”(h»)�”}”(hŒStation info handling”h]”hŒStation info handling”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjrh²hh³hÊh´KÑubh¶)�”}”(hhh]”(h»)�”}”(hŒProgramming information”h]”hŒProgramming information”…”�”}”(hj"rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjrh²hh³hÊh´KÔubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒ!ieee80211_sta_info_flags (C enum)”Œc.ieee80211_sta_info_flags”hNt”auh1húhjrh²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Nubj )�”}”(hhh]”(j)�”}”(hŒieee80211_sta_info_flags”h]”j)�”}”(hŒenum ieee80211_sta_info_flags”h]”(j)�”}”(hj�h]”hŒenum”…”�”}”(hjJrh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjFrh²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjXrh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjFrh²hh³jWrh´Kubj@)�”}”(hŒieee80211_sta_info_flags”h]”jF)�”}”(hjDrh]”hŒieee80211_sta_info_flags”…”�”}”(hjjrh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjfrubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjFrh²hh³jWrh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjBrh²hh³jWrh´Kubah}”(h]”jrh´Nubjœ)�”}”(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 flags”h]”(hÌ)�”}”(hŒ **Constants**”h]”j¦)�”}”(hj®rh]”hŒ Constants”…”�”}”(hj°rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj¬rubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Khj¨rubjê)�”}”(hhh]”(jï)�”}”(hŒ,``WLAN_STA_AUTH`` Station is authenticated. ”h]”(jõ)�”}”(hŒ``WLAN_STA_AUTH``”h]”jû)�”}”(hjÍrh]”hŒ WLAN_STA_AUTH”…”�”}”(hjÏrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjËrubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´KhjÇrubj)�”}”(hhh]”hÌ)�”}”(hŒStation is authenticated.”h]”hŒStation is authenticated.”…”�”}”(hjærh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jârh´Khjãrubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÇrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jârh´KhjÄrubjï)�”}”(hŒ*``WLAN_STA_ASSOC`` Station is associated. ”h]”(jõ)�”}”(hŒ``WLAN_STA_ASSOC``”h]”jû)�”}”(hjsh]”hŒWLAN_STA_ASSOC”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K"hjsubj)�”}”(hhh]”hÌ)�”}”(hŒStation is associated.”h]”hŒStation is associated.”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jsh´K"hjsubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jsh´K"hjÄrubjï)�”}”(hŒ2``WLAN_STA_PS_STA`` Station is in power-save mode ”h]”(jõ)�”}”(hŒ``WLAN_STA_PS_STA``”h]”jû)�”}”(hj?sh]”hŒWLAN_STA_PS_STA”…”�”}”(hjAsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj=subah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K%hj9subj)�”}”(hhh]”hÌ)�”}”(hŒStation is in power-save mode”h]”hŒStation is in power-save mode”…”�”}”(hjXsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jTsh´K%hjUsubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj9subeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jTsh´K%hjÄrubjï)�”}”(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û)�”}”(hjxsh]”hŒWLAN_STA_AUTHORIZED”…”�”}”(hjzsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjvsubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K*hjrsubj)�”}”(hhh]”hÌ)�”}”(hŒš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]”hŒš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.”…”�”}”(hj‘sh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K(hjŽsubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjrsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j�sh´K*hjÄrubjï)�”}”(hŒS``WLAN_STA_SHORT_PREAMBLE`` Station is capable of receiving short-preamble frames. ”h]”(jõ)�”}”(hŒ``WLAN_STA_SHORT_PREAMBLE``”h]”jû)�”}”(hj²sh]”hŒWLAN_STA_SHORT_PREAMBLE”…”�”}”(hj´sh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj°subah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K.hj¬subj)�”}”(hhh]”hÌ)�”}”(hŒ6Station is capable of receiving short-preamble frames.”h]”hŒ6Station is capable of receiving short-preamble frames.”…”�”}”(hjËsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K-hjÈsubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬subeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÇsh´K.hjÄrubjï)�”}”(hŒ2``WLAN_STA_WDS`` Station is one of our WDS peers. ”h]”(jõ)�”}”(hŒ``WLAN_STA_WDS``”h]”jû)�”}”(hjìsh]”hŒ WLAN_STA_WDS”…”�”}”(hjîsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjêsubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K1hjæsubj)�”}”(hhh]”hÌ)�”}”(hŒ Station is one of our WDS peers.”h]”hŒ Station is one of our WDS peers.”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jth´K1hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjæsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jth´K1hjÄrubjï)�”}”(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û)�”}”(hj%th]”hŒWLAN_STA_CLEAR_PS_FILT”…”�”}”(hj'th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj#tubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K6hjtubj)�”}”(hhh]”hÌ)�”}”(hŒ‡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]”hŒ‡Clear PS filter in hardware (using the IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next frame to this station is transmitted.”…”�”}”(hj>th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K4hj;tubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjtubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j:th´K6hjÄrubjï)�”}”(hŒD``WLAN_STA_MFP`` Management frame protection is used with this STA. ”h]”(jõ)�”}”(hŒ``WLAN_STA_MFP``”h]”jû)�”}”(hj_th]”hŒ WLAN_STA_MFP”…”�”}”(hjath²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj]tubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K9hjYtubj)�”}”(hhh]”hÌ)�”}”(hŒ2Management frame protection is used with this STA.”h]”hŒ2Management frame protection is used with this STA.”…”�”}”(hjxth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jtth´K9hjutubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjYtubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jtth´K9hjÄrubjï)�”}”(hŒn``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û)�”}”(hj˜th]”hŒWLAN_STA_BLOCK_BA”…”�”}”(hjšth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj–tubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K=hj’tubj)�”}”(hhh]”hÌ)�”}”(hŒWUsed to deny ADDBA requests (both TX and RX) during suspend/resume and station removal.”h]”hŒWUsed to deny ADDBA requests (both TX and RX) during suspend/resume and station removal.”…”�”}”(hj±th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K``WLAN_STA_MPSP_RECIPIENT`` local STA is recipient of a MPSP. ”h]”(jõ)�”}”(hŒ``WLAN_STA_MPSP_RECIPIENT``”h]”jû)�”}”(hj1xh]”hŒWLAN_STA_MPSP_RECIPIENT”…”�”}”(hj3xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj/xubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Kwhj+xubj)�”}”(hhh]”hÌ)�”}”(hŒ!local STA is recipient of a MPSP.”h]”hŒ!local STA is recipient of a MPSP.”…”�”}”(hjJxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jFxh´KwhjGxubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj+xubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jFxh´KwhjÄrubjï)�”}”(hŒh``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û)�”}”(hjjxh]”hŒWLAN_STA_PS_DELIVER”…”�”}”(hjlxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjhxubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K{hjdxubj)�”}”(hhh]”hÌ)�”}”(hŒOstation woke up, but we're still blocking TX until pending frames are delivered”h]”hŒQstation woke up, but we’re still blocking TX until pending frames are delivered”…”�”}”(hjƒxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Kzhj€xubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjdxubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jxh´K{hjÄrubjï)�”}”(hŒr``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û)�”}”(hj¤xh]”hŒWLAN_STA_USES_ENCRYPTION”…”�”}”(hj¦xh²hh³Nh´Nubah}”(h]”h ]”•h"]”h$]”h&]”uh1júhj¢xubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Khjžxubj)�”}”(hhh]”hÌ)�”}”(hŒTThis station was configured for encryption, so drop all packets without a key later.”h]”hŒTThis station was configured for encryption, so drop all packets without a key later.”…”�”}”(hj½xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K~hjºxubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjžxubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¹xh´KhjÄrubjï)�”}”(hŒ>``WLAN_STA_DECAP_OFFLOAD`` This station uses rx decap offload ”h]”(jõ)�”}”(hŒ``WLAN_STA_DECAP_OFFLOAD``”h]”jû)�”}”(hjÞxh]”hŒWLAN_STA_DECAP_OFFLOAD”…”�”}”(hjàxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÜxubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K‚hjØxubj)�”}”(hhh]”hÌ)�”}”(hŒ"This station uses rx decap offload”h]”hŒ"This station uses rx decap offload”…”�”}”(hj÷xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jóxh´K‚hjôxubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjØxubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jóxh´K‚hjÄrubjï)�”}”(hŒ.``NUM_WLAN_STA_FLAGS`` number of defined flags”h]”(jõ)�”}”(hŒ``NUM_WLAN_STA_FLAGS``”h]”jû)�”}”(hjyh]”hŒNUM_WLAN_STA_FLAGS”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K„hjyubj)�”}”(hhh]”hÌ)�”}”(hŒnumber of defined flags”h]”hŒnumber of defined flags”…”�”}”(hj0yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K…hj-yubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j,yh´K„hjÄrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj¨rubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjrh²hh³j>rh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjZyh]”hŒ Description”…”�”}”(hj\yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjXyubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´K‡hjrh²hubhÌ)�”}”(hŒ‡These flags are used with :c:type:`struct sta_info `'s **flags** member, but only indirectly with set_sta_flag() and friends.”h]”(hŒThese flags are used with ”…”�”}”(hjpyh²hh³Nh´Nubh)�”}”(hŒ$:c:type:`struct sta_info `”h]”jû)�”}”(hjzyh]”hŒstruct sta_info”…”�”}”(hj|yh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjxyubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œsta_info”uh1hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´KhjpyubhŒ’s ”…”�”}”(hjpyh²hh³Nh´Nubj¦)�”}”(hŒ **flags**”h]”hŒflags”…”�”}”(hjœyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjpyubhŒ= member, but only indirectly with set_sta_flag() and friends.”…”�”}”(hjpyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j—yh´Khjrh²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒsta_info (C struct)”Œ c.sta_info”hNt”auh1húhjrh²hh³j>rh´Nubj )�”}”(hhh]”(j)�”}”(hŒsta_info”h]”j)�”}”(hŒstruct sta_info”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjÍyh²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjÉyh²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÛyh²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjÉyh²hh³jÚyh´Kubj@)�”}”(hŒsta_info”h]”jF)�”}”(hjÇyh]”hŒsta_info”…”�”}”(hjíyh²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjéyubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjÉyh²hh³jÚyh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjÅyh²hh³jÚyh´Kubah}”(h]”jÀyah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jÚyh´KhjÂyh²hubjt)�”}”(hhh]”hÌ)�”}”(hŒSTA information”h]”hŒSTA information”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M~hj zh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjÂyh²hh³jÚyh´Kubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–j'zj—j'zj˜‰j™‰jš‰uh1j h²hhjrh³j>rh´Nubjœ)�”}”(hXì**Definition**:: struct 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 *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 *fast_tx; struct ieee80211_fast_rx *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; 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 *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta_removed_link_stats rem_link_stats; struct ieee80211_sta sta; }; **Members** ``list`` global linked list entry ``free_list`` list entry for keeping track of stations to free ``rcu_head`` RCU head used for freeing this station struct ``hash_node`` hash node for rhashtable ``addr`` station's MAC address - duplicated from public part to let the hash table work with just a single cacheline ``local`` pointer to the global information ``sdata`` virtual interface this station belongs to ``ptk`` peer keys negotiated with this station, if any ``ptk_idx`` last installed peer key index ``rate_ctrl`` rate control algorithm reference ``rate_ctrl_priv`` rate control private per-STA pointer ``rate_ctrl_lock`` spinlock used to protect rate control data (data inside the algorithm, so serializes calls there) ``lock`` used for locking all fields that require locking, see comments in the header file. ``fast_tx`` TX fastpath information ``fast_rx`` RX fastpath information ``mesh`` mesh STA information ``drv_deliver_wk`` used for delivering frames after driver PS unblocking ``listen_interval`` listen interval of this station, when we're acting as AP ``dead`` set to true when sta is unlinked ``removed`` set to true when sta is being removed from sta_list ``uploaded`` set to true when sta is uploaded to the driver ``sta_state`` duplicates information about station state (for debug) ``_flags`` STA flags, see :c:type:`enum ieee80211_sta_info_flags `, 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 ``reserved_tid`` reserved TID (if any, otherwise IEEE80211_TID_UNRESERVED) ``amsdu_mesh_control`` track the mesh A-MSDU format used by the peer: ``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. ``rem_link_stats`` accumulated removed link stats ``sta`` station information we share with the driver”h]”(hÌ)�”}”(hŒ**Definition**::”h]”(j¦)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj3zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj/zubhŒ:”…”�”}”(hj/zh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M‚hj+zubjÁ)�”}”(hX[struct 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 *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 *fast_tx; struct ieee80211_fast_rx *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; 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 *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta_removed_link_stats rem_link_stats; struct ieee80211_sta sta; };”h]”hX[struct 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 *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 *fast_tx; struct ieee80211_fast_rx *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; 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 *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta_removed_link_stats rem_link_stats; struct ieee80211_sta sta; };”…”�”}”hjLzsbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M„hj+zubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hj]zh]”hŒMembers”…”�”}”(hj_zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj[zubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M·hj+zubjê)�”}”(hhh]”(jï)�”}”(hŒ"``list`` global linked list entry ”h]”(jõ)�”}”(hŒ``list``”h]”jû)�”}”(hj|zh]”hŒlist”…”�”}”(hj~zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjzzubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M„hjvzubj)�”}”(hhh]”hÌ)�”}”(hŒglobal linked list entry”h]”hŒglobal linked list entry”…”�”}”(hj•zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j‘zh´M„hj’zubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjvzubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‘zh´M„hjszubjï)�”}”(hŒ?``free_list`` list entry for keeping track of stations to free ”h]”(jõ)�”}”(hŒ ``free_list``”h]”jû)�”}”(hjµzh]”hŒ free_list”…”�”}”(hj·zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj³zubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M…hj¯zubj)�”}”(hhh]”hÌ)�”}”(hŒ0list entry for keeping track of stations to free”h]”hŒ0list entry for keeping track of stations to free”…”�”}”(hjÎzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÊzh´M…hjËzubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¯zubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÊzh´M…hjszubjï)�”}”(hŒ;``rcu_head`` RCU head used for freeing this station struct ”h]”(jõ)�”}”(hŒ ``rcu_head``”h]”jû)�”}”(hjîzh]”hŒrcu_head”…”�”}”(hjðzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjìzubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¯hjèzubj)�”}”(hhh]”hÌ)�”}”(hŒ-RCU head used for freeing this station struct”h]”hŒ-RCU head used for freeing this station struct”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j{h´M¯hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjèzubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j{h´M¯hjszubjï)�”}”(hŒ'``hash_node`` hash node for rhashtable ”h]”(jõ)�”}”(hŒ ``hash_node``”h]”jû)�”}”(hj'{h]”hŒ hash_node”…”�”}”(hj){h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj%{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M†hj!{ubj)�”}”(hhh]”hÌ)�”}”(hŒhash node for rhashtable”h]”hŒhash node for rhashtable”…”�”}”(hj@{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j<{h´M†hj={ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj!{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j<{h´M†hjszubjï)�”}”(hŒu``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`{h]”hŒaddr”…”�”}”(hjb{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj^{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MˆhjZ{ubj)�”}”(hhh]”hÌ)�”}”(hŒkstation's MAC address - duplicated from public part to let the hash table work with just a single cacheline”h]”hŒmstation’s MAC address - duplicated from public part to let the hash table work with just a single cacheline”…”�”}”(hjy{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M‡hjv{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZ{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³ju{h´Mˆhjszubjï)�”}”(hŒ,``local`` pointer to the global information ”h]”(jõ)�”}”(hŒ ``local``”h]”jû)�”}”(hjš{h]”hŒlocal”…”�”}”(hjœ{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj˜{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M‰hj”{ubj)�”}”(hhh]”hÌ)�”}”(hŒ!pointer to the global information”h]”hŒ!pointer to the global information”…”�”}”(hj³{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¯{h´M‰hj°{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¯{h´M‰hjszubjï)�”}”(hŒ4``sdata`` virtual interface this station belongs to ”h]”(jõ)�”}”(hŒ ``sdata``”h]”jû)�”}”(hjÓ{h]”hŒsdata”…”�”}”(hjÕ{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÑ{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MŠhjÍ{ubj)�”}”(hhh]”hÌ)�”}”(hŒ)virtual interface this station belongs to”h]”hŒ)virtual interface this station belongs to”…”�”}”(hjì{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jè{h´MŠhjé{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÍ{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jè{h´MŠhjszubjï)�”}”(hŒ7``ptk`` peer keys negotiated with this station, if any ”h]”(jõ)�”}”(hŒ``ptk``”h]”jû)�”}”(hj |h]”hŒptk”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj |ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M‹hj|ubj)�”}”(hhh]”hÌ)�”}”(hŒ.peer keys negotiated with this station, if any”h]”hŒ.peer keys negotiated with this station, if any”…”�”}”(hj%|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j!|h´M‹hj"|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j!|h´M‹hjszubjï)�”}”(hŒ*``ptk_idx`` last installed peer key index ”h]”(jõ)�”}”(hŒ ``ptk_idx``”h]”jû)�”}”(hjE|h]”hŒptk_idx”…”�”}”(hjG|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjC|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MŒhj?|ubj)�”}”(hhh]”hÌ)�”}”(hŒlast installed peer key index”h]”hŒlast installed peer key index”…”�”}”(hj^|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jZ|h´MŒhj[|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj?|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jZ|h´MŒhjszubjï)�”}”(hŒ/``rate_ctrl`` rate control algorithm reference ”h]”(jõ)�”}”(hŒ ``rate_ctrl``”h]”jû)�”}”(hj~|h]”hŒ rate_ctrl”…”�”}”(hj€|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj||ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M�hjx|ubj)�”}”(hhh]”hÌ)�”}”(hŒ rate control algorithm reference”h]”hŒ rate control algorithm reference”…”�”}”(hj—|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j“|h´M�hj”|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjx|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j“|h´M�hjszubjï)�”}”(hŒ8``rate_ctrl_priv`` rate control private per-STA pointer ”h]”(jõ)�”}”(hŒ``rate_ctrl_priv``”h]”jû)�”}”(hj·|h]”hŒrate_ctrl_priv”…”�”}”(hj¹|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjµ|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M�hj±|ubj)�”}”(hhh]”hÌ)�”}”(hŒ$rate control private per-STA pointer”h]”hŒ$rate control private per-STA pointer”…”�”}”(hjÐ|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÌ|h´M�hjÍ|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj±|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÌ|h´M�hjszubjï)�”}”(hŒu``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]”hŒrate_ctrl_lock”…”�”}”(hjò|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjî|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M�hjê|ubj)�”}”(hhh]”hÌ)�”}”(hŒaspinlock used to protect rate control data (data inside the algorithm, so serializes calls there)”h]”hŒaspinlock used to protect rate control data (data inside the algorithm, so serializes calls there)”…”�”}”(hj }h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MŽhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjê|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j}h´M�hjszubjï)�”}”(hŒ\``lock`` used for locking all fields that require locking, see comments in the header file. ”h]”(jõ)�”}”(hŒ``lock``”h]”jû)�”}”(hj*}h]”hŒlock”…”�”}”(hj,}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj(}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M’hj$}ubj)�”}”(hhh]”hÌ)�”}”(hŒRused for locking all fields that require locking, see comments in the header file.”h]”hŒRused for locking all fields that require locking, see comments in the header file.”…”�”}”(hjC}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M‘hj@}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j?}h´M’hjszubjï)�”}”(hŒ$``fast_tx`` TX fastpath information ”h]”(jõ)�”}”(hŒ ``fast_tx``”h]”jû)�”}”(hjd}h]”hŒfast_tx”…”�”}”(hjf}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjb}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¸hj^}ubj)�”}”(hhh]”hÌ)�”}”(hŒTX fastpath information”h]”hŒTX fastpath information”…”�”}”(hj}}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jy}h´M¸hjz}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jy}h´M¸hjszubjï)�”}”(hŒ$``fast_rx`` RX fastpath information ”h]”(jõ)�”}”(hŒ ``fast_rx``”h]”jû)�”}”(hj�}h]”hŒfast_rx”…”�”}”(hjŸ}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj›}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¹hj—}ubj)�”}”(hhh]”hÌ)�”}”(hŒRX fastpath information”h]”hŒRX fastpath information”…”�”}”(hj¶}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j²}h´M¹hj³}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj—}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j²}h´M¹hjszubjï)�”}”(hŒ``mesh`` mesh STA information ”h]”(jõ)�”}”(hŒ``mesh``”h]”jû)�”}”(hjÖ}h]”hŒmesh”…”�”}”(hjØ}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÔ}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¨hjÐ}ubj)�”}”(hhh]”hÌ)�”}”(hŒmesh STA information”h]”hŒmesh STA information”…”�”}”(hjï}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jë}h´M¨hjì}ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÐ}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jë}h´M¨hjszubjï)�”}”(hŒI``drv_deliver_wk`` used for delivering frames after driver PS unblocking ”h]”(jõ)�”}”(hŒ``drv_deliver_wk``”h]”jû)�”}”(hj~h]”hŒdrv_deliver_wk”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M“hj ~ubj)�”}”(hhh]”hÌ)�”}”(hŒ5used for delivering frames after driver PS unblocking”h]”hŒ5used for delivering frames after driver PS unblocking”…”�”}”(hj(~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j$~h´M“hj%~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j$~h´M“hjszubjï)�”}”(hŒM``listen_interval`` listen interval of this station, when we're acting as AP ”h]”(jõ)�”}”(hŒ``listen_interval``”h]”jû)�”}”(hjH~h]”hŒlisten_interval”…”�”}”(hjJ~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjF~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M”hjB~ubj)�”}”(hhh]”hÌ)�”}”(hŒ8listen interval of this station, when we're acting as AP”h]”hŒ:listen interval of this station, when we’re acting as AP”…”�”}”(hja~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j]~h´M”hj^~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjB~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j]~h´M”hjszubjï)�”}”(hŒ*``dead`` set to true when sta is unlinked ”h]”(jõ)�”}”(hŒ``dead``”h]”jû)�”}”(hj�~h]”hŒdead”…”�”}”(hjƒ~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Mªhj{~ubj)�”}”(hhh]”hÌ)�”}”(hŒ set to true when sta is unlinked”h]”hŒ set to true when sta is unlinked”…”�”}”(hjš~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j–~h´Mªhj—~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j–~h´Mªhjszubjï)�”}”(hŒ@``removed`` set to true when sta is being removed from sta_list ”h]”(jõ)�”}”(hŒ ``removed``”h]”jû)�”}”(hjº~h]”hŒremoved”…”�”}”(hj¼~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¸~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M«hj´~ubj)�”}”(hhh]”hÌ)�”}”(hŒ3set to true when sta is being removed from sta_list”h]”hŒ3set to true when sta is being removed from sta_list”…”�”}”(hjÓ~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÏ~h´M«hjÐ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj´~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÏ~h´M«hjszubjï)�”}”(hŒ<``uploaded`` set to true when sta is uploaded to the driver ”h]”(jõ)�”}”(hŒ ``uploaded``”h]”jû)�”}”(hjó~h]”hŒuploaded”…”�”}”(hjõ~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjñ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¬hjí~ubj)�”}”(hhh]”hÌ)�”}”(hŒ.set to true when sta is uploaded to the driver”h]”hŒ.set to true when sta is uploaded to the driver”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jh´M¬hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjí~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jh´M¬hjszubjï)�”}”(hŒE``sta_state`` duplicates information about station state (for debug) ”h]”(jõ)�”}”(hŒ ``sta_state``”h]”jû)�”}”(hj,h]”hŒ sta_state”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M®hj&ubj)�”}”(hhh]”hÌ)�”}”(hŒ6duplicates information about station state (for debug)”h]”hŒ6duplicates information about station state (for debug)”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jAh´M®hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jAh´M®hjszubjï)�”}”(hŒr``_flags`` STA flags, see :c:type:`enum ieee80211_sta_info_flags `, do not use directly ”h]”(jõ)�”}”(hŒ ``_flags``”h]”jû)�”}”(hjeh]”hŒ_flags”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M•hj_ubj)�”}”(hhh]”hÌ)�”}”(hŒfSTA flags, see :c:type:`enum ieee80211_sta_info_flags `, do not use directly”h]”(hŒSTA flags, see ”…”�”}”(hj~h²hh³Nh´Nubh)�”}”(hŒB:c:type:`enum ieee80211_sta_info_flags `”h]”jû)�”}”(hjˆh]”hŒenum ieee80211_sta_info_flags”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj†ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œieee80211_sta_info_flags”uh1hh³jzh´M•hj~ubhŒ, do not use directly”…”�”}”(hj~h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jzh´M•hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jzh´M•hjszubjï)�”}”(hŒI``ps_lock`` used for powersave (when mac80211 is the AP) related locking ”h]”(jõ)�”}”(hŒ ``ps_lock``”h]”jû)�”}”(hjÁh]”hŒps_lock”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M–hj»ubj)�”}”(hhh]”hÌ)�”}”(hŒ` points either here or to deflink.agg. ”h]”(jõ)�”}”(hŒ``cur``”h]”jû)�”}”(hj�ƒh]”hŒcur”…”�”}”(hj‘ƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¾hj‰ƒubj)�”}”(hhh]”hÌ)�”}”(hŒqstorage for aggregation data :c:type:`struct ieee80211_sta ` points either here or to deflink.agg.”h]”(hŒstorage for aggregation data ”…”�”}”(hj¨ƒh²hh³Nh´Nubh)�”}”(hŒ.:c:type:`struct ieee80211_sta `”h]”jû)�”}”(hj²ƒh]”hŒstruct ieee80211_sta”…”�”}”(hj´ƒh²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj°ƒubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ ieee80211_sta”uh1hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M½hj¨ƒubhŒ& points either here or to deflink.agg.”…”�”}”(hj¨ƒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jσh´M½hj¥ƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰ƒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¤ƒh´M¾hjszubjï)�”}”(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û)�”}”(hjìƒh]”hŒdeflink”…”�”}”(hjîƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjêƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MÂhjæƒubj)�”}”(hhh]”hÌ)�”}”(hŒ÷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]”(hŒpThis is the default link STA information, for non MLO STA all link specific STA information is accessed through ”…”�”}”(hj„h²hh³Nh´Nubj¦)�”}”(hŒ **deflink**”h]”hŒdeflink”…”�”}”(hj „h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj„ubhŒ/ or through link[0] which points to address of ”…”�”}”(hj„h²hh³Nh´Nubj¦)�”}”(hŒ **deflink**”h]”hŒdeflink”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj„ubhŒB. For MLO Link STA the first added link STA will point to deflink.”…”�”}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¿hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjæƒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j„h´MÂhjszubjï)�”}”(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û)�”}”(hjJ„h]”hŒlink”…”�”}”(hjL„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjH„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MÉhjD„ubj)�”}”(hhh]”hÌ)�”}”(hX”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]”(hŒ¢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 ”…”�”}”(hjc„h²hh³Nh´Nubj¦)�”}”(hŒ **deflink**”h]”hŒdeflink”…”�”}”(hjk„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjc„ubhŒT or link[0]. For MLO STA, first link STA being added will point its link pointer to ”…”�”}”(hjc„h²hh³Nh´Nubj¦)�”}”(hŒ **deflink**”h]”hŒdeflink”…”�”}”(hj}„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjc„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.”…”�”}”(hjc„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MÃhj`„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjD„ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j_„h´MÉhjszubjï)�”}”(hŒ2``rem_link_stats`` accumulated removed link stats ”h]”(jõ)�”}”(hŒ``rem_link_stats``”h]”jû)�”}”(hj¨„h]”hŒrem_link_stats”…”�”}”(hjª„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¦„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MÊhj¢„ubj)�”}”(hhh]”hÌ)�”}”(hŒaccumulated removed link stats”h]”hŒaccumulated removed link stats”…”�”}”(hjÁ„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j½„h´MÊhj¾„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¢„ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j½„h´MÊhjszubjï)�”}”(hŒ4``sta`` station information we share with the driver”h]”(jõ)�”}”(hŒ``sta``”h]”jû)�”}”(hjá„h]”hŒsta”…”�”}”(hjã„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjß„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M¬hjÛ„ubj)�”}”(hhh]”hÌ)�”}”(hŒ,station information we share with the driver”h]”hŒ,station information we share with the driver”…”�”}”(hjú„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M­hj÷„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÛ„ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jö„h´M¬hjszubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj+zubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjrh²hh³j>rh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj$…h]”hŒ Description”…”�”}”(hj&…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj"…ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M°hjrh²hubhÌ)�”}”(hŒXThis structure collects information about a station that mac80211 is communicating with.”h]”hŒXThis structure collects information about a station that mac80211 is communicating with.”…”�”}”(hj:…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´Mhjrh²hubj$)�”}”(hŒŒ* -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 ”h]”j$)�”}”(hhh]”(j$)�”}”(hŒ-1: not yet known”h]”hÌ)�”}”(hjR…h]”hŒ-1: not yet known”…”�”}”(hjT…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´MƒhjP…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjM…ubj$)�”}”(hŒ0: non-mesh A-MSDU length field”h]”hÌ)�”}”(hjj…h]”hŒ0: non-mesh A-MSDU length field”…”�”}”(hjl…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M„hjh…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjM…ubj$)�”}”(hŒ&1: big-endian mesh A-MSDU length field”h]”hÌ)�”}”(hj‚…h]”hŒ&1: big-endian mesh A-MSDU length field”…”�”}”(hj„…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M…hj€…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjM…ubj$)�”}”(hŒ+2: little-endian mesh A-MSDU length field ”h]”hÌ)�”}”(hŒ)2: little-endian mesh A-MSDU length field”h]”hŒ)2: little-endian mesh A-MSDU length field”…”�”}”(hjœ…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:214: ./net/mac80211/sta_info.h”h´M†hj˜…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjM…ubeh}”(h]”h ]”h"]”h$]”h&]”jU$juh1j$h³ja…h´MƒhjI…ubah}”(h]”h ]”h"]”h$]”h&]”uh1j$h³ja…h´Mƒhjrh²hubeh}”(h]”Œprogramming-information”ah ]”h"]”Œprogramming information”ah$]”h&]”uh1hµhjrh²hh³hÊh´KÔubh¶)�”}”(hhh]”(h»)�”}”(hŒSTA information lifetime rules”h]”hŒSTA information lifetime rules”…”�”}”(hjÈ…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÅ…h²hh³hÊh´KÜubhÌ)�”}”(hŒÚSTA 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]”(hŒSTA info structures (”…”�”}”(hjÖ…h²hh³Nh´Nubh)�”}”(hŒ$:c:type:`struct sta_info `”h]”jû)�”}”(hjà…h]”hŒstruct sta_info”…”�”}”(hjâ…h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhjÞ…ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œsta_info”uh1hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´KhjÖ…ubhŒ¡) 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.”…”�”}”(hjÖ…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jý…h´KhjÅ…h²hubhÌ)�”}”(hXõUpon 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]”hXõUpon 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.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´K#hjÅ…h²hubhÌ)�”}”(hŒxWhen the insertion fails (sta_info_insert()) returns non-zero), the structure will have been freed by sta_info_insert()!”h]”hŒxWhen the insertion fails (sta_info_insert()) returns non-zero), the structure will have been freed by sta_info_insert()!”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´K,hjÅ…h²hubhÌ)�”}”(hXóStation 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]”hXóStation 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&†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´K/hjÅ…h²hubhÌ)�”}”(hŒZIn order to remove a STA info structure, various sta_info_destroy_*() calls are available.”h]”hŒZIn order to remove a STA info structure, various sta_info_destroy_*() calls are available.”…”�”}”(hj5†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´K7hjÅ…h²hubhÌ)�”}”(hŒóThere 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]”hŒõThere 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.”…”�”}”(hjD†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:222: ./net/mac80211/sta_info.c”h´K:hjÅ…h²hubeh}”(h]”Œsta-information-lifetime-rules”ah ]”h"]”Œsta information lifetime rules”ah$]”h&]”uh1hµhjrh²hh³hÊh´KÜubeh}”(h]”Œstation-info-handling”ah ]”h"]”Œstation info handling”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÑubh¶)�”}”(hhh]”(h»)�”}”(hŒAggregation Functions”h]”hŒAggregation Functions”…”�”}”(hjf†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjc†h²hh³hÊh´Kâubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒtid_ampdu_tx (C struct)”Œc.tid_ampdu_tx”hNt”auh1húhjc†h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ tid_ampdu_tx”h]”j)�”}”(hŒstruct tid_ampdu_tx”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj�†h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj‰†h²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj›†h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj‰†h²hh³jš†h´Kubj@)�”}”(hŒ tid_ampdu_tx”h]”jF)�”}”(hj‡†h]”hŒ tid_ampdu_tx”…”�”}”(hj­†h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhj©†ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj‰†h²hh³jš†h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghj…†h²hh³jš†h´Kubah}”(h]”j€†ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³jš†h´Khj‚†h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ!TID aggregation information (Tx).”h]”hŒ!TID aggregation information (Tx).”…”�”}”(hjφh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kœhj̆h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshj‚†h²hh³jš†h´Kubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–jç†j—jç†j˜‰j™‰jš‰uh1j h²hhjc†h³Nh´Nubjœ)�”}”(hXŽ**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; bool ndp; 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 ``ndp`` this session is using NDP Block ACKs ``tid`` TID number”h]”(hÌ)�”}”(hŒ**Definition**::”h]”(j¦)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjó†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjï†ubhŒ:”…”�”}”(hjï†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K hjë†ubjÁ)�”}”(hX¸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; bool ndp; u8 tid; };”h]”hX¸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; bool ndp; u8 tid; };”…”�”}”hj ‡sbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¢hjë†ubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hj‡h]”hŒMembers”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K·hjë†ubjê)�”}”(hhh]”(jï)�”}”(hŒ,``rcu_head`` rcu head for freeing structure ”h]”(jõ)�”}”(hŒ ``rcu_head``”h]”jû)�”}”(hj<‡h]”hŒrcu_head”…”�”}”(hj>‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj:‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KŸhj6‡ubj)�”}”(hhh]”hÌ)�”}”(hŒrcu head for freeing structure”h]”hŒrcu head for freeing structure”…”�”}”(hjU‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jQ‡h´KŸhjR‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jQ‡h´KŸhj3‡ubjï)�”}”(hŒH``session_timer`` check if we keep Tx-ing on the TID (by timeout value) ”h]”(jõ)�”}”(hŒ``session_timer``”h]”jû)�”}”(hju‡h]”hŒ session_timer”…”�”}”(hjw‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjs‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K hjo‡ubj)�”}”(hhh]”hÌ)�”}”(hŒ5check if we keep Tx-ing on the TID (by timeout value)”h]”hŒ5check if we keep Tx-ing on the TID (by timeout value)”…”�”}”(hjއh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jЇh´K hj‹‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjo‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jЇh´K hj3‡ubjï)�”}”(hŒ@``addba_resp_timer`` timer for peer's response to addba request ”h]”(jõ)�”}”(hŒ``addba_resp_timer``”h]”jû)�”}”(hj®‡h]”hŒaddba_resp_timer”…”�”}”(hj°‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj¬‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¡hj¨‡ubj)�”}”(hhh]”hÌ)�”}”(hŒ*timer for peer's response to addba request”h]”hŒ,timer for peer’s response to addba request”…”�”}”(hjLJh²hh³N•äÎh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÇh´K¡hjćubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÇh´K¡hj3‡ubjï)�”}”(hŒB``pending`` pending frames queue -- use sta's spinlock to protect ”h]”(jõ)�”}”(hŒ ``pending``”h]”jû)�”}”(hjç‡h]”hŒpending”…”�”}”(hjé‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjå‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¢hjá‡ubj)�”}”(hhh]”hÌ)�”}”(hŒ5pending frames queue -- use sta's spinlock to protect”h]”hŒ7pending frames queue -- use sta’s spinlock to protect”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jü‡h´K¢hjý‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjá‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jü‡h´K¢hj3‡ubjï)�”}”(hŒ#``sta`` station we are attached to ”h]”(jõ)�”}”(hŒ``sta``”h]”jû)�”}”(hj ˆh]”hŒsta”…”�”}”(hj"ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K£hjˆubj)�”}”(hhh]”hÌ)�”}”(hŒstation we are attached to”h]”hŒstation we are attached to”…”�”}”(hj9ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j5ˆh´K£hj6ˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j5ˆh´K£hj3‡ubjï)�”}”(hŒ$``state`` session state (see above) ”h]”(jõ)�”}”(hŒ ``state``”h]”jû)�”}”(hjYˆh]”hŒstate”…”�”}”(hj[ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjWˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K§hjSˆubj)�”}”(hhh]”hÌ)�”}”(hŒsession state (see above)”h]”hŒsession state (see above)”…”�”}”(hjrˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jnˆh´K§hjoˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jnˆh´K§hj3‡ubjï)�”}”(hŒ(``last_tx`` jiffies of last tx activity ”h]”(jõ)�”}”(hŒ ``last_tx``”h]”jû)�”}”(hj’ˆh]”hŒlast_tx”…”�”}”(hj”ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¨hjŒˆubj)�”}”(hhh]”hÌ)�”}”(hŒjiffies of last tx activity”h]”hŒjiffies of last tx activity”…”�”}”(hj«ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j§ˆh´K¨hj¨ˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j§ˆh´K¨hj3‡ubjï)�”}”(hŒA``timeout`` session timeout value to be filled in ADDBA requests ”h]”(jõ)�”}”(hŒ ``timeout``”h]”jû)�”}”(hjˈh]”hŒtimeout”…”�”}”(hj͈h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjɈubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¥hjňubj)�”}”(hhh]”hÌ)�”}”(hŒ4session timeout value to be filled in ADDBA requests”h]”hŒ4session timeout value to be filled in ADDBA requests”…”�”}”(hjäˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jàˆh´K¥hjáˆubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjňubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jàˆh´K¥hj3‡ubjï)�”}”(hŒ6``dialog_token`` dialog token for aggregation session ”h]”(jõ)�”}”(hŒ``dialog_token``”h]”jû)�”}”(hj‰h]”hŒ dialog_token”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¤hjþˆubj)�”}”(hhh]”hÌ)�”}”(hŒ$dialog token for aggregation session”h]”hŒ$dialog token for aggregation session”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j‰h´K¤hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‰h´K¤hj3‡ubjï)�”}”(hŒ/``stop_initiator`` initiator of a session stop ”h]”(jõ)�”}”(hŒ``stop_initiator``”h]”jû)�”}”(hj=‰h]”hŒstop_initiator”…”�”}”(hj?‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj;‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K©hj7‰ubj)�”}”(hhh]”hÌ)�”}”(hŒinitiator of a session stop”h]”hŒinitiator of a session stop”…”�”}”(hjV‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jR‰h´K©hjS‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jR‰h´K©hj3‡ubjï)�”}”(hŒ)``tx_stop`` TX DelBA frame when stopping ”h]”(jõ)�”}”(hŒ ``tx_stop``”h]”jû)�”}”(hjv‰h]”hŒtx_stop”…”�”}”(hjx‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjt‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kªhjp‰ubj)�”}”(hhh]”hÌ)�”}”(hŒTX DelBA frame when stopping”h]”hŒTX DelBA frame when stopping”…”�”}”(hj�‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j‹‰h´KªhjŒ‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjp‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‹‰h´Kªhj3‡ubjï)�”}”(hŒ-``buf_size`` reorder buffer size at receiver ”h]”(jõ)�”}”(hŒ ``buf_size``”h]”jû)�”}”(hj¯‰h]”hŒbuf_size”…”�”}”(hj±‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj­‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K«hj©‰ubj)�”}”(hhh]”hÌ)�”}”(hŒreorder buffer size at receiver”h]”hŒreorder buffer size at receiver”…”�”}”(hjȉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jĉh´K«hjʼnubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj©‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jĉh´K«hj3‡ubjï)�”}”(hŒ0``ssn`` starting sequence number of the session ”h]”(jõ)�”}”(hŒ``ssn``”h]”jû)�”}”(hjè‰h]”hŒssn”…”�”}”(hjê‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjæ‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¯hjâ‰ubj)�”}”(hhh]”hÌ)�”}”(hŒ'starting sequence number of the session”h]”hŒ'starting sequence number of the session”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jý‰h´K¯hjþ‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâ‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jý‰h´K¯hj3‡ubjï)�”}”(hŒ9``failed_bar_ssn`` ssn of the last failed BAR tx attempt ”h]”(jõ)�”}”(hŒ``failed_bar_ssn``”h]”jû)�”}”(hj!Šh]”hŒfailed_bar_ssn”…”�”}”(hj#Šh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¬hjŠubj)�”}”(hhh]”hÌ)�”}”(hŒ%ssn of the last failed BAR tx attempt”h]”hŒ%ssn of the last failed BAR tx attempt”…”�”}”(hj:Šh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j6Šh´K¬hj7Šubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j6Šh´K¬hj3‡ubjï)�”}”(hŒ(``bar_pending`` BAR needs to be re-sent ”h]”(jõ)�”}”(hŒ``bar_pending``”h]”jû)�”}”(hjZŠh]”hŒ bar_pending”…”�”}”(hj\Šh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjXŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K­hjTŠubj)�”}”(hhh]”hÌ)�”}”(hŒBAR needs to be re-sent”h]”hŒBAR needs to be re-sent”…”�”}”(hjsŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³joŠh´K­hjpŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjTŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³joŠh´K­hj3‡ubjï)�”}”(hŒ'``amsdu`` support A-MSDU within A-MDPU ”h]”(jõ)�”}”(hŒ ``amsdu``”h]”jû)�”}”(hj“Šh]”hŒamsdu”…”�”}”(hj•Šh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‘Šubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K®hj�Šubj)�”}”(hhh]”hÌ)�”}”(hŒsupport A-MSDU within A-MDPU”h]”hŒsupport A-MSDU within A-MDPU”…”�”}”(hj¬Šh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¨Šh´K®hj©Šubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�Šubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¨Šh´K®hj3‡ubjï)�”}”(hŒ-``ndp`` this session is using NDP Block ACKs ”h]”(jõ)�”}”(hŒ``ndp``”h]”jû)�”}”(hjÌŠh]”hŒndp”…”�”}”(hjΊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÊŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K°hjÆŠubj)�”}”(hhh]”hÌ)�”}”(hŒ$this session is using NDP Block ACKs”h]”hŒ$this session is using NDP Block ACKs”…”�”}”(hjåŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jáŠh´K°hjâŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÆŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jáŠh´K°hj3‡ubjï)�”}”(hŒ``tid`` TID number”h]”(jõ)�”}”(hŒ``tid``”h]”jû)�”}”(hj‹h]”hŒtid”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¥hjÿŠubj)�”}”(hhh]”hÌ)�”}”(hŒ TID number”h]”hŒ TID number”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¦hj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÿŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‹h´K¥hj3‡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjë†ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjc†h²hh³Nh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hjH‹h]”hŒ Description”…”�”}”(hjJ‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjF‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K©hjc†h²hubhÌ)�”}”(hŒqThis structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.”h]”hŒsThis structure’s lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.”…”�”}”(hj^‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K°hjc†h²hubhÌ)�”}”(hŒîThe 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]”(hŒVThe TX path can access it under RCU lock-free if, and only if, the state has the flag ”…”�”}”(hjm‹h²hh³Nh´Nubjû)�”}”(hŒ``HT_AGG_STATE_OPERATIONAL``”h]”hŒHT_AGG_STATE_OPERATIONAL”…”�”}”(hju‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjm‹ubhŒ| set. Otherwise, the TX path must also acquire the spinlock and re-check the state, see comments in the tx code touching it.”…”�”}”(hjm‹h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K³hjc†h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒtid_ampdu_rx (C struct)”Œc.tid_ampdu_rx”hNt”auh1húhjc†h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒ tid_ampdu_rx”h]”j)�”}”(hŒstruct tid_ampdu_rx”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hj§‹h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhj£‹h²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K¼ubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjµ‹h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hj£‹h²hh³j´‹h´K¼ubj@)�”}”(hŒ tid_ampdu_rx”h]”jF)�”}”(hj¡‹h]”hŒ tid_ampdu_rx”…”�”}”(hjÇ‹h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjËubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hj£‹h²hh³j´‹h´K¼ubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjŸ‹h²hh³j´‹h´K¼ubah}”(h]”jš‹ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j´‹h´K¼hjœ‹h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒ!TID aggregation information (Rx).”h]”hŒ!TID aggregation information (Rx).”…”�”}”(hjé‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÑhjæ‹h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjœ‹h²hh³j´‹h´K¼ubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–jŒj—jŒj˜‰j™‰jš‰uh1j h²hhjc†h³Nh´Nubjœ)�”}”(hXK**Definition**:: struct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; 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; struct { struct sk_buff_head buf; unsigned long time; } reorder[]; }; **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 ``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) ``reorder`` reorder buffer entries ``reorder.buf`` :c:type:`struct sk_buff_head ` for the frames, since there could be multiple at each entry from an A-MSDU reported as individual subframes ``reorder.time`` time when this entry was filled (jiffies)”h]”(hÌ)�”}”(hŒ**Definition**::”h]”(j¦)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj Œh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj ŒubhŒ:”…”�”}”(hj Œh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÕhjŒubjÁ)�”}”(hXßstruct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; 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; struct { struct sk_buff_head buf; unsigned long time; } reorder[]; };”h]”hXßstruct tid_ampdu_rx { struct rcu_head rcu_head; spinlock_t reorder_lock; u64 reorder_buf_filtered; 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; struct { struct sk_buff_head buf; unsigned long time; } reorder[]; };”…”�”}”hj&Œsbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K×hjŒubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hj7Œh]”hŒMembers”…”�”}”(hj9Œh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj5Œubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KìhjŒubjê)�”}”(hhh]”(jï)�”}”(hŒ3``rcu_head`` RCU head used for freeing this struct ”h]”(jõ)�”}”(hŒ ``rcu_head``”h]”jû)�”}”(hjVŒh]”hŒrcu_head”…”�”}”(hjXŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjTŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KàhjPŒubj)�”}”(hhh]”hÌ)�”}”(hŒ%RCU head used for freeing this struct”h]”hŒ%RCU head used for freeing this struct”…”�”}”(hjoŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jkŒh´KàhjlŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjPŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jkŒh´KàhjMŒubjï)�”}”(hŒA``reorder_lock`` serializes access to reorder buffer, see below. ”h]”(jõ)�”}”(hŒ``reorder_lock``”h]”jû)�”}”(hj�Œh]”hŒ reorder_lock”…”�”}”(hj‘Œh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�Œubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Káhj‰Œubj)�”}”(hhh]”hÌ)�”}”(hŒ/serializes access to reorder buffer, see below.”h]”hŒ/serializes access to reorder buffer, see below.”…”�”}”(hj¨Œh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¤Œh´Káhj¥Œubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‰Œubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¤Œh´KáhjMŒ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û)�”}”(hjÈŒh]”hŒreorder_buf_filtered”…”�”}”(hjÊŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÆŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÕhjÂŒubj)�”}”(hhh]”hÌ)�”}”(hŒtbitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing frames”h]”hŒtbitmap indicating where there are filtered frames in the reorder buffer that should be ignored when releasing frames”…”�”}”(hjáŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÔhjÞŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÂŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÝŒh´KÕhjMŒubjï)�”}”(hŒ#``sta`` station we are attached to ”h]”(jõ)�”}”(hŒ``sta``”h]”jû)�”}”(hj�h]”hŒsta”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KØhjüŒubj)�”}”(hhh]”hÌ)�”}”(hŒstation we are attached to”h]”hŒstation we are attached to”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j�h´KØhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjüŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j�h´KØhjMŒubjï)�”}”(hŒK``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=�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj9�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÖhj5�ubj)�”}”(hhh]”hÌ)�”}”(hŒ8check if peer keeps Tx-ing on the TID (by timeout value)”h]”hŒ8check if peer keeps Tx-ing on the TID (by timeout value)”…”�”}”(hjT�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jP�h´KÖhjQ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj5�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jP�h´KÖhjMŒubjï)�”}”(hŒC``reorder_timer`` releases expired frames from the reorder buffer. ”h]”(jõ)�”}”(hŒ``reorder_timer``”h]”jû)�”}”(hjt�h]”hŒ reorder_timer”…”�”}”(hjv�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjr�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´K×hjn�ubj)�”}”(hhh]”hÌ)�”}”(hŒ0releases expired frames from the reorder buffer.”h]”hŒ0releases expired frames from the reorder buffer.”…”�”}”(hj��h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j‰�h´K×hjŠ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjn�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‰�h´K×hjMŒubjï)�”}”(hŒ(``last_rx`` jiffies of last rx activity ”h]”(jõ)�”}”(hŒ ``last_rx``”h]”jû)�”}”(hj­�h]”hŒlast_rx”…”�”}”(hj¯�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÙhj§�ubj)�”}”(hhh]”hÌ)�”}”(hŒjiffies of last rx activity”h]”hŒjiffies of last rx activity”…”�”}”(hjÆ�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÂ�h´KÙhjÃ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj§�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÂ�h´KÙhjMŒ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è�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjä�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÚhjà�ubj)�”}”(hhh]”hÌ)�”}”(hŒ*head sequence number in reordering buffer.”h]”hŒ*head sequence number in reordering buffer.”…”�”}”(hjÿ�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jû�h´KÚhjü�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjà�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jû�h´KÚhjMŒubjï)�”}”(hŒ9``stored_mpdu_num`` number of MPDUs in reordering buffer ”h]”(jõ)�”}”(hŒ``stored_mpdu_num``”h]”jû)�”}”(hjŽh]”hŒstored_mpdu_num”…”�”}”(hj!Žh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÛhjŽubj)�”}”(hhh]”hÌ)�”}”(hŒ$number of MPDUs in reordering buffer”h]”hŒ$number of MPDUs in reordering buffer”…”�”}”(hj8Žh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j4Žh´KÛhj5Žubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j4Žh´KÛhjMŒubjï)�”}”(hŒ<``ssn`` Starting Sequence Number expected to be aggregated. ”h]”(jõ)�”}”(hŒ``ssn``”h]”jû)�”}”(hjXŽh]”hŒssn”…”�”}”(hjZŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjVŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÜhjRŽubj)�”}”(hhh]”hÌ)�”}”(hŒ3Starting Sequence Number expected to be aggregated.”h]”hŒ3Starting Sequence Number expected to be aggregated.”…”�”}”(hjqŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jmŽh´KÜhjnŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjRŽubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jmŽh´KÜhjMŒubjï)�”}”(hŒ.``buf_size`` buffer size for incoming A-MPDUs ”h]”(jõ)�”}”(hŒ ``buf_size``”h]”jû)�”}”(hj‘Žh]”hŒbuf_size”…”�”}”(hj“Žh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�Žubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÝhj‹Žubj)�”}”(hhh]”hÌ)�”}”(hŒ buffer size for incoming A-MPDUs”h]”hŒ buffer size for incoming A-MPDUs”…”�”}”(hjªŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j¦Žh´KÝhj§Žubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‹Žubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j¦Žh´KÝhjMŒubjï)�”}”(hŒ(``timeout`` reset timer value (in TUs). ”h]”(jõ)�”}”(hŒ ``timeout``”h]”jû)�”}”(hjÊŽh]”hŒtimeout”…”�”}”(hjÌŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÈŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KÞhjÄŽubj)�”}”(hhh]”hÌ)�”}”(hŒreset timer value (in TUs).”h]”hŒreset timer value (in TUs).”…”�”}”(hjãŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jߎh´KÞhjàŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄŽubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jߎh´KÞhjMŒubjï)�”}”(hŒ``tid`` TID number ”h]”(jõ)�”}”(hŒ``tid``”h]”jû)�”}”(hj�h]”hŒtid”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KßhjýŽubj)�”}”(hhh]”hÌ)�”}”(hŒ TID number”h]”hŒ TID number”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j�h´Kßhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjýŽubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j�h´KßhjMŒubjï)�”}”(hŒX``auto_seq`` used for offloaded BA sessions to automatically pick head_seq_and and ssn. ”h]”(jõ)�”}”(hŒ ``auto_seq``”h]”jû)�”}”(hj<�h]”hŒauto_seq”…”�”}”(hj>�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj:�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kãhj6�ubj)�”}”(hhh]”hÌ)�”}”(hŒJused for offloaded BA sessions to automatically pick head_seq_and and ssn.”h]”hŒJused for offloaded BA sessions to automatically pick head_seq_and and ssn.”…”�”}”(hjU�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´KâhjR�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jQ�h´KãhjMŒubjï)�”}”(hŒK``removed`` this session is removed (but might have been found due to RCU) ”h]”(jõ)�”}”(hŒ ``removed``”h]”jû)�”}”(hjv�h]”hŒremoved”…”�”}”(hjx�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjt�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kähjp�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)”…”�”}”(hj��h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j‹�h´KähjŒ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjp�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j‹�h´KähjMŒubjï)�”}”(hŒG``started`` this session has started (head ssn or higher was received) ”h]”(jõ)�”}”(hŒ ``started``”h]”jû)�”}”(hj¯�h]”hŒstarted”…”�”}”(hj±�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj­�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kåhj©�ubj)�”}”(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)”…”�”}”(hjÈ�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jÄ�h´KåhjÅ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj©�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÄ�h´KåhjMŒubjï)�”}”(hŒ#``reorder`` reorder buffer entries ”h]”(jõ)�”}”(hŒ ``reorder``”h]”jû)�”}”(hjè�h]”hŒreorder”…”�”}”(hjê�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjæ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kæhjâ�ubj)�”}”(hhh]”hÌ)�”}”(hŒreorder buffer entries”h]”hŒreorder buffer entries”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jý�h´Kæhjþ�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjâ�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jý�h´KæhjMŒubjï)�”}”(hŒ©``reorder.buf`` :c:type:`struct sk_buff_head ` for the frames, since there could be multiple at each entry from an A-MSDU reported as individual subframes ”h]”(jõ)�”}”(hŒ``reorder.buf``”h]”jû)�”}”(hj!�h]”hŒ reorder.buf”…”�”}”(hj#�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kèhj�ubj)�”}”(hhh]”hÌ)�”}”(hŒ˜:c:type:`struct sk_buff_head ` for the frames, since there could be multiple at each entry from an A-MSDU reported as individual subframes”h]”(h)�”}”(hŒ,:c:type:`struct sk_buff_head `”h]”jû)�”}”(hj@�h]”hŒstruct sk_buff_head”…”�”}”(hjB�h²hh³Nh´Nubah}”(h]”h ]”(jj�Œc-type”eh"]”h$]”h&]”uh1júhj>�ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j‹Œ refdomain”j�Œreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰j†j‘j”Œ sk_buff_head”uh1hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kçhj:�ubhŒl for the frames, since there could be multiple at each entry from an A-MSDU reported as individual subframes”…”�”}”(hj:�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j]�h´Kçhj7�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j6�h´KèhjMŒubjï)�”}”(hŒ:``reorder.time`` time when this entry was filled (jiffies)”h]”(jõ)�”}”(hŒ``reorder.time``”h]”jû)�”}”(hjz�h]”hŒ reorder.time”…”�”}”(hj|�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjx�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kèhjt�ubj)�”}”(hhh]”hÌ)�”}”(hŒ)time when this entry was filled (jiffies)”h]”hŒ)time when this entry was filled (jiffies)”…”�”}”(hj“�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kéhj��ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjt�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j��h´KèhjMŒubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhjŒubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjc†h²hh³Nh´NubhÌ)�”}”(hŒ**Description**”h]”j¦)�”}”(hj½�h]”hŒ Description”…”�”}”(hj¿�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj»�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kìhjc†h²hubhÌ)�”}”(hŒqThis structure's lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.”h]”hŒsThis structure’s lifetime is managed by RCU, assignments to the array holding it must hold the aggregation mutex.”…”�”}”(hjÓ�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kéhjc†h²hubhÌ)�”}”(hŒåThe **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]”(hŒThe ”…”�”}”(hjâ�h²hh³Nh´Nubj¦)�”}”(hŒ**reorder_lock**”h]”hŒ reorder_lock”…”�”}”(hjê�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjâ�ubhŒ; is used to protect the members of this struct, except for ”…”�”}”(hjâ�h²hh³Nh´Nubj¦)�”}”(hŒ **timeout**”h]”hŒtimeout”…”�”}”(hjü�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjâ�ubhŒ, ”…”�”}”(hjâ�h²hh³Nh´Nubj¦)�”}”(hŒ **buf_size**”h]”hŒbuf_size”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjâ�ubhŒ and ”…”�”}”(hjâ�h²hh³Nh´Nubj¦)�”}”(hŒ**dialog_token**”h]”hŒ dialog_token”…”�”}”(hj ‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjâ�ubhŒh, which are constant across the lifetime of the struct (the dialog token being used only for debugging).”…”�”}”(hjâ�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kìhjc†h²hubhû)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jŒsta_ampdu_mlme (C struct)”Œc.sta_ampdu_mlme”hNt”auh1húhjc†h²hh³Nh´Nubj )�”}”(hhh]”(j)�”}”(hŒsta_ampdu_mlme”h]”j)�”}”(hŒstruct sta_ampdu_mlme”h]”(j)�”}”(hj h]”hŒstruct”…”�”}”(hjR‘h²hh³Nh´Nubah}”(h]”h ]”j)ah"]”h$]”h&]”uh1jhjN‘h²hh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Kôubj/)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj`‘h²hh³Nh´Nubah}”(h]”h ]”j;ah"]”h$]”h&]”uh1j.hjN‘h²hh³j_‘h´Kôubj@)�”}”(hŒsta_ampdu_mlme”h]”jF)�”}”(hjL‘h]”hŒsta_ampdu_mlme”…”�”}”(hjr‘h²hh³Nh´Nubah}”(h]”h ]”jQah"]”h$]”h&]”uh1jEhjn‘ubah}”(h]”h ]”(jXjYeh"]”h$]”h&]”j]j^uh1j?hjN‘h²hh³j_‘h´Kôubeh}”(h]”h ]”h"]”h$]”h&]”j]j^jeˆuh1jjfjghjJ‘h²hh³j_‘h´Kôubah}”(h]”jE‘ah ]”(jkjleh"]”h$]”h&]”jpˆjq)jrhuh1jh³j_‘h´KôhjG‘h²hubjt)�”}”(hhh]”hÌ)�”}”(hŒSTA aggregation information.”h]”hŒSTA aggregation information.”…”�”}”(hj”‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´M hj‘‘h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1jshjG‘h²hh³j_‘h´Kôubeh}”(h]”h ]”(j�Œstruct”eh"]”h$]”h&]”j•j�j–j¬‘j—j¬‘j˜‰j™‰jš‰uh1j h²hhjc†h³Nh´Nubjœ)�”}”(hX¨**Definition**:: struct sta_ampdu_mlme { struct tid_ampdu_rx *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 *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¸‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hj´‘ubhŒ:”…”�”}”(hj´‘h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj°‘ubjÁ)�”}”(hXùstruct sta_ampdu_mlme { struct tid_ampdu_rx *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 *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]”hXùstruct sta_ampdu_mlme { struct tid_ampdu_rx *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 *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; };”…”�”}”hjÑ‘sbah}”(h]”h ]”h"]”h$]”h&]”j]j^uh1jÀh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj°‘ubhÌ)�”}”(hŒ **Members**”h]”j¦)�”}”(hjâ‘h]”hŒMembers”…”�”}”(hjä‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¥hjà‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´M hj°‘ubjê)�”}”(hhh]”(jï)�”}”(hŒ<``tid_rx`` aggregation info for Rx per TID -- RCU protected ”h]”(jõ)�”}”(hŒ ``tid_rx``”h]”jû)�”}”(hj’h]”hŒtid_rx”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjÿ‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´M hjû‘ubj)�”}”(hhh]”hÌ)�”}”(hŒ0aggregation info for Rx per TID -- RCU protected”h]”hŒ0aggregation info for Rx per TID -- RCU protected”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j’h´M hj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjû‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j’h´M hjø‘ubjï)�”}”(hŒ>``tid_rx_token`` dialog tokens for valid aggregation sessions ”h]”(jõ)�”}”(hŒ``tid_rx_token``”h]”jû)�”}”(hj:’h]”hŒ tid_rx_token”…”�”}”(hj<’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj8’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj4’ubj)�”}”(hhh]”hÌ)�”}”(hŒ,dialog tokens for valid aggregation sessions”h]”hŒ,dialog tokens for valid aggregation sessions”…”�”}”(hjS’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jO’h´MhjP’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj4’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jO’h´Mhjø‘ubjï)�”}”(hŒi``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û)�”}”(hjs’h]”hŒtid_rx_timer_expired”…”�”}”(hju’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjq’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhjm’ubj)�”}”(hhh]”hÌ)�”}”(hŒObitmap indicating on which TIDs the RX timer expired until the work for it runs”h]”hŒObitmap indicating on which TIDs the RX timer expired until the work for it runs”…”�”}”(hjŒ’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj‰’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjm’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jˆ’h´Mhjø‘ubjï)�”}”(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]”hŒtid_rx_stop_requested”…”�”}”(hj¯’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj«’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj§’ubj)�”}”(hhh]”hÌ)�”}”(hŒdbitmap indicating which BA sessions per TID the driver requested to close until the work for it runs”h]”hŒdbitmap indicating which BA sessions per TID the driver requested to close until the work for it runs”…”�”}”(hjÆ’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´MhjÃ’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj§’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÂ’h´Mhjø‘ubjï)�”}”(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]”hŒtid_rx_manage_offl”…”�”}”(hjé’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjå’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhjá’ubj)�”}”(hhh]”hÌ)�”}”(hŒebitmap indicating which BA sessions were requested to be treated as started/stopped due to offloading”h]”hŒebitmap indicating which BA sessions were requested to be treated as started/stopped due to offloading”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhjý’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjá’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jü’h´Mhjø‘ubjï)�”}”(hŒN``agg_session_valid`` bitmap indicating which TID has a rx BA session open on ”h]”(jõ)�”}”(hŒ``agg_session_valid``”h]”jû)�”}”(hj!“h]”hŒagg_session_valid”…”�”}”(hj#“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj“ubj)�”}”(hhh]”hÌ)�”}”(hŒ7bitmap indicating which TID has a rx BA session open on”h]”hŒ7bitmap indicating which TID has a rx BA session open on”…”�”}”(hj:“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j6“h´Mhj7“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j6“h´Mhjø‘ubjï)�”}”(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û)�”}”(hjZ“h]”hŒunexpected_agg”…”�”}”(hj\“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjX“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´MhjT“ubj)�”}”(hhh]”hÌ)�”}”(hŒobitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a session”h]”hŒobitmap indicating which TID already sent a delBA due to unexpected aggregation related frames outside a session”…”�”}”(hjs“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhjp“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjT“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jo“h´Mhjø‘ubjï)�”}”(hŒ7``work`` work struct for starting/stopping aggregation ”h]”(jõ)�”}”(hŒ``work``”h]”jû)�”}”(hj”“h]”hŒwork”…”�”}”(hj–“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj’“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´MhjŽ“ubj)�”}”(hhh]”hÌ)�”}”(hŒ-work struct for starting/stopping aggregation”h]”hŒ-work struct for starting/stopping aggregation”…”�”}”(hj­“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³j©“h´Mhjª“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŽ“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j©“h´Mhjø‘ubjï)�”}”(hŒ+``tid_tx`` aggregation info for Tx per TID ”h]”(jõ)�”}”(hŒ ``tid_tx``”h]”jû)�”}”(hjÍ“h]”hŒtid_tx”…”�”}”(hjÏ“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjË“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´MhjÇ“ubj)�”}”(hhh]”hÌ)�”}”(hŒaggregation info for Tx per TID”h]”hŒaggregation info for Tx per TID”…”�”}”(hjæ“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jâ“h´Mhjã“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÇ“ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jâ“h´Mhjø‘ubjï)�”}”(hŒj``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”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj”ubj)�”}”(hhh]”hÌ)�”}”(hŒXsessions where start was requested, not just protected by wiphy mutex but also sta->lock”h]”hŒXsessions where start was requested, not just protected by wiphy mutex but also sta->lock”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³j”h´Mhjø‘ubjï)�”}”(hŒ=``last_addba_req_time`` timestamp of the last addBA request. ”h]”(jõ)�”}”(hŒ``last_addba_req_time``”h]”jû)�”}”(hj@”h]”hŒlast_addba_req_time”…”�”}”(hjB”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj>”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj:”ubj)�”}”(hhh]”hÌ)�”}”(hŒ$timestamp of the last addBA request.”h]”hŒ$timestamp of the last addBA request.”…”�”}”(hjY”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jU”h´MhjV”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jU”h´Mhjø‘ubjï)�”}”(hŒ?``addba_req_num`` number of times addBA request has been sent. ”h]”(jõ)�”}”(hŒ``addba_req_num``”h]”jû)�”}”(hjy”h]”hŒ addba_req_num”…”�”}”(hj{”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhjw”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhjs”ubj)�”}”(hhh]”hÌ)�”}”(hŒ,number of times addBA request has been sent.”h]”hŒ,number of times addBA request has been sent.”…”�”}”(hj’”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³jŽ”h´Mhj�”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjs”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jŽ”h´Mhjø‘ubjï)�”}”(hŒH``dialog_token_allocator`` dialog token enumerator for each new session;”h]”(jõ)�”}”(hŒ``dialog_token_allocator``”h]”jû)�”}”(hj²”h]”hŒdialog_token_allocator”…”�”}”(hj´”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1júhj°”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jôh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´Mhj¬”ubj)�”}”(hhh]”hÌ)�”}”(hŒ-dialog token enumerator for each new session;”h]”hŒ-dialog token enumerator for each new session;”…”�”}”(hjË”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³Œk/var/lib/git/docbuild/linux/Documentation/driver-api/80211/mac80211-advanced:228: ./net/mac80211/sta_info.h”h´MhjÈ”ubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jîh³jÇ”h´Mhjø‘ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jéhj°‘ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j›hjc†h²hh³Nh´Nubeh}”(h]”Œaggregation-functions”ah ]”h"]”Œaggregation functions”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kâubh¶)�”}”(hhh]”(h»)�”}”(hŒSynchronisation Functions”h]”hŒSynchronisation Functions”…”�”}”(hjþ”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjû”h²hh³hÊh´KëubhÌ)�”}”(hŒTBD”h]”hŒTBD”…”�”}”(hj •h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kíhjû”h²hubhÌ)�”}”(hŒLocking, lots of RCU”h]”hŒLocking, lots of RCU”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kïhjû”h²hubeh}”(h]”Œsynchronisation-functions”ah ]”h"]”Œsynchronisation functions”ah$]”h&]”uh1hµhh·h²hh³hÊh´Këubeh}”(h]”Œmac80211-subsystem-advanced”ah ]”h"]”Œmac80211 subsystem (advanced)”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j[•Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j5•j2•jˆj…j)"j&"j�#jš#jq&jn&jk)jh)j>j>j>j>jRGjOGj0Vj-Vj�Xj~Xjþ\jû\j„Yj�Yjö\jó\jöajóaj7qj4qj½qjºqjŽqj‹qjµqj²qjäqjáqj rjrj`†j]†jÂ…j¿…jX†jU†jø”jõ”j-•j*•uŒ nametypes”}”(j5•‰jˆ‰j)"‰j�#‰jq&‰jk)‰j>‰j>‰jRG‰j0V‰j�X‰jþ\‰j„Y‰jö\‰jöa‰j7q‰j½q‰jŽq‰jµq‰jäq‰j r‰j`†‰jÂ…‰jX†‰jø”‰j-•‰uh}”(j2•h·j…hÛj jj�j†jÐjÕjØjÝjÌjÑjÀ jÅ j´ j¹ j&"j‹jjjojUjZjÎjÓj.j3j¾jÃjwj|jš#j,"jn&j #j´$j¹$jh)jt&jŸ&j¥&j>jn)j>j©)jC+jH+jX,j],jž.j£.j³0j¸0j€3j…3j¶6j»6jˆ9j�9j=<jB<jOGj>jd>ji>jàBjåBj-VjUGj€Gj…Gj‘Nj–NjñOjöOj�Rj”Rj~Xj3Vj^VjcVjû\j„Xj�Yj•Xjó\j‡YjHZjNZjóaj]jZ]j_]j_j _j4qjùaj$bj)bj­cj²cjWfj\fj!ij&ijJkjOkjnjnjºqj:qj‹qjKqj²qj‘qjáqjÀqjrjçqj]†jrj¿…jrj