path: root/src/fst
Commit message (Collapse)AuthorAgeFilesLines
* Fix or supress various sparse warningsJohannes Berg2017-01-291-1/+1
| | | | Signed-off-by: Johannes Berg <johannes.berg@intel.com>
* FST: Fix search for peer's "other" connectionDedy Lansky2016-09-083-115/+175
| | | | | | | | | | | | | Upon receiving FST Setup Request from some peer on some interface, search is made to see if same peer is connected on other interface with specific band_id. With multiple peers, bug in fst_group_does_iface_appear_in_other_mbies() caused wrong peer address to be returned sometimes. Fix this with a modified, simplified search algorithm of peer's "other" connection. Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
* FST: Make fst_action_names staticJouni Malinen2016-06-231-1/+1
| | | | | | This is not used outside this file. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Fix byte order of couple of fields on big endian hostsJouni Malinen2016-06-232-10/+10
| | | | | | | | | Couple of fsts_id and llt fields were not properly swapped from host byte order to little endian byte order used in the frames. Fix this and use the le32 type to make this more consistent and verifiable with sparse. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Make fst_global_deinit() more robustJouni Malinen2016-06-121-0/+6
| | | | | | | | Verify that fst_global_init() has been called before deinitializing the global FST context. This makes it a bit easier to handle failure paths from initialization. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Fix session setup failure with peer without MB IEDedy Lansky2016-03-071-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Upon receiving FST setup request on old band, the peer is searched on new band. The assumption is that MB IE from this peer on new band previously received either in assoc event or in FST setup request. There are cases in which above assumption doesn't work, peer is not found and session setup fails. For example: - STA connects over 11ac. Due to driver limitation, MB IE is not included in assoc event - STA connects over 11ad. MB IE included in assoc event. - FST session established on 11ac band, with AP as initiator. i.e. FST setup request sent in AP=>STA direction. STA searches for peer's (AP) MB IE on 11ad band which exists. - FST switch occur - FST session established on 11ad band, with STA as initiator. i.e. FST setup request sent in STA=>AP direction. AP searches for peer's (STA) MB IE on 11ac band which are absent. For fixing the above, consider also peers without MB IE as candidates in the search algorithm. Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
* FST: Enlarge State Transition Timeout (STT)Dedy Lansky2016-03-031-1/+2
| | | | | | | | | | STT guards the exchange of FST Action frames with the peer station. It was observed that sometimes Action frames sending is delayed at driver/FW layers for few hundreds millisec. Enlarge the STT to overcome such cases. Signed-off-by: Dedy Lansky <qca_dlansky@qca.qualcomm.com>
* FST: Get rid of gcc extensions in structure/array initializationJouni Malinen2016-01-153-19/+22
| | | | | | These constructions were causing warnings when build with clang. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Fix handling of Rx FST Setup Request when session already existsDedy Lansky2015-12-291-15/+19
| | | | | | | | | | | | | | | | | | | | | | | | When we receive FST Setup Request when session already exists, the following validations take place: 1. we drop the frame if needed according to MAC comparison 2. we drop the frame if the session is "not pending", i.e., if FST Setup Response was already exchanged (sent or received). There are two issues with the above: 1. MAC comparison is relevant only before the Setup Response exchange. In other words, Setup Request should not be dropped due to MAC comparison after Setup Response has been exchanged. 2. Receiving Setup Request after Setup Response exchange most likely means that FST state machine is out of sync with the peer. Dropping the Setup Request will not help solve this situation. The fix is: 1. do MAC comparison only if session is "pending", i.e., Setup Response was not yet exchanged. 2. In case Setup Response was already exchanged, reset our session and handle the Setup Request as if it arrived when session doesn't exist. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Make FST peer connection check more permissive in hostapdAnton Nayshtut2015-11-256-10/+16
| | | | | | | | | | | | | | | | Modify the FST peer connection check so it won't skip peers without MB IEs making it more permissive for peers that didn't provide MB IEs during association request. This can be helpful, e.g., in cases where a STA's interface connected before it was added to the FST group. This allows the AP to receive FST Action frames and initiate session with a STA via STA's interface that doesn't expose MB IEs. The adjusted FST protocol is still safe, as it protects itself in many other ways (checking band info and it's accordance to the interfaces, Setup IDs, connection states of the interfaces involved, etc.) effectively avoiding all types of invalid situations. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Fix STA MB IEs creationAnton Nayshtut2015-11-231-26/+0
| | | | | | | FST STA should always expose its MB IEs regardless of its connection state and whether the connected AP is currently FST-enabled or not. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Mark fst_ies buffer constJouni Malinen2015-08-032-3/+3
| | | | | | | | This buffer is owned by the FST module, so mark it const in the set_ies() callback to make it clearer which component is responsible for modifying and freeing this. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Fix MB IE clearing on detachAnton Nayshtut2015-08-031-0/+1
| | | | | | | | | | This fixes an issue where freed MB IEs buffer memory could potentially have been accessed after an interface is detached from FST group. Without this fix, if an interface is detached from FST group, it can use MB IEs buffer previously set by fst_iface_set_ies(), although the buffer was released by fst_iface_delete(). Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Make fst_hw_mode_to_band() non-inline functionJouni Malinen2015-07-262-16/+18
| | | | | | | There is no need for using an inline function for this. Save a bit in binary size by using a normal function. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Fix get_peer_mbies interface fetching in multi-group caseJouni Malinen2015-07-261-2/+2
| | | | | | | | | The foreach_fst_group() loop needs "break-if-found", not "continue-if-not-found" to do the search iteration properly. If there were multiple groups, the previous design could have failed to find the interface. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Merge unreachable error case to another error returnJouni Malinen2015-07-261-4/+1
| | | | | | | | fst_read_next_text_param() is never called with buflen <= 1, so this separate error path is practically unreachable. Merge it with another error path to make this a bit more compact. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Use more robust interface-find for TEST_REQUESTJouni Malinen2015-07-261-7/+5
| | | | | | | | | | It is possible for there to be multiple FST groups, so the hardcoded mechanism of selecting the first one when sending out an event message may not be sufficient. Get the interface from the caller, if available, and if not, go through all groups in search of an interface to send the event on. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Use more robust interface-find for event messagesJouni Malinen2015-07-261-11/+12
| | | | | | | | | | It is possible for there to be multiple FST groups, so the hardcoded mechanism of selecting the first one when sending out an event message may not be sufficient. Get the interface from the caller, if available, and if not, go through all groups in search of an interface to send the event on. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Remove unnecessary fst_attach() already attached checkJouni Malinen2015-07-261-21/+0
| | | | | | | Now that both hostapd and wpa_supplicant already enforce no duplicate fst_attach() calls, there is no need for this check within fst_attach(). Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Fix dialog token wrap-aroundJouni Malinen2015-07-261-1/+1
| | | | | | | | | | Dialog token is only 8 bits and maintaining u32 version of it in struct fst_group resulted in incorrect wrap-around behavior in fst_group_assign_dialog_token(). It was possible to assign u8 dialog_token value 0 because of this. Fix this by using u8 variable consistently. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Validate STIE header in FST Setup Request/ResponseJouni Malinen2015-07-261-0/+12
| | | | | | | | While this is always supposed to be the first element, check that this is indeed the case instead of blindly using values from within the element. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Fix Session Transition element length field valueJouni Malinen2015-07-261-6/+8
| | | | | | | | The Element ID and Length subfields are not supposed to be included in the Length. In addition, both of these subfields needs to be filled in even for non-zero status code cases. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Print reason for ignoring FST Action frame in debug logJouni Malinen2015-07-251-0/+4
| | | | | | This makes it easier to understand why some frames are not processed. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Fix FST-MANAGER TEST_REQUEST parsingJouni Malinen2015-07-181-0/+21
| | | | | | | | The space separator between the command and the parameter was not skipped properly and the first integer ended up being interpreted as 0 in all cases. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Remove unreachable code in fst_session_handle_tear_down()Jouni Malinen2015-07-181-5/+0
| | | | | | | | | | fst_session_is_in_progress() is already checked as part of fst_find_session_in_progress() before calling fst_session_handle_action(). This is the only call path that can reach fst_session_handle_tear_down() and as such, fst_session_is_in_progress() cannot return 0 here. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Remove duplicated dl_list_empty() check befor dl_list_first()Jouni Malinen2015-07-182-11/+5
| | | | | | | dl_list_first() takes care of this already, so there is no need to do a separate check here. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Use EINVAL more consistently as a negative return valueJouni Malinen2015-07-182-25/+22
| | | | | | | | There was a mix of EINVAL and -EINVAL returns through the FST implementation. Make this more consistent by always returning -EINVAL in error cases. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Mark get_mb_ie() return value constJouni Malinen2015-07-185-21/+22
| | | | | | | The caller is not expected to free or modify the value since this is returning a reference to a buffer maintained by the upper layer. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Replace print_mb_ies() with wpa_snprintf_hex()Jouni Malinen2015-07-183-34/+7
| | | | | | | There is no need to add new functions with more or less identical functionality of an already available helper function. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Mark format_session_state_extra() staticJouni Malinen2015-07-181-5/+2
| | | | | | This is not used outside fst_ctrl_iface.c. Signed-off-by: Jouni Malinen <j@w1.fi>
* FST: Avoid using pointer to mgmt->u.action.u.fst_actionJouni Malinen2015-07-171-10/+15
| | | | | | | | | | | Typecasting &mgmt->u.action.u.fst_action to a struct pointer for various FST Action frame payloads seemed to be triggering static analyzer warnings about bounds checking since sizeof(mgmt->u.action.u.fst_action) == 1 even though that is really a variable length structure. Try to avoid this by calculating the pointer for the beginning of the frame instead of variable length struct. (CID 125642) Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Remove the IE header len/size macrosJouni Malinen2015-07-172-13/+10
| | | | | | | These are confusing when the style used with the couple of FST IE checks differs from the rest of hostapd/wpa_supplicant implementation. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Clean up fst_group_update_ie()Jouni Malinen2015-07-173-21/+14
| | | | | | | None of the callers passed in cleaning_up == TRUE, so drop that unused code path. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Move fst_mbie_get_peer_addr() into fst_group.cJouni Malinen2015-07-172-21/+21
| | | | | | | There is no need for this function to be an inline function in a header file since it is used only within fst_group.c. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Fix FST Action frame length validationJouni Malinen2015-07-171-7/+38
| | | | | | | | | | | Commit 717333f4e4d027c69e7c1241dc124ef7d59a6c85 ('FST: Add the Fast Session Transfer (FST) module') performed incorrect frame length validation for Setup Request (did not remove 24+1 header from consideration) and did not include payload validation for other FST Action frames. Fix these by explicitly verifying that the payload of these frames is sufficiently long before reading the values from there. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Testing supportAnton Nayshtut2015-07-164-0/+369
| | | | | | This patch introduces infrastructure needed for FST module tests. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
* FST: Add the Fast Session Transfer (FST) moduleAnton Nayshtut2015-07-1616-0/+4009
Fast Session Transfer (FST) is the transfer of a session from a channel to another channel in a different frequency band. The term "session" refers to non-physical layer state information kept by a pair of stations (STAs) that communicate directly (i.e., excludes forwarding). The FST is implemented in accordance with IEEE Std 802.11ad-2012. Definitions * FST interface - an interface for which FST functionality is enabled * FST group - a bunch of FST interfaces representing single multi-band STA * FST peer - a multi-band capable STA connected * FST module - multi-band operation functionality implemented in accordance with IEEE Std 802.11ad-2012 (see 10.32 Multi-band operation) as a part of hostapd/wpa_supplicant * FST manager - an external application that implements custom FST related logic, using the FST module's interfaces accessible via CLI or D-Bus This commit introduces only the FST module. Integration of the FST module into the hostapd/wpa_supplicant and corresponding CLI/D-Bus interfaces and FST related tests are covered in separate commits. FST manager application is out of scope of these commits. As FST aggregates a few interfaces into FST group, the FST module uses global CLI for both commands and notifications. It also exposes alternative non-interface based D-Bus subtree for this purposes. Configuration and Initialization * FST functionality can enabled by compilation flag (CONFIG_FST) * hostapd/wpa_supplicant controlling multiple interfaces are used for FST * once enabled by compilation, the FST can be enabled for specific interfaces in the configuration files * FST interfaces are aggregated in FST groups (fst_group_id config file entry), where each FST group: - represents one multi-band device - should have two or more FST interfaces in it * priority (fst_priority config file entry) must be configured for each FST interface. FST interface with higher priority is the interface FST will always try to switch to. Thus, for example, for the maximal throughput, it should be the fastest FST interface in the FST setup. * default Link Loss Timeout (LLT) value can be configured for each FST interface (fst_llt config file entry). It represents LLT to be used by FST when this interface is active. * FST interfaces advertise the Multi-band capability by including the Multi-band element in the corresponding frames FST CLI commands: * fst list_groups - list FST groups configured. * fst list_ifaces - list FST interfaces which belong to specific group * fst iface_peers - list Multi-Band STAs connected to specific interface * fst list_sessions - list existing FST sessions * fst session_get - get FST session info * fst session_add - create FST session object * fst session_set - set FST session parameters (old_iface, new_iface, peer_addr, llt) * fst session_initiate - initiate FST setup * fst session_respond - respond to FST setup establishemnt attempt by counterpart * fst session_transfer - initiate FST switch * fst session_teardown - tear down FST Setup but leave the session object for reuse * fst session_remove - remove FST session object FST CLI notifications: * FST-EVENT-PEER - peer state changed (CONNECT/DISCONNECT) * FST-EVENT-SESSION - FST session level notification with following sub-events: - EVENT_FST_SESSION_STATE - FST session state changed - EVENT_FST_ESTABLISHED - previously initiated FST session became established - EVENT_FST_SETUP - new FST session object created due to FST session negotiation attempt by counterpart All the FST CLI commands and notifications are also implemented on D-Bus for wpa_supplicant. IEEE 802.11 standard compliance FST module implements FST setup statemachine in compliance with IEEE 802.11ad (P802.11-REVmc/D3.3), as it described in 10.32 Multi-band operation (see also Figure 10-34 - States of the FST setup protocol). Thus, for example, the FST module initiates FST switch automatically when FST setup becomes established with LLT=0 in accordance with Transitioning between states. At the moment, FST module only supports non-transparent STA-based FST (see 10.32.1 General). Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>