From 2406474158413810348665876ddb3a56818e92d8 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Wed, 12 Oct 2016 12:22:42 +0200 Subject: [PATCH] kernel-netlink: Return interface name in local subnet enumerator --- .../plugins/kernel_netlink/kernel_netlink_net.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c index 61e0292..b19bbf2 100644 --- a/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c @@ -2137,6 +2137,8 @@ typedef struct { size_t len; /** last subnet enumerated */ host_t *net; + /** interface of current net */ + char ifname[IFNAMSIZ]; } subnet_enumerator_t; METHOD(enumerator_t, destroy_subnet_enumerator, void, @@ -2173,6 +2175,7 @@ METHOD(enumerator_t, enumerate_subnets, bool, struct rtattr *rta; size_t rtasize; chunk_t dst = chunk_empty; + uint32_t oif = 0; msg = NLMSG_DATA(this->current); @@ -2191,20 +2194,27 @@ METHOD(enumerator_t, enumerate_subnets, bool, rtasize = RTM_PAYLOAD(this->current); while (RTA_OK(rta, rtasize)) { - if (rta->rta_type == RTA_DST) + switch (rta->rta_type) { - dst = chunk_create(RTA_DATA(rta), RTA_PAYLOAD(rta)); - break; + 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; } rta = RTA_NEXT(rta, rtasize); } - if (dst.ptr) + if (dst.ptr && oif && if_indextoname(oif, this->ifname)) { this->net = host_create_from_chunk(msg->rtm_family, dst, 0); *net = this->net; *mask = msg->rtm_dst_len; - *ifname = NULL; + *ifname = this->ifname; return TRUE; } break; -- 2.7.4