// +FHDR------------------------------------------------------------
//                 Copyright (c) 2022 SmartLogic.
//                       ALL RIGHTS RESERVED
// -----------------------------------------------------------------
// Filename      : msg_transfer_layer.h
// Author        : xianfeng.du
// Created On    : 2022-06-29
// Last Modified :
// -----------------------------------------------------------------
// Description:
//
//
// -FHDR------------------------------------------------------------

#ifndef __MSG_TRANSFER_LAYER_H__
#define __MSG_TRANSFER_LAYER_H__

#include "typedef.h"

#define MAX_INSTANCE_NUM    (2)
#define MAX_PORT_NUM        (4)

#define SUCCESS             (0)
#define FAILURE             (-1)
#define UNINITIALIZED_QUEUE (1)
#define FULLEDED_QUEUE      (2)
#define EMPTY_QUEUE         (2)
#define OUT_OF_BLOCK_MEMORY (2)

typedef enum e_transfer_type {
    NON_CU_SPLIT,
    CU_SPLIT,
    OAM,
    TRANSFER_TYPE_NUM
} transfer_type_e;

typedef enum e_cu_flag {
    C_PLANE,
    U_PLANE
} cu_flag_e;

typedef union tHandleId {
    uint32_t value;
    struct {
        uint8_t rsv;
        uint8_t type_id;
        uint8_t inst_id;
        uint8_t port_id;
    };
} HandleId_t;

typedef uint32_t (*msg_transfer_callback)(const char* buf,uint32_t payloadSize);

typedef struct t_queue_info {
    uint32_t tx_desc_num;
    uint32_t rx_desc_num;
    uint32_t tx_block_size;
    uint32_t rx_block_size;
    uint16_t tx_block_num;
    uint16_t rx_block_num;
    uint16_t directions;
    uint16_t rsv;
    msg_transfer_callback   tx_callback;
    msg_transfer_callback   rx_callback;
} queue_info_s;

typedef struct t_transfer_type_info {
    queue_info_s queue_cplane_info;
    queue_info_s queue_uplane_info;
} transfer_type_info_s;

int32_t msg_transfer_init(uint16_t port_index, uint16_t transfer_type, uint16_t inst_id, const transfer_type_info_s* transfer_type_info);
int32_t msg_transfer_send_start(int32_t handle_id, uint16_t cu_flag);
int32_t msg_transfer_alloc_msg(int32_t handle_id, uint16_t cu_flag, uint32_t bufSize, char** buf,  uint32_t* availableSize, uint32_t* offset);
int32_t msg_transfer_send_msg(int32_t handle_id, uint16_t cu_flag, uint8_t* msg_ptr, uint32_t offset, uint32_t msg_len);
int32_t msg_transfer_send_end(int32_t handle_id, uint16_t cu_flag); 
int32_t msg_transfer_receive(int32_t handle_id, uint16_t cu_flag, uint32_t offset, uint32_t len, uint8_t** msg_ptr);
int32_t msg_transfer_close(int32_t handle_id); 

#endif

