From 804a18bb9265b65ed01ea345a1ce440ff450b37f Mon Sep 17 00:00:00 2001 From: Anil Madhavapeddy Date: Sat, 22 Jul 2023 15:58:50 +0100 Subject: [PATCH] add TCP_DEFER_ACCEPT and TCP_NO_DELAY socket options --- lib_eio/unix/net.ml | 8 ++++++++ lib_eio/unix/net.mli | 2 ++ lib_eio/unix/sockopt.c | 12 +++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib_eio/unix/net.ml b/lib_eio/unix/net.ml index ccaa52fc0..dd29fd508 100644 --- a/lib_eio/unix/net.ml +++ b/lib_eio/unix/net.ml @@ -53,6 +53,8 @@ type socket_int_option = | EIO_TCP_KEEPCNT | EIO_TCP_KEEPIDLE | EIO_TCP_KEEPINTVL + | EIO_TCP_DEFER_ACCEPT + | EIO_TCP_NODELAY external setsockopt_int : Unix.file_descr -> socket_int_option -> int -> unit = "eio_unix_setsockopt_int" @@ -64,10 +66,12 @@ module Sockopt = struct | SO_KEEPALIVE : bool Eio.Net.Sockopt.t | SO_REUSEADDR : bool Eio.Net.Sockopt.t | SO_REUSEPORT : bool Eio.Net.Sockopt.t + | TCP_NODELAY : bool Eio.Net.Sockopt.t | TCP_CORK : int Eio.Net.Sockopt.t | TCP_KEEPCNT : int Eio.Net.Sockopt.t | TCP_KEEPIDLE : int Eio.Net.Sockopt.t | TCP_KEEPINTVL : int Eio.Net.Sockopt.t + | TCP_DEFER_ACCEPT : int Eio.Net.Sockopt.t let set : type a . Fd.t -> a Eio.Net.Sockopt.t -> a -> unit = fun sock k v -> Fd.use_exn "Sockopt.set" sock @@ fun fd -> @@ -76,6 +80,8 @@ module Sockopt = struct | TCP_KEEPCNT -> setsockopt_int fd EIO_TCP_KEEPCNT v | TCP_KEEPIDLE -> setsockopt_int fd EIO_TCP_KEEPIDLE v | TCP_KEEPINTVL -> setsockopt_int fd EIO_TCP_KEEPINTVL v + | TCP_DEFER_ACCEPT -> setsockopt_int fd EIO_TCP_DEFER_ACCEPT v + | TCP_NODELAY -> setsockopt_int fd EIO_TCP_DEFER_ACCEPT (if v then 1 else 0) | SO_KEEPALIVE -> Unix.(setsockopt fd SO_KEEPALIVE v) | SO_REUSEADDR -> Unix.(setsockopt fd SO_REUSEADDR v) | SO_REUSEPORT -> Unix.(setsockopt fd SO_REUSEPORT v) @@ -87,6 +93,8 @@ module Sockopt = struct | TCP_KEEPCNT -> getsockopt_int fd EIO_TCP_KEEPCNT | TCP_KEEPIDLE -> getsockopt_int fd EIO_TCP_KEEPIDLE | TCP_KEEPINTVL -> getsockopt_int fd EIO_TCP_KEEPINTVL + | TCP_DEFER_ACCEPT -> getsockopt_int fd EIO_TCP_DEFER_ACCEPT + | TCP_NODELAY -> getsockopt_int fd EIO_TCP_NODELAY = 1 | SO_KEEPALIVE -> Unix.(getsockopt fd SO_KEEPALIVE) | SO_REUSEADDR -> Unix.(getsockopt fd SO_REUSEADDR) | SO_REUSEPORT -> Unix.(getsockopt fd SO_REUSEPORT) diff --git a/lib_eio/unix/net.mli b/lib_eio/unix/net.mli index 08812d371..f286feb68 100644 --- a/lib_eio/unix/net.mli +++ b/lib_eio/unix/net.mli @@ -87,6 +87,8 @@ module Sockopt : sig | TCP_KEEPCNT : int Eio.Net.Sockopt.t | TCP_KEEPIDLE : int Eio.Net.Sockopt.t | TCP_KEEPINTVL : int Eio.Net.Sockopt.t + | TCP_DEFER_ACCEPT : int Eio.Net.Sockopt.t + | TCP_NODELAY : bool Eio.Net.Sockopt.t val set : Fd.t -> 'a Eio.Net.Sockopt.t -> 'a -> unit (** [set fd opt v] sets the [opt] option to value [v] on socket [fd]. *) diff --git a/lib_eio/unix/sockopt.c b/lib_eio/unix/sockopt.c index 323e9cccc..351222edc 100644 --- a/lib_eio/unix/sockopt.c +++ b/lib_eio/unix/sockopt.c @@ -27,6 +27,14 @@ #define TCP_KEEPINTVL (-1) #endif +#ifndef TCP_DEFER_ACCEPT +#define TCP_DEFER_ACCEPT (-1) +#endif + +#ifndef TCP_NODELAY +#define TCP_NODELAY (-1) +#endif + struct socket_option { int level; int option; @@ -40,7 +48,9 @@ static struct socket_option sockopt_int[] = { { IPPROTO_TCP, TCP_CORK }, { IPPROTO_TCP, TCP_KEEPCNT }, { IPPROTO_TCP, TCP_KEEPIDLE }, - { IPPROTO_TCP, TCP_KEEPINTVL } + { IPPROTO_TCP, TCP_KEEPINTVL }, + { IPPROTO_TCP, TCP_DEFER_ACCEPT }, + { IPPROTO_TCP, TCP_NODELAY }, }; CAMLprim value eio_unix_getsockopt_int(value vsocket, value voption)