diff options
author | Tobias Brunner <tobias@strongswan.org> | 2016-10-12 12:22:42 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2017-02-08 10:38:28 +0100 |
commit | 2406474158413810348665876ddb3a56818e92d8 (patch) | |
tree | ad42f574b4b936ae933e6650bbd138a77b702920 /src | |
parent | 46c21e3cc3ee3422463362495e1ab59cd292298e (diff) | |
download | strongswan-2406474158413810348665876ddb3a56818e92d8.tar.bz2 strongswan-2406474158413810348665876ddb3a56818e92d8.tar.xz |
kernel-netlink: Return interface name in local subnet enumerator
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/plugins/kernel_netlink/kernel_netlink_net.c | 20 |
1 files 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 61e029254..b19bbf2f0 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; |