summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2019-03-20 18:33:47 +0100
committerSander Vrijders <[email protected]>2019-03-21 09:42:34 +0100
commit086cd5dae628556ffaa2c2efe559a5bd2fba8d0e (patch)
tree283abbcacdacd89ace7eae9d66ec9427e69f3666
parentbb724cad016fba5775e751c817df0a07136d223f (diff)
downloadouroboros-086cd5dae628556ffaa2c2efe559a5bd2fba8d0e.tar.gz
ouroboros-086cd5dae628556ffaa2c2efe559a5bd2fba8d0e.zip
ipcpd: Restrict MTU for Ethernet over loopback
This restricts the MTU for the Ethernet IPCP over loopback adapters (devices named "lo*") to avoid it allocating 65K buffers per packet and quickly filling the default RDRBUFF space. The restriction is set using the build option IPCP_ETH_LO_MTU, with a default value of 1500 bytes. Signed-off-by: Dimitri Staessens <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
-rw-r--r--src/ipcpd/config.h.in1
-rw-r--r--src/ipcpd/eth/CMakeLists.txt2
-rw-r--r--src/ipcpd/eth/eth.c5
3 files changed, 8 insertions, 0 deletions
diff --git a/src/ipcpd/config.h.in b/src/ipcpd/config.h.in
index 8545021b..e050d656 100644
--- a/src/ipcpd/config.h.in
+++ b/src/ipcpd/config.h.in
@@ -65,3 +65,4 @@
#cmakedefine IPCP_ETH_QDISC_BYPASS
#define IPCP_ETH_RD_THR @IPCP_ETH_RD_THR@
#define IPCP_ETH_WR_THR @IPCP_ETH_WR_THR@
+#define IPCP_ETH_LO_MTU @IPCP_ETH_LO_MTU@
diff --git a/src/ipcpd/eth/CMakeLists.txt b/src/ipcpd/eth/CMakeLists.txt
index abffbb2d..89575b6b 100644
--- a/src/ipcpd/eth/CMakeLists.txt
+++ b/src/ipcpd/eth/CMakeLists.txt
@@ -84,6 +84,8 @@ if (HAVE_ETH)
"Number of writer threads in Ethernet IPCP")
set(IPCP_ETH_QDISC_BYPASS false CACHE BOOL
"Bypass the Qdisc in the kernel when using raw sockets")
+ set(IPCP_ETH_LO_MTU 1500 CACHE STRING
+ "Restrict Ethernet MTU over loopback interfaces")
set(ETH_LLC_SOURCES
# Add source files here
diff --git a/src/ipcpd/eth/eth.c b/src/ipcpd/eth/eth.c
index 04130d6f..1a332272 100644
--- a/src/ipcpd/eth/eth.c
+++ b/src/ipcpd/eth/eth.c
@@ -1316,6 +1316,11 @@ static int eth_ipcp_bootstrap(const struct ipcp_config * conf)
log_dbg("Device MTU is %d.", ifr.ifr_mtu);
eth_data.mtu = MIN((int) ETH_MTU_MAX, ifr.ifr_mtu);
+ if (memcmp(conf->dev, "lo", 2) == 0 && eth_data.mtu > IPCP_ETH_LO_MTU) {
+ log_dbg("Using loopback interface. MTU restricted to %d.",
+ IPCP_ETH_LO_MTU);
+ eth_data.mtu = IPCP_ETH_LO_MTU;
+ }
#ifndef SHM_RDRB_MULTI_BLOCK
maxsz = SHM_RDRB_BLOCK_SIZE - 5 * sizeof(size_t) -