/* * Generic interface to platform specific networking code * * Copyright (C) 2016-2018 Antonio Quartulli * * 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; } #endif #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); /** * 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 * @param broadcast the broadcast address to configure on the interface * * @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, const in_addr_t *broadcast); /** * 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 prefixlen The length of the prefix of the destination * @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, int prefixlen, 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 prefixlen The length of the prefix of the destination * @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, int prefixlen, struct in6_addr *best_gw, openvpn_net_iface_t *best_iface); #endif /* ENABLE_SITNL || ENABLE_IPROUTE */ #endif /* NETWORKING_H_ */