kernel-netlink: Ignore routes with next hop during local subnet enumeration
These are not locally attached and we do the same already in kernel-pfroute. Fixes #2554.
This commit is contained in:
@@ -2256,49 +2256,31 @@ METHOD(enumerator_t, enumerate_subnets, bool,
|
|||||||
break;
|
break;
|
||||||
case RTM_NEWROUTE:
|
case RTM_NEWROUTE:
|
||||||
{
|
{
|
||||||
struct rtmsg *msg;
|
rt_entry_t route;
|
||||||
struct rtattr *rta;
|
|
||||||
size_t rtasize;
|
|
||||||
chunk_t dst = chunk_empty;
|
|
||||||
uint32_t oif = 0;
|
|
||||||
|
|
||||||
msg = NLMSG_DATA(this->current);
|
|
||||||
|
|
||||||
if (!route_usable(this->current))
|
if (!route_usable(this->current))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (msg->rtm_table && (
|
parse_route(this->current, &route);
|
||||||
msg->rtm_table == RT_TABLE_LOCAL ||
|
|
||||||
msg->rtm_table == this->private->routing_table))
|
if (route.table && (
|
||||||
|
route.table == RT_TABLE_LOCAL ||
|
||||||
|
route.table == this->private->routing_table))
|
||||||
{ /* ignore our own and the local routing tables */
|
{ /* ignore our own and the local routing tables */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (route.gtw.ptr)
|
||||||
rta = RTM_RTA(msg);
|
{ /* ignore routes via gateway/next hop */
|
||||||
rtasize = RTM_PAYLOAD(this->current);
|
|
||||||
while (RTA_OK(rta, rtasize))
|
|
||||||
{
|
|
||||||
switch (rta->rta_type)
|
|
||||||
{
|
|
||||||
case RTA_DST:
|
|
||||||
dst = chunk_create(RTA_DATA(rta), RTA_PAYLOAD(rta));
|
|
||||||
break;
|
|
||||||
case RTA_OIF:
|
|
||||||
if (RTA_PAYLOAD(rta) == sizeof(oif))
|
|
||||||
{
|
|
||||||
oif = *(uint32_t*)RTA_DATA(rta);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
rta = RTA_NEXT(rta, rtasize);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dst.ptr && oif && if_indextoname(oif, this->ifname))
|
if (route.dst.ptr && route.oif &&
|
||||||
|
if_indextoname(route.oif, this->ifname))
|
||||||
{
|
{
|
||||||
this->net = host_create_from_chunk(msg->rtm_family, dst, 0);
|
this->net = host_create_from_chunk(AF_UNSPEC, route.dst, 0);
|
||||||
*net = this->net;
|
*net = this->net;
|
||||||
*mask = msg->rtm_dst_len;
|
*mask = route.dst_len;
|
||||||
*ifname = this->ifname;
|
*ifname = this->ifname;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user