/*
 * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include "esp_err.h"
#include "lwip/ip6_addr.h"
#include "lwip/netif.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Route table entry
 *
 */
typedef struct {
    ip6_addr_t prefix;
    uint8_t prefix_length;
    ip6_addr_t gateway;
    int8_t preference;
    uint32_t lifetime_seconds;
    struct netif *netif;
} esp_route_entry_t;

/**
 * @brief Adds an entry to the route table
 *
 * @param[in] route_entry    The route entry to be added
 *
 * @return
 *   - The pointer to the added route entry on success
 *   - NULL on failure
 *
 */
esp_route_entry_t *esp_route_table_add_route_entry(const esp_route_entry_t *route_entry);

/**
 * @brief Removes an entry from the route table
 *
 * @param[in] route_entry    The route entry to be removed
 *
 * @return
 *   - ESP_OK
 *   - ESP_ERR_INVALID_ARG  The provided route_entry is not in the route table.
 *
 */
esp_err_t esp_route_table_remove_route_entry(esp_route_entry_t *route_entry);

/**
 * @brief The lwIP ip6 route hook, called by the lwIP function ip6_route when sending packets.
 *
 * @param[in] src   The source address
 * @param[in] dest  The destination address
 *
 * @return
 *   - The target interface when route found
 *   - NULL when route not found
 *
 */
struct netif *lwip_hook_ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest);

/**
 * @brief The lwIP gateway hook, called by the lwIP when deciding next hop.
 *
 * @param[in] netif     The output network interface
 * @param[in] dest      The destination address
 *
 * @return
 *   - The gateway address when route found
 *   - NULL when route not found
 *
 */
const ip6_addr_t *lwip_hook_nd6_get_gw(struct netif *netif, const ip6_addr_t *dest);

#ifdef __cplusplus
}
#endif
