extern unsigned int _gnutls_global_version;
+bool _gnutls_config_is_ktls_disabled(void);
+
#endif /* GNUTLS_LIB_GNUTLS_INT_H */
const version_entry_st *vers = get_version(session);
int ret;
+ session->internals.ktls_enabled = 0;
#ifdef ENABLE_KTLS
- _gnutls_ktls_enable(session);
+ if (_gnutls_config_is_ktls_disabled() == false)
+ _gnutls_ktls_enable(session);
#endif
if (unlikely(session->internals.initial_negotiation_completed)) {
}
#ifdef ENABLE_KTLS
- if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_RECV) || IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND)) {
+ if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_DUPLEX)) {
_gnutls_ktls_set_keys(session);
}
-#else
- session->internals.ktls_enabled = 0;
#endif
return 0;
GNUTLS_KTLS_DUPLEX = GNUTLS_KTLS_RECV | GNUTLS_KTLS_SEND,
} gnutls_transport_ktls_enable_flags_t;
+
gnutls_transport_ktls_enable_flags_t
gnutls_transport_is_ktls_enabled(gnutls_session_t session);
struct cfg {
bool allowlisting;
+ bool ktls_disabled;
name_val_array_t priority_strings;
char *priority_string;
src->default_priority_string = NULL;
dst->allowlisting = src->allowlisting;
+ dst->ktls_disabled = src->ktls_disabled;
memcpy(dst->ciphers, src->ciphers, sizeof(src->ciphers));
memcpy(dst->macs, src->macs, sizeof(src->macs));
memcpy(dst->groups, src->groups, sizeof(src->groups));
if (fail_on_invalid_config)
return 0;
}
+ } else if (c_strcasecmp(name, "ktls") == 0) {
+ p = clear_spaces(value, str);
+ if (c_strcasecmp(p, "false") == 0) {
+ cfg->ktls_disabled = true;
+ } else {
+ _gnutls_debug_log("cfg: unknown ktls mode %s\n",
+ p);
+ if (fail_on_invalid_config)
+ return 0;
+ }
} else {
_gnutls_debug_log("unknown parameter %s\n", name);
if (fail_on_invalid_config)
}
return NULL;
}
+
+bool _gnutls_config_is_ktls_disabled(void){
+ return system_wide_config.ktls_disabled;
+}
void _gnutls_ktls_enable(gnutls_session_t session)
{
int sockin, sockout;
- session->internals.ktls_enabled = 0;
gnutls_transport_get_int2(session, &sockin, &sockout);
if (setsockopt(sockin, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0)