int mca_btl_tcp_send( struct mca_btl_base_module_t* btl, struct mca_btl_base_endpoint_t* endpoint, struct mca_btl_base_descriptor_t* descriptor, mca_btl_base_tag_t tag ) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl; mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor; int i; frag->btl = tcp_btl; frag->endpoint = endpoint; frag->rc = 0; frag->iov_idx = 0; frag->iov_cnt = 1; frag->iov_ptr = frag->iov; frag->iov[0].iov_base = (IOVBASE_TYPE*)&frag->hdr; frag->iov[0].iov_len = sizeof(frag->hdr); frag->hdr.size = 0; for( i = 0; i < (int)frag->base.des_segment_count; i++) { frag->hdr.size += frag->segments[i].seg_len; frag->iov[i+1].iov_len = frag->segments[i].seg_len; frag->iov[i+1].iov_base = (IOVBASE_TYPE*)frag->segments[i].seg_addr.pval; frag->iov_cnt++; } frag->hdr.base.tag = tag; frag->hdr.type = MCA_BTL_TCP_HDR_TYPE_SEND; frag->hdr.count = 0; if (endpoint->endpoint_nbo) MCA_BTL_TCP_HDR_HTON(frag->hdr); return mca_btl_tcp_endpoint_send(endpoint,frag); }
int mca_btl_tcp_put( mca_btl_base_module_t* btl, mca_btl_base_endpoint_t* endpoint, mca_btl_base_descriptor_t* descriptor ) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl; mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor; int i; 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->base.des_remote; frag->iov[1].iov_len = frag->base.des_remote_count * sizeof(mca_btl_base_segment_t); for( i = 0; i < (int)frag->base.des_local_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 = frag->base.des_remote_count; 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, mca_btl_base_endpoint_t* endpoint, mca_btl_base_descriptor_t* descriptor) { mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*) btl; mca_btl_tcp_frag_t* frag = (mca_btl_tcp_frag_t*)descriptor; int rc; 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->base.des_remote; frag->iov[1].iov_len = frag->base.des_remote_count * 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 = frag->base.des_remote_count; if (endpoint->endpoint_nbo) MCA_BTL_TCP_HDR_HTON(frag->hdr); return ((rc = mca_btl_tcp_endpoint_send(endpoint,frag)) >= 0 ? OPAL_SUCCESS : rc); }
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); }