1 | /*
|
---|
2 | * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | *
|
---|
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | * this file except in compliance with the License. You can obtain a copy
|
---|
6 | * in the file LICENSE in the source distribution or at
|
---|
7 | * https://www.openssl.org/source/license.html
|
---|
8 | */
|
---|
9 |
|
---|
10 | /*
|
---|
11 | * Contains definitions for simplifying the use of TCP Fast Open
|
---|
12 | * (RFC7413) in OpenSSL socket BIOs.
|
---|
13 | */
|
---|
14 |
|
---|
15 | /* If a supported OS is added here, update test/bio_tfo_test.c */
|
---|
16 | #if defined(TCP_FASTOPEN) && !defined(OPENSSL_NO_TFO)
|
---|
17 |
|
---|
18 | # if defined(OPENSSL_SYS_MACOSX) || defined(__FreeBSD__)
|
---|
19 | # include <sys/sysctl.h>
|
---|
20 | # endif
|
---|
21 |
|
---|
22 | /*
|
---|
23 | * OSSL_TFO_SYSCTL is used to determine if TFO is supported by
|
---|
24 | * this kernel, and if supported, if it is enabled. This is more of
|
---|
25 | * a problem on FreeBSD 10.3 ~ 11.4, where TCP_FASTOPEN was defined,
|
---|
26 | * but not enabled by default in the kernel, and only for the server.
|
---|
27 | * Linux does not have sysctlbyname(), and the closest equivalent
|
---|
28 | * is to go into the /proc filesystem, but I'm not sure it's
|
---|
29 | * worthwhile.
|
---|
30 | *
|
---|
31 | * On MacOS and Linux:
|
---|
32 | * These operating systems use a single parameter to control TFO.
|
---|
33 | * The OSSL_TFO_CLIENT_FLAG and OSSL_TFO_SERVER_FLAGS are used to
|
---|
34 | * determine if TFO is enabled for the client and server respectively.
|
---|
35 | *
|
---|
36 | * OSSL_TFO_CLIENT_FLAG = 1 = client TFO enabled
|
---|
37 | * OSSL_TFO_SERVER_FLAG = 2 = server TFO enabled
|
---|
38 | *
|
---|
39 | * Such that:
|
---|
40 | * 0 = TFO disabled
|
---|
41 | * 3 = server and client TFO enabled
|
---|
42 | *
|
---|
43 | * macOS 10.14 and later support TFO.
|
---|
44 | * Linux kernel 3.6 added support for client TFO.
|
---|
45 | * Linux kernel 3.7 added support for server TFO.
|
---|
46 | * Linux kernel 3.13 enabled TFO by default.
|
---|
47 | * Linux kernel 4.11 added the TCP_FASTOPEN_CONNECT option.
|
---|
48 | *
|
---|
49 | * On FreeBSD:
|
---|
50 | * FreeBSD 10.3 ~ 11.4 uses a single sysctl for server enable.
|
---|
51 | * FreeBSD 12.0 and later uses separate sysctls for server and
|
---|
52 | * client enable.
|
---|
53 | *
|
---|
54 | * Some options are purposely NOT defined per-platform
|
---|
55 | *
|
---|
56 | * OSSL_TFO_SYSCTL
|
---|
57 | * Defined as a sysctlbyname() option to determine if
|
---|
58 | * TFO is enabled in the kernel (macOS, FreeBSD)
|
---|
59 | *
|
---|
60 | * OSSL_TFO_SERVER_SOCKOPT
|
---|
61 | * Defined to indicate the socket option used to enable
|
---|
62 | * TFO on a server socket (all)
|
---|
63 | *
|
---|
64 | * OSSL_TFO_SERVER_SOCKOPT_VALUE
|
---|
65 | * Value to be used with OSSL_TFO_SERVER_SOCKOPT
|
---|
66 | *
|
---|
67 | * OSSL_TFO_CONNECTX
|
---|
68 | * Use the connectx() function to make a client connection
|
---|
69 | * (macOS)
|
---|
70 | *
|
---|
71 | * OSSL_TFO_CLIENT_SOCKOPT
|
---|
72 | * Defined to indicate the socket option used to enable
|
---|
73 | * TFO on a client socket (FreeBSD, Linux 4.14 and later)
|
---|
74 | *
|
---|
75 | * OSSL_TFO_SENDTO
|
---|
76 | * Defined to indicate the sendto() message type to
|
---|
77 | * be used to initiate a TFO connection (FreeBSD,
|
---|
78 | * Linux pre-4.14)
|
---|
79 | *
|
---|
80 | * OSSL_TFO_DO_NOT_CONNECT
|
---|
81 | * Defined to skip calling connect() when creating a
|
---|
82 | * client socket (macOS, FreeBSD, Linux pre-4.14)
|
---|
83 | */
|
---|
84 |
|
---|
85 | # if defined(OPENSSL_SYS_WINDOWS)
|
---|
86 | /*
|
---|
87 | * NO WINDOWS SUPPORT
|
---|
88 | *
|
---|
89 | * But this is what would be used on the server:
|
---|
90 | *
|
---|
91 | * define OSSL_TFO_SERVER_SOCKOPT TCP_FASTOPEN
|
---|
92 | * define OSSL_TFO_SERVER_SOCKOPT_VALUE 1
|
---|
93 | *
|
---|
94 | * Still have to figure out client support
|
---|
95 | */
|
---|
96 | # undef TCP_FASTOPEN
|
---|
97 | # endif
|
---|
98 |
|
---|
99 | /* NO VMS SUPPORT */
|
---|
100 | # if defined(OPENSSL_SYS_VMS)
|
---|
101 | # undef TCP_FASTOPEN
|
---|
102 | # endif
|
---|
103 |
|
---|
104 | # if defined(OPENSSL_SYS_MACOSX)
|
---|
105 | # define OSSL_TFO_SYSCTL "net.inet.tcp.fastopen"
|
---|
106 | # define OSSL_TFO_SERVER_SOCKOPT TCP_FASTOPEN
|
---|
107 | # define OSSL_TFO_SERVER_SOCKOPT_VALUE 1
|
---|
108 | # define OSSL_TFO_CONNECTX 1
|
---|
109 | # define OSSL_TFO_DO_NOT_CONNECT 1
|
---|
110 | # define OSSL_TFO_CLIENT_FLAG 1
|
---|
111 | # define OSSL_TFO_SERVER_FLAG 2
|
---|
112 | # endif
|
---|
113 |
|
---|
114 | # if defined(__FreeBSD__)
|
---|
115 | # if defined(TCP_FASTOPEN_PSK_LEN)
|
---|
116 | /* As of 12.0 these are the SYSCTLs */
|
---|
117 | # define OSSL_TFO_SYSCTL_SERVER "net.inet.tcp.fastopen.server_enable"
|
---|
118 | # define OSSL_TFO_SYSCTL_CLIENT "net.inet.tcp.fastopen.client_enable"
|
---|
119 | # define OSSL_TFO_SERVER_SOCKOPT TCP_FASTOPEN
|
---|
120 | # define OSSL_TFO_SERVER_SOCKOPT_VALUE MAX_LISTEN
|
---|
121 | # define OSSL_TFO_CLIENT_SOCKOPT TCP_FASTOPEN
|
---|
122 | # define OSSL_TFO_DO_NOT_CONNECT 1
|
---|
123 | # define OSSL_TFO_SENDTO 0
|
---|
124 | /* These are the same because the sysctl are client/server-specific */
|
---|
125 | # define OSSL_TFO_CLIENT_FLAG 1
|
---|
126 | # define OSSL_TFO_SERVER_FLAG 1
|
---|
127 | # else
|
---|
128 | /* 10.3 through 11.4 SYSCTL - ONLY SERVER SUPPORT */
|
---|
129 | # define OSSL_TFO_SYSCTL "net.inet.tcp.fastopen.enabled"
|
---|
130 | # define OSSL_TFO_SERVER_SOCKOPT TCP_FASTOPEN
|
---|
131 | # define OSSL_TFO_SERVER_SOCKOPT_VALUE MAX_LISTEN
|
---|
132 | # define OSSL_TFO_SERVER_FLAG 1
|
---|
133 | # endif
|
---|
134 | # endif
|
---|
135 |
|
---|
136 | # if defined(OPENSSL_SYS_LINUX)
|
---|
137 | /* OSSL_TFO_PROC not used, but of interest */
|
---|
138 | # define OSSL_TFO_PROC "/proc/sys/net/ipv4/tcp_fastopen"
|
---|
139 | # define OSSL_TFO_SERVER_SOCKOPT TCP_FASTOPEN
|
---|
140 | # define OSSL_TFO_SERVER_SOCKOPT_VALUE MAX_LISTEN
|
---|
141 | # if defined(TCP_FASTOPEN_CONNECT)
|
---|
142 | # define OSSL_TFO_CLIENT_SOCKOPT TCP_FASTOPEN_CONNECT
|
---|
143 | # else
|
---|
144 | # define OSSL_TFO_SENDTO MSG_FASTOPEN
|
---|
145 | # define OSSL_TFO_DO_NOT_CONNECT 1
|
---|
146 | # endif
|
---|
147 | # define OSSL_TFO_CLIENT_FLAG 1
|
---|
148 | # define OSSL_TFO_SERVER_FLAG 2
|
---|
149 | # endif
|
---|
150 |
|
---|
151 | #endif
|
---|