Files
kunlun/plc/halmac/inc/mac_stream.h
2024-09-28 14:24:04 +08:00

161 lines
4.5 KiB
C
Executable File

/****************************************************************************
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