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