40 #define SECS_TO_NSECS_CONVERSION pow(10, 9)
67 uint8_t log_max_num_samples,
68 uint32_t max_num_data_ids,
82 DOCA_LOG_ERR(
"Device does not support doca_telemetry_diag");
93 }
else if (log_max_num_samples > cap_8_bit) {
95 "Parameter log_max_num_samples is larger than supported cap: log_max_num_samples=%d, cap=%d",
105 }
else if (max_num_data_ids > cap_32_bit) {
106 DOCA_LOG_ERR(
"Parameter max_num_data_ids is larger than supported cap: max_num_data_ids=%d, cap=%d",
117 }
else if (!cap_8_bit) {
127 }
else if (!cap_8_bit) {
137 }
else if (!cap_8_bit) {
147 }
else if (!cap_8_bit) {
168 if (sample_objects->
buf !=
NULL) {
169 free(sample_objects->
buf);
190 if (sample_objects->
dev !=
NULL) {
201 if (file_result != 0) {
202 DOCA_LOG_WARN(
"Failed to close output file with errno=%s (%d)", strerror(errno), errno);
226 uint64_t sample_period,
227 uint8_t log_max_num_samples,
228 uint32_t max_num_data_ids,
315 uint32_t num_data_ids,
316 uint64_t sample_period_ns,
317 uint8_t log_max_num_samples,
320 uint8_t force_ownership)
322 uint8_t data_clear = 0;
323 uint32_t max_num_data_ids = num_data_ids;
328 uint64_t counter_id_failure = 0;
330 uint64_t data_ids[(
size_t)num_data_ids];
374 for (uint32_t i = 0; i < num_data_ids; i++) {
375 data_ids[i] = data_ids_struct[i].
data_id;
381 &counter_id_failure);
383 DOCA_LOG_ERR(
"Failed to apply counters with error=%s, counter_id_failure=%ld",
409 uint32_t num_actual_samples,
410 uint32_t size_of_sample)
412 uint32_t latest_timestamp_h;
413 int write_result = 0;
417 for (uint32_t sample_index = 0; sample_index < num_actual_samples; sample_index++) {
422 latest_timestamp_h++;
425 write_result = fprintf(sample_objects->
output_file,
432 if (write_result < 0) {
433 DOCA_LOG_ERR(
"Failed to write to output file with errno=%s (%d)", strerror(errno), errno);
437 for (uint32_t j = 0; j < sample_objects->
num_data_ids; j++) {
439 if (write_result < 0) {
440 DOCA_LOG_ERR(
"Failed to write to output file with errno=%s (%d)",
464 uint32_t num_actual_samples,
465 uint32_t size_of_sample)
467 uint32_t latest_timestamp_h;
468 int write_result = 0;
472 for (uint32_t sample_index = 0; sample_index < num_actual_samples; sample_index++) {
477 latest_timestamp_h++;
480 write_result = fprintf(sample_objects->
output_file,
487 if (write_result < 0) {
488 DOCA_LOG_ERR(
"Failed to write to output file with errno=%s (%d)", strerror(errno), errno);
492 for (uint32_t j = 0; j < sample_objects->
num_data_ids; j++) {
494 if (write_result < 0) {
495 DOCA_LOG_ERR(
"Failed to write to output file with errno=%s (%d)",
519 uint32_t num_actual_samples,
520 uint32_t size_of_sample,
523 switch (output_format) {
525 DOCA_LOG_ERR(
"Failed to write output: format not supported in sample");
532 DOCA_LOG_ERR(
"Output format %d not recognized", output_format);
550 uint32_t max_num_samples_per_read,
551 uint64_t total_run_time_nsec,
552 uint32_t size_of_sample,
553 uint64_t poll_interval,
556 uint64_t process_period_nsec;
557 struct timespec t_period_start = {0, 0};
558 struct timespec t_polling_start = {0, 0}, t_polling_current = {0, 0};
559 uint32_t num_actual_samples = 0;
563 if (clock_gettime(CLOCK_REALTIME, &t_polling_start) < 0) {
564 DOCA_LOG_ERR(
"Failed to get time with errno=%s (%d)", strerror(errno), errno);
566 t_polling_current = t_polling_start;
571 max_num_samples_per_read,
572 &num_actual_samples);
581 if (clock_gettime(CLOCK_REALTIME, &t_period_start) < 0) {
582 DOCA_LOG_ERR(
"Failed to get time with errno=%s (%d)", strerror(errno), errno);
593 if (clock_gettime(CLOCK_REALTIME, &t_polling_current) < 0) {
594 DOCA_LOG_ERR(
"Failed to get time with errno=%s (%d)", strerror(errno), errno);
600 if ((num_actual_samples < max_num_samples_per_read) && poll_interval > process_period_nsec)
601 usleep((poll_interval - process_period_nsec) / 1000);
618 uint32_t num_samples_to_read,
619 uint32_t max_num_samples_per_read,
620 uint32_t size_of_sample,
623 uint32_t num_actual_samples = 0;
624 uint32_t total_num_samples_read = 0;
625 uint32_t num_samples_to_read_in_query = max_num_samples_per_read;
629 while (total_num_samples_read < num_samples_to_read) {
630 if (num_samples_to_read_in_query > (num_samples_to_read - total_num_samples_read))
631 num_samples_to_read_in_query = (num_samples_to_read - total_num_samples_read);
635 num_samples_to_read_in_query,
636 &num_actual_samples);
651 total_num_samples_read += num_actual_samples;
661 uint32_t size_of_sample;
664 uint64_t actual_sample_period;
665 uint64_t poll_interval;
670 DOCA_LOG_DBG(
"Started doca_telemetry_diag sample with the following parameters: ");
676 DOCA_LOG_DBG(
" max_samples_per_read=%u",
cfg->max_num_samples_per_read);
682 for (uint32_t i = 0; i <
cfg->num_data_ids; i++) {
685 (
unsigned long long int)
cfg->data_ids_struct[i].data_id,
686 cfg->data_ids_struct[i].name);
690 DOCA_LOG_ERR(
"Output format %u is currently not supported by the sample",
cfg->output_format);
701 cfg->data_ids_struct,
704 cfg->log_max_num_samples,
707 cfg->force_ownership);
715 DOCA_LOG_ERR(
"Failed to open output file \"%s\" with errno=%s (%d)",
724 fprintf(sample_objects.
output_file,
"sample_id, sample_time_start, sample_time_end");
725 for (uint32_t i = 0; i <
cfg->num_data_ids; i++) {
726 fprintf(sample_objects.
output_file,
", %s",
cfg->data_ids_struct[i].name);
742 buf_size = size_of_sample *
cfg->max_num_samples_per_read;
743 sample_objects.
buf = malloc(buf_size);
744 if (sample_objects.
buf ==
NULL) {
757 switch ((
cfg->sample_mode)) {
760 usleep((actual_sample_period * (1U <<
cfg->log_max_num_samples)) / 1000);
765 (1U <<
cfg->log_max_num_samples),
766 cfg->max_num_samples_per_read,
771 poll_interval = actual_sample_period * (
cfg->max_num_samples_per_read - 1);
774 cfg->max_num_samples_per_read,
781 DOCA_LOG_ERR(
"Failed to run query counters: unknown sample mode %d",
cfg->sample_mode);
static doca_error_t open_doca_device_with_pci(const char *pcie_value, struct doca_dev **retval)
DOCA_STABLE struct doca_devinfo * doca_dev_as_devinfo(const struct doca_dev *dev)
Get local device info from device. This should be useful when wanting to query information about devi...
DOCA_STABLE doca_error_t doca_dev_close(struct doca_dev *dev)
Destroy allocated local device instance.
#define DOCA_ERROR_PROPAGATE(r, t)
Save the first encountered doca_error_t.
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_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.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_destroy(struct doca_telemetry_diag *diag)
Destroy doca_telemetry_diag previously created by doca_telemetry_diag_create().
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_create(struct doca_dev *dev, uint8_t force_ownership, struct doca_telemetry_diag **diag)
Create a DOCA Telemetry Diagnostics instance.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_apply_config(struct doca_telemetry_diag *diag)
Apply device configuration.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_is_data_timestamp_source_supported(const struct doca_devinfo *devinfo, enum doca_telemetry_diag_timestamp_source data_timestamp_source, uint8_t *timestamp_source_supported)
Check if given device supports a given data timestamp source.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_stop(struct doca_telemetry_diag *diag)
Stop device sampling.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_get_log_max_num_samples(const struct doca_devinfo *devinfo, uint8_t *log_max_num_samples)
Get the maximal num (in log base 2) of samples that is supported by a given device.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_get_sample_period(struct doca_telemetry_diag *diag, uint64_t *sample_period)
Get sample period.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_get_sample_size(struct doca_telemetry_diag *diag, uint32_t *sample_size)
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_sample_period(struct doca_telemetry_diag *diag, uint64_t sample_period)
Set sample period.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_data_clear(struct doca_telemetry_diag *diag, uint8_t data_clear)
Set data clear.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_is_supported(const struct doca_devinfo *devinfo)
Check if given device is capable of executing telemetry diagnostics operations.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_data_timestamp_source(struct doca_telemetry_diag *diag, enum doca_telemetry_diag_timestamp_source data_timestamp_source)
Set data timestamp source.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_start(struct doca_telemetry_diag *diag)
Start device sampling - trigger device to collect metrics.
doca_telemetry_diag_timestamp_source
description of the timestamp source of the sample
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_get_max_num_data_ids(const struct doca_devinfo *devinfo, uint32_t *max_num_data_ids)
Get the maximal num of data IDs that is supported by a given device.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_is_sync_start_supported(const struct doca_devinfo *devinfo, uint8_t *sync_start)
Check if given device supports sync start.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_is_sample_mode_supported(const struct doca_devinfo *devinfo, enum doca_telemetry_diag_sample_mode sample_mode, uint8_t *sample_mode_supported)
Check if given device supports a given sample mode.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_max_num_data_ids(struct doca_telemetry_diag *diag, uint32_t max_num_data_ids)
Set max num of data IDs.
doca_telemetry_diag_sample_mode
description of data sampling mode
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_apply_counters_list_by_id(struct doca_telemetry_diag *diag, const uint64_t *data_ids, uint32_t num_data_ids, uint64_t *counter_id_failure)
Apply the counters, by their data ID, to be queried.
doca_telemetry_diag_sync_mode
Synchronization mode of data sampling.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_query_counters(struct doca_telemetry_diag *diag, void *buf, uint32_t max_samples_to_read, uint32_t *num_valid_samples)
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_log_max_num_samples(struct doca_telemetry_diag *diag, uint8_t log_max_num_samples)
Set log max of samples.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_cap_is_data_clear_supported(const struct doca_devinfo *devinfo, uint8_t *data_clear)
Check if given device supports data clear.
doca_telemetry_diag_output_format
Defines the layout of the diagnostic data output:
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_sync_mode(struct doca_telemetry_diag *diag, enum doca_telemetry_diag_sync_mode sync_mode)
Set synchronization mode.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_output_format(struct doca_telemetry_diag *diag, enum doca_telemetry_diag_output_format output_format)
Set output format.
DOCA_EXPERIMENTAL doca_error_t doca_telemetry_diag_set_sample_mode(struct doca_telemetry_diag *diag, enum doca_telemetry_diag_sample_mode sample_mode)
Set sampling mode.
@ DOCA_TELEMETRY_DIAG_TIMESTAMP_SOURCE_RTC
@ DOCA_TELEMETRY_DIAG_SAMPLE_MODE_ON_DEMAND
@ DOCA_TELEMETRY_DIAG_SAMPLE_MODE_SINGLE
@ DOCA_TELEMETRY_DIAG_SAMPLE_MODE_REPETITIVE
@ DOCA_TELEMETRY_DIAG_SYNC_MODE_SYNC_START
@ DOCA_TELEMETRY_DIAG_SYNC_MODE_NO_SYNC
@ DOCA_TELEMETRY_DIAG_OUTPUT_FORMAT_2
@ DOCA_TELEMETRY_DIAG_OUTPUT_FORMAT_0
@ DOCA_TELEMETRY_DIAG_OUTPUT_FORMAT_1
const struct ip_frag_config * cfg
struct doca_telemetry_diag * telemetry_diag_obj
static doca_error_t telemetry_diag_sample_run_query_counters_by_max_samples(struct telemetry_diag_sample_objects *sample_objects, uint32_t num_samples_to_read, uint32_t max_num_samples_per_read, uint32_t size_of_sample, enum doca_telemetry_diag_output_format output_format)
static doca_error_t telemetry_diag_sample_run_query_counters_repetitive(struct telemetry_diag_sample_objects *sample_objects, uint32_t max_num_samples_per_read, uint64_t total_run_time_nsec, uint32_t size_of_sample, uint64_t poll_interval, enum doca_telemetry_diag_output_format output_format)
static doca_error_t telemetry_diag_sample_write_output(struct telemetry_diag_sample_objects *sample_objects, uint32_t num_actual_samples, uint32_t size_of_sample, enum doca_telemetry_diag_output_format output_format)
static doca_error_t telemetry_diag_sample_context_init(struct telemetry_diag_sample_objects *sample_objects, struct data_id_entry *data_ids_struct, uint32_t num_data_ids, uint64_t sample_period_ns, uint8_t log_max_num_samples, enum doca_telemetry_diag_sample_mode sample_mode, enum doca_telemetry_diag_output_format output_format, uint8_t force_ownership)
static doca_error_t telemetry_diag_sample_cleanup(struct telemetry_diag_sample_objects *sample_objects)
static doca_error_t telemetry_diag_sample_set_properties(struct doca_telemetry_diag *diag, enum doca_telemetry_diag_output_format output_format, uint64_t sample_period, uint8_t log_max_num_samples, uint32_t max_num_data_ids, enum doca_telemetry_diag_sync_mode sync_mode, enum doca_telemetry_diag_sample_mode sample_mode, uint8_t data_clear, enum doca_telemetry_diag_timestamp_source data_timestamp_source)
doca_error_t telemetry_diag_sample_run(const struct telemetry_diag_sample_cfg *cfg)
DOCA_LOG_REGISTER(TELEMETRY_DIAG::SAMPLE)
static uint64_t telemetry_diag_sample_time_diff_nsec(struct timespec start, struct timespec end)
static doca_error_t telemetry_diag_sample_check_capabilities(struct doca_dev *dev, uint8_t log_max_num_samples, uint32_t max_num_data_ids, enum doca_telemetry_diag_sync_mode sync_mode, enum doca_telemetry_diag_sample_mode sample_mode, uint8_t data_clear, enum doca_telemetry_diag_timestamp_source data_timestamp_source)
#define SECS_TO_NSECS_CONVERSION
static doca_error_t telemetry_diag_sample_write_sample_format_1(struct telemetry_diag_sample_objects *sample_objects, uint32_t num_actual_samples, uint32_t size_of_sample)
static doca_error_t telemetry_diag_sample_write_sample_format_2(struct telemetry_diag_sample_objects *sample_objects, uint32_t num_actual_samples, uint32_t size_of_sample)