in src/transport/xqc_frame_parser.c [19:56]
static size_t xqc_write_packet_receive_timestamps_into_buf(xqc_connection_t *conn, unsigned char *dst_buf, size_t dst_buf_len,
xqc_recv_timestamps_info_t *recv_timestamps, uint64_t po_largest_ack);
/**
* generate datagram frame
*/
xqc_int_t
xqc_gen_datagram_frame(xqc_packet_out_t *packet_out,
const unsigned char *payload, size_t size)
{
if (packet_out == NULL) {
return -XQC_EPARAM;
}
unsigned char *dst_buf = packet_out->po_buf + packet_out->po_used_size;
size_t dst_buf_len = xqc_get_po_remained_size(packet_out);
unsigned char *p = dst_buf + 1;
if ((size + 1 + XQC_DATAGRAM_LENGTH_FIELD_BYTES) > dst_buf_len) {
return -XQC_ENOBUF;
}
xqc_vint_write(p, size, XQC_DATAGRAM_LENGTH_FIELD_BYTES - 1, XQC_DATAGRAM_LENGTH_FIELD_BYTES);
p += XQC_DATAGRAM_LENGTH_FIELD_BYTES;
if (size > 0) {
xqc_memcpy(p, payload, size);
}
p += size;
dst_buf[0] = 0x31;
packet_out->po_frame_types |= XQC_FRAME_BIT_DATAGRAM;
packet_out->po_used_size += p - dst_buf;
return XQC_OK;
}