summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortongzongzhen <[email protected]>2024-05-17 22:27:22 +0800
committertongzongzhen <[email protected]>2024-05-17 22:27:22 +0800
commitd386e297b7a1739542064600a008c70e33c25f3b (patch)
treed183d32bc6b1bab08f5f4883eb2717af827dec27 /src
parentadfdd8368973fabbf1580edf9df21471c8c5ae04 (diff)
add debug option for arp test
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/config.c8
-rw-r--r--src/trace_output.c55
3 files changed, 58 insertions, 7 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e3f4365..e3b4c2e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -16,7 +16,7 @@ set(DP_TELEMETRY_SRC
${CMAKE_SOURCE_DIR}/support/mpack/mpack.c)
add_executable(${PROJECT_NAME} ${DP_TELEMETRY_SRC})
-target_link_libraries(${PROJECT_NAME} libpcapng libmarsio maatframe MESA_prof_load libevent-static rdkafka libcmocka libzlog libcjson uuid pthread)
+target_link_libraries(${PROJECT_NAME} libpcapng libmarsio maatframe MESA_prof_load libevent-static rdkafka libcmocka libzlog libcjson uuid pthread pcap)
if(ENABLE_DEVELOP_MOCKING)
target_link_options(${PROJECT_NAME} PRIVATE -Wl,--wrap=kafka_handle_create,--wrap=kafka_topic_new,--wrap=kafka_produce)
endif()
diff --git a/src/config.c b/src/config.c
index 0bac464..a70e5d4 100644
--- a/src/config.c
+++ b/src/config.c
@@ -76,8 +76,6 @@ void config_load()
sizeof(g_conf->monit_file_path),
"/var/run/mrzcpd/mrmonit.app.dp_trace_telemetry.saving");
- MESA_load_profile_uint_def(config_path, "global", "send_ctrlbuf", &g_conf->send_ctrlbuf, 0);
-
MESA_load_profile_string_def(config_path, "global", "device_group", g_conf->device_group,
sizeof(g_conf->device_group), "");
MESA_load_profile_string_def(config_path, "global", "data_center", g_conf->data_center, sizeof(g_conf->data_center),
@@ -97,7 +95,6 @@ void config_load()
printf("SLED_IP environment variable does not exist.\n");
}
- MESA_load_profile_int_def(config_path, "kafka", "kafka_dump_to_log", &(g_conf->kafka_dump_to_log), 0);
MESA_load_profile_string_def(config_path, "kafka", "borker_list", g_conf->broker_list, sizeof(g_conf->broker_list),
"");
MESA_load_profile_string_def(config_path, "kafka", "topic_name", g_conf->topic_name, sizeof(g_conf->topic_name),
@@ -189,6 +186,11 @@ void dynamic_config_load()
desc_i->measurement_type = DP_TRACE_MEASUREMENT_TYPE_TRACE;
}
+ MESA_load_profile_uint_def(g_conf->dy_config_path, "debug", "send_ctrlbuf", &g_conf->send_ctrlbuf, 0);
+ MESA_load_profile_uint_def(g_conf->dy_config_path, "debug", "kafka_dump_to_log", &(g_conf->kafka_dump_to_log), 0);
+ MESA_load_profile_uint_def(g_conf->dy_config_path, "debug", "arp_pkt_has_ip_test", &(g_conf->arp_pkt_has_ip_test),
+ 0);
+
dzlog_info("Loading data path trace configuration file is completed.");
}
diff --git a/src/trace_output.c b/src/trace_output.c
index 83083ab..d3f48a4 100644
--- a/src/trace_output.c
+++ b/src/trace_output.c
@@ -17,6 +17,7 @@
#include <netinet/ip6.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
+#include <pcap.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
@@ -47,6 +48,7 @@ static void dp_trace_decode_to_message_pack(marsio_buff_t * mr_mbuf, char ** dat
static int dp_trace_record_decode_to_str(marsio_buff_t * mr_mbuf, char * data, unsigned int size);
static void thread_id_to_ring_id_calculate(unsigned int nr_thread, unsigned int nr_ring, unsigned int thread_id,
unsigned int qids[], unsigned int * nr_qids);
+void arp_pkt_no_ip_verify(marsio_buff_t * mr_mbuf);
struct dp_trace_output
{
@@ -498,6 +500,12 @@ static void dp_trace_decode_to_message_pack(marsio_buff_t * mr_mbuf, char ** dat
marsio_dp_trace_buffer_info_get(mr_mbuf, &trace_buff_info);
unsigned int position = 0;
+ const struct config * conf = global_config_get();
+
+ if (conf->arp_pkt_has_ip_test == 1)
+ {
+ arp_pkt_no_ip_verify(mr_mbuf);
+ }
struct timeval tv;
gettimeofday(&tv, NULL);
@@ -518,9 +526,9 @@ static void dp_trace_decode_to_message_pack(marsio_buff_t * mr_mbuf, char ** dat
mpack_write_cstr(&writer, uuid_str);
mpack_write_cstr(&writer, "sled_ip");
- if (global_config_get()->sled_ip != NULL)
+ if (conf->sled_ip != NULL)
{
- mpack_write_cstr(&writer, global_config_get()->sled_ip);
+ mpack_write_cstr(&writer, conf->sled_ip);
}
else
{
@@ -528,7 +536,7 @@ static void dp_trace_decode_to_message_pack(marsio_buff_t * mr_mbuf, char ** dat
}
mpack_write_cstr(&writer, "device_group");
- mpack_write_cstr(&writer, global_config_get()->device_group);
+ mpack_write_cstr(&writer, conf->device_group);
mpack_write_cstr(&writer, "traffic_link_id");
mpack_write_i32(&writer, trace_buff_info.traffic_link_id);
@@ -725,4 +733,45 @@ void dp_trace_ring_clear()
}
dzlog_info("The program starts and clears %u mbufs", ring_clear_cnt);
+}
+
+// During the development process, arp packets showed IP on the UI. This function is specially added to locate the
+// problem location
+void arp_pkt_no_ip_verify(marsio_buff_t * mr_mbuf)
+{
+ pcap_t * pcap_handle = NULL;
+ struct bpf_program fp = {};
+ pcap_handle = pcap_open_dead(DLT_EN10MB, 65535);
+ if (pcap_compile(pcap_handle, &fp, "arp", 0, PCAP_NETMASK_UNKNOWN) < 0)
+ {
+ dzlog_warn("fail to comple arp bpf expr");
+ return;
+ }
+
+ unsigned int packet_length = marsio_buff_buflen(mr_mbuf);
+#define BPF_CAPTURE_PACKAGE_LENGTH 256
+ unsigned char tmp_buf[BPF_CAPTURE_PACKAGE_LENGTH];
+ unsigned int need_pkt_len = BPF_CAPTURE_PACKAGE_LENGTH < packet_length ? BPF_CAPTURE_PACKAGE_LENGTH : packet_length;
+
+ struct pcap_pkthdr header = {.caplen = need_pkt_len, .len = packet_length};
+ const unsigned char * pkt = marsio_buff_mtod(mr_mbuf);
+
+ if ((pcap_offline_filter(&fp, &header, pkt) != 0))
+ {
+ // arp packet
+ struct dp_trace_buffer_telemetry trace_buff_info;
+ marsio_dp_trace_buffer_info_get(mr_mbuf, &trace_buff_info);
+
+ if (strlen(trace_buff_info.inner_src_addr_str) != 0)
+ {
+ dzlog_error("arp pkt has inner src ip:", trace_buff_info.inner_src_addr_str);
+ }
+ if (strlen(trace_buff_info.inner_dst_addr_str) != 0)
+ {
+ dzlog_error("arp pkt has inner dst ip:", trace_buff_info.inner_dst_addr_str);
+ }
+ }
+
+ pcap_freecode(&fp);
+ pcap_close(pcap_handle);
} \ No newline at end of file