/*
 *
 *    Copyright (c) 2025 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 *    @file
 *      This file defines default compile-time configuration constants
 *      for the CHIP PAFTP layer.
 *
 */

#pragma once

#include <system/SystemConfig.h>

/**
 *  @def WIFIPAF_LAYER_NUM_PAF_ENDPOINTS
 *
 *  @brief
 *    This defines the number of WiFiPAFEndPoint objects allocated for use by the
 *    WiFiPAFLayer subsystem. Value should be defined as the minimum of (max number
 *    of simultaneous PAF connections the system supports, max number of
 *    simultaneous PAF connections the application will establish).
 */
#ifndef WIFIPAF_LAYER_NUM_PAF_ENDPOINTS
#define WIFIPAF_LAYER_NUM_PAF_ENDPOINTS 2
#endif // WIFIPAF_LAYER_NUM_PAF_ENDPOINTS

#if (WIFIPAF_LAYER_NUM_PAF_ENDPOINTS < 1)
#error "WIFIPAF_LAYER_NUM_PAF_ENDPOINTS must be greater than 0. configure options may be used to disable chip over PAF."
#endif

/**
 *  @def WIFIPAF_CONNECTION_OBJECT
 *
 *  @brief
 *    This defines the type of WIFIPAF_CONNECTION_OBJECT parameters passed between
 *    PAF platform code and the WiFiPAFLayer subsystem.
 *
 *    Most platforms should be able to retain this type's default definition as
 *    (void *), and pass [pointers to] connection handles generated by their
 *    platform interface where WIFIPAF_CONNECTION_OBJECT arguments are required by
 *    WiFiPAFLayer input functions.
 *
 */
#ifndef WIFIPAF_CONNECTION_OBJECT
#define WIFIPAF_CONNECTION_OBJECT void *
#endif // WIFIPAF_CONNECTION_OBJECT

/**
 *  @def WIFIPAF_CONNECTION_UNINITIALIZED
 *
 *  @brief
 *    This defines the value of an uninitialized WIFIPAF_CONNECTION_OBJECT.
 *
 */
#ifndef WIFIPAF_CONNECTION_UNINITIALIZED
#define WIFIPAF_CONNECTION_UNINITIALIZED nullptr
#endif // WIFIPAF_CONNECTION_UNINITIALIZED

/**
 *  @def PAF_MAX_RECEIVE_WINDOW_SIZE
 *
 *  @brief
 *    This is the maximum allowed size of a PAF end point's receive window, defined as the number of fragments the
 *    end point may reliably receive without PAF-layer acknowledgement. This value should be no larger than the floor
 *    of ONE-HALF the total number of slots or buffers reserved. The PAFTP layer reserves all of these buffers for its
 *    own use - one half for incoming writes or indications, and the other half for incoming confirmations.
 *
 *    This value must be greater than 1, or race condition avoidance logic will prevent send the on remote device. This
 *    logic prevents any send with no piggybacked ack when the receiver's window has only 1 slot open. Without this
 *    logic, simultaneous data transmissions could fill both receiver's windows, leaving no room for the acks required
 *    to re-open them. Both senders would wedge, and the PAFTP connection would stall.
 *
 *    This value must also exceed (WIFIPAF_CONFIG_IMMEDIATE_ACK_WINDOW_THRESHOLD + 1), or ***immediate*** stand-alone
 *    acks will forever be sent without delay in response to one another as each peer's window size dips below
 *    WIFIPAF_CONFIG_IMMEDIATE_ACK_WINDOW_THRESHOLD with receipt of any single message fragment.
 *
 *    Default value of 3 is absolute minimum for stable performance, and an attempt to ensure safe window sizes on new
 *    platforms.
 *
 */
#ifndef PAF_MAX_RECEIVE_WINDOW_SIZE
#define PAF_MAX_RECEIVE_WINDOW_SIZE 6
#endif

#if (PAF_MAX_RECEIVE_WINDOW_SIZE < 3)
#error "PAF_MAX_RECEIVE_WINDOW_SIZE must be greater than 2 for PAF transport protocol stability."
#endif

/**
 * @def PAFTP_CONN_RSP_TIMEOUT_MS
 *
 * @brief
 *   Maximum amount of time, in milliseconds, after sending or receiving a PAFTP Session Handshake
 *   request to wait for connection establishment.
 */
#ifndef PAFTP_CONN_RSP_TIMEOUT_MS
#define PAFTP_CONN_RSP_TIMEOUT_MS 5000
#endif // PAFTP_CONN_RSP_TIMEOUT_MS

/**
 * @def PAFTP_ACK_TIMEOUT_MS
 *
 * @brief
 *   Maximum amount of time, in milliseconds, after sending a PAFTP packet to wait for
 *   an acknowledgement. When the ack is not received within this period the PAFTP session is closed.
 */
#ifndef PAFTP_ACK_TIMEOUT_MS
#define PAFTP_ACK_TIMEOUT_MS 15000
#endif // PAFTP_ACK_TIMEOUT_MS

/**
 * @def PAFTP_CONN_IDLE_TIMEOUT_MS
 *
 * @brief
 *   Maximum amount of time, in milliseconds, no unique data has been sent over PAFTP session
 *   before the Commissioner must close the PAFTP session
 */
#ifndef PAFTP_CONN_IDLE_TIMEOUT_MS
#define PAFTP_CONN_IDLE_TIMEOUT_MS 30000
#endif // PAFTP_CONN_IDLE_TIMEOUT_MS

/*
 * Ref: [4.748] Supported Maximum Service Specific Info Length
 */
#define CHIP_PAF_DEFAULT_MTU 350

#include <lib/core/CHIPConfig.h>
