The UMAC's Rx module implementation. More...
#include "co_int.h"#include "co_bool.h"#include <string.h>#include "compiler.h"#include "rxu_cntrl.h"#include "macif.h"#include "co_ring.h"#include "ke_event.h"#include "ke_task.h"#include "me_task.h"#include "mac_frame.h"#include "rxl_cntrl.h"#include "sta_mgmt.h"#include "vif_mgmt.h"#include "mm.h"#include "rxl_hwdesc.h"#include "ps.h"#include "co_utils.h"#include "co_endian.h"#include "hal_desc.h"#include "llc.h"#include "bam.h"#include "mac_ie.h"#include "me_utils.h"#include "rxu_task.h"#include "scanu_task.h"#include "scanu.h"#include "sm.h"#include "mfp.h"#include "mesh_hwmp.h"Go to the source code of this file.
Defines | |
| #define | RXL_CNTRL_IS_DATA(frame_cntrl) ((frame_cntrl & MAC_FCTRL_TYPE_MASK) == MAC_FCTRL_DATA_T) |
| Indicate if the received packet is a Data packet by reading the Frame Control Field. | |
| #define | RXL_CNTRL_IS_QOS_DATA(frame_cntrl) ((frame_cntrl & MAC_FCTRL_TYPESUBTYPE_MASK) == MAC_FCTRL_QOS_DATA) |
| Indicate if the received packet is a QOS Data packet by reading the Frame Control Field. | |
| #define | RXL_CNTRL_IS_MGT(frame_cntrl) ((frame_cntrl & MAC_FCTRL_TYPE_MASK) == MAC_FCTRL_MGT_T) |
| Indicate if the received packet is a Management packet by reading the Frame Control Field. | |
| #define | RXL_CNTRL_IS_CTRL(frame_cntrl) ((frame_cntrl & MAC_FCTRL_TYPE_MASK) == MAC_FCTRL_CTRL_T) |
| Indicate if the received packet is a Control packet by reading the Frame Control Field. | |
| #define | RXL_CNTRL_IS_PROTECTED(frame_cntrl) ((frame_cntrl & MAC_FCTRL_PROTECTEDFRAME) == MAC_FCTRL_PROTECTEDFRAME) |
| Indicate if the received frame was encrypted (Protected Bit set to 1). | |
| #define | __RX_STAT_DESC_LOC __SHAREDRAM |
| Attribute indicating whether the RX status descriptor pool shall be put in shared RAM or not. | |
Functions | |
| static void | rxu_upload_cfm (void *env) |
| Callback function used for the confirmation of status descriptor upload. | |
| static struct rxu_stat_desc * | rxu_cntrl_desc_prepare (struct rxdesc *rxdesc, uint16_t rx_status, uint32_t host_id) |
| Prepare a RX status descriptor for upload to upper layers. | |
| __INLINE uint8_t | rxu_cntrl_machdr_len_get (uint16_t frame_cntl) |
| Compute the length of the MAC Header based on the frame control. | |
| static bool | rxu_cntrl_protected_handle (uint8_t *frame, uint32_t statinfo) |
| This function processes the received encrypted frames. | |
| static bool | rxu_cntrl_check_pn (uint64_t *pn, struct key_info_tag *key, uint8_t tid) |
| Check if the received frame is not a replayed one. | |
| static void | rxu_cntrl_remove_sec_hdr_mgmt_frame (struct rxdesc *rxdesc, struct rx_cntrl_rx_status *rx_status) |
Remove security header (if any) in management frame
| |
| static void | rxu_cntrl_mac2eth_update (struct rxdesc *rxdesc) |
| Convert the 802.11 MAC Header into a 802.3 Ethernet Header. | |
| static void | rxu_msdu_upload_and_indicate (struct rxdesc *rxdesc, uint16_t rx_status) |
| Prepare and program the upload of a MSDU to the host buffer This function first calls the MPDU to MSDU conversion procedure. | |
| static void | rxu_mpdu_upload_and_indicate (struct rxdesc *rxdesc, uint16_t rx_status) |
| Prepare and program the upload of a MPDU to the host buffer. | |
| static void | rxu_cntrl_get_da_sa (struct mac_hdr_long *machdr_ptr) |
| Extract the Destination and Source Addresses from the MAC Header IEEE 802.11 Address Field See IEEE 802.11-2012 Table 8.19. | |
| static void | rxu_cntrl_machdr_read (uint8_t *frame) |
| Extract various information from the MAC Header and put them in the RX status structure. | |
| static void | rxu_cntrl_mic_rd_concat (uint32_t mic_buffer, uint8_t mic_p1_len, uint32_t mic_p1_addr, uint32_t mic_p2_addr) |
| Concatenate two parts of MIC stored at different addresses and write the result in a buffer. | |
| static bool | rxu_cntrl_mic_compare (uint32_t *mic_value1, uint32_t *mic_value2) |
| Compare two MIC values. | |
| static void | rxu_cntrl_mic_failure (void) |
| Send a TKIP MIC failure indication to the host based on the parameter of the current packet. | |
| static bool | rxu_cntrl_mic_check (struct rxdesc *rxdesc, struct rxu_mic_calc *mic, bool first_frag, bool last_frag) |
| This function implements the MIC verification functionality used internally by the UMAC's RX module to verify the integrity of the packets components. | |
| static void | rxu_cntrl_defrag_mpdu_transfer (struct rxdesc *rxdesc, struct rxu_cntrl_defrag *defrag, uint16_t cpy_len) |
| This function programs the upload of a fragment of a fragmented MSDU that is not the first one. | |
| static struct rxu_cntrl_defrag * | rxu_cntrl_defrag_get (uint8_t sta_idx, uint16_t sn, uint8_t tid) |
| Go through the list of used reassembly structures in order to find a structure whose station index and tid are the provided values. | |
| static struct rxu_cntrl_defrag * | rxu_cntrl_defrag_alloc (void) |
| Allocate a reassembly structure from the free pool. | |
| static void | rxu_cntrl_defrag_len_update (struct rxu_cntrl_defrag *defrag) |
| This function uploads the length of a reassembled frame after all fragments have been uploaded. | |
| static void | rxu_cntrl_defrag_timeout_cb (void *env) |
| This function is called when a reassembly procedure timeout expires. | |
| static bool | rxu_cntrl_defrag_check (struct rxdesc *rxdesc, uint8_t sta_idx, bool qos) |
| Check if the received frame shall be reassembled. | |
| static bool | rxu_cntrl_duplicate_nsta_check (uint8_t *frame) |
| Duplicate filtering check for non-registered STA. | |
| static bool | rxu_cntrl_duplicate_check (uint16_t frame_cntrl, uint8_t sta_idx, uint8_t qos) |
| Duplicate filtering check for registered STA. | |
| static void | rxu_cntrl_reord_update (struct rxu_cntrl_reord *rx_reord) |
| Move the RX reordering window by one. | |
| static void | rxu_cntrl_reord_flush (struct rxu_cntrl_reord *rx_reord, uint16_t sn_skipped) |
| Flush a certain amount of positions of the RX reordering window This function indicates to the host the packets that have been flushed. | |
| static void | rxu_cntrl_reord_fwd (struct rxu_cntrl_reord *rx_reord) |
| Indicates to the host all the packets that have been unblocked by the reception of the next waited sequence number. | |
| static void | rxu_cntrl_reord_bar_check (uint8_t sta_idx, uint8_t *frame) |
| Update the reordering information accordingly with the provided BlockAck Request PDU. | |
| static bool | rxu_cntrl_reord_check (struct rxdesc *rxdesc, uint8_t sta_idx) |
Perform the reordering checks on the received frame This function may decide to:
| |
| static void | rxu_cntrl_reord_timeout_cb (void *env) |
| This function is called when the timer of a reordering structure expires. | |
| static bool | rxu_cntrl_spurious_check (uint8_t *frame, struct rxdesc *rxdesc) |
| Spurious frame check for non-registered STA. | |
| static void | rxu_cntrl_pm_mon_check (uint8_t *frame, uint32_t statinfo) |
| Check whether the received frame shall trigger the PM monitoring procedure. | |
| static bool | rxu_mgt_route_action (uint32_t *payload, uint16_t length, uint8_t sta_idx, uint8_t *vif_idx, ke_task_id_t *task_id, uint16_t machdr_length, bool *need_machdr) |
| Route the received action frame based on its type. | |
| static bool | rxu_mgt_route (uint16_t framectrl, uint16_t length, uint16_t machdr_length, uint8_t sta_idx, uint8_t *vif_idx, uint32_t *payload, ke_task_id_t *task_id, bool *need_machdr) |
| Route the received management frame based on its type. | |
| static bool | rxu_mgt_frame_ind (uint16_t framectrl, uint16_t length, uint8_t sta_idx, uint8_t *vif_idx, int8_t rssi, struct rx_pbd *pbd, uint16_t machdr_length) |
| Perform the checks on a received management frame to decide whether to upload it or forwarded to an internal kernel task. | |
| static uint8_t | rxu_mgt_search_rx_vif (struct mac_hdr *hdr, uint32_t statinfo) |
| Search to which VIF a received management frame is for. | |
| static bool | rxu_mgt_frame_check (struct rxdesc *rxdesc, uint8_t sta_idx) |
| This function processes the received frames that could carry useful information for some UMAC features (connection monitoring, power-save mode, etc. | |
| static void | rxu_cntrl_desc_init (void) |
| Initializes the list of RX IPC descriptors. | |
| static bool | rxu_upload_monitor (struct rxdesc *rxdesc, bool upload) |
| Check if the frame has to be uploaded to the driver. | |
| void | rxu_cntrl_init (void) |
| initializes the rx_context. | |
| bool | rxu_cntrl_frame_handle (struct rxdesc *rxdesc) |
| Upper MAC RX frame handler. | |
| bool | rxu_cntrl_reord_create (struct sta_info_tag *sta, uint8_t tid, uint16_t ssn) |
| Allocate and initialize a reordering structure upon a new RX BlockAck agreement creation. | |
| void | rxu_cntrl_reord_delete (struct sta_info_tag *sta, uint8_t tid) |
| Delete a reordering structure previously allocated. | |
| void | rxu_cntrl_monitor_pm (struct mac_addr *addr) |
| Start the PM bit monitoring on incoming frames for which the TA is unknown. | |
| uint8_t | rxu_cntrl_get_pm (void) |
| This function returns the PM state of the station for which the PM monitoring was started. | |
| void | rxu_cntrl_evt (int dummy) |
| This function is a kernel event handler that is triggered when new RX descriptors are pushed by the host. | |
| bool | rxu_cntrl_desc_check (void) |
| Check if a RX status descriptor is available. | |
Variables | |
| struct rxu_cntrl_env_tag | rxu_cntrl_env |
| The RX module's environment. | |
|
struct rxu_stat_desc rxu_stat_desc_pool[RX_STAT_DESC_CNT] | __RX_STAT_DESC_LOC |
| Pool of RX status structures. | |
| struct rxu_cntrl_reord | rxu_cntrl_reord_pool [RX_CNTRL_REORD_POOL_SIZE] |
| Pool of reordering structures. | |
| struct rxu_cntrl_defrag | rxu_cntrl_defrag_pool [RX_CNTRL_DEFRAG_POOL_SIZE] |
| Pool of reordering structures. | |
The UMAC's Rx module implementation.
Copyright (C) RivieraWaves 2011-2019
Definition in file rxu_cntrl.c.
1.6.1