# Copyright (c) 2016 Intel Corporation.
# SPDX-License-Identifier: Apache-2.0

menuconfig NET_MGMT
	bool "Network Management API"
	help
	  Add support for NM API that enables managing different aspects
	  of the network stack as well as receiving notification on network
	  events (ip address change, iface up and running ...).

config NET_MGMT_EVENT
	bool "Add support for runtime network event notifications"
	depends on NET_MGMT
	help
	  This adds support for the stack to notify events towards any
	  relevant listener. This can be necessary when application
	  (or else) needs to be notified on a specific network event
	  (ip address change for instance) to trigger some related work.

if NET_MGMT_EVENT

choice NET_MGMT_EVENT_WORKER
	prompt "Network event scheduling"
	default NET_MGMT_EVENT_THREAD

config NET_MGMT_EVENT_THREAD
	bool "Separate network events thread"
	help
	  Create a dedicated thread for network event callback handlers.
	  If NET_MGMT_EVENT_INFO is enabled the data will be copied to
	  a message queue.

config NET_MGMT_EVENT_SYSTEM_WORKQUEUE
	bool "System work queue"
	help
	  Submit work to the system work queue to schedule calling network
	  event callback handlers.
	  If NET_MGMT_EVENT_INFO is enabled the data will be copied to
	  a message queue.

config NET_MGMT_EVENT_DIRECT
	bool "Trigger callback on event emit"
	help
	  Call network event handlers when the event is emitted.
	  If NET_MGMT_EVENT_INFO is enabled a data pointer is passed to
	  callback handlers, no info data is copied.

endchoice

config NET_MGMT_EVENT_QUEUE
	bool
	default y
	depends on NET_MGMT_EVENT_THREAD || NET_MGMT_EVENT_SYSTEM_WORKQUEUE
	help
	  Hidden option to enable the network event's queue if asynchronous
	  callbacks are done.

config NET_MGMT_EVENT_STACK_SIZE
	int "Stack size for the inner thread handling event callbacks"
	default 4200 if WIFI_NM_WPA_SUPPLICANT
	default 2048 if COVERAGE_GCOV
	default 840 if X86
	default 800 if THREAD_LOCAL_STORAGE
	default 768
	depends on NET_MGMT_EVENT_THREAD
	help
	  Set the internal stack size for NM to run registered callbacks
	  on events.

config NET_MGMT_EVENT_QUEUE_SIZE
	int "Size of event queue"
	default 16 if NET_MGMT_EVENT_MONITOR
	default 5
	range 1 1024
	depends on NET_MGMT_EVENT_QUEUE
	help
	  Numbers of events which can be queued at same time. Note that if a
	  3rd event comes in, the first will be removed without generating any
	  notification. Thus the size of this queue has to be tweaked depending
	  on the load of the system, planned for the usage.

config NET_MGMT_EVENT_QUEUE_TIMEOUT
	int "Timeout for event queue"
	default 10
	range 1 10000
	depends on NET_MGMT_EVENT_QUEUE
	help
	  Timeout in milliseconds for the event queue. This timeout is used to
	  wait for the queue to be available.

config NET_MGMT_EVENT_INFO
	bool "Passing information along with an event"
	help
	  Event notifier will be able to provide information to an event,
	  and listeners will then be able to get it. Such information depends
	  on the type of event.

config NET_MGMT_EVENT_MONITOR
	bool "Monitor network events from net shell"
	depends on NET_SHELL && NET_MGMT_EVENT_INFO
	help
	  Allow user to monitor network events from net shell using
	  "net events [on|off]" command. The monitoring is disabled by
	  default. Note that you should probably increase the value of
	  NET_MGMT_EVENT_QUEUE_SIZE from the default in order not to miss
	  any events.

config NET_MGMT_EVENT_MONITOR_STACK_SIZE
	int "Size of the stack allocated for the event_mon_stack thread"
	depends on NET_MGMT_EVENT_MONITOR
	default 1024
	help
	  Sets the size of the stack for event_mon_stack_thread.

config NET_MGMT_EVENT_MONITOR_AUTO_START
	bool "Start the event monitor automatically at boot"
	depends on NET_MGMT_EVENT_MONITOR && SHELL_BACKEND_SERIAL
	help
	  Allow user to start monitoring network events automatically
	  when the system starts. The auto start is disabled by default.
	  The default UART based shell is used to print data.

module = NET_MGMT_EVENT
module-dep = NET_LOG
module-str = Log level for network management event core
module-help = Enable debug messages output for network management events.
source "subsys/net/Kconfig.template.log_config.net"

config NET_DEBUG_MGMT_EVENT_STACK
	bool "Stack analysis output on Net MGMT event core"
	select INIT_STACKS
	depends on NET_MGMT_EVENT_THREAD
	help
	  Add debug messages output on how much Net MGMT event stack is used.

config NET_MGMT_THREAD_PRIO_CUSTOM
	bool "Customize net mgmt thread priority"

if NET_MGMT_THREAD_PRIO_CUSTOM
config NET_MGMT_THREAD_PRIORITY
	int "Priority of net_mgmt thread"
	default NUM_PREEMPT_PRIORITIES

endif # NET_MGMT_THREAD_PRIO_CUSTOM

endif # NET_MGMT_EVENT
