dhcrelay: Don't look up the ifindex for the fallback interface (#17797) (#18416)

Currently, whenever isc-dhcp-relay forwards a packet upstream,
internally, it will try to send it on a "fallback" interface. My
understanding is that this isn't meant to be a real interface, but
instead is basically saying to use Linux's regular routing stack to
route the packet appropriately (rather than having isc-dhcp-relay
specify specifically which interface to use).

The problem is that on systems with a weak CPU, a large number of
interfaces, and many upstream servers specified, this can introduce a
noticeable delay in packets getting sent. The delay comes from trying to
get the ifindex of the fallback interface. In one test case, it got to
the point that only 2 packets could be processed per second. Because of
this, dhcrelay will easily get backlogged and likely get to a point
where packets get dropped in the kernel.

Fix this by adding a check saying if we're using the fallback interface,
then don't try to get the ifindex of this interface. We're never going
to have an interface named this in SONiC.

Signed-off-by: Saikrishna Arcot <sarcot@microsoft.com>
Co-authored-by: Saikrishna Arcot <sarcot@microsoft.com>
This commit is contained in:
Yaqiang Zhu 2024-03-23 06:07:10 +08:00 committed by GitHub
parent dcbd39940d
commit fcbda4ca4f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 0 deletions

View File

@ -0,0 +1,34 @@
From 079ff1bb570dae96c4ca513e210c9856e9cc75b0 Mon Sep 17 00:00:00 2001
From: Saikrishna Arcot <sarcot@microsoft.com>
Date: Wed, 10 Jan 2024 23:30:17 -0800
Subject: [PATCH] Don't look up the ifindex for fallback
If sending a packet on the "fallback" interface, then don't try to get the
ifindex for that interface. There will never be an actual interface named
"fallback" in SONiC (at least, not one that we will want to use).
This might save 0.009-0.012 seconds per upstream server, and when there
are as many as 48 upstream servers, it can save about 0.4-0.5 seconds of
time. This then allows dhcrelay to process more packets.
Signed-off-by: Saikrishna Arcot <sarcot@microsoft.com>
diff --git a/common/socket.c b/common/socket.c
index da9f501..e707a7f 100644
--- a/common/socket.c
+++ b/common/socket.c
@@ -767,7 +767,10 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto)
memcpy(&dst, to, sizeof(dst));
m.msg_name = &dst;
m.msg_namelen = sizeof(dst);
- ifindex = if_nametoindex(interface->name);
+ if (strcmp(interface->name, "fallback") != 0)
+ ifindex = if_nametoindex(interface->name);
+ else
+ ifindex = 0;
/*
* Set the data buffer we're sending. (Using this wacky
--
2.34.1

View File

@ -12,3 +12,4 @@
0011-dhcp-relay-Prevent-Buffer-Overrun.patch
0012-add-option-si-to-support-using-src-intf-ip-in-relay.patch
0013-Fix-dhcrelay-agent-option-buffer-pointer-logic.patch
0016-Don-t-look-up-the-ifindex-for-fallback.patch