@deftypefun {int} {gnutls_ext_register} (const char * @var{name}, int @var{id}, gnutls_ext_parse_type_t @var{parse_point}, gnutls_ext_recv_func @var{recv_func}, gnutls_ext_send_func @var{send_func}, gnutls_ext_deinit_data_func @var{deinit_func}, gnutls_ext_pack_func @var{pack_func}, gnutls_ext_unpack_func @var{unpack_func}) @var{name}: the name of the extension to register @var{id}: the numeric TLS id of the extension @var{parse_point}: the parse type of the extension (see gnutls_ext_parse_type_t) @var{recv_func}: a function to receive the data @var{send_func}: a function to send the data @var{deinit_func}: a function deinitialize any private data @var{pack_func}: a function which serializes the extension's private data (used on session packing for resumption) @var{unpack_func}: a function which will deserialize the extension's private data This function will register a new extension type. The extension will remain registered until @code{gnutls_global_deinit()} is called. If the extension type is already registered then @code{GNUTLS_E_ALREADY_REGISTERED} will be returned. Each registered extension can store temporary data into the gnutls_session_t structure using @code{gnutls_ext_set_data()} , and they can be retrieved using @code{gnutls_ext_get_data()} . Any extensions registered with this function are valid for the client and TLS1.2 server hello (or encrypted extensions for TLS1.3). This function is not thread safe. @strong{Returns:} @code{GNUTLS_E_SUCCESS} on success, otherwise a negative error code. @strong{Since:} 3.4.0 @end deftypefun