From ade480d2b090e3fba952605596c9e9276e4cbd02 Mon Sep 17 00:00:00 2001 From: suvendhu Date: Mon, 16 Oct 2023 16:44:32 +0530 Subject: [PATCH] Added packet capture diagnostics --- src/diagnostic.c | 31 ++++++++++++++++++++++++++++++- src/diagnostic.h | 1 + src/session.c | 5 +++++ src/session.h | 3 ++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/diagnostic.c b/src/diagnostic.c index f1af731..49df03f 100644 --- a/src/diagnostic.c +++ b/src/diagnostic.c @@ -35,6 +35,18 @@ struct diagnostic_input { #define IPLAYER_CAPACITY_DIAG_CMD "Device.IP.Diagnostics.IPLayerCapacity()" #define NSLOOKUP_DIAG_CMD "Device.DNS.Diagnostics.NSLookupDiagnostics()" #define WIFINEIBORING_DIAG_CMD "Device.WiFi.NeighboringWiFiDiagnostic()" +#define PACKET_CAPTURE_DIAG_CMD "Device.PacketCaptureDiagnostics()" + +struct diagnostic_input packet_capture[] = { + { "Interface", "Device.PacketCaptureDiagnostics.Interface", NULL }, + { "Format", "Device.PacketCaptureDiagnostics.Format", NULL }, + { "Duration", "Device.PacketCaptureDiagnostics.Duration", NULL }, + { "PacketCount", "Device.PacketCaptureDiagnostics.PacketCount", NULL }, + { "FileTarget", "Device.PacketCaptureDiagnostics.FileTarget", NULL }, + { "FilterExpression", "Device.PacketCaptureDiagnostics.FilterExpression", NULL }, + { "Username", "Device.PacketCaptureDiagnostics.Username", NULL }, + { "Password", "Device.PacketCaptureDiagnostics.Password", NULL }, +}; struct diagnostic_input iplayer_capacity[] = { { "Interface", "Device.IP.Diagnostics.IPLayerCapacityMetrics.Interface", NULL }, @@ -191,6 +203,11 @@ void set_diagnostic_state_end_session_flag(char *parameter_name, char *value) cwmp_set_end_session(END_SESSION_NEIGBORING_WIFI_DIAGNOSTIC); return; } + + if (strcmp(parameter_name, "Device.PacketCaptureDiagnostics.DiagnosticsState") == 0) { + cwmp_set_end_session(END_SESSION_PACKETCAPTURE_DIAGNOSTIC); + return; + } } static bool set_specific_diagnostic_object_parameter_structure_value(struct diagnostic_input (*diagnostics_array)[], int number_inputs, char *parameter, char *value) @@ -218,7 +235,9 @@ bool set_diagnostic_parameter_structure_value(char *parameter_name, char *value) set_specific_diagnostic_object_parameter_structure_value(&traceroute_diagnostics, ARRAY_SIZE(traceroute_diagnostics), parameter_name, value) || set_specific_diagnostic_object_parameter_structure_value(&udpecho_diagnostics, ARRAY_SIZE(udpecho_diagnostics), parameter_name, value) || set_specific_diagnostic_object_parameter_structure_value(&serverselection_diagnostics, ARRAY_SIZE(serverselection_diagnostics), parameter_name, value) || - set_specific_diagnostic_object_parameter_structure_value(&iplayer_capacity, ARRAY_SIZE(iplayer_capacity), parameter_name, value); + set_specific_diagnostic_object_parameter_structure_value(&iplayer_capacity, ARRAY_SIZE(iplayer_capacity), parameter_name, value) || + set_specific_diagnostic_object_parameter_structure_value(&packet_capture, ARRAY_SIZE(packet_capture), parameter_name, value); + } static int cwmp_diagnostics_operate(char *command, char *command_key, struct diagnostic_input diagnostics[], int number_inputs) @@ -261,6 +280,16 @@ int cwmp_wifi_neighboring__diagnostics(void) return 0; } +int cwmp_packet_capture_diagnostics(void) +{ + if (cwmp_diagnostics_operate(PACKET_CAPTURE_DIAG_CMD, "cwmp_pack_capture_diag", packet_capture, ARRAY_SIZE(packet_capture)) == -1) + return -1; + + CWMP_LOG(INFO, "packet capture diagnostic is successfully executed"); + cwmp_main->diag_session = true; + return 0; +} + int cwmp_ip_layer_capacity_diagnostics(void) { if (cwmp_diagnostics_operate(IPLAYER_CAPACITY_DIAG_CMD, "cwmp_ip_layer_diag", iplayer_capacity, ARRAY_SIZE(iplayer_capacity)) == -1) diff --git a/src/diagnostic.h b/src/diagnostic.h index 09a0a0d..8fe6186 100644 --- a/src/diagnostic.h +++ b/src/diagnostic.h @@ -26,5 +26,6 @@ int cwmp_traceroute_diagnostics(void); int cwmp_udp_echo_diagnostics(void); int cwmp_serverselection_diagnostics(void); int cwmp_ip_layer_capacity_diagnostics(void); +int cwmp_packet_capture_diagnostics(void); #endif diff --git a/src/session.c b/src/session.c index b24e532..4607760 100644 --- a/src/session.c +++ b/src/session.c @@ -710,6 +710,11 @@ int run_session_end_func(void) cwmp_ip_layer_capacity_diagnostics(); } + if (end_session_flag & END_SESSION_PACKETCAPTURE_DIAGNOSTIC) { + CWMP_LOG(INFO, "Executing packet capture diagnostic: end session request"); + cwmp_packet_capture_diagnostics(); + } + if (cwmp_main->diag_session) { struct session_timer_event *periodic_inform_event = calloc(1, sizeof(struct session_timer_event)); periodic_inform_event->session_timer_evt.cb = cwmp_schedule_session_with_event; diff --git a/src/session.h b/src/session.h index 8898283..782916e 100644 --- a/src/session.h +++ b/src/session.h @@ -77,7 +77,8 @@ enum end_session_enum END_SESSION_SCHEDULE_DOWNLOAD = 1 << 18, END_SESSION_UPLOAD = 1 << 19, END_SESSION_SCHEDULE_INFORM = 1 << 20, - END_SESSION_CDU = 1 << 21 + END_SESSION_CDU = 1 << 21, + END_SESSION_PACKETCAPTURE_DIAGNOSTIC = 1 << 22, }; enum enum_session_status