int main(int argc, char **argv) { struct sockaddr_in addr; struct rdma_cm_event *event = NULL; struct rdma_cm_id *listener = NULL; struct rdma_event_channel *ec = NULL; uint16_t port = 0; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; TEST_Z(ec = rdma_create_event_channel()); TEST_NZ(rdma_create_id(ec, &listener, NULL, RDMA_PS_TCP)); TEST_NZ(rdma_bind_addr(listener, (struct sockaddr *)&addr)); TEST_NZ(rdma_listen(listener, 10)); /* backlog=10 is arbitrary */ port = ntohs(rdma_get_src_port(listener)); printf("listening on port %d.\n", port); while (rdma_get_cm_event(ec, &event) == 0) { struct rdma_cm_event event_copy; memcpy(&event_copy, event, sizeof(*event)); rdma_ack_cm_event(event); if (on_event(&event_copy)) break; } rdma_destroy_id(listener); rdma_destroy_event_channel(ec); return 0; }
static int fi_ibv_rdm_cm_init(struct fi_ibv_rdm_cm* cm, const struct rdma_addrinfo* rai) { struct sockaddr_in* src_addr = (struct sockaddr_in*)rai->ai_src_addr; cm->ec = rdma_create_event_channel(); if (!cm->ec) { VERBS_INFO(FI_LOG_EP_CTRL, "Failed to create listener event channel: %s\n", strerror(errno)); return -FI_EOTHER; } if (fi_fd_nonblock(cm->ec->fd) != 0) { VERBS_INFO_ERRNO(FI_LOG_EP_CTRL, "fcntl", errno); return -FI_EOTHER; } if (rdma_create_id(cm->ec, &cm->listener, NULL, RDMA_PS_TCP)) { VERBS_INFO(FI_LOG_EP_CTRL, "Failed to create cm listener: %s\n", strerror(errno)); return -FI_EOTHER; } if (fi_ibv_rdm_find_ipoib_addr(src_addr, cm)) { VERBS_INFO(FI_LOG_EP_CTRL, "Failed to find correct IPoIB address\n"); return -FI_ENODEV; } cm->my_addr.sin_port = src_addr->sin_port; char my_ipoib_addr_str[INET6_ADDRSTRLEN]; inet_ntop(cm->my_addr.sin_family, &cm->my_addr.sin_addr.s_addr, my_ipoib_addr_str, INET_ADDRSTRLEN); VERBS_INFO(FI_LOG_EP_CTRL, "My IPoIB: %s\n", my_ipoib_addr_str); if (rdma_bind_addr(cm->listener, (struct sockaddr *)&cm->my_addr)) { VERBS_INFO(FI_LOG_EP_CTRL, "Failed to bind cm listener to my IPoIB addr %s: %s\n", my_ipoib_addr_str, strerror(errno)); return -FI_EOTHER; } if (!cm->my_addr.sin_port) { cm->my_addr.sin_port = rdma_get_src_port(cm->listener); } assert(cm->my_addr.sin_family == AF_INET); VERBS_INFO(FI_LOG_EP_CTRL, "My ep_addr: %s:%u\n", inet_ntoa(cm->my_addr.sin_addr), ntohs(cm->my_addr.sin_port)); return FI_SUCCESS; }
int fi_ibv_rdm_cm_bind_ep(struct fi_ibv_rdm_cm *cm, struct fi_ibv_rdm_ep *ep) { char my_ipoib_addr_str[INET6_ADDRSTRLEN]; assert(cm->ec && cm->listener); if (ep->info->src_addr) { memcpy(&ep->my_addr, ep->info->src_addr, sizeof(ep->my_addr)); inet_ntop(ep->my_addr.sin_family, &ep->my_addr.sin_addr.s_addr, my_ipoib_addr_str, INET_ADDRSTRLEN); } else { strcpy(my_ipoib_addr_str, "undefined"); } VERBS_INFO(FI_LOG_EP_CTRL, "My IPoIB: %s\n", my_ipoib_addr_str); if (!cm->is_bound) { errno = 0; if (rdma_bind_addr(cm->listener, (struct sockaddr *)&ep->my_addr)) { VERBS_INFO(FI_LOG_EP_CTRL, "Failed to bind cm listener to my IPoIB addr %s: %s\n", my_ipoib_addr_str, strerror(errno)); return -FI_EOTHER; } if (rdma_listen(cm->listener, 1024)) { VERBS_INFO(FI_LOG_EP_CTRL, "rdma_listen failed: %s\n", strerror(errno)); return -FI_EOTHER; } cm->is_bound = 1; } if (!ep->my_addr.sin_port) { ep->my_addr.sin_port = rdma_get_src_port(cm->listener); } assert(ep->my_addr.sin_family == AF_INET); VERBS_INFO(FI_LOG_EP_CTRL, "My ep_addr: %s:%u\n", inet_ntoa(ep->my_addr.sin_addr), ntohs(ep->my_addr.sin_port)); return FI_SUCCESS; }
int main(int argc, char **argv) { struct sockaddr_in addr; struct rdma_cm_event *event = NULL; struct rdma_cm_id *listener = NULL; struct rdma_event_channel *ec = NULL; uint16_t port = 0; if (argc != 2) usage(argv[0]); if (strcmp(argv[1], "write") == 0) set_mode(M_WRITE); else if (strcmp(argv[1], "read") == 0) set_mode(M_READ); else usage(argv[0]); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; TEST_Z(ec = rdma_create_event_channel()); TEST_NZ(rdma_create_id(ec, &listener, NULL, RDMA_PS_TCP)); TEST_NZ(rdma_bind_addr(listener, (struct sockaddr *)&addr)); TEST_NZ(rdma_listen(listener, 10)); /* backlog=10 is arbitrary */ port = ntohs(rdma_get_src_port(listener)); printf("listening on port %d.\n", port); while (1) { // pthread_t thread_id; // pthread_attr_t thread_attr; // simple_context_t *context = NULL; // struct rdma_cm_id *id = NULL; int rc =0; fprintf(stderr, "Waiting for cm_event... "); if ((rc = rdma_get_cm_event(ec, &event))){ fprintf(stderr, "get event failed : %d\n", rc); break; } fprintf(stderr, "\"%s\"\n", event_type_str(event->event)); switch (event->event){ case RDMA_CM_EVENT_CONNECT_REQUEST: accept_connection(event->id); break; case RDMA_CM_EVENT_ESTABLISHED: on_connect(event->id->context); // pthread_attr_init(&thread_attr); // pthread_create(&thread_id, // &thread_attr, // handle_server_cq, // (void *)(event->id->context)); break; case RDMA_CM_EVENT_DISCONNECTED: fprintf(stderr, "Disconnect from id : %p \n", event->id); // fprintf(stderr, "Disconnect from id : %p (total connections %d)\n", // event->id, connections); // context = (simple_context_t *)(event->id->context); // id = event->id; break; default: break; } rdma_ack_cm_event(event); // if (context){ // context->quit_cq_thread = 1; // pthread_join(thread_id, NULL); // rdma_destroy_id(id); // free_connection(context); // context = NULL; // } } rdma_destroy_id(listener); rdma_destroy_event_channel(ec); return 0; /* while (rdma_get_cm_event(ec, &event) == 0) { struct rdma_cm_event event_copy; memcpy(&event_copy, event, sizeof(*event)); rdma_ack_cm_event(event); if (on_event(&event_copy)) break; } rdma_destroy_id(listener); rdma_destroy_event_channel(ec); return 0; */ }