3232 * SOFTWARE.
3333 */
3434
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+ */
3842
3943#include <assert.h>
4044#include <stdbool.h>
4145#include <stdio.h>
4246#include <stdlib.h>
43- #include <string.h>
44- #include <sys/socket.h>
45- #include <netinet/in.h>
4647#include <arpa/inet.h>
4748
48- #include <mellanox/xlio.h>
4949#include <infiniband/verbs.h>
50+ #include <mellanox/xlio.h>
51+ #include <mellanox/xlio_extra.h>
5052
5153#define TEST_USERDATA_MAGIC 0xfeedbeef
5254#define FAKE_PORT 65535
@@ -58,6 +60,16 @@ static int g_comp_events = 0;
5860static char sndbuf [256 ];
5961static struct ibv_mr * mr_buf ;
6062
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+
6173static void memory_cb (void * data , size_t size , size_t page_size )
6274{
6375 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
7284 .userdata_op = userdata_op ,
7385 };
7486 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 );
7688 assert (ret == 0 );
77- xlio_socket_flush (sock );
89+ xlio_api -> xlio_socket_flush (sock );
7890}
7991
8092static 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
8597 .mkey = 0 ,
8698 .userdata_op = userdata_op ,
8799 };
88- int ret = xlio_socket_send (sock , data , len , & attr );
100+ int ret = xlio_api -> xlio_socket_send (sock , data , len , & attr );
89101 assert (ret == 0 );
90- xlio_socket_flush (sock );
102+ xlio_api -> xlio_socket_flush (sock );
91103}
92104
93105static 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,
143155 free (msg );
144156
145157 send_single_msg (sock , data , len , 0xdeadbeef , 0 );
146- xlio_socket_buf_free (sock , buf );
158+ xlio_api -> xlio_socket_buf_free (sock , buf );
147159}
148160
149161static 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
172184 (void )data ;
173185 (void )len ;
174186 assert (userdata_sq = TEST_USERDATA_MAGIC );
175- xlio_socket_buf_free (sock , buf );
187+ xlio_api -> xlio_socket_buf_free (sock , buf );
176188}
177189
178190static void test_multi_groups (const char * ip )
@@ -192,13 +204,13 @@ static void test_multi_groups(const char *ip)
192204 .socket_rx_cb = & test_rx_cb ,
193205 };
194206
195- rc = xlio_poll_group_create (& gattr , & group1 );
207+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group1 );
196208 assert (rc == 0 );
197- rc = xlio_poll_group_create (& gattr , & group2 );
209+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group2 );
198210 assert (rc == 0 );
199211
200212 gattr .flags = XLIO_GROUP_FLAG_SAFE ;
201- rc = xlio_poll_group_create (& gattr , & group3 );
213+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group3 );
202214 assert (rc == 0 );
203215
204216 struct xlio_socket_attr sattr = {
@@ -207,15 +219,15 @@ static void test_multi_groups(const char *ip)
207219 };
208220
209221 sattr .group = group1 ;
210- rc = xlio_socket_create (& sattr , & sock1_1 );
222+ rc = xlio_api -> xlio_socket_create (& sattr , & sock1_1 );
211223 assert (rc == 0 );
212- rc = xlio_socket_create (& sattr , & sock1_2 );
224+ rc = xlio_api -> xlio_socket_create (& sattr , & sock1_2 );
213225 assert (rc == 0 );
214226 sattr .group = group2 ;
215- rc = xlio_socket_create (& sattr , & sock2 );
227+ rc = xlio_api -> xlio_socket_create (& sattr , & sock2 );
216228 assert (rc == 0 );
217229 sattr .group = group3 ;
218- rc = xlio_socket_create (& sattr , & sock3 );
230+ rc = xlio_api -> xlio_socket_create (& sattr , & sock3 );
219231 assert (rc == 0 );
220232
221233 struct sockaddr_in addr = {};
@@ -226,40 +238,40 @@ static void test_multi_groups(const char *ip)
226238
227239 g_test_events = 0 ;
228240 /* 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 ));
230242 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 ));
232244 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 ));
234246 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 ));
236248 assert (rc == 0 );
237249
238250 /* TODO There is no API to check expected internal ring distribution. */
239251
240252 /* Wait for ERROR events (ECONREFUSED). */
241253 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 );
245257 }
246258
247259 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 );
252264
253265 /* Wait for TERMINATED events. */
254266 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 );
258270 }
259271
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 );
263275
264276 printf ("Multi group test done.\n" );
265277}
@@ -288,12 +300,12 @@ int main(int argc, char **argv)
288300 return 1 ;
289301 }
290302
291- rc = xlio_init_ex (& iattr );
303+ rc = xlio_api -> xlio_init_ex (& iattr );
292304 assert (rc == 0 );
293305
294306 test_multi_groups (argv [1 ]);
295307
296- rc = xlio_poll_group_create (& gattr , & group );
308+ rc = xlio_api -> xlio_poll_group_create (& gattr , & group );
297309 assert (rc == 0 );
298310
299311 printf ("Group created.\n" );
@@ -304,7 +316,7 @@ int main(int argc, char **argv)
304316 .userdata_sq = 0xdeadc0de ,
305317 };
306318
307- rc = xlio_socket_create (& sattr , & sock );
319+ rc = xlio_api -> xlio_socket_create (& sattr , & sock );
308320 assert (rc == 0 );
309321
310322 printf ("Socket created, connecting to %s:8080.\n" , argv [1 ]);
@@ -315,30 +327,30 @@ int main(int argc, char **argv)
315327 rc = inet_aton (argv [1 ], & addr .sin_addr );
316328 assert (rc != 0 );
317329
318- rc = xlio_socket_connect (sock , (struct sockaddr * )& addr , sizeof (addr ));
330+ rc = xlio_api -> xlio_socket_connect (sock , (struct sockaddr * )& addr , sizeof (addr ));
319331 assert (rc == 0 );
320332
321- struct ibv_pd * pd = xlio_socket_get_pd (sock );
333+ struct ibv_pd * pd = xlio_api -> xlio_socket_get_pd (sock );
322334 assert (pd != NULL );
323335 mr_buf = ibv_reg_mr (pd , sndbuf , sizeof (sndbuf ), IBV_ACCESS_LOCAL_WRITE );
324336 assert (mr_buf != NULL );
325337
326338 printf ("Starting polling loop.\n" );
327339
328340 while (!quit ) {
329- xlio_poll_group_poll (group );
341+ xlio_api -> xlio_poll_group_poll (group );
330342 }
331343
332344 printf ("Quiting...\n" );
333345
334- rc = xlio_socket_destroy (sock );
346+ rc = xlio_api -> xlio_socket_destroy (sock );
335347 assert (rc == 0 );
336348
337349 while (!terminated ) {
338- xlio_poll_group_poll (group );
350+ xlio_api -> xlio_poll_group_poll (group );
339351 }
340352
341- rc = xlio_poll_group_destroy (group );
353+ rc = xlio_api -> xlio_poll_group_destroy (group );
342354 assert (rc == 0 );
343355
344356 printf ("Zerocopy completion events: %d\n" , g_comp_events );
0 commit comments