#ifndef UCP_PROTO_MULTI_H_
#define UCP_PROTO_MULTI_H_
#include "proto.h"
#include "proto_common.h"
#include <ucp/dt/datatype_iter.h>
#define UCP_PROTO_MULTI_WEIGHT_SHIFT 16
#define UCP_PROTO_MULTI_WEIGHT_MAX UCS_BIT(UCP_PROTO_MULTI_WEIGHT_SHIFT)
typedef struct ucp_proto_send_multi {
ucp_proto_t super;
ptrdiff_t iface_fragsz_offset;
} ucp_proto_send_multi_t;
typedef struct {
ucp_proto_common_lane_priv_t super;
size_t max_frag;
size_t max_frag_sum;
uint32_t weight;
uint32_t weight_sum;
} ucp_proto_multi_lane_priv_t;
typedef struct {
ucp_md_map_t reg_md_map;
size_t min_frag;
size_t max_frag_sum;
ucp_lane_map_t lane_map;
ucp_lane_index_t num_lanes;
ucp_proto_multi_lane_priv_t lanes[0];
} ucp_proto_multi_priv_t;
typedef struct {
ucp_proto_common_init_params_t super;
ucp_lane_index_t max_lanes;
ucp_md_map_t initial_reg_md_map;
struct {
uint64_t tl_cap_flags;
ucp_lane_type_t lane_type;
} first, middle;
} ucp_proto_multi_init_params_t;
typedef struct {
ucp_request_t *req;
size_t max_payload;
ucp_datatype_iter_t *next_iter;
} ucp_proto_multi_pack_ctx_t;
typedef ucs_status_t (*ucp_proto_send_multi_cb_t)(
ucp_request_t *req, const ucp_proto_multi_lane_priv_t *lpriv,
ucp_datatype_iter_t *next_iter);
typedef ucs_status_t (*ucp_proto_multi_lane_send_func_t)(ucp_request_t *req,
ucp_lane_index_t lane);
ucs_status_t ucp_proto_multi_init(const ucp_proto_multi_init_params_t *params,
ucp_proto_multi_priv_t *mpriv,
size_t *priv_size_p);
void ucp_proto_multi_config_str(size_t min_length, size_t max_length,
const void *priv, ucs_string_buffer_t *strb);
#endif