/**************************************************************************//**
 @defgroup lip_conf Конфигурация стека

 Определенный проект для определенной встраиваемой системы имеет свои требования
   к используемым ресурсам стеком TCP/IP и к реализуемым стеком функциям.
   В связи с этим, часть параметров стека определяется в отдельном файле
   конфигурации (lip_config.h) в виде конфигурационных макросов.

   Данный файл должен быть скопирован в каждый проект и изменен в соответствии
   с требованиями данного проекта.

   В файле конфигурации содержится набор макросов типа @c LIP_CFG_MODULENAME_ENABLE,
   которые определяют, какие модули будут включены в стек при компиляции. Далее
   идут определения параметров данного модуля в виде макросов
   @c LIP_CFG_MODULENAME_PARAMNAME.

   Старая конфигурация использовала макросы вида @c LIP_USE_MODULENAME и
   @c LIP_MODULENAME_PARAMNAME. В этих макросах отсутствие определения означало
   включение возможности, а наличие --- включение, в отличие от новых вариантов с
   CFG, где требуется явное указание 0 или 1.
   Часть параметров еще остается в старом формате,  но будет переведена на новый
   по возможности с сохранением совместимости со старым форматом конфигурационных определений.

   Некоторые модули имеют зависимости от других, поэтому при их включении
   необходимо, чтобы были включены и модули из списка зависимостей (смотри
   описание модулей), иначе произойдет ошибка при компиляции с соответствующим
   сообщением.

   Часть параметров, относящаяся либо ко всему стеку в целом или к модулям,
   которые всегда включены (такие как @ref lip_ip или @ref lip_arp), идут
   без условных директив в начале файла конфигурации.

   Настройка файла позволяет оптимизировать размер памяти (как кода, так и данных),
   используемый стеком, для конкретного проекта, а так же установить нужные
   временные параметры или другие параметры работы определенных протоколов.
 *****************************************************************************/

/***************************************************************************//**
  @addtogroup lip_conf
  @{
  @file lip_config.h
  @brief Данный файл содержит пример настроек TCP/IP стека lip.
    Он должен быть скопирован в каждый проект и изменен в соответствии
    с требованиями конкретного проекта.
  @author Borisov Alexey <borisov@lcard.ru>
 ******************************************************************************/

#ifndef LIP_CONFIG_H_
#define LIP_CONFIG_H_

#include "dev_pins.h"
#include "chip.h"
#include "lcspec.h"

/** Включение конфигурации, специфичной для порта. Может использоваться для
    разделения общей конфигурации и специфичной для конкретного порта по разным файлам.
    Само наличие и название данного файла может быть любое на усмотрение пользователя.
    В исходных кодах самого стека включается всегда только общий файл конфигурации
    lip_config.h и подразумевается, что все параметры конфигурации будут доступны
    через данное включение, поэтому если используется такое разделение,
    то файл общей конфигурации lip_config.h должен включать файл конфигурации порта */
#include "lip_port_conf.h"
/** Файл содержит константы с уровнями отладочных сообщений и модулями-источниками
    отладочных сообщений, используемыми при вызове стеком функции отладочной печати 
    lip_printf. Должен включаться, если требуется фильтрация вывода сообщений
    по уроню или источнику непосредственно в определении lip_printf
    (lip.h включать в файле конфигурации некорректно из-за возникновения цикличного
    включения) */
#include "lip/lip_log.h"
/* В данном примере конфигурационного файла используется реализация функции отладочной
   печати lip_printf через функцию lprintf одноименного репозитория и
   для включения ее определения включается заголовочный файл lprintf.h.
   В случае реализации отладочной печати другим образом, необходимо включить
   свой файл с объявлениями функций отладочной печати */
#include "lprintf.h"


/** Данный макрос, если определен, определяет функцию для вывода отладочных
    сообщений стека. Первым параметром передается константа с типом модуля,
    к которому относится сообщение, второй --- уровень сообщения (ошибка, предупреждение,
    отладочное сообщение и т.д.), третий --- код ошибки или 0. Остальные параметры
    соответствуют параметрам функции printf() (формат и произвольный набор
    параметров, зависящий от формата). Если макрос не определен, то код для печати
    отладочных сообщений будет выкинут из стека */
#define lip_printf(module, level, err, ...) do { /** if ((module != LIP_LOG_MODULE_TCP) || \
        (level < LIP_LOG_LVL_DEBUG_HIGH)) \
        { lprintf(__VA_ARGS__);} */} while(0)




/** Определение данного макроса указывает, что архитектура поддерживает доступ
    к невыровненным словам. Это позволяет некоторые записи лучше упаковать
    (в частности отчеты в @ref lip_igmp) */
#define LIP_SUPPORT_UNALIGN_ACCESS



/***************************************************************************//**
    @defgroup lip_conf_rand Конфигурация модуля генерации случайных чисел
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_rand
    @addtogroup lip_conf_rand
    @{
********************************************************************************/
/** Включение модуля @ref lip_rand для генерации случайных чисел.
     Используется в других модулях стека и как правило требует включения */
#define LIP_CFG_RAND_ENABLE                 1

/** Разрешение lip_rand_range() генерировать числа в диапазоне от [0, 2^32).
 *  Если равен 0, то диапазон случайных чисел ограничен [0, 2^16).
 *  Рекомендуется к включению, если не требуется минималистичная по ресурсам
 *  сборка стека */
#define LIP_CFG_RAND_UINT32_RANGE_SUPPORT   1

/** @} */







/* -------------------------- Настройки PHY-уровня ---------------------------*/
/**< Включение поддержки всех микросхем физического уровня, поддержка которых реализована
 *   в стеке.
 *   Если 0, то необходимо явно определить через макросы LIP_CFG_PHY_SUPPORT_xxx,
 *   работу с какими микросхемами физического уровня необходимо включить в сборку */
#define LIP_CFG_PHY_SUPPORT_ALL                 0

#define LIP_CFG_PHY_SUPPORT_DP83848J            1 /**< Поддержка PHY TI DP83848J  */
#define LIP_CFG_PHY_SUPPORT_DP83848C            0 /**< Поддержка PHY TI DP83848C  */
#define LIP_CFG_PHY_SUPPORT_LAN8720             1 /**< Поддержка PHY Microchip LAN8720*/
#define LIP_CFG_PHY_SUPPORT_LAN8742             0 /**< Поддержка PHY Microchip LAN8742*/
#define LIP_CFG_PHY_SUPPORT_KSZ9131             0 /**< Поддержка PHY Microchip KSZ9131*/
#define LIP_CFG_PHY_SUPPORT_KSZ8567             0 /**< Поддержка встроенного PHY микросхемы свича Microchip KSZ8567 */
#define LIP_CFG_PHY_SUPPORT_YT8521S             0 /**< Поддержка PHY Motorcomm YT8521S */
#define LIP_CFG_PHY_SUPPORT_RTL8211FS           0 /**< Поддержка PHY Realtek RTL8211FS */

#define LIP_CFG_SW_SUPPORT_KSZ8567              0 /**< Поддержка обработки пакетов от свича KSZ8567 */


#define LIP_CFG_PHY_USE_STATS                   0  /**< Разрешение кода чтения параметров статистики PHY */
#define LIP_CFG_PHY_STATS_CHECK_INTERVAL_MS     25 /**< Интервал чтения параметров статистики PHY в мс */
#define LIP_CFG_PHY_STATS_AVG_SIZE_POW2         5  /**< Количество измерений для усреднения параметров статистики PHY. Определятся как 2 в указанной степени */

#define LIP_CFG_PHY_USE_CABLE_TEST              1 /**< Включение кода выполнения теста кабеля для поддерживающих данную функцию PHY */

/** Время между последовательными проверками состояния линка (мс) - подключен ли кабель */
#define LIP_CFG_PHY_LINK_CHECK_INTERVAL         50


#define LIP_CFG_PHY_TEST_LOOPBACK_ENABLE        0 /**< Включение функций для выполнения loopback теста phy */

/** Если определено, перед инициализацией выполняется аппаратный сброс PHY */
#define LIP_PHY_HARDWARE_RESET
#ifdef LIP_PHY_HARDWARE_RESET
    /** Время аппаратного сброса PHY в мс */
    #define LIP_PHY_RESET_TIME       100

    /** Настройка пинов для сброса Phy */
    #define LIP_PHY_RESET_CFG()     do { \
        CHIP_PIN_CONFIG_OUT(PIN_ETH_PHY_nRESET, 0); \
    } while (0)

    /** Макрос переводит PHY в состояние сброса */
    #define LIP_PHY_RESET_SET()     CHIP_PIN_OUT(PIN_ETH_PHY_nRESET, 0)
    /** Макрос для возвращение PHY из состояние сброса в рабочее */
    #define LIP_PHY_RESET_CLR()     CHIP_PIN_OUT(PIN_ETH_PHY_nRESET, 1)
#endif


/* ------------------------------- Настойки MAC ------------------------------*/
#define LIP_CFG_MAC_TX_QUEUE_ENABLE             0     /**< Разрешение промежуточных очередей пакетов для передачи.
                                                           Позволяет создавать очереди с разным приоритетом.
                                                           Требует от порта поддержки работы по прерываниям */
#if LIP_CFG_MAC_TX_QUEUE_ENABLE
    #define LIP_CFG_MAC_TX_QUEUE_CNT            1     /**< Количество очередей для передачи пакетов (от 1 до 4) */
    #define LIP_CFG_MAC_TX_QUEUE0_SIZE          (4 * LIP_ETH_MAX_PACKET_SIZE)  /**< Размер буфера для сохранения пакетов первой (максимально приоритетной) очереди на передачу (аналогично для остальных) */
    #define LIP_CFG_MAC_TX_QUEUE0_FRAME_CNT     8    /**< Максимальное число пакетов для первой (максимально приоритетной) очереди на передачу (аналогично для остальных) */
    #define LIP_CFG_MAC_TX_QUEUE0_BUF_MEM(var)  __attribute__ ((section (".eth_ram"))) var   /**< Объявление переменной для хранения буфера первой очереди на передачу */

    /* аналогичные определения для QUEUE1, QUEUE2 и QUEUE3, если разрешены ...*/
    #define LIP_CFG_MAC_TX_QUEUE_NUM(prio)      0 /**< Определение номера очереди (0 - самая приоритетная) по коду приоритета пакета */

#else
    #define LIP_CFG_MAC_TX_FRAME_CNT            32 /**< Количество кадров в буфере на передачу, если не используются промежуточные очереди */
    #define LIP_MAC_TX_BUF_SIZE                 (5*LIP_MAC_TX_FRAME_MAX_SIZE + 256) /**< Общий размер буфера на передачу, если не используются промежуточные очереди */
    #define LIP_CFG_MAC_TX_BUF_MEM(v)           v  /**< Объявление переменной для хранения буфера пакетов на передачу, если не используются промежуточные очереди */
#endif

#define LIP_CFG_MAC_RX_QUEUE_ENABLE             0   /**< Разрешение промежуточных очередей пакетов для приема.
                                                        В этом случае пакеты принимаются по прерыванию и сохраняются в нужную
                                                        очередь, а после чего уже извлекаются из очередей в порядке приоритетов
                                                        Требует от порта поддержки работы по прерываниям. */
#if LIP_CFG_MAC_RX_QUEUE_ENABLE
    #define LIP_CFG_MAC_RX_QUEUE_CNT            1     /**< Количество очередей для приема пакетов (от 1 до 4) */
    #define LIP_CFG_MAC_RX_QUEUE0_SIZE          (4 * LIP_ETH_MAX_PACKET_SIZE)  /**< Размер буфера для сохранения пакетов первой (максимально приоритетной) очереди на прием (аналогично для остальных) */
    #define LIP_CFG_MAC_RX_QUEUE0_FRAME_CNT     32    /**< Максимальное число сохраняемых пакетов для первой (максимально приоритетной) очереди на прием (аналогично для остальных) */
    #define LIP_CFG_MAC_RX_QUEUE0_BUF_MEM(var)  __attribute__ ((section (".eth_ram"))) var /**< Объявление переменной для хранения буфера первой очереди на прием */
    /* аналогичные определения для QUEUE1, QUEUE2 и QUEUE3, если разрешены ...*/
#endif

#define LIP_CFG_MAC_USER_PULL_CB            0 /**< Признак, что нужно вызывать пользовательскую функцию опроса lip_mac_user_pull() при фоновой работе MAC-уровня стека.
                                                   Может использоваться в случае, если пользовательский проект требует каких либо нестандартных
                                                   фоновых действий для работы MAC или PHY уровня, не входящих штатный в порт */


#define LIP_CFG_PORT_SELFLOOP_DETECTION     0 /**< Включение поддержки определения замыкания порта на себя и вызова пользовательской функции (сейчас зависит от PTP) */
#define LIP_CFG_MAC_RX_FRAME_PREPROC_CB     0 /**< Включение вызова пользовательской функции lip_mac_rx_frame_user_preproc() для предобработки принимаемых пакетов.
                                                   При включении промежуточных очередей на прием (параметр #LIP_CFG_MAC_RX_QUEUE_ENABLE),
                                                   данная функция вызывается в контексте прерывания до помещения пакетов в очередь */
#define LIP_CFG_ETH_RX_UNSUP_TYPE_CB        0 /**< Включение вызова пользовательской функции lip_eth_user_packet_process() для обработки пакетов ethernet неподдерживаемого типа */


/*-------------------------------- настройки IP ------------------------------*/
/** Время жизни (TTL) по-умолчанию для @ref lip_ipv4 пакетов. Используется, если
    время жизни на задано явно верхним уровнем */
#define LIP_IP_TTL      150

/** Данный макрос включает логику сборки входных фрагментированных пакетов.
    Если он не определен, то все фрагментированные пакеты отбрасываются.
    Включение этого модуля требует дополнительной памяти порядка
    #LIP_IPV4_REASSEMBLY_BUF_CNT*(#LIP_IPV4_REASSEMBLY_MAX_DATA_SIZE+70) байт*/
#define LIP_USE_IPV4_REASSEMBLY

#ifdef LIP_USE_IPV4_REASSEMBLY
    /** Определяет количество используемых буферов для сборки дейтаграммы, т.е.
        максимальное количество незавершенных сборок IP-дейтаграмм. При приходе
        фрагмента новой дейтаграммы, для сохранения которого нет свободного буфера,
        фрагмент будет отброшен */
    #define LIP_IPV4_REASSEMBLY_BUF_CNT 4

    /** Максимальный размер собираемой дейтаграммы. Если всего полезных данных
        в собранной фрагментированной IP-дейтаграмме больше указанного размера,
        то дейтаграмма будет отброшена */
    #define LIP_IPV4_REASSEMBLY_MAX_DATA_SIZE 1500
#endif

/** Если определено, то используется аннонс установленного IPv4 адреса через ARP,
 *  даже если он задан статически */
#define LIP_IPV4_USE_ADDR_ANNOUNCE

/** Если определено, то разрешено напрямую устанавливать link-local адрес как статический*/
//#define LIP_IP_ENABLE_DIRECT_SET_LINK_LOCAL

/*-------------------------------- настройки ARP -----------------------------*/
/** Количество записей в таблице ARP, хранящей соответствие IPv4 адресов
    и MAC-адресов */
#define LIP_ARP_IPV4_TABLE_LENGTH  4
/** Время (в мс) соответствующее увеличению "возраста" записи из ARP-таблицы
    на единицу */
#define LIP_ARP_AGE_INC_TIME       500
/** Макрос определяет "возраст" ARP-записи, при достижении которого она
    выкидывается из таблицы (умноженное на #LIP_ARP_AGE_INC_TIME определяет
    время жизни записи в таблице) */
#define LIP_ARP_DISCARD_AGE        120

/** Если макрос определен, то в модуле @ref lip_ipv4  создается буфера указанного
    размера, который используется, чтобы сохранить пакет, ожидающий разрешения
    через ARP адреса назначения. Если макрос на определен, то отправляемый пакет,
    для которого нет соответствия IP-адреса назначения и MAC-адреса всегда
    выбрасывается */
#define LIP_IP_WAIT_ARP_BUF_SIZE   1500

#ifdef LIP_IP_WAIT_ARP_BUF_SIZE
    /** Макрос определяет время (в мс), которое пакет, отложенный до разрешения
        адреса назначения, сохраняется в буфере. Если за указанное время адрес не
        будет разрешен, то пакет выбрасывается и буфер освобождается */
    #define  LIP_IP_WAIT_ARP_TIME  2000
#endif


/***************************************************************************//**
    @defgroup lip_conf_udp Конфигурация модуля UDP
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_udp
    @addtogroup lip_conf_udp
    @{
********************************************************************************/

/** При определении данного макроса будет включена сборка модуля @ref lip_udp */
#define LIP_USE_UDP
#ifdef LIP_USE_UDP
    /** максимальное кол-во портов, которое можно прослушивать одновременно */
    #define LIP_UDP_MAX_DYN_PORTS    3
#endif
/** @} */




/***************************************************************************//**
    @defgroup lip_conf_tcp Конфигурация модуля TCP
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_tcp
    @addtogroup lip_conf_tcp
    @{
********************************************************************************/

/** Включение поддержки треспортного протокола TCP (модуль @ref lip_tcp) */
#define LIP_CFG_TCP_ENABLE                  1
#if LIP_CFG_TCP_ENABLE
    /** Максимальное количество пользовательских сокетов TCP --- сокетов,
        с которыми идет работа напрямую через функции TCP, без учета сокетов,
        используемых модулями самого стека */
    #define LIP_TCP_USER_SOCKET_CNT             18
    /** Количество повторных передач сегмента по таймеру, после которого соединение
        будет разорвано */
    #define LIP_TCP_RETRANS_MAX_CNT             5

    /** Максимальное количество сегментов в очереди для повторной передачи
        Определяет количество сегментов, которое может быть послано другой стороне,
        но не подтверждено (Flight segments) */
    #define LIP_TCP_RETRANS_MAX_SEG             30

    /** Время (мс), которое сокет находится в состоянии #LIP_TCP_SOCK_STATE_TIME_WAIT,
        чтобы повторить ответ на запрос на завершение другой стороны.
        По идее должно быть 2MSL, но это слишком большое время, если сокет
        нельзя использовать.... */
    #define LIP_TCP_TIME_WAIT                   500

    /** Время по умолчанию на закрытие сокета в мс (от запроса на закрытие до
     *  подтверждение закрытия другой стороной). При закрытии сокета пользователь
     *  сам определяет время закрытия, но данный параметр может использоваться
     *  другими модулями работающими поверх TCP для указения таймаута при закрытии
     *  соединения */
    #define LIP_CFG_TCP_DEFAULT_CLOSE_TOUT      2000

    /** Опционально. Переопределяет время задержки отложенных подтверждений
        (реально время от 1 до  #LIP_TCP_DELAYED_ACK_TIME мс).
        Не может быть больше 500мс. По-умолчанию --- 200 мс */
    #define LIP_CFG_TCP_DELAYED_ACK_TIME        200

    /** Определение включает использование алгоритмов slow start и congestion avoidance
        (крайне рекомендуется) */
    #define LIP_TCP_USE_SLOW_START
    /** Определение включает поддержку опции WinScale (рекомендуется) */
    #define LIP_TCP_USE_WINSCALE
    /** Определение включает поддержку опции Timestamp (рекомендуется) */
    #define LIP_TCP_USE_TIMESTAMP
    /** Определение включает поддержку опции SACK (рекомендуется) */
    #define LIP_TCP_USE_SACK

    /** Определение включает код для режима обмена данными через буфер (очередь) сокета */
    #define LIP_CFG_TCP_FIFO_MODE_ENABLE        1

    /** Определение отличное от 0 включает код для режима передачи данных по
     *  TCP-сокету через задания на обмен.*/
    #define LIP_CFG_TCP_DD_MODE_ENABLE          1
    #if LIP_CFG_TCP_DD_MODE_ENABLE
        /** Максимальное количество заданий на прием данных, которое можно поставить
            одновременно для каждого сокета */
        #define LIP_CFG_TCP_SOCK_RX_DD_CNT      4
        /** Максимальное количество заданий на передачу данных, которое можно поставить
            одновременно для каждого сокета */
        #define LIP_CFG_TCP_SOCK_TX_DD_CNT      4

        /** Определяет размер типа для хранения количества байт для приема или передачи
         *  в одном задании. Может принимать значение 2 (uint16_t) или 4 (uint32_t).
         *  Значение 2 (по умолчанию) требует меньше памяти, но максимальный размер данных одного
         *  задания ограничен 65535 байтами. */
        #define LIP_CFG_TCP_DD_LEN_TYPE_SIZE    2
    #endif

    /** Если в передаваемом сегменте данных больше, чем заданный данным определением
        размер, то данные не копируются в буфер сформированного пакета вслед за
        заголовком, а используется возможность порта (если есть) передать
        данные отдельным дескриптором без копирования */
    #define LIP_TCP_SPLIT_SEND_DATA_SIZE  32

    /** Использование пользовательской функции lip_tcp_cb_get_iss() для получения
        начального номера сегмента сокета, что позволяет, например, сделать номер зависимым от
        времени rtc. */
    #define LIP_CFG_TCP_CB_GET_ISS        0

    /** Определение данного макроса включает поддержку опции #SO_KEEPALIVE.
        При этом также должны быть определены параметры #LIP_TCP_KEEPALIVE_TOUT,
        #LIP_TCP_KEEPALIVE_PROBES и #LIP_TCP_KEEPALIVE_INTERVAL
     */
    #define LIP_TCP_USE_KEEPALIVE
    #ifdef LIP_TCP_USE_KEEPALIVE
        /** Время (мс), в течение которого сокет должен находится в неактивном
            состоянии прежде чем будет выполнена первая проверка соединения,
            если для данного это разрешено с помощью опции #SO_KEEPALIVE  */
        #define LIP_TCP_KEEPALIVE_TOUT     (5*60*1000)
        /** Количество неподтвержденных проверок соединения, после которого
         *  соединение будет разорвано */
        #define LIP_TCP_KEEPALIVE_PROBES   9
        /** Интервал между проверками соединения (мс) */
        #define LIP_TCP_KEEPALIVE_INTERVAL   (75*1000)
    #endif

    /** Определение данного макроса включает поддержку активного установления
        TCP-соединений (для клиента). При его определении должны быть также
        заданы значения #LIP_TCP_TMP_PORT_FIRST и #LIP_TCP_TMP_PORT_LAST. */
    #define LIP_TCP_USE_ACTIVE_CONNECT
    #ifdef LIP_TCP_USE_ACTIVE_CONNECT
        /** TCP-порт, с которого начинается диапазон портов, выделяемых
            в качестве локального порта для активного установления соединений */
        #define LIP_TCP_TMP_PORT_FIRST 32768
        /** последний TCP-порт в диапазоне портов, выделяемых
            в качестве локального порта для активного установления соединений */
        #define LIP_TCP_TMP_PORT_LAST  (32768*2-1)

    #endif

    /** Ненулевое значение данной настройки включает поддержку возможности установить
     *  для TCP сокета пользовательскую функцию копирования принимаемых и/или передаваемых
     *  данных с помощью функций lsock_set_recv_data_copy_func()
     *  и lsock_set_send_data_copy_func() соответственно */
    #define  LIP_CFG_TCP_ENABLE_CUSTOM_DATA_COPY_FUNC  0
#endif
/** @} */



//----------------------------------- настройки DHCP client ------------------------------------//
#define LIP_USE_DHCPC
#ifdef LIP_USE_DHCPC
    /*использование callback-а на событие "DHCP адрес получен" */
    #define LIP_DHCPC_CONFIGURED_CB
    /*использование callback-а на событие "Ошибка получения DHCP-адреса */
    // #define LIP_DHCPC_FAILED_CB

    /* если определено, то в Discover добавляется Fast Commit опция,
     * которая позволяет серверу сразу послать Ack  */
    #define LIP_DHCPC_USE_RAPID_COMMIT

    /* если определено, то включается поддержка приема DHC_FORCERENEW
     * для реконфигурации клиента сервером  */
   #define LIP_DHCPC_USE_RECONFIGURE

    /** Если определено, то проверка адреса после получения выполняется с
     * меньшим интервалом между ARP-запросами
     * (#LIP_IPV4_ACD_PROBE_FAST_INTERVAL_MIN и #LIP_IPV4_ACD_PROBE_FAST_INTERVAL_MAX
     *  вместо #LIP_IPV4_ACD_PROBE_INTERVAL_MIN и #LIP_IPV4_ACD_PROBE_INTERVAL_MAX) */
    #define LIP_DHCPC_FAST_ADDR_CHECK

    /* если определено, то в discovery и request при получении
     * адреса будет запрашиваться заданное время аренды адреса (в секундах) */
    //#define LIP_DHCPC_INITIAL_LEASE_REQUEST   600

    /* изначальный таймаут на повторную передачу */
    #define LIP_DHCPC_RETRANS_TOUT             2000

    #define LIP_DHCPC_INITIAL_DELAY_MIN   200
    
    #define LIP_DHCPC_INITIAL_DELAY_MAX  500 //макс. задержка в мс
    /* после скольки попыток выполнить DISCOVER, считаем, что сервера нет
     * и вызываем faild callback (если определен LIP_DHCPC_FAILED_CB) */
    #define LIP_DHCPC_DISOVERY_RETRANS_FAIL 2
    /* после сокльки попыток переслать REQUEST, переходим снова
     * в состояние начальное состояние */
    #define LIP_DHCPC_REQUEST_RETRANS_CNT   4

    /* если определено, используется client-id в соответствии с rfc4361,
     * иначе - type + mac_addr */
    #define LIP_DHCPC_USE_NODE_SPEC_ID
    /* используется вместе с LIP_DHCPC_USE_NODE_SPEC_ID
     * если определено, то для получения DUID в client-id из rfc4361
     * пользователь реализует callback lip_dhcpc_get_duid_cb(),
     * иначе используется DUID типа 3 (mac+type) */
    //#define LIP_DHCPC_MANUAL_DUID
#endif


//------------------------------- настройки для IP link-local (Auto IP) -----------------//
#define LIP_USE_LINK_LOCAL_ADDR
#ifdef LIP_USE_LINK_LOCAL_ADDR
    /*********************************************************************************
     * по-умолчанию операция получения link-local адреса начинается только
     * после неудачи получения dhcp-адреса
     * если определен данный макрос, то получение link-local адреса начинается
     * сразу после link-up, даже если dhcp разрешен
     * При действительном статическом адреса поиск link-local адреса не производится
     *********************************************************************************/
    #define LIP_LINK_LOCAL_GET_ADDR_BEFORE_DHCP_FAIL
#endif




//-------------------------------- настройки IGMP (для приема mcast) --------------------//
#define LIP_USE_IGMP
#ifdef LIP_USE_IGMP
    /*размер памяти под состояния прослушки адресов по-сокетам
     *размер памяти = (sizoof(pointer) + 8)*r + n*4, где
     *r - кол-во пар сокет-мультикаст адрес,
     *n - суммарное кол-во адресов источников в фильтрах всех пар*/
    #define LIP_IGMP_SOCKET_STATE_MEMORY_SIZE    200
    /* размер памяти под отчеты о изменении состояния прослушивания адресов */
    #define LIP_IGMP_RETRANS_STATE_MEMORY_SIZE    400
    /* размер памяти для передачи ответов на
     * group-specific и group-and-source-specific запросы */
    #define LIP_IGMP_RESPONSE_STATE_MEMORY_SIZE  200
#endif



/***************************************************************************//**
    @defgroup lip_conf_tftp Конфигурация модуля TFTP
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_tftp
    @addtogroup lip_conf_tftp
    @{
********************************************************************************/

/** При определении данного макроса будет включен код модуля @ref lip_tftp для
    работы в режиме клиента */
#define LIP_USE_TFTP_CLIENT
/** При определении данного макроса будет включен код модуля @ref lip_tftp для
    работы в режиме сервера */
#define LIP_USE_TFTP_SERVER

#if defined LIP_USE_TFTP_CLIENT || defined LIP_USE_TFTP_SERVER
    /** Данный макрос включает код для передачи файлов по @ref lip_tftp
        удаленному хосту */
    #define LIP_TFTP_SUPPORT_SEND
    /** Данный макрос включает код для приема файлов по @ref lip_tftp
        от удаленного хоста */
    #define LIP_TFTP_SUPPORT_RECV

    /** Количество файлов, которое может передаваться одновременно суммарно,
        как сервером, так и клиентом */
    #define LIP_TFTP_REQUEST_CNT 6

    /** Количество повторных передач пакета, после чего посылается сообщение
        об ошибке и передача считается разорванной */
    #define LIP_TFTP_RETRANS_CNT      7
    /** Начальный таймаут на повторную передачу пакета в мс */
    #define LIP_TFTP_RETRANS_TIMEOUT_INIT  1000
    /** Максимальный таймаут на повторную передачу.
        Таймаут увеличивается с каждой последующим повтором, но не превышает
        заданного значения */
    #define LIP_TFTP_RETRANS_TIMEOUT_MAX   5000
    /** Таймаут ожидания после завершения приема файла в мс. Служит для того,
        чтобы иметь возможность ответить на дублированные пакеты в случае, если
        удаленный хост не принял последний ACK */
    #define LIP_TFTP_CPL_TIMEOUT      500
#endif

#ifdef LIP_USE_TFTP_SERVER
    /** Данный макрос включает поддержку опций TFTP: размера файла и размера
        блока. Поддержка опций реализована только для режима сервера */
    #define LIP_TFTP_SUPPORT_OPTS
#endif

/** @} */


/***************************************************************************//**
    @defgroup lip_conf_mdns Конфигурация модуля mDNS
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_mdns
    @addtogroup lip_conf_mdns
    @{
********************************************************************************/

/** При определении данного макроса будет включен модуль @ref lip_mdns */
#define LIP_USE_MDNS
#ifdef LIP_USE_MDNS
    /** Максимальное количество дополнительных уникальных доменных узлов,
        добавляемых явно приложением (т.е. не считая узла, соответствующего
        имени хоста, а также узлов для регистрации сервисов через @ref lip_dns_sd) */
    #define LIP_MDNS_ADDITIONAL_UNIQUE_NODES_CNT    0

    /** Максимальное количество дополнительных разделяемых узлов, добавляемых
        явно приложением */
    #define LIP_MDNS_ADDITIONAL_SHARED_NODES_CNT    0

    /** Суммарное максимальное количество записей по всем узлам, добавляемых
        явно приложением через lip_mdns_rr_add() */
    #define LIP_MDNS_ADDITIONAL_TOTAL_RR_CNT        0

    /** Название CPU, использующееся в записи HINFO (в качестве названия ОС
        используется "lip", если не переопределено #LIP_MDNS_OS_NAME).
        Если не определено, то запись HINFO формироваться не будет */
    #define LIP_MDNS_CPU_NAME  "Cortex-M3"
#endif
/** @} */



/***************************************************************************//**
    @defgroup lip_conf_dns_sd Конфигурация модуля DNS-SD
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_dns_sd
    @addtogroup lip_conf_dns_sd
    @{
********************************************************************************/
/** При определении данного макроса будет включен модуль @ref lip_dns_sd */
#define LIP_USE_DNSSD
#ifdef LIP_USE_DNSSD
    /** Максимальное общее количество экземпляров сервисов, которое можно
        зарегистрировать одновременно */
    #define LIP_DNSSD_SERVICES_CNT               1
    /** Максимальное количество пар ключ/значене в описании сервиса */
    #define LIP_DNSSD_SERVICE_MAX_TXT_KEYS       8
#endif
/** @} */

/***************************************************************************//**
    @defgroup lip_conf_mb_server Конфигурация ModbusTCP сервера
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_mb_server
    @addtogroup lip_conf_mb_server
    @{
********************************************************************************/
/** При определении данного макроса будет включен модуль @ref lip_mb_server */
#define LIP_USE_MB_TCP_SERVER
#ifdef LIP_USE_MB_TCP_SERVER
    /** Количество TCP-сокетов, которое используется ModbusTCP сервером. Это
        значение определяет максимально возможное количество параллельно
        обрабатываемых клиентских подключений  */
    #define LIP_MB_TCP_SERVER_SOCKET_CNT   10

    /** Опционально. Данный макрос позволяет переопределить массив буфера
       на прием для каждого сокета ModbusTCP сервера */
    #define LIP_MB_TCP_SERVER_RECV_BUF_SIZE 1024
    /** Опционально. Данный макрос позволяет переопределить массив буфера
        на передачу для каждого сокета ModbusTCP сервера */
    #define LIP_MB_TCP_SERVER_SEND_BUF_SIZE 1024

    /** Опционально. Данный макрос позволяет ограничить максимально возможное
       количество input-регистров (при обращении к регистру с большим адресом,
       будет выдана ошибка неверного адреса без обработки). Если 0, то код
       поддержки функций для input-регистров будет исключен из стека */
    #define LIP_MB_SERVER_INPUT_REGS_MAX      65536
    /** Опционально. Данный макрос позволяет ограничить максимально возможное
        количество holding-регистров (при обращении к регистру с большим адресом,
        будет выдана ошибка неверного адреса без обработки). Если 0, то код
        поддержки функций для holding-регистров будет исключен из стека */
    #define LIP_MB_SERVER_HOLDING_REGS_MAX    65536
    /** Опционально. Данный макрос позволяет ограничить максимально возможное
        количество дискретных входов (при обращении к регистру с большим адресом,
        будет выдана ошибка неверного адреса без обработки). Если 0, то код
        поддержки функций для дискретных входов будет исключен из стека */
    #define LIP_MB_SERVER_DISCRETE_INPUTS_MAX 65536
    /** Опционально. Данный макрос позволяет ограничить максимально возможное
        количество coil-битов (при обращении к регистру с большим адресом,
        будет выдана ошибка неверного адреса без обработки). Если 0, то код
        поддержки функций для coil-битов будет исключен из стека */
    #define LIP_MB_SERVER_COILS_MAX           65536

    /** Опционально. Макрос позволяет переопределить директиву объявления буферов
        сокетов ModbusTCP сервера. Может использоваться для задания расположения
        буферов в специальной секции */
    #define LIP_MB_TCP_SERVER_BUF_MEM(var)   var
#endif
/** @} */


/*------------------------------- настройки PTP ------------------------------*/
#define LIP_CFG_PTP_ENABLE              0 /**< Разрешение протокола PTP */
#define LIP_CFG_PTP_RX_QUEUE_NUM        0 /**< Номер очерди пакетов на прием, в которую будут помещены PTP пакеты
                                              (0 - самая приоритетная, #LIP_CFG_MAC_RX_QUEUE_CNT-1 - низкоприоритетная).
                                               Не имеет значения, если не включены промежуточные очереди на прием
                                               (параметр #LIP_CFG_MAC_RX_QUEUE_ENABLE) */



/***************************************************************************//**
    @defgroup lip_conf_opcua Конфигурация протокола OPCUA
    @brief Набор параметров, задающих конфигурацию модуля @ref lip_opcua
    @addtogroup lip_conf_opcua_pubsub
    @{
********************************************************************************/

/** Включение поддержки протокола OPC-UA (модуль @ref lip_opcua) */
#define LIP_CFG_OPCUA_ENABLE                    0
#define LIP_CFG_OPCUA_TSTMP_PICOSEC_EN          1   /**< Разрешение обработки поля пикосекунд в метках времени OPC UA (если 0 - точность до 100 нс) */
#define LIP_CFG_OPCUA_UADP_SUB_ENABLE           1   /**< Разрешение подписки на сообщения, передаваемые по протоколу UADP OPC UA */
#define LIP_CFG_OPCUA_UADP_PUB_ENABLE           1   /**< Разрешение публикации сообщений по протоколу UADP OPC UA */
#define LIP_CFG_OPCUA_SUB_UADP_PUBID_MAX_CNT    64  /** Максимальное число назначенных Publisher ID для подписки */
#define LIP_CFG_OPCUA_UADP_SUB_DS_MAX_CNT       20  /** Максимальное число обработанных наборов данных в одном принятом сообщении */


#define LIP_CFG_OPCUA_UADP_GROUP_VERSION        1 /**< Разрешение обработки поля версии группы */
#define LIP_CFG_OPCUA_UADP_GROUP_NETMSGNUM      1 /**< Разрешение обработки поля номера сообщения группы */
#define LIP_CFG_OPCUA_UADP_GROUP_SEQNUM         1 /**< Разрешение обработки поля номера последовательности группы */
#define LIP_CFG_OPCUA_UADP_GROUP_TSTMP          1 /**< Разрешение обработки поля метки времени группы */

#define LIP_CFG_OPCUA_UADP_DS_SEQNUM            1 /**< Разрешение обработки поля номера последовательности набора данных */
#define LIP_CFG_OPCUA_UADP_DS_TSTMP             1 /**< Разрешение обработки поля метки времени набора данных */
#define LIP_CFG_OPCUA_UADP_DS_STATUS            1 /**< Разрешение обработки поля статуса набора данных */
#define LIP_CFG_OPCUA_UADP_DS_VERSION           1 /**< Разрешение обработки поля версии (старшей и младшей) набора данных */



#define LIP_CFG_OPCUA_SERVER_ENABLE                     0 /**< Включение поддержки OPC-UA сервера */
#define LIP_CFG_OPCUA_SERVER_AUTO_START_ENABLE          0 /**< Разрешение запуска OPC-UA сервера вместе со стеком. Иначе нужно вручную вызывать
                                                               lip_opcua_server_enable(). Может быть полезно запускать вручную,
                                                               если требуется дождаться установки времени и т.п. */

#define LIP_CFG_OPCUA_SERVER_TXMSG_MAX_SIZE             (52*1024) /**< Макимальный размер передаваемого сообщения */
#define LIP_CFG_OPCUA_SERVER_RXMSG_MAX_SIZE             (8*1024)  /**< Макимальный размер принимаемого сообщения */
#define LIP_CFG_OPCUA_SERVER_SOCKET_TXBUF_SIZE          (16*1024) /**< Размер буфера сокета на передачу данных */

#define LIP_CFG_OPCUA_SERVER_SESSION_CNT                4 /**< Максимальное число клиентских сессий (соединений) с сервером */
#define LIP_CFG_OPCUA_SERVER_SESSION_MAX_TOUT           (5*60*1000) /**< Время в мс, после которого, если для сессии не было запросов, то она будет закрыта */
#define LIP_CFG_OPCUA_SERVER_SC_TOKEN_LIFETIME_MAX      (60*30000) /**< Макимальное время жизни тока для Secure Channel (если задано, то ограничивает значение от клиента) */

#define LIP_CFG_OPCUA_SERVER_BUF_MEM(var)               var  /**< Объявление переменных буферов приема/передачи сообщений сервера */
#define LIP_CFG_OPCUA_SERVER_SESSION_MEM(var)           var  /**< Объявление переменных для хранения контекста клиентских сессий */
#define LIP_CFG_OPCUA_SERVER_MONITEMS_MEM(var)          var  /**< Объявление переменных для хранения контекста отслеживаемых элементов адресного пространства */
#define LIP_CFG_OPCUA_SERVER_MONITEMS_QUEUE_MEM(var)    var  /**< Объявление переменных для хранения очередей оповещений отслеживаемых элементов  */
#define LIP_CFG_OPCUA_SERVER_USER_ITEM_MEM(var)         var  /**< Объявление переменных для хранения пользовательских элементов адресного пространства сервера  */

#define LIP_CFG_OPCUA_SERVER_MONITEM_MAX_CNT            512   /**< Макимальное число отслеживаемых элементов */
#define LIP_CFG_OPCUA_SERVER_MONITEMS_QUEUE_ENABLE      1     /**< Включение поддержки очередей оповещений для отслеживаемых элементов OPC UA */
#define LIP_CFG_OPCUA_SERVER_MONITEMS_QUEUE_MAX_SIZE    1024  /**< Макимальный размер очерди на все отслеживаемые элементы */
#define LIP_CFG_OPCUA_SERVER_MONITEM_USER_DATA_MAX_SIZE 24    /**< Макимальный размер пользовательских данных, хранимых непосрественно внутри контекста отслеживаемого элемента.
                                                                  Получить указатель на эти данные можно с помощью lip_opcua_server_monitem_user_data() */
#define LIP_CFG_OPCUA_SERVER_SUB_MAX_LIFE_CNT           100   /**< Макимальное время жизни подписки на отслеживаемый элемент сервера */
#define LIP_CFG_OPCUA_SERVER_SUB_MIN_PUB_INTERVAL_MS    10    /**< Минимальный поддерживаемый интервал публикаций данных подписки в мс */
#define LIP_CFG_OPCUA_SERVER_SESSION_PUBREQ_MAX_CNT     32    /**< Макимальное число сохраняемых клиентских запросов на публикацию данных для каждой сессии */



#define LIP_CFG_OPCUA_SERVER_USER_ITEM_MAX_CNT          (32*1024) /**< Макимальное число пользовательских элементов в адресном пространстве сервера */
#define LIP_CFG_OPCUA_SERVER_ITEM_USER_EXTREFS_MAX_CNT  32        /**< Макимальное число пользовательских внешних ссылок между элементами серевера */

#define LIP_CFG_OPCUA_SERVER_VERSION_STR                ""        /**< Строка с версей сервера */




/** @} */


/* Настройки примера приема-передачи счетчика по TCP */
#define LIP_CFG_EXAMPLE_TCP_ENABLE              1 /** Разрешение примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_SEND_BUF_MEM(var)    __attribute__ ((section (".sdram"))) var /**< Объявление переменной буфера на передучу примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_RECV_BUF_MEM(var)    __attribute__ ((section (".sdram"))) var /**< Объявление переменной буфера на прием примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_SEND_PART_SIZE     (32*1024)     /**< Размер задания на передачу примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_SEND_PART_CNT      32            /**< Максимальное количество заданий на передачу примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_RECV_PART_SIZE     (32*1024)     /**< Размер задания на прием примера использования TCP */
#define LIP_CFG_EXAMPLE_TCP_RECV_PART_CNT      32            /**< Максимальное количество заданий на прием примера использования TCP */



#endif /* LIP_CONFIG_H_ */

/** @} */

