# ISO-TP configuration options

# Copyright (c) 2019 Alexander Wachter
# SPDX-License-Identifier: Apache-2.0

menuconfig ISOTP
	bool "ISO-TP Transport [EXPERIMENTAL]"
	depends on CAN
	select NET_BUF
	select POLL
	select EXPERIMENTAL
	help
	  Enable ISO TP support for CAN

if ISOTP

module = ISOTP
module-str = ISOTP
source "subsys/logging/Kconfig.template.log_config"

config ISOTP_WFTMAX
	int "WFTmax (Max WAIT frames before aborting)."
	default 10
	range 0 254
	help
	  This value defines the maximum number of WAIT frames before the transmission
	  is aborted.

config ISOTP_BS_TIMEOUT
	int "Bs timeout [ms] (timeout for receiving the frame control)"
	default 1000
	range 200 10000
	help
	  Timeout for the reception of the next FC frame. ISO 15765-2: 1000ms

config ISOTP_A_TIMEOUT
	int "Ar and As timeout [ms] (sending and receiving timeout)"
	default 1000
	range 200 10000
	help
	  As (sender transmit timeout) and Ar (receiver transmit timeout).
	  ISO 15765-2: 1000ms

config ISOTP_CR_TIMEOUT
	int "Cr timeout [ms] (timeout for consecutive frames)"
	default 1000
	range 200 10000
	help
	  Cr (receiver consecutive frame) timeout.
	  ISO 15765-2: 1000ms

config ISOTP_REQUIRE_RX_PADDING
	bool "Require padding for received messages"
	help
	  If enabled, SFs, FCs and the last CF must always have a DLC of 8 bytes
	  (for classic CAN) and unused bytes must be padded by the sending
	  device. This setting allows to be compliant to AUTOSAR Specification
	  of CAN Transport Layer.

	  By default, received CAN frames with or without padding are accepted.

config ISOTP_ENABLE_TX_PADDING
	bool "Padding for transmitted messages"
	default y if ISOTP_REQUIRE_RX_PADDING
	help
	  Add padding bytes 0xCC (as recommended by Bosch) if the PDU payload
	  does not fit exactly into the CAN frame.

config ISOTP_RX_BUF_COUNT
	int "Number of data buffers for receiving data"
	default 4
	help
	  Each data buffer will occupy ISOTP_RX_BUF_SIZE + smallish
	  header (sizeof(struct net_buf)) amount of data.

config ISOTP_RX_BUF_SIZE
	int "Size of one buffer data block"
	default 63 if CAN_FD_MODE
	default 56
	help
	  This value defines the size of a single block in the pool. The number of
	  blocks is given by ISOTP_RX_BUF_COUNT. To be efficient use a multiple of
	  CAN_MAX_DLEN - 1 (for classic CAN : 8 - 1 = 7, for CAN-FD : 64 - 1 = 63).

config ISOTP_RX_SF_FF_BUF_COUNT
	int "Number of SF and FF data buffers for receiving data"
	default 4
	help
	  This buffer is used for first and single frames. It is extra because the
	  buffer has to be ready for the first reception in isr context and therefor
	  is allocated when binding.
	  Each buffer will occupy CAN_MAX_DLEN - 1 byte + header (sizeof(struct net_buf))
	  amount of data.

config ISOTP_USE_TX_BUF
	bool "Buffer tx writes"
	help
	  Copy the outgoing data to a net buffer so that the calling function
	  can discard the data.

if ISOTP_USE_TX_BUF

config ISOTP_TX_BUF_COUNT
	int "Number of data buffers for sending data"
	default 4
	help
	  Each data buffer will occupy CONFIG_NET_BUF_DATA_SIZE + smallish
	  header (sizeof(struct net_buf)) amount of data. If context buffers
	  are used, use the same size here.

config ISOTP_BUF_TX_DATA_POOL_SIZE
	int "Size of the memory pool where buffers are allocated from"
	default 256
	help
	  This value defines the size of the memory pool where the buffers
	  for sending are allocated from.

endif # ISOTP_USE_TX_BUF

config ISOTP_ENABLE_CONTEXT_BUFFERS
	bool "Buffered tx contexts"
	default y
	help
	  This option enables buffered sending contexts. This makes send and
	  forget possible. A memory slab is used to buffer the context.

config ISOTP_TX_CONTEXT_BUF_COUNT
	int "Amount of context buffers for sending data"
	default 4
	depends on ISOTP_ENABLE_CONTEXT_BUFFERS
	help
	  This defines the size of the memory slab where the buffers are
	  allocated from.

config ISOTP_CUSTOM_FIXED_ADDR
	bool "Use fixed address not compatible with SAE J1939"
	default n
	help
	  This option allow to use an alternative CAN frame id format.
	  If not set ISO-TP fixed addressing use SAE J1939 standard.

menu "Fixed address definition"
	visible if ISOTP_CUSTOM_FIXED_ADDR

config ISOTP_FIXED_ADDR_SA_POS
	int "Position of fixed source address (SA)"
	default 0
	help
	  Source address position in bits.

config ISOTP_FIXED_ADDR_SA_MASK
	hex "Mask to obtain fixed source address (SA)"
	default 0xFF
	help
	  Source address mask.

config ISOTP_FIXED_ADDR_TA_POS
	int "Position of fixed target address (TA)"
	default 8
	help
	  Target address position in bits.

config ISOTP_FIXED_ADDR_TA_MASK
	hex "Mask to obtain fixed target address (TA)"
	default 0xFF00
	help
	  Target address mask.

config ISOTP_FIXED_ADDR_PRIO_POS
	int "Position of priority in fixed addressing mode"
	default 26
	help
	  Priority address position in bits.

config ISOTP_FIXED_ADDR_PRIO_MASK
	hex "Mask for priority in fixed addressing mode"
	default 0x1C000000
	help
	  Priority address mask.

config ISOTP_FIXED_ADDR_RX_MASK
	hex "CAN filter RX mask to match any priority and source address (SA)"
	default 0x03FFFF00
	help
	  CAN filter RX mask

endmenu

endif # ISOTP
