diff options
author | Tobias Brunner <tobias@strongswan.org> | 2015-04-09 14:43:07 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2015-05-21 14:19:53 +0200 |
commit | 6716c6526e47c392655c5f0e6aa449a9eb6f5f94 (patch) | |
tree | f6c25763477bdf0361f6a95cd86695e171799f8b /src/libhydra/plugins/kernel_netlink | |
parent | cc902695e80c6af8ef512ce641898fefd36cb6c8 (diff) | |
download | strongswan-6716c6526e47c392655c5f0e6aa449a9eb6f5f94.tar.bz2 strongswan-6716c6526e47c392655c5f0e6aa449a9eb6f5f94.tar.xz |
kernel-netlink: Ignore unusable routes
Diffstat (limited to 'src/libhydra/plugins/kernel_netlink')
-rw-r--r-- | src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c index a431e49b7..1515b01cc 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c @@ -1551,6 +1551,26 @@ static void rt_entry_destroy(rt_entry_t *this) } /** + * Check if the route received with RTM_NEWROUTE is usable based on its type. + */ +static bool route_usable(struct nlmsghdr *hdr) +{ + struct rtmsg *msg; + + msg = NLMSG_DATA(hdr); + switch (msg->rtm_type) + { + case RTN_BLACKHOLE: + case RTN_UNREACHABLE: + case RTN_PROHIBIT: + case RTN_THROW: + return FALSE; + default: + return TRUE; + } +} + +/** * Parse route received with RTM_NEWROUTE. The given rt_entry_t object will be * reused if not NULL. * @@ -1700,6 +1720,10 @@ static host_t *get_route(private_kernel_netlink_net_t *this, host_t *dest, rt_entry_t *other; uintptr_t table; + if (!route_usable(current)) + { + continue; + } route = parse_route(current, route); table = (uintptr_t)route->table; |