Skip to content

Commit

Permalink
dhcrelay: Don't look up the ifindex for the fallback interface (sonic…
Browse files Browse the repository at this point in the history
…-net#17797) (sonic-net#17840)

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>
  • Loading branch information
saiarcot895 authored Jan 19, 2024
1 parent fc7a1ac commit 306175b
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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

1 change: 1 addition & 0 deletions src/isc-dhcp/patch/series
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 306175b

Please sign in to comment.