# Bluetooth Object Transfer service

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

config BT_OTS
	bool "Object Transfer Service (OTS) [EXPERIMENTAL]"
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_GATT_DYNAMIC_DB
	select BT_SMP
	select EXPERIMENTAL
	help
	  Enable Object Transfer Service.

if BT_OTS

config BT_OTS_DIR_LIST_OBJ
	bool "The Directory Listing Object"
	help
	  Enables the Directory Listing Object, which is an object that contains all the metadata
	  from all other objects, for easy exposure to a client. Enabling this will use one of the
	  objects given by BT_OTS_MAX_OBJ_CNT.

config BT_OTS_DIR_LIST_OBJ_NAME
	string "The object name of the Directory Listing Object"
	default "Directory"
	depends on BT_OTS_DIR_LIST_OBJ
	help
	  The name of the Directory Listing Object when it is read by a client.

config BT_OTS_MAX_INST_CNT
	int "Maximum number of available OTS instances"
	default 1
	range 1 1 if !BT_OTS_SECONDARY_SVC

config BT_OTS_SECONDARY_SVC
	bool "Register OTS as Secondary Service"

config BT_OTS_OACP_CREATE_SUPPORT
	bool "Support OACP Create Operation"
	depends on BT_OTS_OACP_WRITE_SUPPORT
	depends on BT_OTS_OBJ_NAME_WRITE_SUPPORT

config BT_OTS_OACP_CHECKSUM_SUPPORT
	imply CRC
	bool "Support OACP Calculate Checksum operation"

config BT_OTS_OACP_DELETE_SUPPORT
	bool "Support OACP Delete Operation"

config BT_OTS_OACP_READ_SUPPORT
	bool "Support OACP Read Operation"
	default y

config BT_OTS_OACP_WRITE_SUPPORT
	bool "Support OACP Write Operation"

config BT_OTS_OACP_PATCH_SUPPORT
	bool "Support patching of objects"
	depends on BT_OTS_OACP_WRITE_SUPPORT

config BT_OTS_OLCP_GO_TO_SUPPORT
	bool "Support OLCP Go To Operation"
	default y

config BT_OTS_OBJ_NAME_WRITE_SUPPORT
	bool "Support object name write"

endif # BT_OTS

#### Object Transfer Service Client ################################

config BT_OTS_CLIENT
	bool "Object Transfer Service Client [Experimental]"
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC
	select EXPERIMENTAL
	help
	  This option enables support for the Object Transfer Service Client.

if BT_OTS || BT_OTS_CLIENT

config BT_OTS_MAX_OBJ_CNT
	hex "Maximum number of objects that each service instance can store"
	default 0x05
	# Given the maximum size of a directory listing record (172) and the maximum size of an
	# object using the net_buf implementation is 2^16-1, the maximum number of objects is given
	# by 2^16-1 / 172 = 381 == 0x17D)
	range 0x02 0x17D if BT_OTS_DIR_LIST_OBJ
	# Max obj count is otherwise the non-RFU IDs available
	range 0x01 0xFFFFFFFFFFFFFEFF

config BT_OTS_L2CAP_CHAN_TX_MTU
	int "Size of TX MTU for Object Transfer Channel"
	default 256
	range 21 65533

config BT_OTS_L2CAP_CHAN_RX_MTU
	int "Size of RX MTU for Object Transfer Channel"
	# RX MTU will be truncated to account for the L2CAP PDU and SDU header.
	default BT_BUF_ACL_RX_SIZE
	range 21 BT_BUF_ACL_RX_SIZE

config BT_OTS_OBJ_MAX_NAME_LEN
	int "Maximum object name length"
	# Max name length allowed by OTS spec is 120 octets
	# TODO: Set separate max name length for client, as other
	# servers may use the full 120 octets.
	default 120
	range 1 120

endif # BT_OTS || BT_OTS_CLIENT
