diff --git a/src/doca_cc_helper.h b/src/doca_cc_helper.h index e13f3256..6c42ad1f 100644 --- a/src/doca_cc_helper.h +++ b/src/doca_cc_helper.h @@ -39,6 +39,11 @@ #include #include #include +#include +#include +#include +#include + #include "os_abstract.h" #define MSG_SIZE 4080 @@ -58,6 +63,25 @@ enum cc_client_state { CONNECTION_IN_PROGRESS, CC_CONNECTED }; +struct local_mem_bufs { + void *mem; /* Memory address for DOCA buf mmap */ + struct doca_mmap *mmap; /* DOCA mmap object */ + struct doca_buf_inventory *buf_inv; /* DOCA buf inventory object */ + bool need_alloc_mem; /* Whether need to allocate memory */ +}; + +struct cc_data_path_ctx { + struct doca_cc_consumer *consumer; /**< CC consumer object */ + struct doca_pe *consumer_pe; /**< CC consumer's PE object */ + struct local_mem_bufs consumer_mem; /**< Mmap and DOCA buf objects for consumer */ + struct doca_cc_producer *producer; /**< CC producer object */ + struct doca_pe *producer_pe; /**< CC producer's PE object */ + struct local_mem_bufs producer_mem; /**< Mmap and DOCA buf objects for producer */ + uint32_t remote_consumer_id; /**< Consumer ID on the peer side */ + bool producer_finish; /**< Controls whether producer progress loop should be run */ + bool consumer_finish; /**< Controls whether consumer progress loop should be run */ +}; + struct cc_ctx { struct doca_dev *hw_dev; /**< Doca Device used per PCI address > */ struct doca_cc_connection *connection; /**< Connection object used for pairing a connection >*/ @@ -68,6 +92,7 @@ struct cc_ctx { int fd; /**< File Descriptor >*/ os_mutex_t lock; /**< For underload mode only>*/ os_cond_t cond; /**< For underload mode only>*/ + struct cc_data_path_ctx data_path; /**< Data path objects */ }; struct cc_ctx_server { @@ -413,6 +438,36 @@ cc_server_state_changed_callback(const union doca_data user_data, struct doca_ct } } +/** + * Callback for new consumer arrival event + * + * @event [in]: New remote consumer event object + * @cc_connection [in]: The connection related to the consumer + * @id [in]: The ID of the new remote consumer + */ +static void +cc_server_new_consumer_callback(struct doca_cc_event_consumer *event, struct doca_cc_connection *cc_connection, uint32_t id) +{ + union doca_data user_data; + struct doca_cc_server *cc_server; + doca_error_t result; + + /* This argument is not in use */ + (void)event; + + cc_server = doca_cc_server_get_server_ctx(cc_connection); + + result = doca_ctx_get_user_data(doca_cc_server_as_ctx(cc_server), &user_data); + if (result != DOCA_SUCCESS) { + DOCA_LOG_ERR("Failed to get user data from ctx with error = %s", doca_error_get_name(result)); + return; + } + struct cc_ctx_server *ctx_server = (struct cc_ctx_server *)user_data.ptr; + ctx_server->ctx.data_path.remote_consumer_id = id; + + DOCA_LOG_INFO("[fd=%d] Got a new remote consumer with ID = [%d]",ctx_server->ctx.fd, id); +} + static doca_error_t cc_doca_server_set_params(struct cc_ctx_server *ctx_server) {