aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2013-06-11 16:05:40 +0200
committerTobias Brunner <tobias@strongswan.org>2013-06-21 17:03:20 +0200
commit3cd7ba4960457c02f798abba1052eba1bde18b9c (patch)
treec9ce824b898f78aa36ab3a45a4bc5abbeeb52ac9
parent1b3b7ba54d1d703efce60efbd0462e38a8b55eb2 (diff)
downloadstrongswan-3cd7ba4960457c02f798abba1052eba1bde18b9c.tar.bz2
strongswan-3cd7ba4960457c02f798abba1052eba1bde18b9c.tar.xz
kernel-netlink: Routes don't require a gateway/nexthop
-rw-r--r--src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
index d4cb4e1ac..020b36a0b 100644
--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
+++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
@@ -265,7 +265,7 @@ static route_entry_t *route_entry_clone(route_entry_t *this)
INIT(route,
.if_name = strdup(this->if_name),
.src_ip = this->src_ip->clone(this->src_ip),
- .gateway = this->gateway->clone(this->gateway),
+ .gateway = this->gateway ? this->gateway->clone(this->gateway) : NULL,
.dst_net = chunk_clone(this->dst_net),
.prefixlen = this->prefixlen,
);
@@ -298,10 +298,14 @@ static u_int route_entry_hash(route_entry_t *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) &&
- a->gateway->ip_equals(a->gateway, b->gateway) &&
- chunk_equals(a->dst_net, b->dst_net) && a->prefixlen == b->prefixlen;
+ if (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)
+ {
+ return (!a->gateway && !b->gateway) || (a->gateway && b->gateway &&
+ a->gateway->ip_equals(a->gateway, b->gateway));
+ }
+ return FALSE;
}
typedef struct net_change_t net_change_t;