aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLutz Donnerhacke <donner@FreeBSD.org>2021-05-25 13:03:34 +0000
committerLutz Donnerhacke <donner@FreeBSD.org>2021-06-19 16:58:52 +0000
commitd41044ddfdbc2a026570cae11d5fc2e18f5e4b92 (patch)
tree22555c8e5951d4fc8b1980ead3f35dfcfb178bfa
parentef828d39be8e4b6d922db080ed41611702dec56d (diff)
downloadsrc-d41044ddfdbc2a026570cae11d5fc2e18f5e4b92.tar.gz
src-d41044ddfdbc2a026570cae11d5fc2e18f5e4b92.zip
libalias: Restructure - Common search terms
Factor out the common Out and In filter Slightly better performance due to eager skip of search loop MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D30568
-rw-r--r--sys/netinet/libalias/alias_db.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/sys/netinet/libalias/alias_db.c b/sys/netinet/libalias/alias_db.c
index 8f6db015fe86..342f6117f878 100644
--- a/sys/netinet/libalias/alias_db.c
+++ b/sys/netinet/libalias/alias_db.c
@@ -1096,15 +1096,19 @@ _FindLinkOut(struct libalias *la, struct in_addr src_addr,
u_int i;
struct alias_link *lnk;
+#define OUTGUARD \
+ if (lnk->src_port != src_port || \
+ lnk->src_addr.s_addr != src_addr.s_addr || \
+ lnk->link_type != link_type || \
+ lnk->server != NULL) \
+ continue;
+
LIBALIAS_LOCK_ASSERT(la);
i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type);
LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) {
+ OUTGUARD;
if (lnk->dst_addr.s_addr == dst_addr.s_addr &&
- lnk->src_addr.s_addr == src_addr.s_addr &&
- lnk->src_port == src_port &&
- lnk->dst_port == dst_port &&
- lnk->link_type == link_type &&
- lnk->server == NULL)
+ lnk->dst_port == dst_port)
break;
}
@@ -1133,6 +1137,7 @@ _FindLinkOut(struct libalias *la, struct in_addr src_addr,
link_type);
}
}
+#undef OUTGUARD
return (lnk);
}
@@ -1197,47 +1202,42 @@ _FindLinkIn(struct libalias *la, struct in_addr dst_addr,
if (dst_port == 0)
flags_in |= LINK_UNKNOWN_DEST_PORT;
+#define INGUARD \
+ if (lnk->alias_port != alias_port || \
+ lnk->link_type != link_type || \
+ lnk->alias_addr.s_addr != alias_addr.s_addr) \
+ continue;
+
/* Search loop */
start_point = StartPointIn(alias_addr, alias_port, link_type);
LIST_FOREACH(lnk, &la->linkTableIn[start_point], list_in) {
int flags;
+ INGUARD;
flags = flags_in | lnk->flags;
if (!(flags & LINK_PARTIALLY_SPECIFIED)) {
- if (lnk->alias_addr.s_addr == alias_addr.s_addr
- && lnk->alias_port == alias_port
- && lnk->dst_addr.s_addr == dst_addr.s_addr
- && lnk->dst_port == dst_port
- && lnk->link_type == link_type) {
+ if (lnk->dst_addr.s_addr == dst_addr.s_addr
+ && lnk->dst_port == dst_port) {
lnk_fully_specified = lnk;
break;
}
} else if ((flags & LINK_UNKNOWN_DEST_ADDR)
&& (flags & LINK_UNKNOWN_DEST_PORT)) {
- if (lnk->alias_addr.s_addr == alias_addr.s_addr
- && lnk->alias_port == alias_port
- && lnk->link_type == link_type) {
- if (lnk_unknown_all == NULL)
- lnk_unknown_all = lnk;
- }
+ if (lnk_unknown_all == NULL)
+ lnk_unknown_all = lnk;
} else if (flags & LINK_UNKNOWN_DEST_ADDR) {
- if (lnk->alias_addr.s_addr == alias_addr.s_addr
- && lnk->alias_port == alias_port
- && lnk->link_type == link_type
- && lnk->dst_port == dst_port) {
+ if (lnk->dst_port == dst_port) {
if (lnk_unknown_dst_addr == NULL)
lnk_unknown_dst_addr = lnk;
}
} else if (flags & LINK_UNKNOWN_DEST_PORT) {
- if (lnk->alias_addr.s_addr == alias_addr.s_addr
- && lnk->alias_port == alias_port
- && lnk->link_type == link_type
- && lnk->dst_addr.s_addr == dst_addr.s_addr) {
+ if (lnk->dst_addr.s_addr == dst_addr.s_addr) {
if (lnk_unknown_dst_port == NULL)
lnk_unknown_dst_port = lnk;
}
}
}
+#undef INGUARD
CleanupLink(la, &lnk_fully_specified);
if (lnk_fully_specified != NULL) {