1d6b92ffaSHans Petter Selasky /*
2d6b92ffaSHans Petter Selasky  * Copyright (c) 2005-2009 Intel Corporation.  All rights reserved.
3d6b92ffaSHans Petter Selasky  *
4d6b92ffaSHans Petter Selasky  * This software is available to you under the OpenIB.org BSD license
5d6b92ffaSHans Petter Selasky  * below:
6d6b92ffaSHans Petter Selasky  *
7d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
8d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
9d6b92ffaSHans Petter Selasky  *     conditions are met:
10d6b92ffaSHans Petter Selasky  *
11d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
12d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
13d6b92ffaSHans Petter Selasky  *        disclaimer.
14d6b92ffaSHans Petter Selasky  *
15d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
16d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
17d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
18d6b92ffaSHans Petter Selasky  *        provided with the distribution.
19d6b92ffaSHans Petter Selasky  *
20d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
23d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
24d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
25d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27d6b92ffaSHans Petter Selasky  * SOFTWARE.
28d6b92ffaSHans Petter Selasky  */
29d6b92ffaSHans Petter Selasky 
30d6b92ffaSHans Petter Selasky #include <stdio.h>
31d6b92ffaSHans Petter Selasky #include <stdlib.h>
32d6b92ffaSHans Petter Selasky #include <string.h>
33d6b92ffaSHans Petter Selasky #include <errno.h>
34d6b92ffaSHans Petter Selasky #include <getopt.h>
35d6b92ffaSHans Petter Selasky #include <netdb.h>
36d6b92ffaSHans Petter Selasky #include <rdma/rdma_cma.h>
37d6b92ffaSHans Petter Selasky #include <rdma/rdma_verbs.h>
38d6b92ffaSHans Petter Selasky 
39d6b92ffaSHans Petter Selasky static const char *port = "7471";
40d6b92ffaSHans Petter Selasky 
41d6b92ffaSHans Petter Selasky static struct rdma_cm_id *listen_id, *id;
42d6b92ffaSHans Petter Selasky static struct ibv_mr *mr, *send_mr;
43d6b92ffaSHans Petter Selasky static int send_flags;
44d6b92ffaSHans Petter Selasky static uint8_t send_msg[16];
45d6b92ffaSHans Petter Selasky static uint8_t recv_msg[16];
46d6b92ffaSHans Petter Selasky 
run(void)47d6b92ffaSHans Petter Selasky static int run(void)
48d6b92ffaSHans Petter Selasky {
49d6b92ffaSHans Petter Selasky 	struct rdma_addrinfo hints, *res;
50d6b92ffaSHans Petter Selasky 	struct ibv_qp_init_attr init_attr;
51d6b92ffaSHans Petter Selasky 	struct ibv_qp_attr qp_attr;
52d6b92ffaSHans Petter Selasky 	struct ibv_wc wc;
53d6b92ffaSHans Petter Selasky 	int ret;
54d6b92ffaSHans Petter Selasky 
55d6b92ffaSHans Petter Selasky 	memset(&hints, 0, sizeof hints);
56d6b92ffaSHans Petter Selasky 	hints.ai_flags = RAI_PASSIVE;
57d6b92ffaSHans Petter Selasky 	hints.ai_port_space = RDMA_PS_TCP;
58d6b92ffaSHans Petter Selasky 	ret = rdma_getaddrinfo(NULL, port, &hints, &res);
59d6b92ffaSHans Petter Selasky 	if (ret) {
60d6b92ffaSHans Petter Selasky 		printf("rdma_getaddrinfo: %s\n", gai_strerror(ret));
61d6b92ffaSHans Petter Selasky 		return ret;
62d6b92ffaSHans Petter Selasky 	}
63d6b92ffaSHans Petter Selasky 
64d6b92ffaSHans Petter Selasky 	memset(&init_attr, 0, sizeof init_attr);
65d6b92ffaSHans Petter Selasky 	init_attr.cap.max_send_wr = init_attr.cap.max_recv_wr = 1;
66d6b92ffaSHans Petter Selasky 	init_attr.cap.max_send_sge = init_attr.cap.max_recv_sge = 1;
67d6b92ffaSHans Petter Selasky 	init_attr.cap.max_inline_data = 16;
68d6b92ffaSHans Petter Selasky 	init_attr.sq_sig_all = 1;
69d6b92ffaSHans Petter Selasky 	ret = rdma_create_ep(&listen_id, res, NULL, &init_attr);
70d6b92ffaSHans Petter Selasky 	if (ret) {
71d6b92ffaSHans Petter Selasky 		perror("rdma_create_ep");
72d6b92ffaSHans Petter Selasky 		goto out_free_addrinfo;
73d6b92ffaSHans Petter Selasky 	}
74d6b92ffaSHans Petter Selasky 
75d6b92ffaSHans Petter Selasky 	ret = rdma_listen(listen_id, 0);
76d6b92ffaSHans Petter Selasky 	if (ret) {
77d6b92ffaSHans Petter Selasky 		perror("rdma_listen");
78d6b92ffaSHans Petter Selasky 		goto out_destroy_listen_ep;
79d6b92ffaSHans Petter Selasky 	}
80d6b92ffaSHans Petter Selasky 
81d6b92ffaSHans Petter Selasky 	ret = rdma_get_request(listen_id, &id);
82d6b92ffaSHans Petter Selasky 	if (ret) {
83d6b92ffaSHans Petter Selasky 		perror("rdma_get_request");
84d6b92ffaSHans Petter Selasky 		goto out_destroy_listen_ep;
85d6b92ffaSHans Petter Selasky 	}
86d6b92ffaSHans Petter Selasky 
87d6b92ffaSHans Petter Selasky 	memset(&qp_attr, 0, sizeof qp_attr);
88d6b92ffaSHans Petter Selasky 	memset(&init_attr, 0, sizeof init_attr);
89d6b92ffaSHans Petter Selasky 	ret = ibv_query_qp(id->qp, &qp_attr, IBV_QP_CAP,
90d6b92ffaSHans Petter Selasky 			   &init_attr);
91d6b92ffaSHans Petter Selasky 	if (ret) {
92d6b92ffaSHans Petter Selasky 		perror("ibv_query_qp");
93d6b92ffaSHans Petter Selasky 		goto out_destroy_accept_ep;
94d6b92ffaSHans Petter Selasky 	}
95d6b92ffaSHans Petter Selasky 	if (init_attr.cap.max_inline_data >= 16)
96d6b92ffaSHans Petter Selasky 		send_flags = IBV_SEND_INLINE;
97d6b92ffaSHans Petter Selasky 	else
98d6b92ffaSHans Petter Selasky 		printf("rdma_server: device doesn't support IBV_SEND_INLINE, "
99d6b92ffaSHans Petter Selasky 		       "using sge sends\n");
100d6b92ffaSHans Petter Selasky 
101d6b92ffaSHans Petter Selasky 	mr = rdma_reg_msgs(id, recv_msg, 16);
102d6b92ffaSHans Petter Selasky 	if (!mr) {
103d6b92ffaSHans Petter Selasky 		ret = -1;
104d6b92ffaSHans Petter Selasky 		perror("rdma_reg_msgs for recv_msg");
105d6b92ffaSHans Petter Selasky 		goto out_destroy_accept_ep;
106d6b92ffaSHans Petter Selasky 	}
107d6b92ffaSHans Petter Selasky 	if ((send_flags & IBV_SEND_INLINE) == 0) {
108d6b92ffaSHans Petter Selasky 		send_mr = rdma_reg_msgs(id, send_msg, 16);
109d6b92ffaSHans Petter Selasky 		if (!send_mr) {
110d6b92ffaSHans Petter Selasky 			ret = -1;
111d6b92ffaSHans Petter Selasky 			perror("rdma_reg_msgs for send_msg");
112d6b92ffaSHans Petter Selasky 			goto out_dereg_recv;
113d6b92ffaSHans Petter Selasky 		}
114d6b92ffaSHans Petter Selasky 	}
115d6b92ffaSHans Petter Selasky 
116d6b92ffaSHans Petter Selasky 	ret = rdma_post_recv(id, NULL, recv_msg, 16, mr);
117d6b92ffaSHans Petter Selasky 	if (ret) {
118d6b92ffaSHans Petter Selasky 		perror("rdma_post_recv");
119d6b92ffaSHans Petter Selasky 		goto out_dereg_send;
120d6b92ffaSHans Petter Selasky 	}
121d6b92ffaSHans Petter Selasky 
122d6b92ffaSHans Petter Selasky 	ret = rdma_accept(id, NULL);
123d6b92ffaSHans Petter Selasky 	if (ret) {
124d6b92ffaSHans Petter Selasky 		perror("rdma_accept");
125d6b92ffaSHans Petter Selasky 		goto out_dereg_send;
126d6b92ffaSHans Petter Selasky 	}
127d6b92ffaSHans Petter Selasky 
128d6b92ffaSHans Petter Selasky 	while ((ret = rdma_get_recv_comp(id, &wc)) == 0);
129d6b92ffaSHans Petter Selasky 	if (ret < 0) {
130d6b92ffaSHans Petter Selasky 		perror("rdma_get_recv_comp");
131d6b92ffaSHans Petter Selasky 		goto out_disconnect;
132d6b92ffaSHans Petter Selasky 	}
133d6b92ffaSHans Petter Selasky 
134d6b92ffaSHans Petter Selasky 	ret = rdma_post_send(id, NULL, send_msg, 16, send_mr, send_flags);
135d6b92ffaSHans Petter Selasky 	if (ret) {
136d6b92ffaSHans Petter Selasky 		perror("rdma_post_send");
137d6b92ffaSHans Petter Selasky 		goto out_disconnect;
138d6b92ffaSHans Petter Selasky 	}
139d6b92ffaSHans Petter Selasky 
140d6b92ffaSHans Petter Selasky 	while ((ret = rdma_get_send_comp(id, &wc)) == 0);
141d6b92ffaSHans Petter Selasky 	if (ret < 0)
142d6b92ffaSHans Petter Selasky 		perror("rdma_get_send_comp");
143d6b92ffaSHans Petter Selasky 	else
144d6b92ffaSHans Petter Selasky 		ret = 0;
145d6b92ffaSHans Petter Selasky 
146d6b92ffaSHans Petter Selasky out_disconnect:
147d6b92ffaSHans Petter Selasky 	rdma_disconnect(id);
148d6b92ffaSHans Petter Selasky out_dereg_send:
149d6b92ffaSHans Petter Selasky 	if ((send_flags & IBV_SEND_INLINE) == 0)
150d6b92ffaSHans Petter Selasky 		rdma_dereg_mr(send_mr);
151d6b92ffaSHans Petter Selasky out_dereg_recv:
152d6b92ffaSHans Petter Selasky 	rdma_dereg_mr(mr);
153d6b92ffaSHans Petter Selasky out_destroy_accept_ep:
154d6b92ffaSHans Petter Selasky 	rdma_destroy_ep(id);
155d6b92ffaSHans Petter Selasky out_destroy_listen_ep:
156d6b92ffaSHans Petter Selasky 	rdma_destroy_ep(listen_id);
157d6b92ffaSHans Petter Selasky out_free_addrinfo:
158d6b92ffaSHans Petter Selasky 	rdma_freeaddrinfo(res);
159d6b92ffaSHans Petter Selasky 	return ret;
160d6b92ffaSHans Petter Selasky }
161d6b92ffaSHans Petter Selasky 
main(int argc,char ** argv)162d6b92ffaSHans Petter Selasky int main(int argc, char **argv)
163d6b92ffaSHans Petter Selasky {
164d6b92ffaSHans Petter Selasky 	int op, ret;
165d6b92ffaSHans Petter Selasky 
166d6b92ffaSHans Petter Selasky 	while ((op = getopt(argc, argv, "p:")) != -1) {
167d6b92ffaSHans Petter Selasky 		switch (op) {
168d6b92ffaSHans Petter Selasky 		case 'p':
169d6b92ffaSHans Petter Selasky 			port = optarg;
170d6b92ffaSHans Petter Selasky 			break;
171d6b92ffaSHans Petter Selasky 		default:
172d6b92ffaSHans Petter Selasky 			printf("usage: %s\n", argv[0]);
173d6b92ffaSHans Petter Selasky 			printf("\t[-p port_number]\n");
174d6b92ffaSHans Petter Selasky 			exit(1);
175d6b92ffaSHans Petter Selasky 		}
176d6b92ffaSHans Petter Selasky 	}
177d6b92ffaSHans Petter Selasky 
178d6b92ffaSHans Petter Selasky 	printf("rdma_server: start\n");
179d6b92ffaSHans Petter Selasky 	ret = run();
180d6b92ffaSHans Petter Selasky 	printf("rdma_server: end %d\n", ret);
181d6b92ffaSHans Petter Selasky 	return ret;
182d6b92ffaSHans Petter Selasky }
183