Commit 09ce44b3 authored by Udip Pant's avatar Udip Pant Committed by Facebook Github Bot

function to enable or disable pathmtu discovery

Summary:
Allows us to set IPV6_PMTUDISC_PROBE
See http://man7.org/linux/man-pages/man7/ip.7.html for reference

Reviewed By: yfeldblum

Differential Revision: D17624135

fbshipit-source-id: 46c1e71c768a0a7d0fbab5b728ba5df1b2f781b3
parent b73bf8c1
...@@ -209,6 +209,34 @@ void AsyncUDPSocket::dontFragment(bool df) { ...@@ -209,6 +209,34 @@ void AsyncUDPSocket::dontFragment(bool df) {
#endif #endif
} }
void AsyncUDPSocket::setDFAndTurnOffPMTU() {
#if defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_PROBE)
if (address().getFamily() == AF_INET) {
int v4 = IP_PMTUDISC_PROBE;
if (folly::netops::setsockopt(
fd_, IPPROTO_IP, IP_MTU_DISCOVER, &v4, sizeof(v4))) {
throw AsyncSocketException(
AsyncSocketException::NOT_OPEN,
"Failed to set PMTUDISC_PROBE with IP_MTU_DISCOVER",
errno);
}
}
#endif
#if defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_PROBE)
if (address().getFamily() == AF_INET6) {
int v6 = IPV6_PMTUDISC_PROBE;
if (folly::netops::setsockopt(
fd_, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &v6, sizeof(v6))) {
throw AsyncSocketException(
AsyncSocketException::NOT_OPEN,
"Failed to set PMTUDISC_PROBE with IPV6_MTU_DISCOVER",
errno);
}
}
#endif
}
void AsyncUDPSocket::setErrMessageCallback( void AsyncUDPSocket::setErrMessageCallback(
ErrMessageCallback* errMessageCallback) { ErrMessageCallback* errMessageCallback) {
errMessageCallback_ = errMessageCallback; errMessageCallback_ = errMessageCallback;
......
...@@ -252,6 +252,16 @@ class AsyncUDPSocket : public EventHandler { ...@@ -252,6 +252,16 @@ class AsyncUDPSocket : public EventHandler {
*/ */
virtual void dontFragment(bool df); virtual void dontFragment(bool df);
/**
* Set Dont-Fragment (DF) but ignore Path MTU.
*
* On Linux, this sets IP(V6)_MTU_DISCOVER to IP(V6)_PMTUDISC_PROBE.
* This essentially sets DF but ignores Path MTU for this socket.
* This may be desirable for apps that has its own PMTU Discovery mechanism.
* See http://man7.org/linux/man-pages/man7/ip.7.html for more info.
*/
virtual void setDFAndTurnOffPMTU();
/** /**
* Callback for receiving errors on the UDP sockets * Callback for receiving errors on the UDP sockets
*/ */
......
...@@ -43,6 +43,7 @@ struct MockAsyncUDPSocket : public AsyncUDPSocket { ...@@ -43,6 +43,7 @@ struct MockAsyncUDPSocket : public AsyncUDPSocket {
MOCK_METHOD1(resumeRead, void(ReadCallback*)); MOCK_METHOD1(resumeRead, void(ReadCallback*));
MOCK_METHOD0(pauseRead, void()); MOCK_METHOD0(pauseRead, void());
MOCK_METHOD0(close, void()); MOCK_METHOD0(close, void());
MOCK_METHOD0(setDFAndTurnOffPMTU, void());
MOCK_CONST_METHOD0(getNetworkSocket, NetworkSocket()); MOCK_CONST_METHOD0(getNetworkSocket, NetworkSocket());
MOCK_METHOD1(setReusePort, void(bool)); MOCK_METHOD1(setReusePort, void(bool));
MOCK_METHOD1(setReuseAddr, void(bool)); MOCK_METHOD1(setReuseAddr, void(bool));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment