diff options
author | Tim Rühsen <tim.ruehsen@gmx.de> | 2016-07-14 12:31:55 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2016-07-15 13:46:49 +0200 |
commit | 1f98f7ceab7c331b8281ab39ffe9cd53c7ae765f (patch) | |
tree | 21015e52a6bd611b6f0ac9254c17aefdd83bb024 /lib/record.c | |
parent | c2e839247e14415b72c824726ddbc59fa54f941f (diff) | |
download | gnutls-fast-open.tar.gz |
Support TCP Fast Openfast-open
New function gnutls_transport_set_fastopen() with example usage
in gnutls-cli (enabled with new --fastopen option).
Diffstat (limited to 'lib/record.c')
-rw-r--r-- | lib/record.c | 41 |
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 */ /** |