struct route_entry_t {
/** Name of the interface the route is bound to */
char *if_name;
- /** Source ip of the route */
+ /** Source IP of the route */
host_t *src_ip;
+ /** Gateway of the route */
+ host_t *gateway;
/** Destination net */
chunk_t dst_net;
/** Destination net prefixlen */
{
free(this->if_name);
DESTROY_IF(this->src_ip);
+ DESTROY_IF(this->gateway);
chunk_free(&this->dst_net);
free(this);
}
*/
static bool route_entry_equals(route_entry_t *a, route_entry_t *b)
{
- return a->if_name && b->if_name && streq(a->if_name, b->if_name) &&
- a->src_ip->ip_equals(a->src_ip, b->src_ip) &&
- chunk_equals(a->dst_net, b->dst_net) && a->prefixlen == b->prefixlen;
+ if ((!a->src_ip && !b->src_ip) || (a->src_ip && b->src_ip &&
+ a->src_ip->ip_equals(a->src_ip, b->src_ip)))
+ {
+ if ((!a->gateway && !b->gateway) || (a->gateway && b->gateway &&
+ a->gateway->ip_equals(a->gateway, b->gateway)))
+ {
+ return a->if_name && b->if_name && streq(a->if_name, b->if_name) &&
+ chunk_equals(a->dst_net, b->dst_net) &&
+ a->prefixlen == b->prefixlen;
+ }
+ }
+ return FALSE;
}
typedef struct policy_entry_t policy_entry_t;
.dst_net = chunk_clone(policy->dst.net->get_address(policy->dst.net)),
.prefixlen = policy->dst.mask,
);
+#ifndef __linux__
+ /* on Linux we cant't install a gateway */
+ route->gateway = hydra->kernel_interface->get_nexthop(
+ hydra->kernel_interface, dst, src);
+#endif
if (policy->route)
{
}
/* uninstall previously installed route */
if (hydra->kernel_interface->del_route(hydra->kernel_interface,
- old->dst_net, old->prefixlen, NULL,
+ old->dst_net, old->prefixlen, old->gateway,
old->src_ip, old->if_name) != SUCCESS)
{
DBG1(DBG_KNL, "error uninstalling route installed with policy "
dst_ts, route->src_ip, route->if_name);
switch (hydra->kernel_interface->add_route(hydra->kernel_interface,
- route->dst_net, route->prefixlen, NULL,
+ route->dst_net, route->prefixlen, route->gateway,
route->src_ip, route->if_name))
{
case ALREADY_DONE:
route_entry_t *route = policy->route;
if (hydra->kernel_interface->del_route(hydra->kernel_interface,
- route->dst_net, route->prefixlen, NULL, route->src_ip,
+ route->dst_net, route->prefixlen, route->gateway, route->src_ip,
route->if_name) != SUCCESS)
{
DBG1(DBG_KNL, "error uninstalling route installed with "
route_entry_t *route = pol->route;
hydra->kernel_interface->del_route(hydra->kernel_interface,
- route->dst_net, route->prefixlen, NULL, route->src_ip,
- route->if_name);
+ route->dst_net, route->prefixlen, route->gateway,
+ route->src_ip, route->if_name);
remove_exclude_route(this, route);
}
policy_entry_destroy(pol);