static int run_client(void) { struct rdma_addrinfo hints; int i, ret, ret2; printf("cmatose: starting client\n"); memset(&hints, 0, sizeof hints); hints.ai_port_space = RDMA_PS_TCP; ret = get_rdma_addr(src_addr, dst_addr, port, &hints, &test.rai); if (ret) { perror("cmatose: getaddrinfo error"); return ret; } printf("cmatose: connecting\n"); for (i = 0; i < connections; i++) { ret = rdma_resolve_addr(test.nodes[i].cma_id, test.rai->ai_src_addr, test.rai->ai_dst_addr, 2000); if (ret) { perror("cmatose: failure getting addr"); connect_error(); return ret; } } ret = connect_events(); if (ret) goto disc; if (message_count) { printf("receiving data transfers\n"); ret = poll_cqs(RECV_CQ_INDEX); if (ret) goto disc; printf("sending replies\n"); for (i = 0; i < connections; i++) { ret = post_sends(&test.nodes[i]); if (ret) goto disc; } printf("data transfers complete\n"); } ret = 0; if (migrate) { ret = migrate_channel(NULL); if (ret) goto out; } disc: ret2 = disconnect_events(); if (ret2) ret = ret2; out: return ret; }
static int run_server(void) { struct rdma_cm_id *listen_id; int i, ret; printf("cmatose: starting server\n"); ret = rdma_create_id(test.channel, &listen_id, &test, hints.ai_port_space); if (ret) { perror("cmatose: listen request failed"); return ret; } ret = get_rdma_addr(src_addr, dst_addr, port, &hints, &test.rai); if (ret) { printf("cmatose: getrdmaaddr error: %s\n", gai_strerror(ret)); goto out; } ret = rdma_bind_addr(listen_id, test.rai->ai_src_addr); if (ret) { perror("cmatose: bind address failed"); goto out; } ret = rdma_listen(listen_id, 0); if (ret) { perror("cmatose: failure trying to listen"); goto out; } ret = connect_events(); if (ret) goto out; if (message_count) { printf("initiating data transfers\n"); for (i = 0; i < connections; i++) { ret = post_sends(&test.nodes[i]); if (ret) goto out; } printf("completing sends\n"); ret = poll_cqs(SEND_CQ_INDEX); if (ret) goto out; printf("receiving data transfers\n"); ret = poll_cqs(RECV_CQ_INDEX); if (ret) goto out; printf("data transfers complete\n"); } if (migrate) { ret = migrate_channel(listen_id); if (ret) goto out; } printf("cmatose: disconnecting\n"); for (i = 0; i < connections; i++) { if (!test.nodes[i].connected) continue; test.nodes[i].connected = 0; rdma_disconnect(test.nodes[i].cma_id); } ret = disconnect_events(); printf("disconnected\n"); out: rdma_destroy_id(listen_id); return ret; }