65 static void handle_error(
struct doca_rmax_in_stream_event_rx_data *event_rx_data,
union doca_data event_user_data);
132 const char *str = (
const char *)param;
134 if (strcasecmp(str,
"RAW") == 0)
136 else if (strcasecmp(str,
"ULP") == 0)
139 DOCA_LOG_ERR(
"unknown scatter type '%s' was specified", str);
155 const char *str = (
const char *)param;
157 if (strcasecmp(str,
"raw") == 0)
159 else if (strcasecmp(str,
"free-running") == 0)
161 else if (strcasecmp(str,
"synced") == 0)
164 DOCA_LOG_ERR(
"unknown timestamp format '%s' was specified", str);
188 if (sscanf(str,
"%u.%u.%u.%u%c", &
ip[0], &
ip[1], &
ip[2], &
ip[3], &dummy) == 4 &&
ip[0] < 256 &&
ip[1] < 256 &&
189 ip[2] < 256 &&
ip[3] < 256) {
194 out->s_addr =
addr.addr;
196 DOCA_LOG_ERR(
"bad %s IP address format '%s'", label, str);
212 const char *str = (
const char *)param;
227 const char *str = (
const char *)param;
242 const char *str = (
const char *)param;
257 const int value = *(
const int *)param;
278 const int value = *(
const int *)param;
299 const int value = *(
const int *)param;
320 const int value = *(
const int *)param;
343 const char *
input = (
const char *)param;
347 alloc = str = strdup(
input);
349 DOCA_LOG_ERR(
"unable to allocate memory: %s", strerror(errno));
353 while ((str = strtok(str,
",")) !=
NULL) {
357 if (sscanf(str,
"%d%c", &idx, &dummy) != 1) {
363 ret = doca_rmax_cpu_affinity_set(config->
affinity_mask, idx);
365 DOCA_LOG_ERR(
"error setting CPU index '%d' in affinity mask", idx);
389 const int value = *(
const int *)param;
410 const int value = *(
const int *)param;
431 const int value = *(
const int *)param;
465 struct doca_argp_param *list_flag;
466 struct doca_argp_param *scatter_type_param;
467 struct doca_argp_param *tstamp_format_param;
468 struct doca_argp_param *dev_ip_param;
469 struct doca_argp_param *dst_ip_param;
470 struct doca_argp_param *src_ip_param;
471 struct doca_argp_param *dst_port_param;
472 struct doca_argp_param *hdr_size_param;
473 struct doca_argp_param *data_size_param;
474 struct doca_argp_param *num_elements_param;
475 struct doca_argp_param *cpu_affinity_param;
476 struct doca_argp_param *min_packets_param;
477 struct doca_argp_param *max_packets_param;
478 struct doca_argp_param *sleep_param;
479 struct doca_argp_param *dump_flag;
606 "Number of packets to allocate memory for (default 262144)");
658 "Comma separated list of CPU affinity cores for the application main thread");
691 "Block until at least this number of packets are received (default 0)");
746 if (config->
dev_ip.s_addr == 0) {
750 if (config->
dst_ip.s_addr == 0) {
754 if (config->
src_ip.s_addr == 0) {
767 struct doca_devinfo **devinfo;
776 DOCA_LOG_INFO(
"Iface\t\tIB dev\t\tBus ID\tIP addr\t\tPTP\n");
777 for (uint32_t i = 0; i < nb_devs; ++i) {
782 bool has_ptp =
false;
806 ret = doca_rmax_get_ptp_clock_supported(devinfo[i]);
815 DOCA_LOG_WARN(
"Failed to query PTP capability for device %d: %s",
823 DOCA_LOG_WARN(
"Failed to query IP address for device %d: %s",
836 (has_ptp) ?
'y' :
'n');
845 struct doca_devinfo **devinfo;
846 struct doca_devinfo *found_devinfo =
NULL;
850 struct doca_dev *dev =
NULL;
857 for (uint32_t i = 0; i < nb_devs; ++i) {
861 if (
addr.s_addr != dev_ip->s_addr)
863 found_devinfo = devinfo[i];
897 size_t num_buffers = (config->
hdr_size > 0) ? 2 : 1;
967 struct doca_dev *dev,
971 static const size_t page_size = 4096;
978 char *ptr_memory =
NULL;
980 memset(&size, 0,
sizeof(size));
983 ret = doca_rmax_in_stream_create(dev, &data->
stream);
988 event_user_data.
ptr = (
void *)data;
995 ret = doca_rmax_in_stream_set_scatter_type_raw(data->
stream);
998 ret = doca_rmax_in_stream_set_scatter_type_ulp(data->
stream);
1005 ret = doca_rmax_in_stream_set_timestamp_format_raw_counter(data->
stream);
1008 ret = doca_rmax_in_stream_set_timestamp_format_free_running(data->
stream);
1011 ret = doca_rmax_in_stream_set_timestamp_format_ptp_synced(data->
stream);
1039 ret = doca_rmax_in_stream_set_memblks_count(data->
stream, num_buffers);
1042 ret = doca_rmax_in_stream_memblk_desc_set_min_size(data->
stream, data->
pkt_size);
1045 ret = doca_rmax_in_stream_memblk_desc_set_max_size(data->
stream, data->
pkt_size);
1050 ret = doca_rmax_in_stream_get_memblk_size(data->
stream, size);
1054 ret = doca_rmax_in_stream_get_memblk_stride_size(data->
stream, data->
stride_size);
1060 if (ptr_memory ==
NULL) {
1061 DOCA_LOG_ERR(
"Failed to allocate memory size: %zu", size[0] + size[1]);
1068 DOCA_LOG_ERR(
"Failed to set mmap memory range, %p, size %zu: %s",
1082 if (num_buffers == 1) {
1083 ptr[0] = ptr_memory;
1085 ptr[0] = ptr_memory;
1086 ptr[1] = ptr_memory + size[0];
1090 for (
size_t i = 0; i < num_buffers; ++i) {
1091 struct doca_buf *buf;
1093 if (ptr[i] ==
NULL) {
1096 goto destroy_buffers;
1102 goto destroy_buffers;
1111 goto destroy_buffers;
1115 ret = doca_rmax_in_stream_set_memblk(data->
stream, data->
buffer);
1117 goto destroy_buffers;
1122 goto destroy_buffers;
1127 goto destroy_buffers;
1130 ret = doca_rmax_flow_create(&data->
flow);
1133 ret = doca_rmax_flow_set_src_ip(data->
flow, &config->
src_ip);
1136 ret = doca_rmax_flow_set_dst_ip(data->
flow, &config->
dst_ip);
1139 ret = doca_rmax_flow_set_dst_port(data->
flow, config->
dst_port);
1142 ret = doca_rmax_flow_attach(data->
flow, data->
stream);
1152 err = doca_rmax_flow_destroy(data->
flow);
1166 err = doca_rmax_in_stream_destroy(data->
stream);
1178 ret = doca_rmax_flow_detach(data->
flow, data->
stream);
1183 ret = doca_rmax_flow_destroy(data->
flow);
1202 ret = doca_rmax_in_stream_destroy(data->
stream);
1213 const struct doca_rmax_in_stream_result *comp = doca_rmax_in_stream_event_rx_data_get_result(event_rx_data);
1217 if (comp->elements_count <= 0)
1220 data->
recv_pkts += comp->elements_count;
1226 for (
size_t i = 0; i < comp->elements_count; ++i)
1227 for (
size_t chunk = 0; chunk < data->
num_buffers; ++chunk) {
1228 const uint8_t *ptr = comp->memblk_ptr_arr[chunk] + data->
stride_size[chunk] * i;
1245 static const uint64_t us_in_s = 1000000L;
1246 struct timespec now;
1249 double mbits_received;
1251 ret = clock_gettime(CLOCK_MONOTONIC_RAW, &now);
1253 DOCA_LOG_ERR(
"error getting time: %s", strerror(errno));
1257 dt = (now.tv_sec - data->
start.tv_sec) * us_in_s;
1258 dt += now.tv_nsec / 1000 - data->
start.tv_nsec / 1000;
1263 mbits_received = (double)(data->
recv_bytes * 8) / dt;
1264 const char *unit = mbits_received > 1e3 ?
"Gbps" :
"Mbps";
1265 double rate = mbits_received > 1e3 ? mbits_received * 1e-3 : mbits_received;
1267 DOCA_LOG_INFO(
"Got %7zu packets | %7.2lf %s during %7.2lf sec\n", data->
recv_pkts, rate, unit, dt * 1e-6);
1270 data->
start.tv_sec = now.tv_sec;
1271 data->
start.tv_nsec = now.tv_nsec;
1281 const struct doca_rmax_stream_error *err = doca_rmax_in_stream_event_rx_data_get_error(event_rx_data);
1284 DOCA_LOG_ERR(
"Error: code=%d message=%s", err->code, err->message);
1295 ret = clock_gettime(CLOCK_MONOTONIC_RAW, &data->
start);
1297 DOCA_LOG_ERR(
"error getting time: %s", strerror(errno));
1309 if (usleep(config->
sleep_us) != 0) {
if(bitoffset % 64+bitlength > 64) result|
DOCA_EXPERIMENTAL void doca_argp_param_set_description(struct doca_argp_param *param, const char *description)
Set the description of the program param, used during program usage.
DOCA_EXPERIMENTAL void doca_argp_param_set_long_name(struct doca_argp_param *param, const char *name)
Set the long name of the program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_callback(struct doca_argp_param *param, doca_argp_param_cb_t callback)
Set the callback function of the program param.
DOCA_EXPERIMENTAL doca_error_t doca_argp_param_create(struct doca_argp_param **param)
Create new program param.
DOCA_EXPERIMENTAL void doca_argp_param_set_type(struct doca_argp_param *param, enum doca_argp_type type)
Set the type of the param arguments.
DOCA_EXPERIMENTAL doca_error_t doca_argp_register_version_callback(doca_argp_param_cb_t callback)
Register an alternative version callback.
DOCA_EXPERIMENTAL void doca_argp_param_set_short_name(struct doca_argp_param *param, const char *name)
Set the short name of the program param.
DOCA_EXPERIMENTAL doca_error_t doca_argp_register_param(struct doca_argp_param *input_param)
Register a program flag.
DOCA_STABLE doca_error_t doca_buf_inventory_destroy(struct doca_buf_inventory *inventory)
Destroy buffer inventory structure.
static doca_error_t doca_buf_inventory_buf_get_by_addr(struct doca_buf_inventory *inventory, struct doca_mmap *mmap, void *addr, size_t len, struct doca_buf **buf)
Allocate single element from buffer inventory and point it to the buffer defined by addr & len argume...
DOCA_STABLE doca_error_t doca_buf_inventory_start(struct doca_buf_inventory *inventory)
Start element retrieval from inventory.
DOCA_STABLE doca_error_t doca_buf_inventory_create(size_t num_elements, struct doca_buf_inventory **inventory)
Allocates buffer inventory with default/unset attributes.
DOCA_STABLE doca_error_t doca_buf_inventory_stop(struct doca_buf_inventory *inventory)
Stop element retrieval from inventory.
DOCA_STABLE doca_error_t doca_buf_dec_refcount(struct doca_buf *buf, uint16_t *refcount)
Decrease the object reference count by 1, if 0 reached, return the element back to the inventory.
DOCA_STABLE doca_error_t doca_buf_chain_list(struct doca_buf *list1, struct doca_buf *list2)
Append list2 to list1.
DOCA_STABLE doca_error_t doca_ctx_start(struct doca_ctx *ctx)
Finalizes all configurations, and starts the DOCA CTX.
DOCA_STABLE doca_error_t doca_ctx_stop(struct doca_ctx *ctx)
Stops the context allowing reconfiguration.
DOCA_STABLE doca_error_t doca_devinfo_create_list(struct doca_devinfo ***dev_list, uint32_t *nb_devs)
Creates list of all available local devices.
DOCA_STABLE doca_error_t doca_devinfo_get_ibdev_name(const struct doca_devinfo *devinfo, char *ibdev_name, uint32_t size)
Get the name of the IB device represented by a DOCA devinfo.
#define DOCA_DEVINFO_IBDEV_NAME_SIZE
Buffer size to hold Infiniband/RoCE device name. Including a null terminator.
DOCA_STABLE doca_error_t doca_devinfo_destroy_list(struct doca_devinfo **dev_list)
Destroy list of local device info structures.
DOCA_STABLE doca_error_t doca_dev_open(struct doca_devinfo *devinfo, struct doca_dev **dev)
Initialize local device for use.
#define DOCA_DEVINFO_IFACE_NAME_SIZE
Buffer size to hold network interface name. Including a null terminator.
#define DOCA_DEVINFO_PCI_ADDR_SIZE
Buffer size to hold PCI BDF format: "XXXX:XX:XX.X". Including a null terminator.
DOCA_STABLE doca_error_t doca_devinfo_get_ipv4_addr(const struct doca_devinfo *devinfo, uint8_t *ipv4_addr, uint32_t size)
Get the IPv4 address of a DOCA devinfo.
DOCA_STABLE doca_error_t doca_devinfo_get_iface_name(const struct doca_devinfo *devinfo, char *iface_name, uint32_t size)
Get the name of the ethernet interface of a DOCA devinfo.
DOCA_STABLE doca_error_t doca_devinfo_get_pci_addr_str(const struct doca_devinfo *devinfo, char *pci_addr_str)
Get the PCI address of a DOCA devinfo.
enum doca_error doca_error_t
DOCA API return codes.
DOCA_STABLE const char * doca_error_get_name(doca_error_t error)
Returns the string representation of an error code name.
@ DOCA_ERROR_INVALID_VALUE
@ DOCA_ERROR_NOT_SUPPORTED
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_WARN(format,...)
Generates a WARNING application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
DOCA_STABLE doca_error_t doca_mmap_set_memrange(struct doca_mmap *mmap, void *addr, size_t len)
Set the memory range of DOCA memory map.
DOCA_STABLE doca_error_t doca_mmap_destroy(struct doca_mmap *mmap)
Destroy DOCA Memory Map structure.
DOCA_STABLE doca_error_t doca_mmap_create(struct doca_mmap **mmap)
Allocates zero size memory map object with default/unset attributes.
DOCA_STABLE doca_error_t doca_mmap_start(struct doca_mmap *mmap)
Start DOCA Memory Map.
DOCA_STABLE doca_error_t doca_mmap_set_free_cb(struct doca_mmap *mmap, doca_mmap_memrange_free_cb_t *free_cb, void *opaque)
Set callback that will free the memory range when destroying DOCA memory map.
DOCA_STABLE doca_error_t doca_mmap_add_dev(struct doca_mmap *mmap, struct doca_dev *dev)
Register DOCA memory map on a given device.
DOCA_STABLE doca_error_t doca_pe_destroy(struct doca_pe *pe)
Destroy doca progress engine.
DOCA_STABLE doca_error_t doca_pe_connect_ctx(struct doca_pe *pe, struct doca_ctx *ctx)
This method connects a context to a progress engine.
DOCA_STABLE uint8_t doca_pe_progress(struct doca_pe *pe)
Run the progress engine.
DOCA_STABLE doca_error_t doca_pe_create(struct doca_pe **pe)
Creates DOCA progress engine.
void * aligned_alloc(size_t alignment, size_t size)
char * hex_dump(const void *data, size_t size)
bool destroy_stream(struct doca_dev *dev, struct globals *globals, struct stream_data *data)
static void handle_error(struct doca_rmax_in_stream_event_rx_data *event_rx_data, union doca_data event_user_data)
static doca_error_t set_dev_ip_param(void *param, void *opaque)
bool register_argp_params(void)
static doca_error_t set_max_packets_param(void *param, void *opaque)
doca_error_t init_globals(struct app_config *config, struct doca_dev *dev, struct globals *globals)
static doca_error_t set_dst_ip_param(void *param, void *opaque)
static doca_error_t set_tstamp_format_param(void *param, void *opaque)
static doca_error_t set_num_elements_param(void *param, void *opaque)
static doca_error_t set_dst_port_param(void *param, void *opaque)
bool run_recv_loop(const struct app_config *config, struct globals *globals, struct stream_data *data)
static void handle_completion(struct doca_rmax_in_stream_event_rx_data *event_rx_data, union doca_data event_user_data)
struct doca_dev * open_device(struct in_addr *dev_ip)
static doca_error_t set_cpu_affinity_param(void *param, void *opaque)
static doca_error_t set_sleep_param(void *param, void *opaque)
static doca_error_t set_dump_flag(void *param, void *opaque)
DOCA_LOG_REGISTER(STREAM_RECEIVE_PERF_CORE)
bool destroy_globals(struct globals *globals, struct doca_dev *dev)
static bool print_statistics(struct stream_data *data)
static doca_error_t set_scatter_type_param(void *param, void *opaque)
doca_error_t init_stream(struct app_config *config, struct doca_dev *dev, struct globals *globals, struct stream_data *data)
bool mandatory_args_set(struct app_config *config)
static doca_error_t set_ip_param(const char *label, const char *str, struct in_addr *out)
bool init_config(struct app_config *config)
static doca_error_t set_list_flag(void *param, void *opaque)
static doca_error_t set_src_ip_param(void *param, void *opaque)
void destroy_config(struct app_config *config)
static doca_error_t set_min_packets_param(void *param, void *opaque)
static void free_callback(void *addr, size_t len, void *opaque)
static doca_error_t set_data_size_param(void *param, void *opaque)
static doca_error_t set_hdr_size_param(void *param, void *opaque)
@ TIMESTAMP_FORMAT_PTP_SYNCED
@ TIMESTAMP_FORMAT_RAW_COUNTER
@ TIMESTAMP_FORMAT_FREE_RUNNING
enum timestamp_format tstamp_format
struct doca_rmax_cpu_affinity * affinity_mask
enum scatter_type scatter_type
struct doca_buf_inventory * inventory
uint16_t stride_size[MAX_BUFFERS]
uint16_t pkt_size[MAX_BUFFERS]
struct doca_rmax_flow * flow
struct doca_rmax_in_stream * stream
Convenience type for representing opaque data.
noreturn doca_error_t sdk_version_callback(void *param, void *doca_config)