32
32
* SOFTWARE.
33
33
*/
34
34
35
- /* g++ -I./install/include -L./install/lib -L../dpcp/install/lib -o test xlio_socket_api.c -lxlio -lm -lnl-3 -ldpcp -libverbs -lmlx5 -lrdmacm -lnl-route-3 -g3 */
36
- /* LD_LIBRARY_PATH=./install/lib:../dpcp/install/lib ./test */
37
- /* Use `nc -l 8080` on the remote side */
35
+ /* Build:
36
+ * gcc -o xlio_socket_api xlio_socket_api.c -lxlio -libverbs -g3
37
+ * Remote/server side:
38
+ * nc -l 8080
39
+ * Local/client side:
40
+ * sudo ./xlio_socket_api <server_ip_addr>
41
+ */
38
42
39
43
#include <assert.h>
40
44
#include <stdbool.h>
41
45
#include <stdio.h>
42
46
#include <stdlib.h>
43
- #include <string.h>
44
- #include <sys/socket.h>
45
- #include <netinet/in.h>
46
47
#include <arpa/inet.h>
47
48
48
- #include <mellanox/xlio.h>
49
49
#include <infiniband/verbs.h>
50
+ #include <mellanox/xlio.h>
51
+ #include <mellanox/xlio_extra.h>
50
52
51
53
#define TEST_USERDATA_MAGIC 0xfeedbeef
52
54
#define FAKE_PORT 65535
@@ -58,6 +60,16 @@ static int g_comp_events = 0;
58
60
static char sndbuf [256 ];
59
61
static struct ibv_mr * mr_buf ;
60
62
63
+ static struct xlio_api_t * xlio_api = NULL ;
64
+ void __attribute__((constructor )) init_xlio_api (void )
65
+ {
66
+ xlio_api = xlio_get_api ();
67
+ if (xlio_api == NULL ) {
68
+ printf ("Extra API not found\n" );
69
+ exit (-1 );
70
+ }
71
+ }
72
+
61
73
static void memory_cb (void * data , size_t size , size_t page_size )
62
74
{
63
75
printf ("Memory area allocated data=%p size=%zu page_size=%zu\n" , data , size , page_size );
@@ -72,9 +84,9 @@ static void send_single_msg(xlio_socket_t sock, const void *data, size_t len, ui
72
84
.userdata_op = userdata_op ,
73
85
};
74
86
memcpy (sndbuf , data , len );
75
- int ret = xlio_socket_send (sock , sndbuf , len , & attr );
87
+ int ret = xlio_api -> xlio_socket_send (sock , sndbuf , len , & attr );
76
88
assert (ret == 0 );
77
- xlio_socket_flush (sock );
89
+ xlio_api -> xlio_socket_flush (sock );
78
90
}
79
91
80
92
static void send_inline_msg (xlio_socket_t sock , const void * data , size_t len , uintptr_t userdata_op ,
@@ -85,9 +97,9 @@ static void send_inline_msg(xlio_socket_t sock, const void *data, size_t len, ui
85
97
.mkey = 0 ,
86
98
.userdata_op = userdata_op ,
87
99
};
88
- int ret = xlio_socket_send (sock , data , len , & attr );
100
+ int ret = xlio_api -> xlio_socket_send (sock , data , len , & attr );
89
101
assert (ret == 0 );
90
- xlio_socket_flush (sock );
102
+ xlio_api -> xlio_socket_flush (sock );
91
103
}
92
104
93
105
static void socket_event_cb (xlio_socket_t sock , uintptr_t userdata_sq , int event , int value )
@@ -143,7 +155,7 @@ static void socket_rx_cb(xlio_socket_t sock, uintptr_t userdata_sq, void *data,
143
155
free (msg );
144
156
145
157
send_single_msg (sock , data , len , 0xdeadbeef , 0 );
146
- xlio_socket_buf_free (sock , buf );
158
+ xlio_api -> xlio_socket_buf_free (sock , buf );
147
159
}
148
160
149
161
static void test_event_cb (xlio_socket_t sock , uintptr_t userdata_sq , int event , int value )
@@ -172,7 +184,7 @@ static void test_rx_cb(xlio_socket_t sock, uintptr_t userdata_sq, void *data, si
172
184
(void )data ;
173
185
(void )len ;
174
186
assert (userdata_sq = TEST_USERDATA_MAGIC );
175
- xlio_socket_buf_free (sock , buf );
187
+ xlio_api -> xlio_socket_buf_free (sock , buf );
176
188
}
177
189
178
190
static void test_multi_groups (const char * ip )
@@ -192,13 +204,13 @@ static void test_multi_groups(const char *ip)
192
204
.socket_rx_cb = & test_rx_cb ,
193
205
};
194
206
195
- rc = xlio_poll_group_create (& gattr , & group1 );
207
+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group1 );
196
208
assert (rc == 0 );
197
- rc = xlio_poll_group_create (& gattr , & group2 );
209
+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group2 );
198
210
assert (rc == 0 );
199
211
200
212
gattr .flags = XLIO_GROUP_FLAG_SAFE ;
201
- rc = xlio_poll_group_create (& gattr , & group3 );
213
+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group3 );
202
214
assert (rc == 0 );
203
215
204
216
struct xlio_socket_attr sattr = {
@@ -207,15 +219,15 @@ static void test_multi_groups(const char *ip)
207
219
};
208
220
209
221
sattr .group = group1 ;
210
- rc = xlio_socket_create (& sattr , & sock1_1 );
222
+ rc = xlio_api -> xlio_socket_create (& sattr , & sock1_1 );
211
223
assert (rc == 0 );
212
- rc = xlio_socket_create (& sattr , & sock1_2 );
224
+ rc = xlio_api -> xlio_socket_create (& sattr , & sock1_2 );
213
225
assert (rc == 0 );
214
226
sattr .group = group2 ;
215
- rc = xlio_socket_create (& sattr , & sock2 );
227
+ rc = xlio_api -> xlio_socket_create (& sattr , & sock2 );
216
228
assert (rc == 0 );
217
229
sattr .group = group3 ;
218
- rc = xlio_socket_create (& sattr , & sock3 );
230
+ rc = xlio_api -> xlio_socket_create (& sattr , & sock3 );
219
231
assert (rc == 0 );
220
232
221
233
struct sockaddr_in addr = {};
@@ -226,40 +238,40 @@ static void test_multi_groups(const char *ip)
226
238
227
239
g_test_events = 0 ;
228
240
/* Connect will fail, we need it to allocate rings for the checks below. */
229
- rc = xlio_socket_connect (sock1_1 , (struct sockaddr * )& addr , sizeof (addr ));
241
+ rc = xlio_api -> xlio_socket_connect (sock1_1 , (struct sockaddr * )& addr , sizeof (addr ));
230
242
assert (rc == 0 );
231
- rc = xlio_socket_connect (sock1_2 , (struct sockaddr * )& addr , sizeof (addr ));
243
+ rc = xlio_api -> xlio_socket_connect (sock1_2 , (struct sockaddr * )& addr , sizeof (addr ));
232
244
assert (rc == 0 );
233
- rc = xlio_socket_connect (sock2 , (struct sockaddr * )& addr , sizeof (addr ));
245
+ rc = xlio_api -> xlio_socket_connect (sock2 , (struct sockaddr * )& addr , sizeof (addr ));
234
246
assert (rc == 0 );
235
- rc = xlio_socket_connect (sock3 , (struct sockaddr * )& addr , sizeof (addr ));
247
+ rc = xlio_api -> xlio_socket_connect (sock3 , (struct sockaddr * )& addr , sizeof (addr ));
236
248
assert (rc == 0 );
237
249
238
250
/* TODO There is no API to check expected internal ring distribution. */
239
251
240
252
/* Wait for ERROR events (ECONREFUSED). */
241
253
while (g_test_events < 4 ) {
242
- xlio_poll_group_poll (group1 );
243
- xlio_poll_group_poll (group2 );
244
- xlio_poll_group_poll (group3 );
254
+ xlio_api -> xlio_poll_group_poll (group1 );
255
+ xlio_api -> xlio_poll_group_poll (group2 );
256
+ xlio_api -> xlio_poll_group_poll (group3 );
245
257
}
246
258
247
259
g_test_events = 0 ;
248
- xlio_socket_destroy (sock1_1 );
249
- xlio_socket_destroy (sock1_2 );
250
- xlio_socket_destroy (sock2 );
251
- xlio_socket_destroy (sock3 );
260
+ xlio_api -> xlio_socket_destroy (sock1_1 );
261
+ xlio_api -> xlio_socket_destroy (sock1_2 );
262
+ xlio_api -> xlio_socket_destroy (sock2 );
263
+ xlio_api -> xlio_socket_destroy (sock3 );
252
264
253
265
/* Wait for TERMINATED events. */
254
266
while (g_test_events < 4 ) {
255
- xlio_poll_group_poll (group1 );
256
- xlio_poll_group_poll (group2 );
257
- xlio_poll_group_poll (group3 );
267
+ xlio_api -> xlio_poll_group_poll (group1 );
268
+ xlio_api -> xlio_poll_group_poll (group2 );
269
+ xlio_api -> xlio_poll_group_poll (group3 );
258
270
}
259
271
260
- xlio_poll_group_destroy (group1 );
261
- xlio_poll_group_destroy (group2 );
262
- xlio_poll_group_destroy (group3 );
272
+ xlio_api -> xlio_poll_group_destroy (group1 );
273
+ xlio_api -> xlio_poll_group_destroy (group2 );
274
+ xlio_api -> xlio_poll_group_destroy (group3 );
263
275
264
276
printf ("Multi group test done.\n" );
265
277
}
@@ -288,12 +300,12 @@ int main(int argc, char **argv)
288
300
return 1 ;
289
301
}
290
302
291
- rc = xlio_init_ex (& iattr );
303
+ rc = xlio_api -> xlio_init_ex (& iattr );
292
304
assert (rc == 0 );
293
305
294
306
test_multi_groups (argv [1 ]);
295
307
296
- rc = xlio_poll_group_create (& gattr , & group );
308
+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group );
297
309
assert (rc == 0 );
298
310
299
311
printf ("Group created.\n" );
@@ -304,7 +316,7 @@ int main(int argc, char **argv)
304
316
.userdata_sq = 0xdeadc0de ,
305
317
};
306
318
307
- rc = xlio_socket_create (& sattr , & sock );
319
+ rc = xlio_api -> xlio_socket_create (& sattr , & sock );
308
320
assert (rc == 0 );
309
321
310
322
printf ("Socket created, connecting to %s:8080.\n" , argv [1 ]);
@@ -315,30 +327,30 @@ int main(int argc, char **argv)
315
327
rc = inet_aton (argv [1 ], & addr .sin_addr );
316
328
assert (rc != 0 );
317
329
318
- rc = xlio_socket_connect (sock , (struct sockaddr * )& addr , sizeof (addr ));
330
+ rc = xlio_api -> xlio_socket_connect (sock , (struct sockaddr * )& addr , sizeof (addr ));
319
331
assert (rc == 0 );
320
332
321
- struct ibv_pd * pd = xlio_socket_get_pd (sock );
333
+ struct ibv_pd * pd = xlio_api -> xlio_socket_get_pd (sock );
322
334
assert (pd != NULL );
323
335
mr_buf = ibv_reg_mr (pd , sndbuf , sizeof (sndbuf ), IBV_ACCESS_LOCAL_WRITE );
324
336
assert (mr_buf != NULL );
325
337
326
338
printf ("Starting polling loop.\n" );
327
339
328
340
while (!quit ) {
329
- xlio_poll_group_poll (group );
341
+ xlio_api -> xlio_poll_group_poll (group );
330
342
}
331
343
332
344
printf ("Quiting...\n" );
333
345
334
- rc = xlio_socket_destroy (sock );
346
+ rc = xlio_api -> xlio_socket_destroy (sock );
335
347
assert (rc == 0 );
336
348
337
349
while (!terminated ) {
338
- xlio_poll_group_poll (group );
350
+ xlio_api -> xlio_poll_group_poll (group );
339
351
}
340
352
341
- rc = xlio_poll_group_destroy (group );
353
+ rc = xlio_api -> xlio_poll_group_destroy (group );
342
354
assert (rc == 0 );
343
355
344
356
printf ("Zerocopy completion events: %d\n" , g_comp_events );
0 commit comments