From patchwork Wed Feb 26 20:48:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1245325 X-Patchwork-Delegate: sjg@chromium.org Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=LaEADKvE; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48SSbC5wqfz9sPK for ; Thu, 27 Feb 2020 07:49:27 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1358880EC2; Wed, 26 Feb 2020 21:48:48 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="LaEADKvE"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3550D80396; Wed, 26 Feb 2020 21:48:33 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 9C84380396 for ; Wed, 26 Feb 2020 21:48:26 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1582750105; bh=vW65iJ2f8m1nr89ith/jRraIebQJ4IWaZRIsocPCNXE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=LaEADKvE0Zw17D/cbtmtTKaP8JuzxW020rPFvxtrIr2ie+9zwWakGluhpjn5/hui3 09gScZa//G2RN+ibt2SEO2iI97zIQYq+PaHFLQSYWKnfLkYRAZLw6Q+uyGSkS/dNS/ jzHMIpKFrUl3y/JHy4/uTZQ7pyGmGPEwHGOHOS5o= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.160]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MF3HU-1jDfJR1h6W-00FRxV; Wed, 26 Feb 2020 21:48:25 +0100 From: Heinrich Schuchardt To: Simon Glass Cc: Bin Meng , Sean Anderson , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH v5 2/6] log: syslog driver Date: Wed, 26 Feb 2020 21:48:16 +0100 Message-Id: <20200226204820.17376-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200226204820.17376-1-xypron.glpk@gmx.de> References: <20200226204820.17376-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:z8kp7oRiCeSy0ZiWAfIRyL+1sWJY9nJswXpwfwNjqAhZopf3T6X VPUxPVFZ9cSMY3jfTryWgW0XklSQANKTa2M2P8sKOiXEqfJB4Y9oKCk53AVE+7RVvuyDZba tDRRvjzPKWbdcM/xgBvvfwga54BZE8QSeprHr/aMOyvINniUW/Trl6hI8R/QpKugqBAUi7H gzVs4gB1De+ZpYb7sKBCQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:slmoQJV+2kM=:OyNRfs5NvsM18zzs0h1Jx5 FsumrNUVSQgu9+vO1i/YKD+lGo3Q8+4JxTxAfGFmQj9jp9CWMT0IcCpE5uGf1mQHNza+bhVVM PeLAjKjLA92ErDmmOhGxSgE/Z0Rp1415qptI/ioIfHAiSVLE7eYNkeiZh4JmJ9XT4/ahR8p0I oMRpxwBuAKfZ1hg1yeEfk0JKx1jtMh+nEjKqQg4kfUaDKCzuC+qYj30xqT1n6dZEgddJqFovG 5tJzZ1wgtsR5yOqwCfVs4JkJufmtvNsRw6Um8vQS8Rk6XF9rlzIFZOLhWSgYLFXhpQTcvSmb1 hjOz4g9nNa3RNRw9rbZfl8ktyuYFOl56lNE6rZ3HDnTRbCeKYixedtoWGh07GBvZOQIEAUATJ YoBt0IsuT3ZD5Xd3NsOlcqegJh2QXoHu/L93iu4qm414YbFg1RHoiNd7zk8+625xyu9rVqCcg MP438YcwPGOIFWtVnLbL81+v0wzexUlWi1sbWE+wO8ThJdf4acLXxOyPGHeR+l54jP8LhWe0j lY1FMj0td8tOEdzOCQScZKceY05wx5YctHo+UqP6+kt6pmG7fIMMKZmN/lEJzFgz++iw4VtR7 V1AVbrj02OzifVHdEGkS6Z+5WF3Gjj4AQYLcam3tKG3ojWjVgjnZrK9MZMMH3LOGmPOb/1FAn xR3FTCqqsn6FjXmptQc8wcAIdmQxN5jr/ATWgDFf4+49VUdyg+mfU2jo+w09el4msF03E955/ v/H6W3aG2F+Y0Hmo9LLxjiR8fks8ZyRs5UQb2J2STdtojm14NcIlHOeHajK+pkgm3d/7cMhux Pa0tTZiGet3JO+ixUubnxc4QuoJ36oNsibaAuj2snQJ4VKD6Xera9y+zByic/D8QF/3D1jzvL CraZNj6s5rpmiNH85eslLObK8PSaU7xMJHluXcozNqXNEqUH0L2STnrRih2w8zJd5HtmBR68O RRilVBt4Yo84x4Hs31+9GC5QXRuoQG/y36vJVOVbVwueIcFey/4jmw+zd6rAtxL0CIiJlLqVn QGcdBGrQyG/L7RKIDYKCkhBX4DXs5GlkHifnINWxqQdiTxxQ1UN3ZRqhDhPynHbtQ6Bpuwn8H 6cKMRid1unl4vT+D3vBHDIJN6MBwFF16FtgZlO/qhGG448SBdDlKR2eekBkmGt3xoYK/rffFN PvNmicMXBTDhU6dfSHZbyI5LmXUWUfh3ZR4Z9IyouKxrD/AJ+BrAVXtsRfyDKblGBJAbH4DaY Al7SoRUzfROaIvVnR X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Provide a log driver that broadcasts RFC 3164 messages to syslog servers. rsyslog is one implementation of such a server. The messages are sent to the local broadcast address 255.255.255.255 on port 514. The environment variable log_hostname can be used to provide the HOSTNAME field for the messages. The optional TIMESTAMP field of RFC 3164 is not provided. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass Reviewed-by: Simon Glass --- v5: do not build syslog driver in SPL v4: no change --- MAINTAINERS | 2 +- common/Kconfig | 7 +++ common/Makefile | 1 + common/log_syslog.c | 117 ++++++++++++++++++++++++++++++++++++++++++++ doc/README.log | 3 ++ 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 common/log_syslog.c -- 2.25.0 diff --git a/MAINTAINERS b/MAINTAINERS index 1842569f24..c1ff620c4a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -631,7 +631,7 @@ LOGGING M: Simon Glass S: Maintained T: git https://gitlab.denx.de/u-boot/u-boot.git -F: common/log.c +F: common/log* F: cmd/log.c F: test/log/log_test.c F: test/py/tests/test_log.py diff --git a/common/Kconfig b/common/Kconfig index cedd353e89..af0a009a8e 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -774,6 +774,13 @@ config TPL_LOG_CONSOLE log message is shown - other details like level, category, file and line number are omitted. +config LOG_SYSLOG + bool "Log output to syslog server" + depends on LOG && NET + help + Enables a log driver which broadcasts log records via UDP port 514 + to syslog servers. + config LOG_TEST bool "Provide a test for logging" depends on LOG && UNIT_TEST diff --git a/common/Makefile b/common/Makefile index 896e4af91d..dd54118091 100644 --- a/common/Makefile +++ b/common/Makefile @@ -131,6 +131,7 @@ obj-$(CONFIG_DFU_OVER_USB) += dfu.o obj-y += command.o obj-$(CONFIG_$(SPL_TPL_)LOG) += log.o obj-$(CONFIG_$(SPL_TPL_)LOG_CONSOLE) += log_console.o +obj-$(CONFIG_$(SPL_TPL_)LOG_SYSLOG) += log_syslog.o obj-y += s_record.o obj-$(CONFIG_CMD_LOADB) += xyzModem.o obj-$(CONFIG_$(SPL_TPL_)YMODEM_SUPPORT) += xyzModem.o diff --git a/common/log_syslog.c b/common/log_syslog.c new file mode 100644 index 0000000000..5e3e20e8a4 --- /dev/null +++ b/common/log_syslog.c @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Log to syslog. + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define BUFFER_SIZE 480 + +static void append(char **buf, char *buf_end, const char *fmt, ...) +{ + va_list args; + size_t size = buf_end - *buf; + + va_start(args, fmt); + vsnprintf(*buf, size, fmt, args); + va_end(args); + *buf += strlen(*buf); +} + +static int log_syslog_emit(struct log_device *ldev, struct log_rec *rec) +{ + int ret; + int fmt = gd->log_fmt; + char msg[BUFFER_SIZE]; + char *msg_end = msg + BUFFER_SIZE; + char *ptr = msg; + char *iphdr; + char *log_msg; + int eth_hdr_size; + struct in_addr bcast_ip; + static int processing_msg; + unsigned int log_level; + char *log_hostname; + + /* Fend off messages from the network stack while writing a message */ + if (processing_msg) + return 0; + + processing_msg = 1; + + /* Setup packet buffers */ + net_init(); + /* Disable hardware and put it into the reset state */ + eth_halt(); + /* Set current device according to environment variables */ + eth_set_current(); + /* Get hardware ready for send and receive operations */ + ret = eth_init(); + if (ret < 0) { + eth_halt(); + goto out; + } + + memset(msg, 0, BUFFER_SIZE); + + /* Set ethernet header */ + eth_hdr_size = net_set_ether((uchar *)ptr, net_bcast_ethaddr, PROT_IP); + ptr += eth_hdr_size; + iphdr = ptr; + ptr += IP_UDP_HDR_SIZE; + log_msg = ptr; + + /* + * The syslog log levels defined in RFC 5424 match the U-Boot ones up to + * level 7 (debug). + */ + log_level = rec->level; + if (log_level > 7) + log_level = 7; + /* Leave high bits as 0 to write a 'kernel message' */ + + /* Write log message to buffer */ + append(&ptr, msg_end, "<%u>", log_level); + log_hostname = env_get("log_hostname"); + if (log_hostname) + append(&ptr, msg_end, "%s ", log_hostname); + append(&ptr, msg_end, "uboot: "); + if (fmt & (1 << LOGF_LEVEL)) + append(&ptr, msg_end, "%s.", + log_get_level_name(rec->level)); + if (fmt & (1 << LOGF_CAT)) + append(&ptr, msg_end, "%s,", + log_get_cat_name(rec->cat)); + if (fmt & (1 << LOGF_FILE)) + append(&ptr, msg_end, "%s:", rec->file); + if (fmt & (1 << LOGF_LINE)) + append(&ptr, msg_end, "%d-", rec->line); + if (fmt & (1 << LOGF_FUNC)) + append(&ptr, msg_end, "%s()", rec->func); + if (fmt & (1 << LOGF_MSG)) + append(&ptr, msg_end, "%s%s", + fmt != (1 << LOGF_MSG) ? " " : "", rec->msg); + /* Consider trailing 0x00 */ + ptr++; + + debug("log message: '%s'\n", log_msg); + + /* Broadcast message */ + bcast_ip.s_addr = 0xFFFFFFFFL; + net_set_udp_header((uchar *)iphdr, bcast_ip, 514, 514, ptr - log_msg); + net_send_packet((uchar *)msg, ptr - msg); + +out: + processing_msg = 0; + return ret; +} + +LOG_DRIVER(syslog) = { + .name = "syslog", + .emit = log_syslog_emit, +}; diff --git a/doc/README.log b/doc/README.log index 19856d43da..1057981f45 100644 --- a/doc/README.log +++ b/doc/README.log @@ -147,7 +147,10 @@ several possible determinations for logging information, all of which can be enabled or disabled independently: console - goes to stdout + syslog - broadcast RFC 3164 messages to syslog servers on UDP port 514 +The syslog driver sends the value of environmental variable 'log_hostname' as +HOSTNAME if available. Log format ----------