# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

# Immediate mode cannot be used with network backend as it would cause the sent
# rsyslog message to be malformed.
config LOG_BACKEND_NET
	bool "Networking backend"
	depends on NETWORKING && (NET_UDP || NET_TCP) && !LOG_MODE_IMMEDIATE
	help
	  Send syslog messages to network server.
	  See RFC 5424 (syslog protocol) and RFC 5426 (syslog over UDP) and
	  RFC 6587 (syslog over TCP) specifications for details.

if LOG_BACKEND_NET

config LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	bool "Print structured data according to RFC 5424"
	help
	  Print additional structured data as described in
	  RFC 5424 chapter 6.3. Note that this might increase the
	  length of the syslog message a lot.

config LOG_BACKEND_NET_RFC5424_SDATA_TZKNOWN
	bool "RFC 5424 chapter 7.1.1 tzKnown field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  The tzKnown parameter indicates whether the originator knows its time zone.
	  See RFC 5424 chapter 7.1 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_ISSYNCED
	bool "RFC 5424 chapter 7.1.2 isSynced field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  The isSynced parameter indicates whether the originator is
	  synchronized to a reliable external time source, e.g., via NTP.
	  See RFC 5424 chapter 7.1 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_SOFTWARE
	bool "RFC 5424 chapter 7.2.3 software description field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  Software description parameter uniquely identifies the software that
	  generated the message.
	  See RFC 5424 chapter 7.2 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_SOFTWARE_VALUE
	string "RFC 5424 chapter 7.2.3 software field value"
	default "zephyr"
	depends on LOG_BACKEND_NET_RFC5424_SDATA_SOFTWARE
	help
	  User defined value for the software field.
	  See RFC 5424 chapter 7.2.3 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_SOFTWARE_VERSION
	bool "RFC 5424 chapter 7.2.4 software version field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  Software version parameter uniquely identifies the software that
	  generated the message.
	  See RFC 5424 chapter 7.2.4 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_SEQID
	bool "RFC 5424 chapter 7.3.1 sequence id field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  Sequence id parameter tracks the sequence in which the
	  originator submits messages to the syslog transport for sending.
	  See RFC 5424 chapter 7.3.1 for details.

config LOG_BACKEND_NET_RFC5424_SDATA_UPTIME
	bool "RFC 5424 chapter 7.3.2 system uptime field"
	depends on LOG_BACKEND_NET_RFC5424_STRUCTURED_DATA
	help
	  The system uptime parameter tracks the "time (in hundredths of a
	  second) since the network management portion of the system was last
	  re-initialized." For Zephyr this is currently interpreted as the
	  system uptime.
	  See RFC 5424 chapter 7.3.2 for details.

config LOG_BACKEND_NET_SERVER
	string "Syslog server IP address"
	help
	  This can be either IPv4 or IPv6 address.
	  Server listen UDP port number can be configured here too.
	  Following syntax is supported:
	  192.0.2.1:514
	  192.0.2.42
	  [2001:db8::1]:514
	  [2001:db8::2]
	  2001:db::42
	  If you want to use TCP, add "tcp://" in front of the address
	  like this
	  tcp://192.0.2.1:514
	  tcp://192.0.2.42
	  tcp://[2001:db8::1]:514
	  UDP is used by default if the URI is missing.

config LOG_BACKEND_NET_MAX_BUF_SIZE
	int "Max syslog message size"
	range 64 1180
	default 1180 if NET_IPV6
	default 480 if NET_IPV4
	default 256
	help
	  As each syslog message needs to fit to UDP packet, set this value
	  so that messages are not truncated.
	  The RFC 5426 recommends that for IPv4 the size is 480 octets and for
	  IPv6 the size is 1180 octets. As each buffer will use RAM, the value
	  should be selected so that typical messages will fit the buffer.

config LOG_BACKEND_NET_AUTOSTART
	bool "Automatically start networking backend"
	default y if NET_CONFIG_NEED_IPV4 || NET_CONFIG_NEED_IPV6
	help
	  When enabled automatically start the networking backend on
	  application start. If no routes to the logging server are available
	  on application startup, this must be set to n and the backend must be
	  started by the application later on. Otherwise the logging
	  thread might block.

config LOG_BACKEND_NET_USE_DHCPV4_OPTION
	bool "Use DHCPv4 Log Server Option to configure syslog server"
	depends on NET_DHCPV4
	help
	  When enabled the syslog server IP address is read from the DHCPv4
	  Log Server Option (7).

backend = NET
backend-str = net
source "subsys/logging/Kconfig.template.log_format_config"

endif # LOG_BACKEND_NET
