| 1398 | } |
| 1399 | |
| 1400 | static int krping_bind_server(struct krping_cb *cb) |
| 1401 | { |
| 1402 | struct sockaddr_storage sin; |
| 1403 | int ret; |
| 1404 | |
| 1405 | |
| 1406 | fill_sockaddr(&sin, cb); |
| 1407 | |
| 1408 | ret = rdma_bind_addr(cb->cm_id, (struct sockaddr *)&sin); |
| 1409 | if (ret) { |
| 1410 | printk(KERN_ERR PFX "rdma_bind_addr error %d\n", ret); |
| 1411 | return ret; |
| 1412 | } |
| 1413 | DEBUG_LOG("rdma_bind_addr successful\n"); |
| 1414 | |
| 1415 | DEBUG_LOG("rdma_listen\n"); |
| 1416 | ret = rdma_listen(cb->cm_id, 3); |
| 1417 | if (ret) { |
| 1418 | printk(KERN_ERR PFX "rdma_listen failed: %d\n", ret); |
| 1419 | return ret; |
| 1420 | } |
| 1421 | |
| 1422 | wait_event_interruptible(cb->sem, cb->state >= CONNECT_REQUEST); |
| 1423 | if (cb->state != CONNECT_REQUEST) { |
| 1424 | printk(KERN_ERR PFX "wait for CONNECT_REQUEST state %d\n", |
| 1425 | cb->state); |
| 1426 | return -1; |
| 1427 | } |
| 1428 | |
| 1429 | if (!reg_supported(cb->child_cm_id->device)) |
| 1430 | return -EINVAL; |
| 1431 | |
| 1432 | return 0; |
| 1433 | } |
| 1434 | |
| 1435 | static void krping_run_server(struct krping_cb *cb) |
| 1436 | { |
no test coverage detected