/*---------------------------------------------------------------------------*/ int msg_api_init(struct msg_params *msg_params, size_t hdrlen, size_t datalen, int is_server) { const char *req_hdr = "hello world request header"; const char *req_data = "hello world request data"; const char *rsp_hdr = "hello world response header"; const char *rsp_data = "hello world response data"; const char *ptr; size_t len; int pagesize = sysconf(_SC_PAGESIZE); if (pagesize < 0) return -1; msg_params->g_hdr = NULL; msg_params->g_data = NULL; if (hdrlen) { msg_params->g_hdr = (uint8_t *)memalign(pagesize, hdrlen); if (!msg_params->g_hdr) goto cleanup; ptr = (is_server) ? rsp_hdr : req_hdr; len = strlen(ptr); if (hdrlen <= len) len = hdrlen - 1; if (len) strncpy((char *)msg_params->g_hdr, ptr, len); msg_params->g_hdr[len] = 0; } if (datalen) { datalen = ALIGNHUGEPAGE(datalen); msg_params->g_data = (uint8_t *)alloc_mem_buf(datalen, &msg_params->g_shmid); if (!msg_params->g_data) goto cleanup; ptr = (is_server) ? rsp_data : req_data; len = strlen(ptr); if (datalen <= len) len = datalen - 1; if (len) strncpy((char *)msg_params->g_data, ptr, len); msg_params->g_data[len] = 0; msg_params->g_data_mr = xio_reg_mr(msg_params->g_data, datalen); if (!msg_params->g_data_mr) goto cleanup; } return 0; cleanup: msg_api_free(msg_params); return -1; }
/*---------------------------------------------------------------------------*/ static int xio_client_main(void *data) { char url[256]; struct xio_session_params params; struct xio_context_params ctx_params; struct xio_connection_params cparams; int error; int retval = 0; atomic_add(2, &module_state); print_counter = PRINT_COUNTER; print_test_config(&test_config); memset(¶ms, 0, sizeof(params)); memset(&cparams, 0, sizeof(cparams)); /* prepare buffers for this test */ if (msg_api_init(&msg_params, test_config.hdr_len, test_config.data_len, 0) != 0) { pr_err("msg_api_init failed\n"); return -1; } pool = msg_pool_alloc(MAX_POOL_SIZE, 1, 1); if (!pool) { pr_err("msg_pool_alloc failed\n"); goto cleanup; } /* create thread context for the server */ memset(&ctx_params, 0, sizeof(ctx_params)); ctx_params.flags = XIO_LOOP_GIVEN_THREAD; ctx_params.worker = current; ctx = xio_context_create(&ctx_params, POLLING_TIMEOUT, cpu); if (!ctx) { pr_err("context open failed\n"); goto cleanup; } sprintf(url, "%s://%s:%d", test_config.transport, test_config.server_addr, test_config.server_port); params.type = XIO_SESSION_CLIENT; params.ses_ops = &ses_ops; params.uri = url; g_session = xio_session_create(¶ms); if (!g_session) pr_err("session creation failed\n"); cparams.session = g_session; cparams.ctx = ctx; cparams.conn_idx = test_config.conn_idx; /* connect the session */ g_connection = xio_connect(&cparams); /* the default xio supplied main loop */ if (atomic_add_unless(&module_state, 4, 0x83)) retval = xio_context_run_loop(ctx); atomic_sub(4, &module_state); if (retval != 0) { error = xio_errno(); pr_err("running event loop failed. reason %d - (%s)\n", error, xio_strerror(error)); xio_assert(retval == 0); } /* normal exit phase */ pr_info("exit signaled\n"); xio_context_destroy(ctx); msg_pool_free(pool); cleanup: msg_api_free(&msg_params); pr_info("exit complete\n"); complete_and_exit(&cleanup_complete, 0); return 0; }