summaryrefslogtreecommitdiffstats
path: root/src/plugins/sc_plugins.c
diff options
context:
space:
mode:
authorJunfeng Wang <Drenfong.Wang@intel.com>2019-04-16 04:42:12 +0000
committerHongjun Ni <hongjun.ni@intel.com>2019-04-23 07:38:05 +0000
commit29d2d586b9dfdd7776e42fefbe2b049de49dc009 (patch)
treea838a308882f54015080baad3df778faed74575d /src/plugins/sc_plugins.c
parent21698aac5f4771f40f4a57eddcd5f5e3d24b0fd7 (diff)
check vpp health and if found vpp is down/restart, will reconnect vpp
Change-Id: I7c38d351b8016f51671a94f18ade44ef966acc04 Signed-off-by: Junfeng Wang <Drenfong.Wang@intel.com>
Diffstat (limited to 'src/plugins/sc_plugins.c')
-rw-r--r--src/plugins/sc_plugins.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/plugins/sc_plugins.c b/src/plugins/sc_plugins.c
index 4dc6751..0a36afb 100644
--- a/src/plugins/sc_plugins.c
+++ b/src/plugins/sc_plugins.c
@@ -15,6 +15,51 @@
#include "sc_plugins.h"
#include "sc_model.h"
+#include <dirent.h>
+
+static int vpp_pid_start;
+
+/* get vpp pid in system */
+int get_vpp_pid()
+{
+ DIR *dir;
+ struct dirent *ptr;
+ FILE *fp;
+ char filepath[50];
+ char filetext[20];
+
+ dir = opendir("/proc");
+ int vpp_pid = 0;
+ /* read vpp pid file in proc, return pid of vpp */
+ if (NULL != dir)
+ {
+ while (NULL != (ptr =readdir(dir)))
+ {
+ if ((0 == strcmp(ptr->d_name, ".")) || (0 == strcmp(ptr->d_name, "..")))
+ continue;
+
+ if (DT_DIR != ptr->d_type)
+ continue;
+
+ sprintf(filepath, "/proc/%s/cmdline",ptr->d_name);
+ fp = fopen(filepath, "r");
+
+ if (NULL != fp)
+ {
+ fread(filetext, 1, 13, fp);
+ filetext[12] = '\0';
+
+ if (filetext == strstr(filetext, "/usr/bin/vpp"))
+ vpp_pid = atoi(ptr->d_name);
+
+ fclose(fp);
+ }
+ }
+ closedir(dir);
+ }
+ return vpp_pid;
+}
+
int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx)
{
@@ -38,7 +83,8 @@ int sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx)
/* set subscription as our private context */
*private_ctx = plugin_main.subscription;
-
+ /* get the vpp pid sweetcomb connected, we assumed that only one vpp is run in system */
+ vpp_pid_start = get_vpp_pid();
return SR_ERR_OK;
}
@@ -53,3 +99,18 @@ void sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx)
SRP_LOG_DBG_MSG("plugin disconnect vpp ok.");
}
+int sr_plugin_health_check_cb(sr_session_ctx_t *session, void *private_ctx)
+{
+ /* health check, will use shell to detect vpp when plugin is loaded */
+ /* health_check will run every 10 seconds in loop*/
+ int vpp_pid_now = get_vpp_pid();
+
+ if(vpp_pid_now == vpp_pid_start)
+ {
+ return SR_ERR_OK;
+ }
+ else
+ {
+ return -1;
+ }
+}