diff --git a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index d45f497..968cb53 100755
--- a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -1,71 +1,273 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -176,7 +177,13 @@
  #include <sys/shm.h>
  #endif
  
++#include <unistd.h>
+ 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
++
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +217,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +685,79 @@
+ static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
+ #endif /* FEATURE_KMSG_SYSLOG */
+ 
++int g_syslog_buffer_size=8*1024;
++char g_syslog_buffer[16*1024];
++
++int syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return full_write(fd, msg, len);
++	}
++}
++
+ /* Print a message to the log file. */
+ static void log_locally(time_t now, char *msg, logFile_t *log_file)
+ {
+@@ -693,14 +774,24 @@
+ 		 * This costs almost nothing since it happens
+ 		 * _at most_ once a second for each file, and happens
+ 		 * only when each file is actually written.
+-		 */
+-		if (!now)
+-			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
++		 */		
++		if(!syslog_is_buffer_write())
++		{
++			if (!now)
++		    {
++				now = time(NULL);
++		    }   
++			if(log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;				
++			}					        
+ 		}
++		else if (access(log_file->path, F_OK) != 0)
++		{
++			syslog_close_fp_fd(log_file->fp,&(log_file->fd));   
++			goto reopen;
++		}		
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +801,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			if (log_file->fd < 0) {
+ 				/* cannot open logfile? - print to /dev/console then */
+ 				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+@@ -759,6 +848,10 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +869,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* TODO: what to do on write errors ("disk full")? */
+-	len = full_write(log_file->fd, msg, len);
++	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1068,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1096,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1189,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1198,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	if(NULL != lynq_get_value && (NULL != lynq_set_value))
++	{
++	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
++	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
++           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
++    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1292,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +275,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1314,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++
diff --git a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index d45f497..968cb53 100755
--- a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -1,71 +1,273 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -176,7 +177,13 @@
  #include <sys/shm.h>
  #endif
  
++#include <unistd.h>
+ 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
++
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +217,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +685,79 @@
+ static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
+ #endif /* FEATURE_KMSG_SYSLOG */
+ 
++int g_syslog_buffer_size=8*1024;
++char g_syslog_buffer[16*1024];
++
++int syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return full_write(fd, msg, len);
++	}
++}
++
+ /* Print a message to the log file. */
+ static void log_locally(time_t now, char *msg, logFile_t *log_file)
+ {
+@@ -693,14 +774,24 @@
+ 		 * This costs almost nothing since it happens
+ 		 * _at most_ once a second for each file, and happens
+ 		 * only when each file is actually written.
+-		 */
+-		if (!now)
+-			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
++		 */		
++		if(!syslog_is_buffer_write())
++		{
++			if (!now)
++		    {
++				now = time(NULL);
++		    }   
++			if(log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;				
++			}					        
+ 		}
++		else if (access(log_file->path, F_OK) != 0)
++		{
++			syslog_close_fp_fd(log_file->fp,&(log_file->fd));   
++			goto reopen;
++		}		
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +801,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			if (log_file->fd < 0) {
+ 				/* cannot open logfile? - print to /dev/console then */
+ 				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+@@ -759,6 +848,10 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +869,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* TODO: what to do on write errors ("disk full")? */
+-	len = full_write(log_file->fd, msg, len);
++	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1068,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1096,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1189,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1198,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	if(NULL != lynq_get_value && (NULL != lynq_set_value))
++	{
++	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
++	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
++           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
++    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1292,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +275,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1314,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++
