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

225 lines
6.6 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_PEER_H
#define MAC_PEER_H
#include "plc_utils.h"
#include "mac_vdev.h"
#include "iot_crc.h"
#include "iot_queue.h"
#include "iot_config.h"
#include "iot_bitmap_api.h"
#ifdef __cplusplus
extern "C" {
#endif
#if PLC_SUPPORT_CCO_ROLE
#if RUN_IN_PSRAM
#define peer_tbl_sz (1 << 8)
#else /* RUN_IN_PSRAM */
#define peer_tbl_sz (1 << 6)
#endif /* RUN_IN_PSRAM */
#else /* PLC_SUPPORT_CCO_ROLE */
#define peer_tbl_sz (1 << 6)
#endif /* PLC_SUPPORT_CCO_ROLE */
#define MAC_CONN_TYPE_CONNLESS 0
#define DEL_ALL_STREAM 0
#define DEL_TX_STREAM 1
#define DEL_RX_STREAM 2
/* mac tei bitmap length in bytes */
#define MAC_TEI_MAP_BYTE_LEN ((PLC_TEI_MAX_NUM + 8) / 8)
/* mac tei bitmap type defination */
typedef struct _mac_tei_map_t {
uint8_t map[MAC_TEI_MAP_BYTE_LEN];
} mac_tei_map_t;
typedef struct _rate_info {
uint32_t last_rx_ts;
uint16_t rate_idx : 8, /* current rate idx, max 255 rates */
con_no_sack_cnt : 4, /* cnt not receiving sack */
con_sack_err_cnt : 4; /* cnt no one pb rx correct */
int8_t avg_snr; /* snr for current rate */
uint8_t tx_power;
} rate_info_t;
typedef struct _mac_peer {
struct _mac_peer *next;
iot_list_head_t vdev_node;
/* stream list */
iot_single_list_head_t *data_stream_list;
/* rate info */
rate_info_t rate_info;
#if HPLC_RF_DEV_SUPPORT
rate_info_t rf_rate_info;
#endif
/* dtei, stei if self peer */
uint16_t tei :12,
is_self_peer :1,
is_bcast_peer :1,
is_sub_peer :1,
is_proxy_peer :1;
/* pdev id */
pdevid_t pdev_id;
/* vdev id */
vdevid_t vdev_id;
} mac_peer_t;
extern mac_peer_t *peer_hash_tbl[peer_tbl_sz];
/*
* API
*/
/* peer table related */
#define peer_get_hash(input) \
(iot_getcrc8((uint8_t*)&(input), sizeof(input)) & (peer_tbl_sz - 1))
/* @return peer address if found
* NULL if not found
*/
#define get_peer_tbl_entry(tei) \
peer_hash_tbl[peer_get_hash(tei)]
#define get_peer_tbl_entry_addr(tei) \
&peer_hash_tbl[peer_get_hash(tei)]
/* @return peer address if found
* NULL if not found
*/
mac_peer_t * find_peer(mac_vdev_t *vdev, \
nid_t nid, tei_t tei);
/* @return - 0 for successful
* other for failed
*/
uint32_t peer_hash_tbl_add(mac_peer_t *peer);
/*
* @return - 0 for successful
* other for failed
*/
uint32_t mac_peer_alloc(mac_vdev_t *vdev, tei_t tei,
uint32_t is_self, uint32_t is_direct_conn, \
uint32_t is_sub_peer, uint32_t is_proxy_peer, mac_peer_t **peer);
/* init peer
* peer (IN) - ptr of peer that already allocated
* vdev_ptr (IN) - ptr of vdev that the peer refered
* is_self_peer (IN) - if the peer is self peer
* is_direct_conn (IN) - if the peer is direct connected
* return 0 for success, other for error
*/
uint32_t mac_peer_init(mac_peer_t *peer,
void *vdev_ptr, uint32_t is_self_peer,
uint32_t is_direct_conn, tei_t tei);
/* return 0 for success, else for failed */
uint32_t peer_add_stream(mac_peer_t *peer, void *stream);
uint32_t peer_del_stream(mac_peer_t *peer, void *stream);
/*
* @breif peer_del_all_stream() - del stream
* @param mac_peer_t *peer [the pointer of the peer]
* @param uint32_t del_tx_rx_stream [0: all stream, 1: tx stream, 2: rx stream]
* @return uint32 [free stream cnt]
*/
uint32_t peer_del_all_stream(mac_peer_t *peer, uint32_t del_tx_rx_stream);
uint32_t mac_peer_free(mac_vdev_t *vdev, mac_peer_t *peer);
uint32_t is_peer_empty(mac_peer_t *peer);
uint32_t mac_peer_del_temp_peer(mac_peer_t *peer);
/*
* @breif mac_peer_rx_ts_update() - updata peer rx ts
* @param mac_peer_t *peer [the pointer of the peer]
* @param uint32_t cur_ts [the current os timestamp]
* @return uint32 [0]
*/
uint32_t mac_peer_rx_ts_update(mac_peer_t *peer, uint32_t cur_ts);
/*
* @breif mac_peer_del_overflow_peer - del overflow peer
* @param mac_peer_t *peer [which peer to del]
* @return del peer success return ERR_OK, else ERR_FAIL
*/
uint32_t mac_peer_del_overflow_peer(mac_peer_t *peer);
/* mac convert tei to bitmap index */
#define MAC_TEI_TO_BM(tei) (tei + 1)
/* mac convert bitmap index to tei */
#define MAC_BM_TO_TEI(bm) (bm - 1)
/*
* @brief mac_tei_map_reset() - mac tei bitmap reset
* @param bm tei bitmap to reset
*/
#define mac_tei_map_reset(bm) \
if (bm) { \
os_mem_set((bm), 0, sizeof(*(bm))); \
}
/*
* @breif mac_tei_map_set() - set mac tei bitmap from parameter tei
* @param bm which bitmap to set bit
* @param tei which tei as index to set bit
*/
#define mac_tei_map_set(bm, tei) \
if (bm) { \
iot_bitmap_set((bm)->map, sizeof(*(bm)), MAC_TEI_TO_BM(tei)); \
}
/*
* @breif mac_tei_map_is_set() - check mac bitmap of parameter tei is set
* @param bm which bitmap to check
* @param tei which tei as index to check
*/
#define mac_tei_map_is_set(bm, tei) \
((bm) ? iot_bitmap_is_set((bm)->map, sizeof(*(bm)), \
MAC_TEI_TO_BM(tei)) : 0)
/*
* @breif mac_tei_map_clear() - clear mac tei bitmap from parameter tei
* @param bm which bitmap to clear bit
* @param tei which tei as index to clear bit
*/
#define mac_tei_map_clear(bm, tei) \
if (bm) { \
iot_bitmap_clear((bm)->map, sizeof(*(bm)), MAC_TEI_TO_BM(tei));\
}
#ifdef __cplusplus
}
#endif
#endif // !MAC_PEER_H