1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_frame_common.h
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#ifndef LSQUIC_FRAME_COMMON_H
750aadb33SDmitri Tikhonov#define LSQUIC_FRAME_COMMON_H 1
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonovenum http_frame_type
1050aadb33SDmitri Tikhonov{
1150aadb33SDmitri Tikhonov    HTTP_FRAME_DATA          = 0x00,
1250aadb33SDmitri Tikhonov    HTTP_FRAME_HEADERS       = 0x01,
1350aadb33SDmitri Tikhonov    HTTP_FRAME_PRIORITY      = 0x02,
1450aadb33SDmitri Tikhonov    HTTP_FRAME_RST_STREAM    = 0x03,
1550aadb33SDmitri Tikhonov    HTTP_FRAME_SETTINGS      = 0x04,
1650aadb33SDmitri Tikhonov    HTTP_FRAME_PUSH_PROMISE  = 0x05,
1750aadb33SDmitri Tikhonov    HTTP_FRAME_PING          = 0x06,
1850aadb33SDmitri Tikhonov    HTTP_FRAME_GOAWAY        = 0x07,
1950aadb33SDmitri Tikhonov    HTTP_FRAME_WINDOW_UPDATE = 0x08,
2050aadb33SDmitri Tikhonov    HTTP_FRAME_CONTINUATION  = 0x09,
2150aadb33SDmitri Tikhonov    N_HTTP_FRAME_TYPES
2250aadb33SDmitri Tikhonov};
2350aadb33SDmitri Tikhonov
2450aadb33SDmitri Tikhonov
2550aadb33SDmitri Tikhonovenum http_frame_header_flags    /* RFC 7540, Section 6.2 */
2650aadb33SDmitri Tikhonov{
2750aadb33SDmitri Tikhonov    HFHF_END_STREAM     = 0x01,
2850aadb33SDmitri Tikhonov    HFHF_END_HEADERS    = 0x04,
2950aadb33SDmitri Tikhonov    HFHF_PADDED         = 0x08,
3050aadb33SDmitri Tikhonov    HFHF_PRIORITY       = 0x20,
3150aadb33SDmitri Tikhonov};
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonov
3450aadb33SDmitri Tikhonovstruct http_frame_header        /* RFC 7540, Section 4.1 */
3550aadb33SDmitri Tikhonov{
3650aadb33SDmitri Tikhonov    unsigned char   hfh_length[3];
3750aadb33SDmitri Tikhonov    unsigned char   hfh_type;           /* enum http_frame_type */
3850aadb33SDmitri Tikhonov    unsigned char   hfh_flags;
3950aadb33SDmitri Tikhonov    unsigned char   hfh_stream_id[4];
4050aadb33SDmitri Tikhonov};
4150aadb33SDmitri Tikhonov
4250aadb33SDmitri Tikhonov#define hfh_get_length(hfh) (  ((hfh)->hfh_length[0] << 16) |   \
4350aadb33SDmitri Tikhonov                               ((hfh)->hfh_length[1] <<  8) |   \
4450aadb33SDmitri Tikhonov                                (hfh)->hfh_length[2]            )
4550aadb33SDmitri Tikhonov
4650aadb33SDmitri Tikhonovenum settings_param             /* RFC 7540, Section 6.5.2 */
4750aadb33SDmitri Tikhonov{
4850aadb33SDmitri Tikhonov    SETTINGS_HEADER_TABLE_SIZE      = 0x0001,
4950aadb33SDmitri Tikhonov    SETTINGS_ENABLE_PUSH            = 0x0002,
5050aadb33SDmitri Tikhonov    SETTINGS_MAX_CONCURRENT_STREAMS = 0x0003,
5150aadb33SDmitri Tikhonov    SETTINGS_INITIAL_WINDOW_SIZE    = 0x0004,
5250aadb33SDmitri Tikhonov    SETTINGS_MAX_FRAME_SIZE         = 0x0005,
5350aadb33SDmitri Tikhonov    SETTINGS_MAX_HEADER_LIST_SIZE   = 0x0006,
5450aadb33SDmitri Tikhonov};
5550aadb33SDmitri Tikhonov
5650aadb33SDmitri Tikhonov
5750aadb33SDmitri Tikhonov/* This also doubles as HEADERS frame payload prefix: */
5850aadb33SDmitri Tikhonovstruct http_prio_frame          /* RFC 7540, Section 6.3 */
5950aadb33SDmitri Tikhonov{
6050aadb33SDmitri Tikhonov    unsigned char   hpf_stream_id[4];  /* High bit is the exclusive flag */
6150aadb33SDmitri Tikhonov    unsigned char   hpf_weight;
6250aadb33SDmitri Tikhonov};
6350aadb33SDmitri Tikhonov
6450aadb33SDmitri Tikhonov
6550aadb33SDmitri Tikhonovstruct http_push_promise_frame  /* RFC 7540, Section 6.6 */
6650aadb33SDmitri Tikhonov{
6750aadb33SDmitri Tikhonov    unsigned char   hppf_promised_id[4];    /* High bit is reserved */
6850aadb33SDmitri Tikhonov};
6950aadb33SDmitri Tikhonov
7050aadb33SDmitri Tikhonov
7150aadb33SDmitri Tikhonovstruct lsquic_http2_setting
7250aadb33SDmitri Tikhonov{
7350aadb33SDmitri Tikhonov    uint16_t id;
7450aadb33SDmitri Tikhonov    uint32_t value;
7550aadb33SDmitri Tikhonov};
7650aadb33SDmitri Tikhonov
7750aadb33SDmitri Tikhonov
7850aadb33SDmitri Tikhonovconst char *
7950aadb33SDmitri Tikhonovlsquic_http_setting_id2str (enum settings_param id);
8050aadb33SDmitri Tikhonov
8150aadb33SDmitri Tikhonov#endif
82