xqc_int_t xqc_parse_datagram_frame()

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