/** * Copyright (C) Mellanox Technologies Ltd. 2001-2015. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCP_WIREUP_H_ #define UCP_WIREUP_H_ #include #include #include #include #include #include /** * Wireup message types */ enum { UCP_WIREUP_MSG_PRE_REQUEST, UCP_WIREUP_MSG_REQUEST, UCP_WIREUP_MSG_REPLY, UCP_WIREUP_MSG_ACK, UCP_WIREUP_MSG_LAST }; /** * Criteria for transport selection. */ typedef struct { const char *title; /* Name of the criteria for debugging */ uint64_t local_md_flags; /* Required local MD flags */ uint64_t remote_md_flags; /* Required remote MD flags */ uint64_t local_iface_flags; /* Required local interface flags */ uint64_t remote_iface_flags;/* Required remote interface flags */ /** * Calculates score of a potential transport. * * @param [in] context UCP context. * @param [in] md_attr Local MD attributes. * @param [in] iface_attr Local interface attributes. * @param [in] remote_info Remote peer attributes. * * @return Transport score, the higher the better. */ double (*calc_score)(ucp_context_h context, const uct_md_attr_t *md_attr, const uct_iface_attr_t *iface_attr, const ucp_address_iface_attr_t *remote_iface_attr); uint8_t tl_rsc_flags; /* Flags that describe TL specifics */ ucp_tl_iface_atomic_flags_t local_atomic_flags; ucp_tl_iface_atomic_flags_t remote_atomic_flags; } ucp_wireup_criteria_t; /** * Packet structure for wireup requests. */ typedef struct ucp_wireup_msg { uint8_t type; /* Message type */ ucp_err_handling_mode_t err_mode; /* Peer error handling mode */ ucp_ep_conn_sn_t conn_sn; /* Connection sequence number */ uintptr_t src_ep_ptr; /* Endpoint of source */ uintptr_t dest_ep_ptr; /* Endpoint of destination (0 - invalid) */ /* packed addresses follow */ } UCS_S_PACKED ucp_wireup_msg_t; typedef struct { double score; unsigned addr_index; ucp_rsc_index_t rsc_index; uint8_t priority; } ucp_wireup_select_info_t; ucs_status_t ucp_wireup_send_request(ucp_ep_h ep); ucs_status_t ucp_wireup_send_pre_request(ucp_ep_h ep); ucs_status_t ucp_wireup_connect_remote(ucp_ep_h ep, ucp_lane_index_t lane); ucs_status_t ucp_wireup_select_aux_transport(ucp_ep_h ep, unsigned ep_init_flags, const ucp_unpacked_address_t *remote_address, ucp_wireup_select_info_t *select_info); ucs_status_t ucp_wireup_select_sockaddr_transport(const ucp_context_h context, const ucs_sock_addr_t *sockaddr, ucp_rsc_index_t *rsc_index_p); double ucp_wireup_amo_score_func(ucp_context_h context, const uct_md_attr_t *md_attr, const uct_iface_attr_t *iface_attr, const ucp_address_iface_attr_t *remote_iface_attr); ucs_status_t ucp_wireup_msg_progress(uct_pending_req_t *self); int ucp_wireup_msg_ack_cb_pred(const ucs_callbackq_elem_t *elem, void *arg); int ucp_wireup_is_reachable(ucp_worker_h worker, ucp_rsc_index_t rsc_index, const ucp_address_entry_t *ae); ucs_status_t ucp_wireup_init_lanes(ucp_ep_h ep, unsigned ep_init_flags, uint64_t local_tl_bitmap, const ucp_unpacked_address_t *remote_address, unsigned *addr_indices); ucs_status_t ucp_wireup_select_lanes(ucp_ep_h ep, unsigned ep_init_flags, uint64_t tl_bitmap, const ucp_unpacked_address_t *remote_address, unsigned *addr_indices, ucp_ep_config_key_t *key); ucs_status_t ucp_signaling_ep_create(ucp_ep_h ucp_ep, uct_ep_h uct_ep, int is_owner, uct_ep_h *signaling_ep); int ucp_worker_iface_is_tl_p2p(const uct_iface_attr_t *iface_attr); int ucp_wireup_is_rsc_self_or_shm(ucp_ep_h ep, ucp_rsc_index_t rsc_index); void ucp_wireup_assign_lane(ucp_ep_h ep, ucp_lane_index_t lane, uct_ep_h uct_ep, const char *info); ucs_status_t ucp_wireup_connect_lane(ucp_ep_h ep, unsigned ep_init_flags, ucp_lane_index_t lane, const ucp_unpacked_address_t *remote_address, unsigned addr_index); ucs_status_t ucp_wireup_resolve_proxy_lanes(ucp_ep_h ep); void ucp_wireup_remote_connected(ucp_ep_h ep); static inline int ucp_worker_is_tl_p2p(ucp_worker_h worker, ucp_rsc_index_t rsc_index) { return ucp_worker_iface_is_tl_p2p(ucp_worker_iface_get_attr(worker, rsc_index)); } unsigned ucp_ep_init_flags(const ucp_worker_h worker, const ucp_ep_params_t *params); ucs_status_t ucp_wireup_connect_local(ucp_ep_h ep, const ucp_unpacked_address_t *remote_address, const ucp_lane_index_t *lanes2remote); #endif