Index: net/socket/tcp_socket.cc |
diff --git a/net/socket/tcp_socket.cc b/net/socket/tcp_socket.cc |
index 864159750a8d2c700af63ff7692633dac7e50453..8090265935e7547af839bb387681d4b2b7ecba93 100644 |
--- a/net/socket/tcp_socket.cc |
+++ b/net/socket/tcp_socket.cc |
@@ -8,72 +8,67 @@ |
#include "base/files/file_path.h" |
#include "base/location.h" |
#include "base/memory/ref_counted.h" |
+#include "base/task_runner_util.h" |
#include "base/threading/worker_pool.h" |
namespace net { |
namespace { |
+// True if OS supports TCP FastOpen. |
+bool g_tcp_fastopen_supported = false; |
+// True if OS supports TCP FastOpen and is turned on for all connections. |
bool g_tcp_fastopen_enabled = false; |
#if defined(OS_LINUX) || defined(OS_ANDROID) |
-typedef base::RefCountedData<bool> SharedBoolean; |
+ // typedef base::RefCountedData<bool> SharedBoolean; |
-// Checks to see if the system supports TCP FastOpen. Notably, it requires |
-// kernel support. Additionally, this checks system configuration to ensure that |
-// it's enabled. |
-void SystemSupportsTCPFastOpen(scoped_refptr<SharedBoolean> supported) { |
- supported->data = false; |
+// Checks if the kernel supports TCP FastOpen. |
+bool SystemSupportsTCPFastOpen() { |
static const base::FilePath::CharType kTCPFastOpenProcFilePath[] = |
"/proc/sys/net/ipv4/tcp_fastopen"; |
- std::string system_enabled_tcp_fastopen; |
+ std::string system_supports_tcp_fastopen; |
if (!base::ReadFileToString(base::FilePath(kTCPFastOpenProcFilePath), |
- &system_enabled_tcp_fastopen)) { |
- return; |
+ &system_supports_tcp_fastopen)) { |
+ return false; |
} |
- |
- // As per http://lxr.linux.no/linux+v3.7.7/include/net/tcp.h#L225 |
- // TFO_CLIENT_ENABLE is the LSB |
- if (system_enabled_tcp_fastopen.empty() || |
- (system_enabled_tcp_fastopen[0] & 0x1) == 0) { |
- return; |
+ // The read from /proc should return '1' if TCP FastOpen is enabled in the OS. |
+ if (system_supports_tcp_fastopen.empty() || |
+ (system_supports_tcp_fastopen[0] != '1')) { |
+ return false; |
} |
- |
- supported->data = true; |
-} |
- |
-void EnableCallback(scoped_refptr<SharedBoolean> supported) { |
- g_tcp_fastopen_enabled = supported->data; |
+ return true; |
} |
-// This is asynchronous because it needs to do file IO, and it isn't allowed to |
-// do that on the IO thread. |
-void EnableFastOpenIfSupported() { |
- scoped_refptr<SharedBoolean> supported = new SharedBoolean; |
- base::WorkerPool::PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(SystemSupportsTCPFastOpen, supported), |
- base::Bind(EnableCallback, supported), |
- false); |
+void CallbackForTCPFastOpenCheck(bool user_enabled, |
+ bool system_supported) { |
+ g_tcp_fastopen_supported = system_supported; |
+ if (user_enabled) { |
+ g_tcp_fastopen_enabled = system_supported; |
+ } |
} |
#else |
-void EnableFastOpenIfSupported() { |
- g_tcp_fastopen_enabled = false; |
-} |
+void CheckSupportAndMaybeEnableTCPFastOpen(bool user_enabled) {} |
#endif |
} // namespace |
-void SetTCPFastOpenEnabled(bool value) { |
- if (value) { |
- EnableFastOpenIfSupported(); |
- } else { |
- g_tcp_fastopen_enabled = false; |
- } |
+// This is asynchronous because it needs to do file IO, and it isn't allowed to |
+// do that on the IO thread. |
+void CheckSupportAndMaybeEnableTCPFastOpen(bool user_enabled) { |
+ base::PostTaskAndReplyWithResult( |
+ base::WorkerPool::GetTaskRunner(/*task_is_slow=*/false), |
+ FROM_HERE, |
+ base::Bind(SystemSupportsTCPFastOpen), |
+ base::Bind(CallbackForTCPFastOpenCheck, user_enabled)); |
+} |
+ |
+bool IsTCPFastOpenSupported() { |
+ return g_tcp_fastopen_supported; |
} |
bool IsTCPFastOpenEnabled() { |