#ifndef UCP_RNDV_H_
#define UCP_RNDV_H_
#include <ucp/core/ucp_types.h>
#include <ucp/proto/proto_am.h>
#include <ucp/core/ucp_mm.h>
#include <ucs/datastruct/ptr_map.h>
typedef enum {
UCP_RNDV_RTS_TAG_OK = UCS_OK,
UCP_RNDV_RTS_AM = 1
} UCS_S_PACKED ucp_rndv_rts_opcode_t;
typedef struct {
uint64_t hdr;
ucp_request_hdr_t sreq;
uint64_t address;
size_t size;
uint8_t opcode;
} UCS_S_PACKED ucp_rndv_rts_hdr_t;
typedef struct {
uint64_t sreq_id;
uint64_t rreq_id;
uint64_t address;
size_t size;
size_t offset;
} UCS_S_PACKED ucp_rndv_rtr_hdr_t;
typedef struct {
ucp_reply_hdr_t super;
size_t size;
} UCS_S_PACKED ucp_rndv_ack_hdr_t;
ucs_status_t ucp_rndv_send_rts(ucp_request_t *sreq, uct_pack_callback_t pack_cb,
size_t rts_body_size);
void ucp_rndv_req_send_ack(ucp_request_t *ack_req, size_t ack_size,
ucs_ptr_map_key_t remote_req_id, ucs_status_t status,
ucp_am_id_t am_id, const char *ack_str);
ucs_status_t ucp_rndv_progress_rma_get_zcopy(uct_pending_req_t *self);
ucs_status_t ucp_rndv_progress_rma_put_zcopy(uct_pending_req_t *self);
size_t ucp_rndv_rts_pack(ucp_request_t *sreq, ucp_rndv_rts_hdr_t *rndv_rts_hdr,
ucp_rndv_rts_opcode_t opcode);
ucs_status_t ucp_proto_progress_rndv_rtr(uct_pending_req_t *self);
ucs_status_t ucp_rndv_reg_send_buffer(ucp_request_t *sreq);
ucp_mem_desc_t *
ucp_rndv_mpool_get(ucp_worker_h worker, ucs_memory_type_t mem_type,
ucs_sys_device_t sys_dev);
void ucp_rndv_receive(ucp_worker_h worker, ucp_request_t *rreq,
const ucp_rndv_rts_hdr_t *rndv_rts_hdr,
const void *rkey_buf);
ucs_status_t ucp_rndv_send_handle_status_from_pending(ucp_request_t *sreq,
ucs_status_t status);
static UCS_F_ALWAYS_INLINE int
ucp_rndv_rts_is_am(const ucp_rndv_rts_hdr_t *rts_hdr)
{
return rts_hdr->opcode == UCP_RNDV_RTS_AM;
}
static UCS_F_ALWAYS_INLINE int
ucp_rndv_rts_is_tag(const ucp_rndv_rts_hdr_t *rts_hdr)
{
return rts_hdr->opcode == UCP_RNDV_RTS_TAG_OK;
}
#endif