# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2007-2019  B.A.T.M.A.N. contributors:
#
# Marek Lindner, Simon Wunderlich

#
# B.A.T.M.A.N meshing protocol
#

config BATMAN_ADV
	tristate "B.A.T.M.A.N. Advanced Meshing Protocol"
	depends on NET
	select LIBCRC32C
	help
	  B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
	  a routing protocol for multi-hop ad-hoc mesh networks. The
	  networks may be wired or wireless. See
	  https://www.open-mesh.org/ for more information and user space
	  tools.

config BATMAN_ADV_BATMAN_V
	bool "B.A.T.M.A.N. V protocol"
	depends on BATMAN_ADV && !(CFG80211=m && BATMAN_ADV=y)
	default y
	help
	  This option enables the B.A.T.M.A.N. V protocol, the successor
	  of the currently used B.A.T.M.A.N. IV protocol. The main
	  changes include splitting of the OGM protocol into a neighbor
	  discovery protocol (Echo Location Protocol, ELP) and a new OGM
	  Protocol OGMv2 for flooding protocol information through the
	  network, as well as a throughput based metric.
	  B.A.T.M.A.N. V is currently considered experimental and not
	  compatible to B.A.T.M.A.N. IV networks.

config BATMAN_ADV_BLA
	bool "Bridge Loop Avoidance"
	depends on BATMAN_ADV && INET
	select CRC16
	default y
	help
	  This option enables BLA (Bridge Loop Avoidance), a mechanism
	  to avoid Ethernet frames looping when mesh nodes are connected
	  to both the same LAN and the same mesh. If you will never use
	  more than one mesh node in the same LAN, you can safely remove
	  this feature and save some space.

config BATMAN_ADV_DAT
	bool "Distributed ARP Table"
	depends on BATMAN_ADV && INET
	default y
	help
	  This option enables DAT (Distributed ARP Table), a DHT based
	  mechanism that increases ARP reliability on sparse wireless
	  mesh networks. If you think that your network does not need
	  this option you can safely remove it and save some space.

config BATMAN_ADV_NC
	bool "Network Coding"
	depends on BATMAN_ADV
	help
	  This option enables network coding, a mechanism that aims to
	  increase the overall network throughput by fusing multiple
	  packets in one transmission.
	  Note that interfaces controlled by batman-adv must be manually
	  configured to have promiscuous mode enabled in order to make
	  network coding work.
	  If you think that your network does not need this feature you
	  can safely disable it and save some space.

config BATMAN_ADV_MCAST
	bool "Multicast optimisation"
	depends on BATMAN_ADV && INET && !(BRIDGE=m && BATMAN_ADV=y)
	default y
	help
	  This option enables the multicast optimisation which aims to
	  reduce the air overhead while improving the reliability of
	  multicast messages.

config BATMAN_ADV_DEBUGFS
	bool "batman-adv debugfs entries"
	depends on BATMAN_ADV
	depends on DEBUG_FS
	help
	  Enable this to export routing related debug tables via debugfs.
	  The information for each soft-interface and used hard-interface can be
	  found under batman_adv/

	  If unsure, say N.

config BATMAN_ADV_DEBUG
	bool "B.A.T.M.A.N. debugging"
	depends on BATMAN_ADV
	help
	  This is an option for use by developers; most people should
	  say N here. This enables compilation of support for
	  outputting debugging information to the debugfs log or tracing
	  buffer. The output is controlled via the batadv netdev specific
	  log_level setting.

config BATMAN_ADV_SYSFS
	bool "batman-adv sysfs entries"
	depends on BATMAN_ADV
	default y
	help
	  Say Y here if you want to enable batman-adv device configuration and
	  status interface through sysfs attributes. It is replaced by the
	  batadv generic netlink family but still used by various userspace
	  tools and scripts.

	  If unsure, say Y.

config BATMAN_ADV_TRACING
	bool "B.A.T.M.A.N. tracing support"
	depends on BATMAN_ADV
	depends on EVENT_TRACING
	help
	  This is an option for use by developers; most people should
	  say N here. Select this option to gather traces like the debug
	  messages using the generic tracing infrastructure of the kernel.
	  BATMAN_ADV_DEBUG must also be selected to get trace events for
	  batadv_dbg.
