/*
 *  Generic interface to platform specific networking code
 *
 *  Copyright (C) 2016-2018 Antonio Quartulli <a@unstable.cc>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2
 *  as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program (see the file COPYING included with this
 *  distribution); if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef NETWORKING_H_
#define NETWORKING_H_

#include "syshead.h"

struct context;

#ifdef ENABLE_SITNL
#include "networking_sitnl.h"
#elif ENABLE_IPROUTE
#include "networking_iproute2.h"
#else
/* define mock types to ensure code builds on any platform */
typedef void *openvpn_net_ctx_t;
typedef void *openvpn_net_iface_t;

static inline int
net_ctx_init(struct context *c, openvpn_net_ctx_t *ctx)
{
    return 0;
}

static inline void
net_ctx_reset(openvpn_net_ctx_t *ctx)
{
    (void)ctx;
}

static inline void
net_ctx_free(openvpn_net_ctx_t *ctx)
{
    (void)ctx;
}
#endif /* ifdef ENABLE_SITNL */

#if defined(ENABLE_SITNL) || defined(ENABLE_IPROUTE)

/**
 * Initialize the platform specific context object
 *
 * @param c         openvpn generic context
 * @param ctx       the implementation specific context to initialize
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_ctx_init(struct context *c, openvpn_net_ctx_t *ctx);

/**
 * Release resources allocated by the internal garbage collector
 *
 * @param ctx       the implementation specific context
 */
void net_ctx_reset(openvpn_net_ctx_t *ctx);

/**
 * Release all resources allocated within the platform specific context object
 *
 * @param ctx       the implementation specific context to release
 */
void net_ctx_free(openvpn_net_ctx_t *ctx);

/**
 * Bring interface up or down.
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface to modify
 * @param up        true if the interface has to be brought up, false otherwise
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_iface_up(openvpn_net_ctx_t *ctx, const openvpn_net_iface_t *iface,
                 bool up);

/**
 * Set the MTU for an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface to modify
 * @param mtru      the new MTU
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_iface_mtu_set(openvpn_net_ctx_t *ctx,
                      const openvpn_net_iface_t *iface, uint32_t mtu);

/**
 * Add an IPv4 address to an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface where the address has to be added
 * @param addr      the address to add
 * @param prefixlen the prefix length of the network associated with the address
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_addr_v4_add(openvpn_net_ctx_t *ctx, const openvpn_net_iface_t *iface,
                    const in_addr_t *addr, int prefixlen);

/**
 * Add an IPv6 address to an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface where the address has to be added
 * @param addr      the address to add
 * @param prefixlen the prefix length of the network associated with the address
 *
 * @return          0 on success, a negative error code otherwise
 */

int net_addr_v6_add(openvpn_net_ctx_t *ctx, const openvpn_net_iface_t *iface,
                    const struct in6_addr *addr, int prefixlen);

/**
 * Remove an IPv4 from an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface to remove the address from
 * @param prefixlen the prefix length of the network associated with the address
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_addr_v4_del(openvpn_net_ctx_t *ctx, const openvpn_net_iface_t *iface,
                    const in_addr_t *addr, int prefixlen);

/**
 * Remove an IPv6 from an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface to remove the address from
 * @param prefixlen the prefix length of the network associated with the address
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_addr_v6_del(openvpn_net_ctx_t *ctx, const openvpn_net_iface_t *iface,
                    const struct in6_addr *addr, int prefixlen);

/**
 * Add a point-to-point IPv4 address to an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface where the address has to be added
 * @param local     the address to add
 * @param remote    the associated p-t-p remote address
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_addr_ptp_v4_add(openvpn_net_ctx_t *ctx,
                        const openvpn_net_iface_t *iface,
                        const in_addr_t *local, const in_addr_t *remote);

/**
 * Remove a point-to-point IPv4 address from an interface
 *
 * @param ctx       the implementation specific context
 * @param iface     the interface to remove the address from
 * @param local     the address to remove
 * @param remote    the associated p-t-p remote address
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_addr_ptp_v4_del(openvpn_net_ctx_t *ctx,
                        const openvpn_net_iface_t *iface,
                        const in_addr_t *local, const in_addr_t *remote);


/**
 * Add a route for an IPv4 address/network
 *
 * @param ctx       the implementation specific context
 * @param dst       the destination of the route
 * @param prefixlen the length of the prefix of the destination
 * @param gw        the gateway for this route
 * @param iface     the interface for this route (can be NULL)
 * @param table     the table to add this route to (if 0, will be added to the
 *                  main table)
 * @param metric    the metric associated with the route
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_route_v4_add(openvpn_net_ctx_t *ctx, const in_addr_t *dst,
                     int prefixlen, const in_addr_t *gw,
                     const openvpn_net_iface_t *iface, uint32_t table,
                     int metric);

/**
 * Add a route for an IPv6 address/network
 *
 * @param ctx       the implementation specific context
 * @param dst       the destination of the route
 * @param prefixlen the length of the prefix of the destination
 * @param gw        the gateway for this route
 * @param iface     the interface for this route (can be NULL)
 * @param table     the table to add this route to (if 0, will be added to the
 *                  main table)
 * @param metric    the metric associated with the route
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_route_v6_add(openvpn_net_ctx_t *ctx, const struct in6_addr *dst,
                     int prefixlen, const struct in6_addr *gw,
                     const openvpn_net_iface_t *iface,
                     uint32_t table, int metric);

/**
 * Delete a route for an IPv4 address/network
 *
 * @param ctx       the implementation specific context
 * @param dst       the destination of the route
 * @param prefixlen the length of the prefix of the destination
 * @param gw        the gateway for this route
 * @param iface     the interface for this route (can be NULL)
 * @param table     the table to add this route to (if 0, will be added to the
 *                  main table)
 * @param metric    the metric associated with the route
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_route_v4_del(openvpn_net_ctx_t *ctx, const in_addr_t *dst,
                     int prefixlen, const in_addr_t *gw,
                     const openvpn_net_iface_t *iface, uint32_t table,
                     int metric);

/**
 * Delete a route for an IPv4 address/network
 *
 * @param ctx       the implementation specific context
 * @param dst       the destination of the route
 * @param prefixlen the length of the prefix of the destination
 * @param gw        the gateway for this route
 * @param iface     the interface for this route (can be NULL)
 * @param table     the table to add this route to (if 0, will be added to the
 *                  main table)
 * @param metric    the metric associated with the route
 *
 * @return          0 on success, a negative error code otherwise
 */
int net_route_v6_del(openvpn_net_ctx_t *ctx, const struct in6_addr *dst,
                     int prefixlen, const struct in6_addr *gw,
                     const openvpn_net_iface_t *iface,
                     uint32_t table, int metric);

/**
 * Retrieve the gateway and outgoing interface for the specified IPv4
 * address/network
 *
 * @param ctx           the implementation specific context
 * @param dst           The destination to lookup
 * @param best_gw       Location where the retrieved GW has to be stored
 * @param best_iface    Location where the retrieved interface has to be stored
 *
 * @return              0 on success, a negative error code otherwise
 */
int net_route_v4_best_gw(openvpn_net_ctx_t *ctx, const in_addr_t *dst,
                         in_addr_t *best_gw, openvpn_net_iface_t *best_iface);

/**
 * Retrieve the gateway and outgoing interface for the specified IPv6
 * address/network
 *
 * @param ctx           the implementation specific context
 * @param dst           The destination to lookup
 * @param best_gw       Location where the retrieved GW has to be stored
 * @param best_iface    Location where the retrieved interface has to be stored
 *
 * @return              0 on success, a negative error code otherwise
 */
int net_route_v6_best_gw(openvpn_net_ctx_t *ctx, const struct in6_addr *dst,
                         struct in6_addr *best_gw,
                         openvpn_net_iface_t *best_iface);

#endif /* ENABLE_SITNL || ENABLE_IPROUTE */

#endif /* NETWORKING_H_ */
