static size_t xqc_write_packet_receive_timestamps_into_buf()

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;
}