summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-04-29 15:38:31 +0800
committer杨威 <[email protected]>2024-04-29 10:44:10 +0000
commit32b40e3ba32a22b425ad1e5d4e2a69654f9f5244 (patch)
treefc46e84928d320b8adb7b62e7ab3351188a795a7
parented1ff3bc45c45a3ed131beadf1584529e28b2856 (diff)
✨ feat(packet_io marsio): 支持dp trace接口,追加诊断信息v4.3.50
-rw-r--r--include/public/stream_inc/stream_rawpkt.h4
-rw-r--r--src/dealpkt/plug_support.c23
-rw-r--r--src/packet_io/packet_io_marsio.c58
3 files changed, 82 insertions, 3 deletions
diff --git a/include/public/stream_inc/stream_rawpkt.h b/include/public/stream_inc/stream_rawpkt.h
index fb148b8..61796a8 100644
--- a/include/public/stream_inc/stream_rawpkt.h
+++ b/include/public/stream_inc/stream_rawpkt.h
@@ -124,6 +124,10 @@ int MESA_detain_pkt_forward(struct detain_pkt *pkt);
int MESA_detain_pkt_forward_based_on_stream(const struct streaminfo *pstream, struct detain_pkt *dpkt);
void MESA_detain_pkt_free(struct detain_pkt *pkt);
+
+void sapp_emit_datapath_telemetry(const void *raw_pkt, const char * module, const char *str);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/src/dealpkt/plug_support.c b/src/dealpkt/plug_support.c
index 2b2e765..53caa94 100644
--- a/src/dealpkt/plug_support.c
+++ b/src/dealpkt/plug_support.c
@@ -193,6 +193,9 @@ int MESA_retain_pkt_update(const raw_pkt_t *p_raw_pkt, int pkt_ret)
extern int marsio_get_route_dir_from_mbuff(void *pkt_reference);
extern int marsio_get_link_id_from_mbuff(void *pkt_reference);
+
+
+
int get_opt_from_rawpkt(const void *voidpkt, int type, void *void_value)
{
int ret = 0;
@@ -916,6 +919,13 @@ static inline unsigned long long __get_stream_opt_traffic(int cltype, int iotype
return tval;
}
+extern void marsio4_emit_datapath_telemetry(const raw_pkt_t *raw_pkt, const char * module, const char *str);
+
+inline void sapp_emit_datapath_telemetry(const void *raw_pkt, const char * module, const char *str)
+{
+ return marsio4_emit_datapath_telemetry((const raw_pkt_t *)raw_pkt, module, str);
+}
+
int MESA_set_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt opt, void *opt_val, int opt_val_len)
{
@@ -1112,6 +1122,9 @@ int MESA_set_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o
memset(pstream_pr->sid_append_list, 0, sizeof(struct segment_id_list));
}
}
+ char tmp_buff[256];
+ snprintf(tmp_buff, sizeof(tmp_buff), "update sid_append_list_sz=%u", set_sid_list->sz_sidlist);
+ marsio4_emit_datapath_telemetry(pstream_pr->raw_pkt, "sapp", tmp_buff);
ret = 0;
}
break;
@@ -1145,7 +1158,10 @@ int MESA_set_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o
memset(pstream_pr->sid_prepend_list, 0, sizeof(struct segment_id_list));
}
}
- ret = 0;
+ char tmp_buff[256];
+ snprintf(tmp_buff, sizeof(tmp_buff), "update sid_prepend_list_sz=%u", set_sid_list->sz_sidlist);
+ marsio4_emit_datapath_telemetry(pstream_pr->raw_pkt, "sapp", tmp_buff);
+ ret = 0;
}
break;
case MSO_STREAM_SET_DATAMETA_TRACE_ID:
@@ -1157,7 +1173,10 @@ int MESA_set_stream_opt(const struct streaminfo *pstream, enum MESA_stream_opt o
break;
}
pstream_pr->stream_trace_id=*((unsigned long long *)opt_val);
- ret=0;
+ char tmp_buff[256];
+ snprintf(tmp_buff, sizeof(tmp_buff), "update trace_id=%llu", pstream_pr->stream_trace_id);
+ marsio4_emit_datapath_telemetry(pstream_pr->raw_pkt, "sapp", tmp_buff);
+ ret=0;
}
break;
default:
diff --git a/src/packet_io/packet_io_marsio.c b/src/packet_io/packet_io_marsio.c
index 102741a..479b0d1 100644
--- a/src/packet_io/packet_io_marsio.c
+++ b/src/packet_io/packet_io_marsio.c
@@ -107,6 +107,15 @@ int (*ptr_marsio_poll_wait)(struct mr_instance * instance, struct mr_vdev * vdev
int (*ptr_marsio_buff_is_ctrlbuf)(marsio_buff_t * m);
+int (*ptr_marsio_dp_trace_measurements_can_emit)(struct mr_instance * instance, const marsio_buff_t * mbuf,
+ uint8_t measurement_type);
+
+int (*ptr_marsio_dp_trace_measurement_emit_str)(struct mr_instance * instance, marsio_buff_t * mbuf, uint8_t measurement_type,
+ const char * module, const char * str);
+
+void (*ptr_marsio_dp_trace_filter_exec)(struct mr_instance * instance, marsio_buff_t * mbuf);
+
+
static struct bpf_program MARSIO_BPF_FILTER[MAX_THREAD_NUM];
static int g_marsio_have_bpf;
@@ -114,8 +123,24 @@ struct __marsio_bpf_counter_t
{
long count;
} __attribute__((aligned(64))); /* for multi-thread, must 64byte alignment */
+
struct __marsio_bpf_counter_t g_marsio_bpf_counter[MAX_THREAD_NUM];
+void marsio4_emit_datapath_telemetry(const raw_pkt_t *raw_pkt, const char * module, const char *str)
+{
+ if(sapp_marsio4_instance == NULL || ptr_marsio_dp_trace_measurements_can_emit== NULL || ptr_marsio_dp_trace_measurement_emit_str == NULL)return;
+ if(raw_pkt != NULL && raw_pkt->io_lib_pkt_reference != NULL && str != NULL && module != NULL)
+ {
+ if(ptr_marsio_dp_trace_measurements_can_emit(sapp_marsio4_instance, raw_pkt->io_lib_pkt_reference, DP_TRACE_MEASUREMENT_TYPE_TRACE))
+ {
+ ptr_marsio_dp_trace_measurement_emit_str(sapp_marsio4_instance, (marsio_buff_t *)raw_pkt->io_lib_pkt_reference, DP_TRACE_MEASUREMENT_TYPE_TRACE, module, str);
+ }
+ if(ptr_marsio_dp_trace_measurements_can_emit(sapp_marsio4_instance, raw_pkt->io_lib_pkt_reference, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY))
+ {
+ ptr_marsio_dp_trace_measurement_emit_str(sapp_marsio4_instance, (marsio_buff_t *)raw_pkt->io_lib_pkt_reference, DP_TRACE_MEASUREMENT_TYPE_TELEMETRY, module, str);
+ }
+ }
+}
/************************ funcitons for dynamic link *************************/
int marsio_dl_io_set_cap_level(int cap_level)
@@ -372,7 +397,21 @@ int marsio_dl_io_raw_pkt_send(void *phandle, unsigned char *data,int datalen, vo
marsio_pkt_dump(thread_seq, send_mbuf[0], PKT_CLASSIFY_INJECT);
- ret = ptr_marsio_send_burst_with_options((struct mr_sendpath *)arg, thread_seq, send_mbuf, 1, send_option);
+ if(ptr_marsio_dp_trace_filter_exec)
+ {
+ ptr_marsio_dp_trace_filter_exec(sapp_marsio4_instance, send_mbuf[0]);
+ }
+
+ if(raw_pkt->is_ctrl_pkt==1)
+ {
+ marsio4_emit_datapath_telemetry(raw_pkt, "sapp", "inject=ctrl_pkt");
+ }
+ else
+ {
+ marsio4_emit_datapath_telemetry(raw_pkt, "sapp", "inject=rawpkt");
+ }
+
+ ret = ptr_marsio_send_burst_with_options((struct mr_sendpath *)arg, thread_seq, send_mbuf, 1, send_option);
if(ret < 0){
return -1;
}
@@ -799,6 +838,8 @@ static inline int marsio4_pkt_hand(int tid, marsio_buff_t *rx_buff, raw_pkt_t *r
return ret;
}
+
+
static int marsio4_process_packet(int tid, raw_pkt_t *raw_pkt)
{
int i,j,k, pkt_num = 0;
@@ -849,12 +890,14 @@ static int marsio4_process_packet(int tid, raw_pkt_t *raw_pkt)
int ret = marsio4_pkt_forward(tid, g_mr4_sendpath_up_set[i], rx_buff[j]);
if (ret < 0)
{
+ marsio4_emit_datapath_telemetry(raw_pkt, "sapp", "egress_action=forward_error");
ptr_marsio_buff_free(sapp_marsio4_instance, &rx_buff[j], 1, MARSIO_SOCKET_ID_ANY, tid);
}
}
else if (hand_res == DROP)
{
/* ����ģʽ��ֻ�ܵ���free, �п���batch�յ�N������, ij������Ҫ��ע, ij��������Ҫ */
+ marsio4_emit_datapath_telemetry(raw_pkt, "sapp", "egress_action=drop");
ptr_marsio_buff_free(sapp_marsio4_instance, &rx_buff[j], 1, MARSIO_SOCKET_ID_ANY, tid);
}
else
@@ -1210,6 +1253,19 @@ static int marsio_dl_get_function_entry(void)
printf("\033[33m[Error]dlsym function '%s' from '%s' failed!\033[0m\n", "marsio_buff_malloc_smartoffload", ABBR_MARSIO_LIBRARY_FILE);
sleep(1);
}
+ ptr_marsio_dp_trace_measurements_can_emit = (int (*)(struct mr_instance * instance, const marsio_buff_t * mbuf, uint8_t measurement_type))dlsym(marsio_so_handle, "marsio_dp_trace_measurements_can_emit");
+ if(NULL == ptr_marsio_dp_trace_measurements_can_emit){
+ printf("\033[33m[Warning]dlsym function '%s' from '%s' failed!\033[0m\n", "marsio_dp_trace_measurements_can_emit", ABBR_MARSIO_LIBRARY_FILE);
+ }
+ ptr_marsio_dp_trace_measurement_emit_str = (int (*)(struct mr_instance * instance, marsio_buff_t * mbuf, uint8_t measurement_type, const char * module, const char * str))dlsym(marsio_so_handle, "marsio_dp_trace_measurement_emit_str");
+ if(NULL == ptr_marsio_dp_trace_measurement_emit_str){
+ printf("\033[33m[Warning]dlsym function '%s' from '%s' failed!\033[0m\n", "marsio_dp_trace_measurement_emit_str", ABBR_MARSIO_LIBRARY_FILE);
+ }
+
+ ptr_marsio_dp_trace_filter_exec = (void (*)(struct mr_instance * instance, marsio_buff_t * mbuf))dlsym(marsio_so_handle, "marsio_dp_trace_filter_exec");
+ if(NULL == ptr_marsio_dp_trace_filter_exec){
+ printf("\033[33m[Warning]dlsym function '%s' from '%s' failed!\033[0m\n", "marsio_dp_trace_filter_exec", ABBR_MARSIO_LIBRARY_FILE);
+ }
/* for vlan flipping */
if(DEPLOYMENT_MODE_INLINE == sapp_global_val->config.packet_io.deployment_mode_bin){