face: support runtime MTU changes on Ethernet faces
refs #3257
Change-Id: I160fe444b889b8f7be19022a2bd52bbc9f7a21aa
diff --git a/daemon/face/ethernet-transport.cpp b/daemon/face/ethernet-transport.cpp
index 6b419bf..01e175b 100644
--- a/daemon/face/ethernet-transport.cpp
+++ b/daemon/face/ethernet-transport.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2019, Regents of the University of California,
+ * Copyright (c) 2014-2020, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -58,11 +58,16 @@
NDN_THROW_NESTED(Error(e.what()));
}
- m_netifStateConn = localEndpoint.onStateChanged.connect(
- [=] (ndn::net::InterfaceState, ndn::net::InterfaceState newState) {
+ m_netifStateChangedConn = localEndpoint.onStateChanged.connect(
+ [this] (ndn::net::InterfaceState, ndn::net::InterfaceState newState) {
handleNetifStateChange(newState);
});
+ m_netifMtuChangedConn = localEndpoint.onMtuChanged.connect(
+ [this] (uint32_t, uint32_t mtu) {
+ setMtu(mtu);
+ });
+
asyncRead();
}
diff --git a/daemon/face/ethernet-transport.hpp b/daemon/face/ethernet-transport.hpp
index 8258285..a88b95b 100644
--- a/daemon/face/ethernet-transport.hpp
+++ b/daemon/face/ethernet-transport.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2019, Regents of the University of California,
+ * Copyright (c) 2014-2020, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -106,7 +106,8 @@
std::string m_interfaceName;
private:
- signal::ScopedConnection m_netifStateConn;
+ signal::ScopedConnection m_netifStateChangedConn;
+ signal::ScopedConnection m_netifMtuChangedConn;
bool m_hasRecentlyReceived;
#ifdef _DEBUG
/// number of frames dropped by the kernel, as reported by libpcap
diff --git a/daemon/face/generic-link-service.cpp b/daemon/face/generic-link-service.cpp
index 601c041..b3b7d96 100644
--- a/daemon/face/generic-link-service.cpp
+++ b/daemon/face/generic-link-service.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2019, Regents of the University of California,
+ * Copyright (c) 2014-2020, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -171,7 +171,8 @@
mtu -= CONGESTION_MARK_SIZE;
}
- BOOST_ASSERT(mtu == MTU_UNLIMITED || mtu > 0);
+ // An MTU of 0 is allowed but will cause all packets to be dropped before transmission
+ BOOST_ASSERT(mtu == MTU_UNLIMITED || mtu >= 0);
if (m_options.allowFragmentation && mtu != MTU_UNLIMITED) {
bool isOk = false;
diff --git a/daemon/face/transport.cpp b/daemon/face/transport.cpp
index 7b1bb18..18d8608 100644
--- a/daemon/face/transport.cpp
+++ b/daemon/face/transport.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2019, Regents of the University of California,
+ * Copyright (c) 2014-2020, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -124,6 +124,22 @@
m_service->receivePacket(packet, endpoint);
}
+void
+Transport::setMtu(ssize_t mtu)
+{
+ BOOST_ASSERT(mtu == MTU_UNLIMITED || mtu >= 0);
+
+ if (mtu == m_mtu) {
+ return;
+ }
+
+ if (m_mtu != MTU_INVALID) {
+ NFD_LOG_FACE_INFO("setMtu " << m_mtu << " -> " << mtu);
+ }
+
+ m_mtu = mtu;
+}
+
bool
Transport::canChangePersistencyTo(ndn::nfd::FacePersistency newPersistency) const
{
diff --git a/daemon/face/transport.hpp b/daemon/face/transport.hpp
index dd6bb41..211fefc 100644
--- a/daemon/face/transport.hpp
+++ b/daemon/face/transport.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2014-2019, Regents of the University of California,
+ * Copyright (c) 2014-2020, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -444,13 +444,6 @@
return m_mtu;
}
-inline void
-Transport::setMtu(ssize_t mtu)
-{
- BOOST_ASSERT(mtu == MTU_UNLIMITED || mtu > 0);
- m_mtu = mtu;
-}
-
inline ssize_t
Transport::getSendQueueCapacity() const
{