# 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) && NET_SOCKETS && !LOG_MODE_IMMEDIATE
	depends on POSIX_C_LANG_SUPPORT_R
	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_CONNECTION_MANAGER
	bool "Use connection manager for start and stop networking backend"
	depends on NET_CONNECTION_MANAGER
	depends on LOG_BACKEND_NET_AUTOSTART
	default y
	help
	  When enabled the connection manager will be used to start and stop
	  the networking backend. This is useful when the application
	  needs to wait for the network connection to be established before
	  starting the logging backend.

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
