obmc-console: syslog handler support high precise timestamp

Add syslog_ts_high_precision configuration for syslog handler to support
syslog timestamp accurate to 100ms.

Tested:
run command
for i in {1..10}; do echo test ${i}; usleep 200000; done
high precise timestamp enabled get log as following in different seconds
```
Nov 13 16:53:41.395962 mvt19-nfd11.prod.google.com n1[20712]: test 1
Nov 13 16:53:41.567652 mvt19-nfd11.prod.google.com n1[20712]: test 2
Nov 13 16:53:41.826274 mvt19-nfd11.prod.google.com n1[20712]: test 3
Nov 13 16:53:41.998670 mvt19-nfd11.prod.google.com n1[20712]: test 4
Nov 13 16:53:42.171093 mvt19-nfd11.prod.google.com n1[20712]: test 5
Nov 13 16:53:42.429577 mvt19-nfd11.prod.google.com n1[20712]: test 6
Nov 13 16:53:42.602563 mvt19-nfd11.prod.google.com n1[20712]: test 7
Nov 13 16:53:42.774245 mvt19-nfd11.prod.google.com n1[20712]: test 8
Nov 13 16:53:43.032813 mvt19-nfd11.prod.google.com n1[20712]: test 9
Nov 13 16:53:43.207131 mvt19-nfd11.prod.google.com n1[20712]: test 10
```

w/o enable it get log as following in one second
```
Nov 13 16:53:54.875536 mvt19-nfd11.prod.google.com n2[20682]: test 1
Nov 13 16:53:54.875570 mvt19-nfd11.prod.google.com n2[20682]: test 2
Nov 13 16:53:54.875611 mvt19-nfd11.prod.google.com n2[20682]: test 3
Nov 13 16:53:54.875640 mvt19-nfd11.prod.google.com n2[20682]: test 4
Nov 13 16:53:54.875668 mvt19-nfd11.prod.google.com n2[20682]: test 5
Nov 13 16:53:54.875695 mvt19-nfd11.prod.google.com n2[20682]: test 6
Nov 13 16:53:54.875722 mvt19-nfd11.prod.google.com n2[20682]: test 7
Nov 13 16:53:54.875754 mvt19-nfd11.prod.google.com n2[20682]: test 8
Nov 13 16:53:54.875781 mvt19-nfd11.prod.google.com n2[20682]: test 9
Nov 13 16:53:54.875807 mvt19-nfd11.prod.google.com n2[20682]: test 10
```

http://fusion2/bad995d8-fbac-3e16-935c-4d16829860d0

Google-Bug-Id: 330467754
Change-Id: Id46b85ef7c60dc26942e5a5da277d1fc22b6da06
Signed-off-by: Dan Zhang <zhdaniel@google.com>
diff --git a/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch b/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
index 53715a2..775df9e 100644
--- a/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
+++ b/recipes-phosphor/console/obmc-console/0001-Add-syslog-handler.patch
@@ -1,7 +1,7 @@
-From c1c9e1e782bac752adb9ae7ed4c930d17db933be Mon Sep 17 00:00:00 2001
+From 509ae06211e5ccae426b7d1c997779fc857328b1 Mon Sep 17 00:00:00 2001
 From: Dan Zhang <zhdaniel@google.com>
 Date: Mon, 20 May 2024 22:02:21 +0000
-Subject: [PATCH 1/2] Add syslog-handler
+Subject: [PATCH 1/3] Add syslog-handler
 
 Log the console data to syslog when syslogid configured.
 Will buffer small piece of data to avoid overwhelming the syslog with
@@ -15,8 +15,8 @@
 Signed-off-by: Dan Zhang <zhdaniel@google.com>
 ---
  meson.build      |   1 +
- syslog-handler.c | 215 +++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 216 insertions(+)
+ syslog-handler.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 228 insertions(+)
  create mode 100644 syslog-handler.c
 
 diff --git a/meson.build b/meson.build
@@ -33,10 +33,10 @@
             c_args: [
 diff --git a/syslog-handler.c b/syslog-handler.c
 new file mode 100644
-index 0000000..a410dae
+index 0000000..7d1603f
 --- /dev/null
 +++ b/syslog-handler.c
-@@ -0,0 +1,215 @@
+@@ -0,0 +1,227 @@
 +/**
 + * Copyright © 2024 Google
 + *
@@ -73,15 +73,18 @@
 +
 +/* syslog data buffering size threshold 1KB */
 +#define SYSLOG_HANDLER_BUF_SIZE_THRESHOLD 1024
-+/* syslog data buffering time threshold 1s */
-+#define SYSLOG_HANDLER_BUF_TIME_THRESHOLD_SEC 1
 +
 +#define min(a, b) ((a) < (b) ? (a) : (b))
 +
-+static struct timeval const syslog_handler_timeout = {
-+	.tv_sec = SYSLOG_HANDLER_BUF_TIME_THRESHOLD_SEC,
++static struct timeval const syslog_ts_low_precision = {
++	.tv_sec = 1,
 +	.tv_usec = 0,
 +};
++static struct timeval const syslog_ts_high_precision = {
++	.tv_sec = 0,
++	.tv_usec = 100000, /* 100 ms */
++};
++static struct timeval const *syslog_handler_timeout = &syslog_ts_low_precision;
 +
 +struct syslog_handler {
 +	struct handler handler;
@@ -152,7 +155,8 @@
 +	}
 +}
 +
-+static enum ringbuffer_poll_ret syslog_ringbuffer_poll(void *arg, size_t force_len)
++static enum ringbuffer_poll_ret syslog_ringbuffer_poll(void *arg,
++						       size_t force_len)
 +{
 +	struct syslog_handler *lh = arg;
 +	size_t len;
@@ -168,7 +172,7 @@
 +		/* Buffer the console data unitl more than 1K or idle 1 second
 +		 to push the data to syslog */
 +		console_poller_set_timeout(lh->console, lh->poller,
-+					   &syslog_handler_timeout);
++					   syslog_handler_timeout);
 +		return RINGBUFFER_POLL_OK;
 +	}
 +	syslog_drain_queue(lh, len);
@@ -199,6 +203,7 @@
 +{
 +	struct syslog_handler *lh = to_syslog_handler(handler);
 +	const char *syslogid;
++	const char *ts_high_precision;
 +
 +	lh->console = console;
 +	lh->poller = NULL;
@@ -212,6 +217,13 @@
 +		return -1;
 +	}
 +
++	syslog_handler_timeout = &syslog_ts_low_precision;
++	ts_high_precision =
++		config_get_value(config, "syslog_ts_high_precision");
++	if (ts_high_precision && !strcasecmp(ts_high_precision, "true")) {
++		syslog_handler_timeout = &syslog_ts_high_precision;
++	}
++
 +	/* regsiter console_poller used for timeout only so create a dummy pipe */
 +	if (pipe(lh->pipefd) == -1) {
 +		warn("syslog handler create pipe failed");
@@ -225,8 +237,8 @@
 +					     accum_timeout, lh->pipefd[0], 0,
 +					     NULL);
 +
-+	lh->rbc = console_ringbuffer_consumer_register(console,
-+						       syslog_ringbuffer_poll, lh);
++	lh->rbc = console_ringbuffer_consumer_register(
++		console, syslog_ringbuffer_poll, lh);
 +
 +	return 0;
 +}
@@ -253,5 +265,5 @@
 +
 +console_handler_register(&syslog_handler.handler);
 -- 
-2.45.1.288.g0e0cd299f1-goog
+2.47.0.338.g60cca15819-goog