in src/transport/xqc_frame_parser.c [58:102]
xqc_int_t xqc_parse_datagram_frame(xqc_packet_in_t *packet_in, xqc_connection_t *conn,
unsigned char **buffer, size_t *size)
{
uint64_t length;
int vlen = 0;
const unsigned char *p = packet_in->pos;
const unsigned char *end = packet_in->last;
/* skip frame type */
const unsigned char first_byte = *p++;
xqc_bool_t has_length = (first_byte & 0x1);
if (has_length) {
/*currently, the length of length field is 2 bytes*/
vlen = xqc_vint_read(p, end, &length);
if (vlen < 0) {
return -XQC_EVINTREAD;
}
p += vlen;
if (length > (end - p)) {
return -XQC_EILLEGAL_FRAME;
}
} else {
length = end - p;
}
/* recv a DATAGRAM frame larger than max_datagram_frame_size */
if ((length + 1 + vlen) > conn->local_settings.max_datagram_frame_size) {
return -XQC_EPROTO;
}
*size = length;
*buffer = (unsigned char *)p;
p += length;
packet_in->pos = (unsigned char *)p;
packet_in->pi_frame_types |= XQC_FRAME_BIT_DATAGRAM;
xqc_log_event(conn->log, TRA_FRAMES_PROCESSED, XQC_FRAME_DATAGRAM, length);
return XQC_OK;
}