Gitweb:
https://git.exim.org/exim.git/commitdiff/53c7b3a70978c2748f46d1d99211530750b1de22
Commit: 53c7b3a70978c2748f46d1d99211530750b1de22
Parent: 8cb1a4f75c3d1acaed66495ccbd7820694ee20b0
Author: Jeremy Harris <jgh146exb@???>
AuthorDate: Sun Dec 8 19:26:15 2019 +0000
Committer: Jeremy Harris <jgh146exb@???>
CommitDate: Sun Dec 8 22:10:45 2019 +0000
Fix macOS build
---
src/src/smtp_in.c | 38 +++++++++++++++++++++++---------------
src/src/smtp_out.c | 4 +++-
2 files changed, 26 insertions(+), 16 deletions(-)
diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c
index 9a31247..580fe9f 100644
--- a/src/src/smtp_in.c
+++ b/src/src/smtp_in.c
@@ -2400,7 +2400,26 @@ return FALSE;
static void
tfo_in_check(void)
{
-# ifdef TCP_INFO
+# ifdef __FreeBSD__
+int is_fastopen;
+socklen_t len = sizeof(is_fastopen);
+
+/* The tinfo TCPOPT_FAST_OPEN bit seems unreliable, and we don't see state
+TCP_SYN_RCV (as of 12.1) so no idea about data-use. */
+
+if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_FASTOPEN, &is_fastopen, &len) == 0)
+ {
+ if (is_fastopen)
+ {
+ DEBUG(D_receive)
+ debug_printf("TFO mode connection (TCP_FASTOPEN getsockopt)\n");
+ f.tcp_in_fastopen = TRUE;
+ }
+ }
+else DEBUG(D_receive)
+ debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
+
+# elif defined(TCP_INFO)
struct tcp_info tinfo;
socklen_t len = sizeof(tinfo);
@@ -2409,7 +2428,7 @@ if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
if (tinfo.tcpi_options & TCPI_OPT_SYN_DATA)
{
DEBUG(D_receive)
- debug_printf("TCP_FASTOPEN mode connection (ACKd data-on-SYN)\n");
+ debug_printf("TFO mode connection (ACKd data-on-SYN)\n");
f.tcp_in_fastopen_data = f.tcp_in_fastopen = TRUE;
}
else
@@ -2417,20 +2436,9 @@ if (getsockopt(fileno(smtp_out), IPPROTO_TCP, TCP_INFO, &tinfo, &len) == 0)
if (tinfo.tcpi_state == TCP_SYN_RECV) /* Not seen on FreeBSD 12.1 */
{
DEBUG(D_receive)
- debug_printf("TCP_FASTOPEN mode connection (state TCP_SYN_RECV)\n");
+ debug_printf("TFO mode connection (state TCP_SYN_RECV)\n");
f.tcp_in_fastopen = TRUE;
}
-# ifdef __FreeBSD__
- else if (tinfo.tcpi_options & TCPOPT_FAST_OPEN)
- {
- /* This only tells us that some combination of the TCP options was used. It
- can be a TFO-R received (as of 12.1). However, pretend it shows real usage
- (that an acceptable TFO-C was received and acted on). Ignore the possibility
- of data-on-SYN for now. */
- DEBUG(D_receive) debug_printf("TCP_FASTOPEN mode connection (TFO option used)\n");
- f.tcp_in_fastopen = TRUE;
- }
-# endif
else DEBUG(D_receive)
debug_printf("TCP_INFO getsockopt: %s\n", strerror(errno));
# endif
@@ -3050,7 +3058,7 @@ smtp_printf("%s",
handshake arrived. If so we must have managed a TFO. */
#ifdef TCP_FASTOPEN
-tfo_in_check();
+if (sender_host_address && !f.sender_host_notsocket) tfo_in_check();
#endif
return TRUE;
diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c
index 3dc3a13..96ee152 100644
--- a/src/src/smtp_out.c
+++ b/src/src/smtp_out.c
@@ -155,11 +155,11 @@ return TRUE;
static void
tfo_out_check(int sock)
{
+# ifdef __FreeBSD__
struct tcp_info tinfo;
int val;
socklen_t len = sizeof(val);
-# ifdef __FreeBSD__
/* The observability as of 12.1 is not useful as a client, only telling us that
a TFO option was used on SYN. It could have been a TFO-R, or ignored by the
server. */
@@ -177,6 +177,8 @@ switch (tcp_out_fastopen)
# else /* Linux & Apple */
# if defined(TCP_INFO) && defined(EXIM_HAVE_TCPI_UNACKED)
+struct tcp_info tinfo;
+socklen_t len = sizeof(tinfo);
switch (tcp_out_fastopen)
{