mca_btl_base_descriptor_t* mca_btl_tcp_prepare_dst( struct mca_btl_base_module_t* btl, struct mca_btl_base_endpoint_t* endpoint, struct mca_mpool_base_registration_t* registration, struct opal_convertor_t* convertor, uint8_t order, size_t reserve, size_t* size, uint32_t flags) { mca_btl_tcp_frag_t* frag; if( OPAL_UNLIKELY((*size) > UINT32_MAX) ) { /* limit the size to what we support */ *size = (size_t)UINT32_MAX; } MCA_BTL_TCP_FRAG_ALLOC_USER(frag); if( OPAL_UNLIKELY(NULL == frag) ) { return NULL; } frag->segments->seg_len = *size; opal_convertor_get_current_pointer( convertor, (void**)&(frag->segments->seg_addr.pval) ); frag->base.des_remote = NULL; frag->base.des_remote_count = 0; frag->base.des_local = frag->segments; frag->base.des_local_count = 1; frag->base.des_flags = flags; frag->base.order = MCA_BTL_NO_ORDER; return &frag->base; }
int mca_btl_tcp_put (mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, void *local_address, uint64_t remote_address, mca_btl_base_registration_handle_t *local_handle, mca_btl_base_registration_handle_t *remote_handle, size_t size, int flags, int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbcontext, void *cbdata) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl; mca_btl_tcp_frag_t *frag = NULL; int i; MCA_BTL_TCP_FRAG_ALLOC_USER(frag); if( OPAL_UNLIKELY(NULL == frag) ) { return OPAL_ERR_OUT_OF_RESOURCE; } frag->endpoint = endpoint; frag->segments->seg_len = size; frag->segments->seg_addr.pval = local_address; frag->base.des_segments = frag->segments; frag->base.des_segment_count = 1; frag->base.order = MCA_BTL_NO_ORDER; frag->segments[0].seg_addr.pval = local_address; frag->segments[0].seg_len = size; frag->segments[1].seg_addr.lval = remote_address; frag->segments[1].seg_len = size; if (endpoint->endpoint_nbo) MCA_BTL_BASE_SEGMENT_HTON(frag->segments[1]); frag->base.des_flags = MCA_BTL_DES_FLAGS_BTL_OWNERSHIP | MCA_BTL_DES_SEND_ALWAYS_CALLBACK; frag->base.des_cbfunc = fake_rdma_complete; frag->cb.func = cbfunc; frag->cb.data = cbdata; frag->cb.context = cbcontext; frag->btl = tcp_btl; frag->endpoint = endpoint; frag->rc = 0; frag->iov_idx = 0; frag->hdr.size = 0; frag->iov_cnt = 2; frag->iov_ptr = frag->iov; frag->iov[0].iov_base = (IOVBASE_TYPE*)&frag->hdr; frag->iov[0].iov_len = sizeof(frag->hdr); frag->iov[1].iov_base = (IOVBASE_TYPE*) (frag->segments + 1); frag->iov[1].iov_len = sizeof(mca_btl_base_segment_t); for( i = 0; i < (int)frag->base.des_segment_count; i++ ) { frag->hdr.size += frag->segments[i].seg_len; frag->iov[i+2].iov_len = frag->segments[i].seg_len; frag->iov[i+2].iov_base = (IOVBASE_TYPE*)frag->segments[i].seg_addr.pval; frag->iov_cnt++; } frag->hdr.base.tag = MCA_BTL_TAG_BTL; frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_PUT; frag->hdr.count = 1; if (endpoint->endpoint_nbo) MCA_BTL_TCP_HDR_HTON(frag->hdr); return ((i = mca_btl_tcp_endpoint_send(endpoint,frag)) >= 0 ? OPAL_SUCCESS : i); }
int mca_btl_tcp_get (mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint, void *local_address, uint64_t remote_address, mca_btl_base_registration_handle_t *local_handle, mca_btl_base_registration_handle_t *remote_handle, size_t size, int flags, int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbcontext, void *cbdata) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl; mca_btl_tcp_frag_t* frag = NULL; int rc; MCA_BTL_TCP_FRAG_ALLOC_USER(frag); if( OPAL_UNLIKELY(NULL == frag) ) { return OPAL_ERR_OUT_OF_RESOURCE;; } frag->endpoint = endpoint; frag->segments->seg_len = size; frag->segments->seg_addr.pval = local_address; frag->base.des_segments = frag->segments; frag->base.des_segment_count = 1; frag->base.order = MCA_BTL_NO_ORDER; frag->segments[0].seg_addr.pval = local_address; frag->segments[0].seg_len = size; frag->segments[1].seg_addr.lval = remote_address; frag->segments[1].seg_len = size; /* call the rdma callback through the descriptor callback. this is * tcp so the extra latency is not an issue */ frag->base.des_flags = MCA_BTL_DES_FLAGS_BTL_OWNERSHIP | MCA_BTL_DES_SEND_ALWAYS_CALLBACK; frag->base.des_cbfunc = fake_rdma_complete; frag->cb.func = cbfunc; frag->cb.data = cbdata; frag->cb.context = cbcontext; frag->btl = tcp_btl; frag->endpoint = endpoint; frag->rc = 0; frag->iov_idx = 0; frag->hdr.size = 0; frag->iov_cnt = 2; frag->iov_ptr = frag->iov; frag->iov[0].iov_base = (IOVBASE_TYPE*)&frag->hdr; frag->iov[0].iov_len = sizeof(frag->hdr); frag->iov[1].iov_base = (IOVBASE_TYPE*) &frag->segments[1]; frag->iov[1].iov_len = sizeof(mca_btl_base_segment_t); frag->hdr.base.tag = MCA_BTL_TAG_BTL; frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_GET; frag->hdr.count = 1; if (endpoint->endpoint_nbo) MCA_BTL_TCP_HDR_HTON(frag->hdr); return ((rc = mca_btl_tcp_endpoint_send(endpoint,frag)) >= 0 ? OPAL_SUCCESS : rc); }