uint8_t *data, *mtu_data;
int ret = 0;
unsigned int offset, frag_len, data_size;
- const unsigned int mtu =
- gnutls_dtls_get_data_mtu(session) - DTLS_HANDSHAKE_HEADER_SIZE;
+ unsigned int mtu =
+ gnutls_dtls_get_data_mtu(session);
+
+ if (session->security_parameters.max_record_recv_size < mtu)
+ mtu = session->security_parameters.max_record_recv_size;
+
+ mtu -= DTLS_HANDSHAKE_HEADER_SIZE;
if (bufel->type == GNUTLS_CHANGE_CIPHER_SPEC) {
_gnutls_dtls_log
*/
#define MAX_RECORD_SEND_OVERHEAD(session) (MAX_CIPHER_BLOCK_SIZE/*iv*/+MAX_PAD_SIZE+((gnutls_compression_get(session)!=GNUTLS_COMP_NULL)?(EXTRA_COMP_SIZE):(0))+MAX_HASH_SIZE/*MAC*/)
#define MAX_RECORD_SEND_SIZE(session) (IS_DTLS(session)? \
- ((size_t)gnutls_dtls_get_mtu(session)): \
+ (MIN((size_t)gnutls_dtls_get_mtu(session), (size_t)session->security_parameters.max_record_send_size+MAX_RECORD_SEND_OVERHEAD(session))): \
((size_t)session->security_parameters.max_record_send_size+MAX_RECORD_SEND_OVERHEAD(session)))
#define MAX_PAD_SIZE 255
#define EXTRA_COMP_SIZE 2048
{
size_t max;
- if (IS_DTLS(session))
- max = gnutls_dtls_get_data_mtu(session);
- else {
+ if (IS_DTLS(session)) {
+ max = MIN(gnutls_dtls_get_data_mtu(session), session->security_parameters.max_record_send_size);
+ } else {
max = session->security_parameters.max_record_send_size;
}