static int addr_handler(struct cmatest_node *node) { int ret; if (set_tos) { ret = rdma_set_option(node->cma_id, RDMA_OPTION_ID, RDMA_OPTION_ID_TOS, &tos, sizeof tos); if (ret) perror("cmatose: set TOS option failed"); } ret = rdma_resolve_route(node->cma_id, 2000); if (ret) { perror("cmatose: resolve route failed"); connect_error(); } return ret; }
int rdma_client_connect(struct pingpong_context *ctx,struct perftest_parameters *user_param) { char *service; int temp,num_of_retry= NUM_OF_RETRIES; struct sockaddr_in sin; struct addrinfo *res; struct rdma_cm_event *event; struct rdma_conn_param conn_param; struct addrinfo hints; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (check_add_port(&service,user_param->port,user_param->servername,&hints,&res)) { fprintf(stderr, "Problem in resolving basic adress and port\n"); return FAILURE; } sin.sin_addr.s_addr = ((struct sockaddr_in*)res->ai_addr)->sin_addr.s_addr; sin.sin_family = PF_INET; sin.sin_port = htons((unsigned short)user_param->port); while (1) { if (num_of_retry == 0) { fprintf(stderr, "Received %d times ADDR_ERROR\n",NUM_OF_RETRIES); return FAILURE; } if (rdma_resolve_addr(ctx->cm_id, NULL,(struct sockaddr *)&sin,2000)) { fprintf(stderr, "rdma_resolve_addr failed\n"); return FAILURE; } if (rdma_get_cm_event(ctx->cm_channel,&event)) { fprintf(stderr, "rdma_get_cm_events failed\n"); return FAILURE; } if (event->event == RDMA_CM_EVENT_ADDR_ERROR) { num_of_retry--; rdma_ack_cm_event(event); continue; } if (event->event != RDMA_CM_EVENT_ADDR_RESOLVED) { fprintf(stderr, "unexpected CM event %d\n",event->event); rdma_ack_cm_event(event); return FAILURE; } rdma_ack_cm_event(event); break; } if (user_param->tos != DEF_TOS) { if (rdma_set_option(ctx->cm_id,RDMA_OPTION_ID,RDMA_OPTION_ID_TOS,&user_param->tos,sizeof(uint8_t))) { fprintf(stderr, " Set TOS option failed: %d\n",event->event); return FAILURE; } } while (1) { if (num_of_retry <= 0) { fprintf(stderr, "Received %d times ADDR_ERROR - aborting\n",NUM_OF_RETRIES); return FAILURE; } if (rdma_resolve_route(ctx->cm_id,2000)) { fprintf(stderr, "rdma_resolve_route failed\n"); return FAILURE; } if (rdma_get_cm_event(ctx->cm_channel,&event)) { fprintf(stderr, "rdma_get_cm_events failed\n"); return FAILURE; } if (event->event == RDMA_CM_EVENT_ROUTE_ERROR) { num_of_retry--; rdma_ack_cm_event(event); continue; } if (event->event != RDMA_CM_EVENT_ROUTE_RESOLVED) { fprintf(stderr, "unexpected CM event %d\n",event->event); rdma_ack_cm_event(event); return FAILURE; } rdma_ack_cm_event(event); break; } ctx->context = ctx->cm_id->verbs; temp = user_param->work_rdma_cm; user_param->work_rdma_cm = ON; if (ctx_init(ctx,user_param)) { fprintf(stderr," Unable to create the resources needed by comm struct\n"); return FAILURE; } memset(&conn_param, 0, sizeof conn_param); if (user_param->verb == READ || user_param->verb == ATOMIC) { conn_param.responder_resources = user_param->out_reads; conn_param.initiator_depth = user_param->out_reads; } user_param->work_rdma_cm = temp; conn_param.retry_count = user_param->retry_count; conn_param.rnr_retry_count = 7; if (user_param->work_rdma_cm == OFF) { if (post_one_recv_wqe(ctx)) { fprintf(stderr, "Couldn't post send \n"); return 1; } } if (rdma_connect(ctx->cm_id,&conn_param)) { fprintf(stderr, "Function rdma_connect failed\n"); return FAILURE; } if (rdma_get_cm_event(ctx->cm_channel,&event)) { fprintf(stderr, "rdma_get_cm_events failed\n"); return FAILURE; } if (event->event != RDMA_CM_EVENT_ESTABLISHED) { rdma_ack_cm_event(event); fprintf(stderr, "Unexpected CM event bl blka %d\n", event->event); return FAILURE; } if (user_param->connection_type == UD) { user_param->rem_ud_qpn = event->param.ud.qp_num; user_param->rem_ud_qkey = event->param.ud.qkey; ctx->ah[0] = ibv_create_ah(ctx->pd,&event->param.ud.ah_attr); if (!ctx->ah) { printf(" Unable to create address handler for UD QP\n"); return FAILURE; } if (user_param->tst == LAT || (user_param->tst == BW && user_param->duplex)) { if (send_qp_num_for_ah(ctx,user_param)) { printf(" Unable to send my QP number\n"); return FAILURE; } } } rdma_ack_cm_event(event); return SUCCESS; }