static char *dst_addr;
static char *src_addr;
static int timeout = 2000;
+static int retries = 2;
enum step {
STEP_CREATE_ID,
struct rdma_cm_id *id;
struct timeval times[STEP_CNT][2];
int error;
+ int retries;
};
static struct node *nodes;
conn_handler(n);
break;
case RDMA_CM_EVENT_ADDR_ERROR:
+ if (n->retries--) {
+ ret = rdma_resolve_addr(n->id, rai->ai_src_addr,
+ rai->ai_dst_addr, timeout);
+ if (!ret)
+ break;
+ }
printf("RDMA_CM_EVENT_ADDR_ERROR, error: %d\n", event->status);
addr_handler(n);
n->error = 1;
break;
case RDMA_CM_EVENT_ROUTE_ERROR:
+ if (n->retries--) {
+ ret = rdma_resolve_route(n->id, timeout);
+ if (!ret)
+ break;
+ }
printf("RDMA_CM_EVENT_ROUTE_ERROR, error: %d\n", event->status);
route_handler(n);
n->error = 1;
for (i = 0; i < connections; i++) {
if (nodes[i].error)
continue;
+ nodes[i].retries = retries;
start_perf(&nodes[i], STEP_RESOLVE_ADDR);
ret = rdma_resolve_addr(nodes[i].id, rai->ai_src_addr,
rai->ai_dst_addr, timeout);
for (i = 0; i < connections; i++) {
if (nodes[i].error)
continue;
+ nodes[i].retries = retries;
start_perf(&nodes[i], STEP_RESOLVE_ROUTE);
ret = rdma_resolve_route(nodes[i].id, timeout);
if (ret) {
hints.ai_port_space = RDMA_PS_TCP;
hints.ai_qp_type = IBV_QPT_RC;
- while ((op = getopt(argc, argv, "s:b:c:p:t:")) != -1) {
+ while ((op = getopt(argc, argv, "s:b:c:p:r:t:")) != -1) {
switch (op) {
case 's':
dst_addr = optarg;
case 'p':
port = optarg;
break;
+ case 'r':
+ retries = atoi(optarg);
+ break;
case 't':
timeout = atoi(optarg);
break;