summaryrefslogtreecommitdiff
path: root/lib/record.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/record.c')
-rw-r--r--lib/record.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/lib/record.c b/lib/record.c
index 4e462b9eac..d33c9c25e1 100644
--- a/lib/record.c
+++ b/lib/record.c
@@ -146,6 +146,47 @@ gnutls_transport_set_int2(gnutls_session_t session,
(gnutls_transport_ptr_t) (long) recv_int;
}
+/**
+ * gnutls_transport_set_fastopen:
+ * @session: is a #gnutls_session_t type.
+ * @connect_addr: is the address we want to connect to
+ * @connect_addrlen: is the length of @connect_addr
+ *
+ * Enables TCP Fast Open (TFO) when @connect_addr and @connect_addrlen are set
+ * before the transport socket has been connected.
+ *
+ * TFO only works for TCP sockets of type AF_INET and AF_INET6.
+ * Not every OS supports TFO yet.
+ *
+ * Overriding push functions via gnutls_transport_set_vec_push_function()
+ * or gnutls_transport_set_push_function() effectively disables the internal
+ * support for TFO. In this case the user's write function has to care about
+ * the implementation of TFO.
+ *
+ * On GNU/Linux TFO has to be enabled at the system layer, that is
+ * in /proc/sys/net/ipv4/tcp_fastopen, bit 0 has to be set.
+ *
+ * Since: 3.5.3
+ **/
+void
+gnutls_transport_set_fastopen(gnutls_session_t session,
+ struct sockaddr *connect_addr, socklen_t connect_addrlen)
+{
+ gnutls_free(session->internals.connect_addr);
+
+ if (connect_addr && connect_addrlen) {
+ session->internals.connect_addr = gnutls_malloc(connect_addrlen);
+ if (session->internals.connect_addr) {
+ memcpy(session->internals.connect_addr, connect_addr, connect_addrlen);
+ session->internals.connect_addrlen = connect_addrlen;
+ } else
+ gnutls_assert();
+ } else {
+ session->internals.connect_addr = NULL;
+ session->internals.connect_addrlen = 0;
+ }
+}
+
#if 0
/* this will be a macro */
/**