#ifndef LIP_MAC_RX_H
#define LIP_MAC_RX_H


/***************************************************************************//**
 @addtogroup lip_mac
 @{
 @file lip_mac_rx.h
 @brief Файл содержит определения функций приема пакетов

 В данном файле реализована работа логики приема пакетов от MAC-контроллера.

 Данные функции являются связующим звеном между логикой приема конкретного порта
 под конкретный MAC-контроллер и логикой дольнейшей обработки стеком.

 В зависимости от конфигурации стека, пакет может либо сразу обрабатываться
 без предварительного сохранения стеком, либо использоваться набор из нескольких
 промежуточных очередей для предварительного сохранения пакетов, с последующим
 извлечением пакетов и обработкой в фоне. Последнее позволяет разделять пакеты
 по приорертету по разным очередям и обслуживать их в порядке приоритета а не
 порядке приема.

 По приему нового кадра порт вызывает на каждый принятый пакет функцию
 lip_mac_rx_proc_frame(), передавая информацию и указатель на данные принятого кадра.
 Данная функция может вызываться из контекста прерывания, если порт поддерживает
 прием по прерываниям и он разрешен (как правило используется только при разрешении
 промежуточных очередей).

 Модуль делает предобработку кадра и далее вызывает lip_process_rx_frame() для
 обработки кадра стеком.

 @author Borisov Alexey <borisov@lcard.ru>
******************************************************************************/

#include "lip/lip_defs.h"
#include "lip/ll/lip_ll.h"
#include "lip_mac_rx_cfg_defs.h"

typedef void (*t_mac_rx_proc_frame_cb)(t_lip_rx_ll_frame *ll_frame);

/** @brief Инициализация модуля приема пакетов  */
void lip_max_rx_init(void);
/** @brief Завершение работы модуля работы с очередями приема пакетов */
void lip_max_rx_close(void);

/** @brief Сохранение принятого от порта кадра в одну из очередей для дальнейшей обработки */
void lip_mac_rx_proc_frame(t_lip_rx_ll_frame *ll_frame);

void lip_mac_rx_pull(void);

void lip_mac_rx_set_custom_proc_frame_cb(t_mac_rx_proc_frame_cb cb);

#if  LIP_MAC_RX_FRAME_PREPROC_CB
    /** @brief Ползовательская функция обработного вызова для обработки принятых кадров.

        Если вызов данной функции разрешен в настройках стека с помощью параметра
        #LIP_CFG_MAC_RX_FRAME_PREPROC_CB, то она вызывается непосредственно после
        приема пакета еще до помещения пакета в очередь, в контексте прерывания.

        Если фукнция вернет #LIP_ERR_SUCCESS, то пакет будет далее обработан штатным
        образом и помещен в одну из очередей для дальнейшей обработки, иначе пакет
        будет отброшен.

        Функция может использоваться как для изменения информации о пакете, так
        и для сверхприоритетной обработки пакета без помещения в очередь для
        фоновой обработки (в этом случае можно вернуть код ошибки
        #LIP_ERR_USER_DROP_REQUEST).

        Пользователь должен учитывать, что принятых пакет может быть разделен
        на две части (зависит от реализации порта)

        @param[in] ll_frame - указатель на структуру с информацией о принятом кадре и
                              его данных.
        @return  Код ошибки. #LIP_ERR_SUCCESS, если пакет должен далее обработан штатным
                 образом, другое значение, если пакет должен быть отброшен
    */
    t_lip_errs lip_mac_rx_frame_user_preproc(t_lip_rx_ll_frame *ll_frame);
#endif

#endif // LIP_MAC_RX_H
