199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson * Copyright(C) 2020 Marvell International Ltd.
399a2dd95SBruce Richardson */
499a2dd95SBruce Richardson
599a2dd95SBruce Richardson #include <inttypes.h>
672b452c5SDmitry Kozlyuk #include <stdlib.h>
799a2dd95SBruce Richardson #include <time.h>
899a2dd95SBruce Richardson
999a2dd95SBruce Richardson #include <rte_byteorder.h>
1099a2dd95SBruce Richardson #include <rte_common.h>
1199a2dd95SBruce Richardson #include <rte_time.h>
1299a2dd95SBruce Richardson #include <rte_trace.h>
1399a2dd95SBruce Richardson #include <rte_version.h>
1499a2dd95SBruce Richardson
1599a2dd95SBruce Richardson #include "eal_trace.h"
1699a2dd95SBruce Richardson
1799a2dd95SBruce Richardson __rte_format_printf(2, 0)
1899a2dd95SBruce Richardson static int
metadata_printf(char ** str,const char * fmt,...)1999a2dd95SBruce Richardson metadata_printf(char **str, const char *fmt, ...)
2099a2dd95SBruce Richardson {
2199a2dd95SBruce Richardson va_list ap;
2299a2dd95SBruce Richardson int rc;
2399a2dd95SBruce Richardson
2499a2dd95SBruce Richardson *str = NULL;
2599a2dd95SBruce Richardson va_start(ap, fmt);
2699a2dd95SBruce Richardson rc = vasprintf(str, fmt, ap);
2799a2dd95SBruce Richardson va_end(ap);
2899a2dd95SBruce Richardson
2999a2dd95SBruce Richardson return rc;
3099a2dd95SBruce Richardson }
3199a2dd95SBruce Richardson
3299a2dd95SBruce Richardson static int
meta_copy(char ** meta,int * offset,char * str,int rc)3399a2dd95SBruce Richardson meta_copy(char **meta, int *offset, char *str, int rc)
3499a2dd95SBruce Richardson {
3599a2dd95SBruce Richardson int count = *offset;
3699a2dd95SBruce Richardson char *ptr = *meta;
3799a2dd95SBruce Richardson
3899a2dd95SBruce Richardson if (rc < 0)
3999a2dd95SBruce Richardson return rc;
4099a2dd95SBruce Richardson
4199a2dd95SBruce Richardson ptr = realloc(ptr, count + rc + 1);
4299a2dd95SBruce Richardson if (ptr == NULL)
4399a2dd95SBruce Richardson goto free_str;
4499a2dd95SBruce Richardson
4599a2dd95SBruce Richardson memcpy(RTE_PTR_ADD(ptr, count), str, rc);
4699a2dd95SBruce Richardson ptr[count + rc] = '\0';
4799a2dd95SBruce Richardson count += rc;
4899a2dd95SBruce Richardson free(str);
4999a2dd95SBruce Richardson
5099a2dd95SBruce Richardson *meta = ptr;
5199a2dd95SBruce Richardson *offset = count;
5299a2dd95SBruce Richardson
5399a2dd95SBruce Richardson return rc;
5499a2dd95SBruce Richardson
5599a2dd95SBruce Richardson free_str:
5699a2dd95SBruce Richardson free(str);
5799a2dd95SBruce Richardson return -ENOMEM;
5899a2dd95SBruce Richardson }
5999a2dd95SBruce Richardson
6099a2dd95SBruce Richardson static int
meta_data_type_emit(char ** meta,int * offset)6199a2dd95SBruce Richardson meta_data_type_emit(char **meta, int *offset)
6299a2dd95SBruce Richardson {
6399a2dd95SBruce Richardson char *str = NULL;
6499a2dd95SBruce Richardson int rc;
6599a2dd95SBruce Richardson
6699a2dd95SBruce Richardson rc = metadata_printf(&str,
6799a2dd95SBruce Richardson "/* CTF 1.8 */\n"
6899a2dd95SBruce Richardson "typealias integer {size = 8; base = x;}:= uint8_t;\n"
6999a2dd95SBruce Richardson "typealias integer {size = 16; base = x;} := uint16_t;\n"
7099a2dd95SBruce Richardson "typealias integer {size = 32; base = x;} := uint32_t;\n"
7199a2dd95SBruce Richardson "typealias integer {size = 64; base = x;} := uint64_t;\n"
7299a2dd95SBruce Richardson "typealias integer {size = 8; signed = true;} := int8_t;\n"
7399a2dd95SBruce Richardson "typealias integer {size = 16; signed = true;} := int16_t;\n"
7499a2dd95SBruce Richardson "typealias integer {size = 32; signed = true;} := int32_t;\n"
7599a2dd95SBruce Richardson "typealias integer {size = 64; signed = true;} := int64_t;\n"
7699a2dd95SBruce Richardson #ifdef RTE_ARCH_64
7799a2dd95SBruce Richardson "typealias integer {size = 64; base = x;} := uintptr_t;\n"
7899a2dd95SBruce Richardson #else
7999a2dd95SBruce Richardson "typealias integer {size = 32; base = x;} := uintptr_t;\n"
8099a2dd95SBruce Richardson #endif
8199a2dd95SBruce Richardson #ifdef RTE_ARCH_64
8299a2dd95SBruce Richardson "typealias integer {size = 64; base = x;} := long;\n"
8399a2dd95SBruce Richardson #else
8499a2dd95SBruce Richardson "typealias integer {size = 32; base = x;} := long;\n"
8599a2dd95SBruce Richardson #endif
8699a2dd95SBruce Richardson "typealias integer {size = 8; signed = false; encoding = ASCII; } := string_bounded_t;\n\n"
8799a2dd95SBruce Richardson #ifdef RTE_ARCH_64
8899a2dd95SBruce Richardson "typealias integer {size = 64; base = x;} := size_t;\n"
8999a2dd95SBruce Richardson #else
9099a2dd95SBruce Richardson "typealias integer {size = 32; base = x;} := size_t;\n"
9199a2dd95SBruce Richardson #endif
9299a2dd95SBruce Richardson "typealias floating_point {\n"
9399a2dd95SBruce Richardson " exp_dig = 8;\n"
9499a2dd95SBruce Richardson " mant_dig = 24;\n"
9599a2dd95SBruce Richardson "} := float;\n\n"
9699a2dd95SBruce Richardson "typealias floating_point {\n"
9799a2dd95SBruce Richardson " exp_dig = 11;\n"
9899a2dd95SBruce Richardson " mant_dig = 53;\n"
9999a2dd95SBruce Richardson "} := double;\n\n");
10099a2dd95SBruce Richardson
10199a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
10299a2dd95SBruce Richardson }
10399a2dd95SBruce Richardson
10499a2dd95SBruce Richardson static int
is_be(void)10599a2dd95SBruce Richardson is_be(void)
10699a2dd95SBruce Richardson {
10799a2dd95SBruce Richardson #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
10899a2dd95SBruce Richardson return 1;
10999a2dd95SBruce Richardson #else
11099a2dd95SBruce Richardson return 0;
11199a2dd95SBruce Richardson #endif
11299a2dd95SBruce Richardson }
11399a2dd95SBruce Richardson
11499a2dd95SBruce Richardson static int
meta_header_emit(char ** meta,int * offset)11599a2dd95SBruce Richardson meta_header_emit(char **meta, int *offset)
11699a2dd95SBruce Richardson {
11799a2dd95SBruce Richardson struct trace *trace = trace_obj_get();
11899a2dd95SBruce Richardson char uustr[RTE_UUID_STRLEN];
11999a2dd95SBruce Richardson char *str = NULL;
12099a2dd95SBruce Richardson int rc;
12199a2dd95SBruce Richardson
12299a2dd95SBruce Richardson rte_uuid_unparse(trace->uuid, uustr, RTE_UUID_STRLEN);
12399a2dd95SBruce Richardson rc = metadata_printf(&str,
12499a2dd95SBruce Richardson "trace {\n"
12599a2dd95SBruce Richardson " major = 1;\n"
12699a2dd95SBruce Richardson " minor = 8;\n"
12799a2dd95SBruce Richardson " uuid = \"%s\";\n"
12899a2dd95SBruce Richardson " byte_order = %s;\n"
12999a2dd95SBruce Richardson " packet.header := struct {\n"
13099a2dd95SBruce Richardson " uint32_t magic;\n"
13199a2dd95SBruce Richardson " uint8_t uuid[16];\n"
13299a2dd95SBruce Richardson " };\n"
13399a2dd95SBruce Richardson "};\n\n", uustr, is_be() ? "be" : "le");
13499a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
13599a2dd95SBruce Richardson }
13699a2dd95SBruce Richardson
13799a2dd95SBruce Richardson static int
meta_env_emit(char ** meta,int * offset)13899a2dd95SBruce Richardson meta_env_emit(char **meta, int *offset)
13999a2dd95SBruce Richardson {
14099a2dd95SBruce Richardson char *str = NULL;
14199a2dd95SBruce Richardson int rc;
14299a2dd95SBruce Richardson
14399a2dd95SBruce Richardson rc = metadata_printf(&str,
14499a2dd95SBruce Richardson "env {\n"
14599a2dd95SBruce Richardson " dpdk_version = \"%s\";\n"
14699a2dd95SBruce Richardson " tracer_name = \"dpdk\";\n"
14799a2dd95SBruce Richardson "};\n\n", rte_version());
14899a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
14999a2dd95SBruce Richardson }
15099a2dd95SBruce Richardson
15199a2dd95SBruce Richardson static int
meta_clock_pass1_emit(char ** meta,int * offset)15299a2dd95SBruce Richardson meta_clock_pass1_emit(char **meta, int *offset)
15399a2dd95SBruce Richardson {
15499a2dd95SBruce Richardson char *str = NULL;
15599a2dd95SBruce Richardson int rc;
15699a2dd95SBruce Richardson
15799a2dd95SBruce Richardson rc = metadata_printf(&str,
15899a2dd95SBruce Richardson "clock {\n"
15999a2dd95SBruce Richardson " name = \"dpdk\";\n"
16099a2dd95SBruce Richardson " freq = ");
16199a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
16299a2dd95SBruce Richardson }
16399a2dd95SBruce Richardson
16499a2dd95SBruce Richardson static int
meta_clock_pass2_emit(char ** meta,int * offset)16599a2dd95SBruce Richardson meta_clock_pass2_emit(char **meta, int *offset)
16699a2dd95SBruce Richardson {
16799a2dd95SBruce Richardson char *str = NULL;
16899a2dd95SBruce Richardson int rc;
16999a2dd95SBruce Richardson
17099a2dd95SBruce Richardson rc = metadata_printf(&str,
17199a2dd95SBruce Richardson "%20"PRIu64";\n"
17299a2dd95SBruce Richardson " offset_s =", 0);
17399a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
17499a2dd95SBruce Richardson }
17599a2dd95SBruce Richardson
17699a2dd95SBruce Richardson static int
meta_clock_pass3_emit(char ** meta,int * offset)17799a2dd95SBruce Richardson meta_clock_pass3_emit(char **meta, int *offset)
17899a2dd95SBruce Richardson {
17999a2dd95SBruce Richardson char *str = NULL;
18099a2dd95SBruce Richardson int rc;
18199a2dd95SBruce Richardson
18299a2dd95SBruce Richardson rc = metadata_printf(&str,
18399a2dd95SBruce Richardson "%20"PRIu64";\n"
18499a2dd95SBruce Richardson " offset =", 0);
18599a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
18699a2dd95SBruce Richardson }
18799a2dd95SBruce Richardson
18899a2dd95SBruce Richardson static int
meta_clock_pass4_emit(char ** meta,int * offset)18999a2dd95SBruce Richardson meta_clock_pass4_emit(char **meta, int *offset)
19099a2dd95SBruce Richardson {
19199a2dd95SBruce Richardson char *str = NULL;
19299a2dd95SBruce Richardson int rc;
19399a2dd95SBruce Richardson
19499a2dd95SBruce Richardson rc = metadata_printf(&str,
19599a2dd95SBruce Richardson "%20"PRIu64";\n};\n\n"
19699a2dd95SBruce Richardson "typealias integer {\n"
19799a2dd95SBruce Richardson " size = 48; align = 1; signed = false;\n"
19899a2dd95SBruce Richardson " map = clock.dpdk.value;\n"
19999a2dd95SBruce Richardson "} := uint48_clock_dpdk_t;\n\n", 0);
20099a2dd95SBruce Richardson
20199a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
20299a2dd95SBruce Richardson }
20399a2dd95SBruce Richardson
20499a2dd95SBruce Richardson static int
meta_stream_emit(char ** meta,int * offset)20599a2dd95SBruce Richardson meta_stream_emit(char **meta, int *offset)
20699a2dd95SBruce Richardson {
20799a2dd95SBruce Richardson char *str = NULL;
20899a2dd95SBruce Richardson int rc;
20999a2dd95SBruce Richardson
21099a2dd95SBruce Richardson rc = metadata_printf(&str,
21199a2dd95SBruce Richardson "stream {\n"
21299a2dd95SBruce Richardson " packet.context := struct {\n"
21399a2dd95SBruce Richardson " uint32_t cpu_id;\n"
21499a2dd95SBruce Richardson " string_bounded_t name[32];\n"
21599a2dd95SBruce Richardson " };\n"
21699a2dd95SBruce Richardson " event.header := struct {\n"
21799a2dd95SBruce Richardson " uint48_clock_dpdk_t timestamp;\n"
21899a2dd95SBruce Richardson " uint16_t id;\n"
21999a2dd95SBruce Richardson " } align(64);\n"
22099a2dd95SBruce Richardson "};\n\n");
22199a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
22299a2dd95SBruce Richardson }
22399a2dd95SBruce Richardson
22499a2dd95SBruce Richardson static int
meta_event_emit(char ** meta,int * offset,struct trace_point * tp)22599a2dd95SBruce Richardson meta_event_emit(char **meta, int *offset, struct trace_point *tp)
22699a2dd95SBruce Richardson {
22799a2dd95SBruce Richardson char *str = NULL;
22899a2dd95SBruce Richardson int rc;
22999a2dd95SBruce Richardson
23099a2dd95SBruce Richardson rc = metadata_printf(&str,
23199a2dd95SBruce Richardson "event {\n"
23299a2dd95SBruce Richardson " id = %d;\n"
23399a2dd95SBruce Richardson " name = \"%s\";\n"
23499a2dd95SBruce Richardson " fields := struct {\n"
23599a2dd95SBruce Richardson "%s"
23699a2dd95SBruce Richardson " };\n"
23799a2dd95SBruce Richardson "};\n\n", trace_id_get(tp->handle), tp->name,
23899a2dd95SBruce Richardson tp->ctf_field != NULL ? tp->ctf_field : "");
23999a2dd95SBruce Richardson return meta_copy(meta, offset, str, rc);
24099a2dd95SBruce Richardson }
24199a2dd95SBruce Richardson
24299a2dd95SBruce Richardson int
trace_metadata_create(void)24399a2dd95SBruce Richardson trace_metadata_create(void)
24499a2dd95SBruce Richardson {
24599a2dd95SBruce Richardson struct trace_point_head *tp_list = trace_list_head_get();
24699a2dd95SBruce Richardson struct trace *trace = trace_obj_get();
24799a2dd95SBruce Richardson struct trace_point *tp;
24899a2dd95SBruce Richardson int rc, offset = 0;
24999a2dd95SBruce Richardson char *meta = NULL;
25099a2dd95SBruce Richardson
25199a2dd95SBruce Richardson rc = meta_data_type_emit(&meta, &offset);
25299a2dd95SBruce Richardson if (rc < 0)
25399a2dd95SBruce Richardson goto fail;
25499a2dd95SBruce Richardson
25599a2dd95SBruce Richardson rc = meta_header_emit(&meta, &offset);
25699a2dd95SBruce Richardson if (rc < 0)
25799a2dd95SBruce Richardson goto fail;
25899a2dd95SBruce Richardson
25999a2dd95SBruce Richardson rc = meta_env_emit(&meta, &offset);
26099a2dd95SBruce Richardson if (rc < 0)
26199a2dd95SBruce Richardson goto fail;
26299a2dd95SBruce Richardson
26399a2dd95SBruce Richardson rc = meta_clock_pass1_emit(&meta, &offset);
26499a2dd95SBruce Richardson if (rc < 0)
26599a2dd95SBruce Richardson goto fail;
26699a2dd95SBruce Richardson trace->ctf_meta_offset_freq = offset;
26799a2dd95SBruce Richardson
26899a2dd95SBruce Richardson rc = meta_clock_pass2_emit(&meta, &offset);
26999a2dd95SBruce Richardson if (rc < 0)
27099a2dd95SBruce Richardson goto fail;
27199a2dd95SBruce Richardson trace->ctf_meta_offset_freq_off_s = offset;
27299a2dd95SBruce Richardson
27399a2dd95SBruce Richardson rc = meta_clock_pass3_emit(&meta, &offset);
27499a2dd95SBruce Richardson if (rc < 0)
27599a2dd95SBruce Richardson goto fail;
27699a2dd95SBruce Richardson trace->ctf_meta_offset_freq_off = offset;
27799a2dd95SBruce Richardson
27899a2dd95SBruce Richardson rc = meta_clock_pass4_emit(&meta, &offset);
27999a2dd95SBruce Richardson if (rc < 0)
28099a2dd95SBruce Richardson goto fail;
28199a2dd95SBruce Richardson
28299a2dd95SBruce Richardson rc = meta_stream_emit(&meta, &offset);
28399a2dd95SBruce Richardson if (rc < 0)
28499a2dd95SBruce Richardson goto fail;
28599a2dd95SBruce Richardson
28699a2dd95SBruce Richardson STAILQ_FOREACH(tp, tp_list, next)
28799a2dd95SBruce Richardson if (meta_event_emit(&meta, &offset, tp) < 0)
28899a2dd95SBruce Richardson goto fail;
28999a2dd95SBruce Richardson
29099a2dd95SBruce Richardson trace->ctf_meta = meta;
29199a2dd95SBruce Richardson return 0;
29299a2dd95SBruce Richardson
29399a2dd95SBruce Richardson fail:
29499a2dd95SBruce Richardson free(meta);
29599a2dd95SBruce Richardson return -EBADF;
29699a2dd95SBruce Richardson }
29799a2dd95SBruce Richardson
29899a2dd95SBruce Richardson void
trace_metadata_destroy(void)29999a2dd95SBruce Richardson trace_metadata_destroy(void)
30099a2dd95SBruce Richardson {
30199a2dd95SBruce Richardson struct trace *trace = trace_obj_get();
30299a2dd95SBruce Richardson
30399a2dd95SBruce Richardson if (trace->ctf_meta) {
30499a2dd95SBruce Richardson free(trace->ctf_meta);
30599a2dd95SBruce Richardson trace->ctf_meta = NULL;
30699a2dd95SBruce Richardson }
30799a2dd95SBruce Richardson }
30899a2dd95SBruce Richardson
30999a2dd95SBruce Richardson static void
meta_fix_freq(struct trace * trace,char * meta)31099a2dd95SBruce Richardson meta_fix_freq(struct trace *trace, char *meta)
31199a2dd95SBruce Richardson {
31299a2dd95SBruce Richardson char *str;
31399a2dd95SBruce Richardson int rc;
31499a2dd95SBruce Richardson
31599a2dd95SBruce Richardson str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq);
31699a2dd95SBruce Richardson rc = sprintf(str, "%20"PRIu64"", rte_get_timer_hz());
31799a2dd95SBruce Richardson str[rc] = ';';
31899a2dd95SBruce Richardson }
31999a2dd95SBruce Richardson
32099a2dd95SBruce Richardson static void
meta_fix_freq_offset(struct trace * trace,char * meta)32199a2dd95SBruce Richardson meta_fix_freq_offset(struct trace *trace, char *meta)
32299a2dd95SBruce Richardson {
32399a2dd95SBruce Richardson uint64_t uptime_tickes_floor, uptime_ticks, freq, uptime_sec;
32499a2dd95SBruce Richardson uint64_t offset, offset_s;
32599a2dd95SBruce Richardson char *str;
32699a2dd95SBruce Richardson int rc;
32799a2dd95SBruce Richardson
32899a2dd95SBruce Richardson uptime_ticks = trace->uptime_ticks &
32999a2dd95SBruce Richardson ((1ULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT) - 1);
33099a2dd95SBruce Richardson freq = rte_get_tsc_hz();
33199a2dd95SBruce Richardson uptime_tickes_floor = RTE_ALIGN_MUL_FLOOR(uptime_ticks, freq);
33299a2dd95SBruce Richardson
33399a2dd95SBruce Richardson uptime_sec = uptime_tickes_floor / freq;
33499a2dd95SBruce Richardson offset_s = trace->epoch_sec - uptime_sec;
33599a2dd95SBruce Richardson
33699a2dd95SBruce Richardson offset = uptime_ticks - uptime_tickes_floor;
33799a2dd95SBruce Richardson offset += trace->epoch_nsec * (freq / NSEC_PER_SEC);
33899a2dd95SBruce Richardson
33999a2dd95SBruce Richardson str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off_s);
34099a2dd95SBruce Richardson rc = sprintf(str, "%20"PRIu64"", offset_s);
34199a2dd95SBruce Richardson str[rc] = ';';
34299a2dd95SBruce Richardson str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off);
34399a2dd95SBruce Richardson rc = sprintf(str, "%20"PRIu64"", offset);
34499a2dd95SBruce Richardson str[rc] = ';';
34599a2dd95SBruce Richardson }
34699a2dd95SBruce Richardson
34799a2dd95SBruce Richardson static void
meta_fixup(struct trace * trace,char * meta)34899a2dd95SBruce Richardson meta_fixup(struct trace *trace, char *meta)
34999a2dd95SBruce Richardson {
35099a2dd95SBruce Richardson meta_fix_freq(trace, meta);
35199a2dd95SBruce Richardson meta_fix_freq_offset(trace, meta);
35299a2dd95SBruce Richardson }
35399a2dd95SBruce Richardson
35499a2dd95SBruce Richardson int
rte_trace_metadata_dump(FILE * f)35599a2dd95SBruce Richardson rte_trace_metadata_dump(FILE *f)
35699a2dd95SBruce Richardson {
35799a2dd95SBruce Richardson struct trace *trace = trace_obj_get();
35899a2dd95SBruce Richardson char *ctf_meta = trace->ctf_meta;
35999a2dd95SBruce Richardson int rc;
36099a2dd95SBruce Richardson
36199a2dd95SBruce Richardson if (ctf_meta == NULL)
36299a2dd95SBruce Richardson return -EINVAL;
36399a2dd95SBruce Richardson
364*2a7a42a5STyler Retzlaff if (!rte_atomic_load_explicit(&trace->ctf_fixup_done, rte_memory_order_seq_cst) &&
36599a2dd95SBruce Richardson rte_get_timer_hz()) {
36699a2dd95SBruce Richardson meta_fixup(trace, ctf_meta);
367*2a7a42a5STyler Retzlaff rte_atomic_store_explicit(&trace->ctf_fixup_done, 1, rte_memory_order_seq_cst);
36899a2dd95SBruce Richardson }
36999a2dd95SBruce Richardson
37099a2dd95SBruce Richardson rc = fprintf(f, "%s", ctf_meta);
37199a2dd95SBruce Richardson return rc < 0 ? rc : 0;
37299a2dd95SBruce Richardson }
37399a2dd95SBruce Richardson
trace_metadata_fixup_field(const char * field)37499a2dd95SBruce Richardson char *trace_metadata_fixup_field(const char *field)
37599a2dd95SBruce Richardson {
37699a2dd95SBruce Richardson const char *ctf_reserved_words[] = {
37799a2dd95SBruce Richardson "align",
37899a2dd95SBruce Richardson "event",
37999a2dd95SBruce Richardson };
38099a2dd95SBruce Richardson unsigned int i;
38199a2dd95SBruce Richardson char *out;
38299a2dd95SBruce Richardson char *p;
38399a2dd95SBruce Richardson
38499a2dd95SBruce Richardson /* reserved keywords */
38599a2dd95SBruce Richardson for (i = 0; i < RTE_DIM(ctf_reserved_words); i++) {
38699a2dd95SBruce Richardson if (strcmp(field, ctf_reserved_words[i]) != 0)
38799a2dd95SBruce Richardson continue;
38899a2dd95SBruce Richardson if (asprintf(&out, "_%s", ctf_reserved_words[i]) == -1)
38999a2dd95SBruce Richardson out = NULL;
39099a2dd95SBruce Richardson return out;
39199a2dd95SBruce Richardson }
39299a2dd95SBruce Richardson
39399a2dd95SBruce Richardson /* nothing to replace, return early */
39499a2dd95SBruce Richardson if (strstr(field, ".") == NULL && strstr(field, "->") == NULL)
39599a2dd95SBruce Richardson return NULL;
39699a2dd95SBruce Richardson
39799a2dd95SBruce Richardson out = strdup(field);
39899a2dd95SBruce Richardson if (out == NULL)
39999a2dd95SBruce Richardson return NULL;
40099a2dd95SBruce Richardson p = out;
40199a2dd95SBruce Richardson while ((p = strstr(p, ".")) != NULL) {
40299a2dd95SBruce Richardson p[0] = '_';
40399a2dd95SBruce Richardson p++;
40499a2dd95SBruce Richardson }
40599a2dd95SBruce Richardson p = out;
40699a2dd95SBruce Richardson while ((p = strstr(p, "->")) != NULL) {
40799a2dd95SBruce Richardson p[0] = '_';
40899a2dd95SBruce Richardson p++;
40999a2dd95SBruce Richardson memmove(p, p + 1, strlen(p));
41099a2dd95SBruce Richardson }
41199a2dd95SBruce Richardson return out;
41299a2dd95SBruce Richardson }
413