session->internals.dtls.retransmit_end = &session->internals.dtls.retransmit;
session->internals.dtls.retransmit = NULL;
}
+
+void
+_gnutls_dtls_split_sequence (const uint64 *input,
+ uint16_t *epoch, uint64_t *sequence)
+{
+ *epoch = _gnutls_read_uint16 (UINT64DATA(*input));
+ *sequence = _gnutls_read_uint48 (&UINT64DATA(*input)[2]);
+
+ fprintf(stderr, "%04x:%012lx\n", *epoch, *sequence);
+}
int _gnutls_dtls_transmit(gnutls_session_t session);
void _gnutls_dtls_clear_outgoing_buffer(gnutls_session_t session);
+void _gnutls_dtls_split_sequence(const uint64 *input, uint16_t *epoch, uint64_t *sequence);
#endif
}
+uint64_t
+_gnutls_uint48touint64 (uint48 num)
+{
+ uint64_t ret=0;
+
+ ((uint8_t *) & ret)[2] = num.i[0];
+ ((uint8_t *) & ret)[3] = num.i[1];
+ ((uint8_t *) & ret)[4] = num.i[2];
+ ((uint8_t *) & ret)[5] = num.i[3];
+ ((uint8_t *) & ret)[6] = num.i[4];
+ ((uint8_t *) & ret)[7] = num.i[5];
+ return ret;
+}
+
/* data should be at least 3 bytes */
uint32_t
_gnutls_read_uint24 (const opaque * data)
return ret;
}
+
+uint64_t
+_gnutls_read_uint48 (const opaque * data)
+{
+ uint64_t ret;
+ uint48 num;
+
+ memcpy(num.i, data, 6);
+
+ ret = _gnutls_uint48touint64 (num);
+#ifndef WORDS_BIGENDIAN
+ ret = bswap_64 (ret);
+#endif
+
+ return ret;
+}
uint32_t _gnutls_uint24touint32 (uint24 num);
uint24 _gnutls_uint32touint24 (uint32_t num);
+uint64_t _gnutls_uint48touint64 (uint48 num);
+uint64_t _gnutls_read_uint48 (const opaque * data);
uint32_t _gnutls_read_uint32 (const opaque * data);
uint16_t _gnutls_read_uint16 (const opaque * data);
uint32_t _gnutls_conv_uint32 (uint32_t data);