diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-10-22 16:52:38 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-10-22 16:52:38 +0200 |
commit | a5f035960006556beab51c42e6948985635e261a (patch) | |
tree | bee22c1c99904edcc348117d784b2352a018a4b3 | |
parent | 91c40d86120f3bf033539a53c971d99f5dd70708 (diff) |
resolved: simplify detection of packets from the loopback device
We can simplify our code quite a bit if we explicitly check for the
ifindex being 1 on Linux as a loopback check. Apparently, this is
hardcoded on Linux on the kernel, and effectively exported to userspace
via rtnl and such, hence we should be able to rely on it.
-rw-r--r-- | src/resolve/resolved-dns-stream.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-manager.c | 22 | ||||
-rw-r--r-- | src/resolve/resolved-manager.h | 1 | ||||
-rw-r--r-- | src/shared/missing.h | 9 |
4 files changed, 11 insertions, 23 deletions
diff --git a/src/resolve/resolved-dns-stream.c b/src/resolve/resolved-dns-stream.c index 8aad5e4df1..3690679ec6 100644 --- a/src/resolve/resolved-dns-stream.c +++ b/src/resolve/resolved-dns-stream.c @@ -157,7 +157,7 @@ static int dns_stream_identify(DnsStream *s) { * device if the connection came from the local host since it * avoids the routing table in such a case. Let's unset the * interface index in such a case. */ - if (s->ifindex > 0 && manager_ifindex_is_loopback(s->manager, s->ifindex) != 0) + if (s->ifindex == LOOPBACK_IFINDEX) s->ifindex = 0; /* If we don't know the interface index still, we look for the diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 74f4ad5dba..c4a5b08773 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -960,7 +960,7 @@ int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) { * device if the packet came from the local host since it * avoids the routing table in such a case. Let's unset the * interface index in such a case. */ - if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0) + if (p->ifindex == LOOPBACK_IFINDEX) p->ifindex = 0; /* If we don't know the interface index still, we look for the @@ -1695,26 +1695,6 @@ fail: return r; } -/* lo having ifindex 1 is hardcoded in the kernel */ -#define LOOPBACK_IFINDEX 1 - -int manager_ifindex_is_loopback(Manager *m, int ifindex) { - Link *l; - assert(m); - - if (ifindex <= 0) - return -EINVAL; - - l = hashmap_get(m->links, INT_TO_PTR(ifindex)); - if (!l) - /* in case we don't yet track the link, rely on the hardcoded value */ - return ifindex == LOOPBACK_IFINDEX; - else if (l->flags & IFF_LOOPBACK) - return 1; - - return 0; -} - int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) { LinkAddress *a; diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h index 78cbfc0b03..1151029d29 100644 --- a/src/resolve/resolved-manager.h +++ b/src/resolve/resolved-manager.h @@ -139,7 +139,6 @@ int manager_llmnr_ipv6_udp_fd(Manager *m); int manager_llmnr_ipv4_tcp_fd(Manager *m); int manager_llmnr_ipv6_tcp_fd(Manager *m); -int manager_ifindex_is_loopback(Manager *m, int ifindex); int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr); LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr); diff --git a/src/shared/missing.h b/src/shared/missing.h index a88d9e414b..bb4f8f23a8 100644 --- a/src/shared/missing.h +++ b/src/shared/missing.h @@ -527,3 +527,12 @@ static inline int setns(int fd, int nstype) { #ifndef BPF_XOR # define BPF_XOR 0xa0 #endif + +/* Note that LOOPBACK_IFINDEX is currently not exported by the + * kernel/glibc, but hardcoded internally by the kernel. However, as + * it is exported to userspace indirectly via rtnetlink and the + * ioctls, and made use of widely we define it here too, in a way that + * is compatible with the kernel's internal definition. */ +#ifndef LOOPBACK_IFINDEX +#define LOOPBACK_IFINDEX 1 +#endif |