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