return ret;
}
- if (gtxt.size > MAX_RECORD_RECV_SIZE)
+ if (gtxt.size > MAX_RECORD_RECV_SIZE(session))
{
_gnutls_free_datum (>xt);
/* This shouldn't have happen and
}
/* This check is not really needed */
- if (max_data_size < MAX_RECORD_RECV_SIZE)
+ if (max_data_size < MAX_RECORD_RECV_SIZE(session))
{
_gnutls_free_datum (>xt);
return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
size =
_gnutls_compress (params->write.compression_state,
plaintext->data, plaintext->size, &data,
- MAX_RECORD_SEND_SIZE + EXTRA_COMP_SIZE);
+ MAX_RECORD_SEND_SIZE(session) + EXTRA_COMP_SIZE);
if (size < 0)
{
gnutls_assert ();
size =
_gnutls_decompress (params->read.compression_state,
compressed->data, compressed->size, &data,
- MAX_RECORD_RECV_SIZE);
+ MAX_RECORD_RECV_SIZE(session));
if (size < 0)
{
gnutls_assert ();
opaque *data, *mtu_data;
int ret = 0;
unsigned int offset, frag_len, data_size;
- const uint mtu = session->internals.dtls.hsk_mtu;
+ const uint mtu = session->internals.dtls.mtu;
if (bufel->htype == GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC)
{
session->internals.dtls.retrans_timeout = retrans_timeout;
session->internals.dtls.total_timeout = total_timeout;
}
+
+/**
+ * gnutls_dtls_set_mtu:
+ * @session: is a #gnutls_session_t structure.
+ * @mtu: The maximum transfer unit of the interface
+ *
+ * This function will set the maximum transfer unit of the interface
+ * that DTLS packets are expected to leave from.
+ *
+ **/
+void gnutls_dtls_set_mtu (gnutls_session_t session, unsigned int mtu)
+{
+ session->internals.dtls.mtu = mtu;
+}
+
+/**
+ * gnutls_dtls_get_mtu:
+ * @session: is a #gnutls_session_t structure.
+ *
+ * This function will return the actual maximum transfer unit for
+ * application data. I.e. DTLS headers are subtracted from the
+ * actual MTU.
+ *
+ **/
+unsigned int gnutls_dtls_get_mtu (gnutls_session_t session)
+{
+ return session->internals.dtls.mtu - RECORD_HEADER_SIZE(session);
+}
#define RECORD_HEADER_SIZE(session) (IS_DTLS(session) ? DTLS_RECORD_HEADER_SIZE : TLS_RECORD_HEADER_SIZE)
#define MAX_RECORD_HEADER_SIZE DTLS_RECORD_HEADER_SIZE
-#define MAX_RECORD_SEND_SIZE (size_t)session->security_parameters.max_record_send_size
-#define MAX_RECORD_RECV_SIZE (size_t)session->security_parameters.max_record_recv_size
+#define MAX_RECORD_SEND_SIZE(session) (IS_DTLS(session)?((size_t)session->internals.dtls.mtu-DTLS_RECORD_HEADER_SIZE):(size_t)session->security_parameters.max_record_send_size)
+#define MAX_RECORD_RECV_SIZE(session) (size_t)session->security_parameters.max_record_recv_size
#define MAX_PAD_SIZE 255
#define EXTRA_COMP_SIZE 2048
#define MAX_RECORD_OVERHEAD (MAX_CIPHER_BLOCK_SIZE/*iv*/+MAX_PAD_SIZE+EXTRA_COMP_SIZE)
-#define MAX_RECV_SIZE(session) (MAX_RECORD_OVERHEAD+MAX_RECORD_RECV_SIZE+RECORD_HEADER_SIZE(session))
+#define MAX_RECV_SIZE(session) (MAX_RECORD_OVERHEAD+MAX_RECORD_RECV_SIZE(session)+RECORD_HEADER_SIZE(session))
#define TLS_HANDSHAKE_HEADER_SIZE 4
#define DTLS_HANDSHAKE_HEADER_SIZE (TLS_HANDSHAKE_HEADER_SIZE+8)
/* For DTLS handshake fragmentation and reassembly. */
uint16_t hsk_write_seq;
uint16_t hsk_read_seq;
- uint16_t hsk_mtu;
+ uint16_t mtu;
unsigned int retrans_timeout;
unsigned int total_timeout;
(int) _gnutls_uint64touint32 (&record_state->sequence_number),
_gnutls_packet2str (type), type, (int) sizeofdata);
- if (sizeofdata > MAX_RECORD_SEND_SIZE)
- data2send_size = MAX_RECORD_SEND_SIZE;
+ if (sizeofdata > MAX_RECORD_SEND_SIZE(session))
+ data2send_size = MAX_RECORD_SEND_SIZE(session);
else
data2send_size = sizeofdata;
if (gnutls_compression_get (session) != GNUTLS_COMP_NULL ||
session->internals.priorities.allow_large_records != 0)
- max_record_size = MAX_RECORD_RECV_SIZE + EXTRA_COMP_SIZE;
+ max_record_size = MAX_RECORD_RECV_SIZE(session) + EXTRA_COMP_SIZE;
else
- max_record_size = MAX_RECORD_RECV_SIZE;
+ max_record_size = MAX_RECORD_RECV_SIZE(session);
/* We allocate MAX_RECORD_RECV_SIZE length
* because we cannot predict the output data by the record
/* Flags do nothing, so just copy them into the struct for now. */
(*session)->internals.dtls.flags = flags;
- (*session)->internals.dtls.hsk_mtu = DTLS_DEFAULT_MTU;
+ (*session)->internals.dtls.mtu = DTLS_DEFAULT_MTU;
(*session)->internals.transport = GNUTLS_DGRAM;
(*session)->internals.dtls.retrans_timeout = 1000;
void gnutls_dtls_set_timeouts (gnutls_session_t session, unsigned int retrans_timeout,
unsigned int total_timeout);
+unsigned int gnutls_dtls_get_mtu (gnutls_session_t session);
+void gnutls_dtls_set_mtu (gnutls_session_t session, unsigned int mtu);
+
#ifdef __cplusplus
}
#endif
gnutls_cipher_add_auth;
gnutls_dtls_set_timeouts;
gnutls_transport_set_pull_timeout_function;
+ gnutls_dtls_get_mtu;
+ gnutls_dtls_set_mtu;
} GNUTLS_2_12;
GNUTLS_PRIVATE {