]> git.ipfire.org Git - thirdparty/openssl.git/blame - include/internal/bio_tfo.h
Copyright year updates
[thirdparty/openssl.git] / include / internal / bio_tfo.h
CommitLineData
a3e53d56 1/*
da1c088f 2 * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
a3e53d56
TS
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 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
eb4129e1 81 * Defined to skip calling connect() when creating a
a3e53d56
TS
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 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