161 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			161 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef MAC_STREAM_H
							 | 
						||
| 
								 | 
							
								#define MAC_STREAM_H
							 | 
						||
| 
								 | 
							
								#include "plc_utils.h"
							 | 
						||
| 
								 | 
							
								#include "mac_peer.h"
							 | 
						||
| 
								 | 
							
								#include "mac_msdu.h"
							 | 
						||
| 
								 | 
							
								#include "rx_pb_reorder.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if PLC_SUPPORT_CCO_ROLE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if RUN_IN_PSRAM
							 | 
						||
| 
								 | 
							
								#define stream_tbl_sz   (1 << 10)
							 | 
						||
| 
								 | 
							
								#else /* RUN_IN_PSRAM */
							 | 
						||
| 
								 | 
							
								#define stream_tbl_sz   (1 << 6)
							 | 
						||
| 
								 | 
							
								#endif /* RUN_IN_PSRAM */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define stream_tbl_sz   (1 << 6)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define rx stream */
							 | 
						||
| 
								 | 
							
								#define IS_RX_STREAM        0
							 | 
						||
| 
								 | 
							
								/* define tx stream */
							 | 
						||
| 
								 | 
							
								#define IS_TX_STREAM        1
							 | 
						||
| 
								 | 
							
								/* define dbg tx stream */
							 | 
						||
| 
								 | 
							
								#define IS_DBG_TX_STREAM    2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* is plc device stream */
							 | 
						||
| 
								 | 
							
								#define IS_PLC_STREAM    0
							 | 
						||
| 
								 | 
							
								/* is rf device stream */
							 | 
						||
| 
								 | 
							
								#define IS_RF_STREAM     1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//rx stream timeout
							 | 
						||
| 
								 | 
							
								#define MAC_RX_STREAM_TIMEOUT_MS    20*1000    //20s
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* pack for the structures in the whole file */
							 | 
						||
| 
								 | 
							
								#pragma pack(push)      // save the pack status
							 | 
						||
| 
								 | 
							
								#pragma pack(1)         // 1 byte align
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_tx_stream_ctxt {
							 | 
						||
| 
								 | 
							
								    mac_msdu_t *cur_tx_msdu;
							 | 
						||
| 
								 | 
							
								    mac_msdu_frame_t *mac_frame_list; // the mac_frame queue
							 | 
						||
| 
								 | 
							
								    mac_msdu_frame_t *last_mac_frame; // the last frame
							 | 
						||
| 
								 | 
							
								    /* node in swq */
							 | 
						||
| 
								 | 
							
								    iot_list_head_t swq_node;
							 | 
						||
| 
								 | 
							
								    /* put the not 4-byte align part at the end */
							 | 
						||
| 
								 | 
							
								    /* the number of mac frame in this stream
							 | 
						||
| 
								 | 
							
								     * not include the frame already in HWQ
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint16_t mac_frame_num;
							 | 
						||
| 
								 | 
							
								} mac_tx_stream_ctxt_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_rx_stream_ctxt {
							 | 
						||
| 
								 | 
							
								    reorder_msdu_buf_t reorder_buf;
							 | 
						||
| 
								 | 
							
								} mac_rx_stream_ctxt_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _mac_stream {
							 | 
						||
| 
								 | 
							
								    mac_peer_t *peer;
							 | 
						||
| 
								 | 
							
								    iot_single_list_head_t peer_node;  /* node in peer */
							 | 
						||
| 
								 | 
							
								    struct _mac_stream *next; /* next in stream hash table */
							 | 
						||
| 
								 | 
							
								    union {
							 | 
						||
| 
								 | 
							
								        mac_tx_stream_ctxt_t tx;
							 | 
						||
| 
								 | 
							
								        mac_rx_stream_ctxt_t rx;
							 | 
						||
| 
								 | 
							
								    } msdu;
							 | 
						||
| 
								 | 
							
								    /* put the not 4-byte align part at the end */
							 | 
						||
| 
								 | 
							
								    lid_t   lid;
							 | 
						||
| 
								 | 
							
								    uint8_t is_tx       : 2,
							 | 
						||
| 
								 | 
							
								        in_swq          : 1, /* is in swq already */
							 | 
						||
| 
								 | 
							
								        phase_in_swq    : 2, /* stream phase */
							 | 
						||
| 
								 | 
							
								        is_rf           : 1, /* is plc or rf streaam 0:plc, 1:rf */
							 | 
						||
| 
								 | 
							
								        resv            : 2; /* resv */
							 | 
						||
| 
								 | 
							
								} mac_stream_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if DEBUG_FREE_STREAM_FAIL
							 | 
						||
| 
								 | 
							
								typedef struct _mac_debug_stream_ctxt {
							 | 
						||
| 
								 | 
							
								    uint32_t nid;
							 | 
						||
| 
								 | 
							
								    uint32_t lid;
							 | 
						||
| 
								 | 
							
								    uint32_t tei;
							 | 
						||
| 
								 | 
							
								    uint32_t is_tx : 2,
							 | 
						||
| 
								 | 
							
								             is_rf : 1,
							 | 
						||
| 
								 | 
							
								             resv  : 29;
							 | 
						||
| 
								 | 
							
								} mac_debug_stream_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* stream hash table related */
							 | 
						||
| 
								 | 
							
								extern mac_stream_t *g_stream_hash_tbl[stream_tbl_sz];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t stream_hash_tbl_get_hsahv(nid_t nid, \
							 | 
						||
| 
								 | 
							
								    tei_t tei, lid_t lid, uint8_t is_tx, uint8_t is_rf);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								*   @peer_in - the peer to look into, could be NULL if nid is valid
							 | 
						||
| 
								 | 
							
								*                else should be not NULL
							 | 
						||
| 
								 | 
							
								*    @nid    -   if 0, the peer_in is needed
							 | 
						||
| 
								 | 
							
								*    @tei    -   tei
							 | 
						||
| 
								 | 
							
								*    @lid    -   lid
							 | 
						||
| 
								 | 
							
								*   @return stream address if found
							 | 
						||
| 
								 | 
							
								*            NULL if not found
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								mac_stream_t * find_stream(mac_peer_t *peer_in, \
							 | 
						||
| 
								 | 
							
								    nid_t nid, tei_t tei, lid_t lid, uint8_t is_tx, uint8_t is_rf);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* @return - 0 for successful
							 | 
						||
| 
								 | 
							
								*           other for failed
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								uint32_t stream_hash_tbl_add(mac_stream_t *stream);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* @return  - 0 for successful
							 | 
						||
| 
								 | 
							
								 *          - other for error
							 | 
						||
| 
								 | 
							
								 * @peer (INPUT)    - ptr for peer based on
							 | 
						||
| 
								 | 
							
								 * @is_tx(INPUT)    - this stream is for tx or rx
							 | 
						||
| 
								 | 
							
								 * @lid     (INPUT) - link id for this stream
							 | 
						||
| 
								 | 
							
								 * @is_rf   (INPUT) - this stream is for plc or rf
							 | 
						||
| 
								 | 
							
								 * @stream_ptr  (OUTPUT) - the stream created
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t mac_stream_alloc(mac_peer_t *peer, uint32_t is_tx, \
							 | 
						||
| 
								 | 
							
								    lid_t lid, uint8_t is_rf, mac_stream_t **stream_ptr);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t mac_stream_free(mac_peer_t *peer, mac_stream_t *stream);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t is_stream_empty(mac_stream_t *stream);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* @brief           dump info when mac stream exhausted
							 | 
						||
| 
								 | 
							
								 * @param peer:     ptr for peer based on
							 | 
						||
| 
								 | 
							
								 * @retval:         void
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void mac_stream_exhausted_dump(mac_peer_t *peer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma pack(pop)       // restore the pack status
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !MAC_STREAM_H
							 |