#ifndef UCP_WIREUP_EP_H_
#define UCP_WIREUP_EP_H_
#include "address.h"
#include <ucp/api/ucp.h>
#include <ucp/core/ucp_proxy_ep.h>
#include <ucs/datastruct/queue_types.h>
enum {
UCP_WIREUP_EP_FLAG_READY = UCS_BIT(0),
UCP_WIREUP_EP_FLAG_LOCAL_CONNECTED = UCS_BIT(1),
UCP_WIREUP_EP_FLAG_REMOTE_CONNECTED = UCS_BIT(2),
UCP_WIREUP_EP_FLAG_SEND_CLIENT_ID = UCS_BIT(3)
};
struct ucp_wireup_ep {
ucp_proxy_ep_t super;
ucs_queue_head_t pending_q;
uct_ep_h aux_ep;
struct sockaddr_storage cm_remote_sockaddr;
ucp_rsc_index_t aux_rsc_index;
volatile uint32_t pending_count;
volatile uint32_t flags;
uct_worker_cb_id_t progress_id;
unsigned ep_init_flags;
ucp_tl_bitmap_t cm_resolve_tl_bitmap;
ucp_rsc_index_t dst_rsc_indices[UCP_MAX_LANES];
};
ucs_status_t ucp_wireup_ep_create(ucp_ep_h ep, uct_ep_h *ep_p);
ucp_rsc_index_t ucp_wireup_ep_get_aux_rsc_index(uct_ep_h uct_ep);
ucs_status_t ucp_wireup_ep_connect(uct_ep_h uct_ep, unsigned ucp_ep_init_flags,
ucp_rsc_index_t rsc_index,
unsigned path_index, int connect_aux,
const ucp_unpacked_address_t *remote_address);
void ucp_wireup_ep_pending_queue_purge(uct_ep_h uct_ep,
uct_pending_purge_callback_t cb,
void *arg);
void ucp_wireup_ep_set_aux(ucp_wireup_ep_t *wireup_ep, uct_ep_h uct_ep,
ucp_rsc_index_t rsc_index);
ucs_status_t
ucp_wireup_ep_connect_aux(ucp_wireup_ep_t *wireup_ep, unsigned ep_init_flags,
const ucp_unpacked_address_t *remote_address);
void ucp_wireup_ep_discard_aux_ep(ucp_wireup_ep_t *wireup_ep,
unsigned ep_flush_flags,
uct_pending_purge_callback_t purge_cb,
void *purge_arg);
void ucp_wireup_ep_set_next_ep(uct_ep_h uct_ep, uct_ep_h next_ep,
ucp_rsc_index_t rsc_index);
uct_ep_h ucp_wireup_ep_extract_next_ep(uct_ep_h uct_ep);
void ucp_wireup_ep_destroy_next_ep(ucp_wireup_ep_t *wireup_ep);
void ucp_wireup_ep_remote_connected(uct_ep_h uct_ep, int ready);
int ucp_wireup_ep_test(uct_ep_h uct_ep);
int ucp_wireup_aux_ep_is_owner(ucp_wireup_ep_t *wireup_ep, uct_ep_h owned_ep);
int ucp_wireup_ep_is_owner(uct_ep_h uct_ep, uct_ep_h owned_ep);
void ucp_wireup_ep_disown(uct_ep_h uct_ep, uct_ep_h owned_ep);
uct_ep_h ucp_wireup_ep_get_msg_ep(ucp_wireup_ep_t *wireup_ep);
ucs_status_t ucp_wireup_ep_progress_pending(uct_pending_req_t *self);
ucp_wireup_ep_t *ucp_wireup_ep(uct_ep_h uct_ep);
#endif