tcp_client_socket.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/socket/tcp_client_socket.h" 6 7#include "base/file_util.h" 8#include "base/files/file_path.h" 9 10namespace net { 11 12namespace { 13 14#if defined(OS_LINUX) 15 16// Checks to see if the system supports TCP FastOpen. Notably, it requires 17// kernel support. Additionally, this checks system configuration to ensure that 18// it's enabled. 19bool SystemSupportsTCPFastOpen() { 20 static const base::FilePath::CharType kTCPFastOpenProcFilePath[] = 21 "/proc/sys/net/ipv4/tcp_fastopen"; 22 std::string system_enabled_tcp_fastopen; 23 if (!file_util::ReadFileToString( 24 base::FilePath(kTCPFastOpenProcFilePath), 25 &system_enabled_tcp_fastopen)) { 26 return false; 27 } 28 29 // As per http://lxr.linux.no/linux+v3.7.7/include/net/tcp.h#L225 30 // TFO_CLIENT_ENABLE is the LSB 31 if (system_enabled_tcp_fastopen.empty() || 32 (system_enabled_tcp_fastopen[0] & 0x1) == 0) { 33 return false; 34 } 35 36 return true; 37} 38 39#else 40 41bool SystemSupportsTCPFastOpen() { 42 return false; 43} 44 45#endif 46 47} 48 49static bool g_tcp_fastopen_enabled = false; 50 51void SetTCPFastOpenEnabled(bool value) { 52 g_tcp_fastopen_enabled = value && SystemSupportsTCPFastOpen(); 53} 54 55bool IsTCPFastOpenEnabled() { 56 return g_tcp_fastopen_enabled; 57} 58 59} // namespace net 60