Add reserved bits to header and frames
Currently reserved bit is always set to 0. The addition of reserved bit is for future extension.
This commit is contained in:
parent
8890e593e6
commit
b4bb6a6101
|
@ -605,6 +605,11 @@ typedef struct {
|
|||
* The flags.
|
||||
*/
|
||||
uint8_t flags;
|
||||
/**
|
||||
* Reserved bit in frame header. Currently, this is always set to 0
|
||||
* and application should not expect something useful in here.
|
||||
*/
|
||||
uint8_t reserved;
|
||||
} nghttp2_frame_hd;
|
||||
|
||||
|
||||
|
@ -887,6 +892,11 @@ typedef struct {
|
|||
* The promised stream ID
|
||||
*/
|
||||
int32_t promised_stream_id;
|
||||
/**
|
||||
* Reserved bit. Currently this is always set to 0 and application
|
||||
* should not expect something useful in here.
|
||||
*/
|
||||
uint8_t reserved;
|
||||
} nghttp2_push_promise;
|
||||
|
||||
/**
|
||||
|
@ -931,6 +941,11 @@ typedef struct {
|
|||
* The length of |opaque_data| member.
|
||||
*/
|
||||
size_t opaque_data_len;
|
||||
/**
|
||||
* Reserved bit. Currently this is always set to 0 and application
|
||||
* should not expect something useful in here.
|
||||
*/
|
||||
uint8_t reserved;
|
||||
} nghttp2_goaway;
|
||||
|
||||
/**
|
||||
|
@ -947,6 +962,11 @@ typedef struct {
|
|||
* The window size increment.
|
||||
*/
|
||||
int32_t window_size_increment;
|
||||
/**
|
||||
* Reserved bit. Currently this is always set to 0 and application
|
||||
* should not expect something useful in here.
|
||||
*/
|
||||
uint8_t reserved;
|
||||
} nghttp2_window_update;
|
||||
|
||||
/**
|
||||
|
|
|
@ -44,6 +44,7 @@ void nghttp2_frame_pack_frame_hd(uint8_t* buf, const nghttp2_frame_hd *hd)
|
|||
buf[3]= hd->type;
|
||||
buf[4] = hd->flags;
|
||||
nghttp2_put_uint32be(&buf[5], hd->stream_id);
|
||||
/* ignore hd->reserved for now */
|
||||
}
|
||||
|
||||
void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t* buf)
|
||||
|
@ -52,9 +53,10 @@ void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t* buf)
|
|||
hd->type = buf[3];
|
||||
hd->flags = buf[4];
|
||||
hd->stream_id = nghttp2_get_uint32(&buf[5]) & NGHTTP2_STREAM_ID_MASK;
|
||||
hd->reserved = 0;
|
||||
}
|
||||
|
||||
static void frame_set_hd(nghttp2_frame_hd *hd, size_t length,
|
||||
void nghttp2_frame_hd_init(nghttp2_frame_hd *hd, size_t length,
|
||||
uint8_t type, uint8_t flags,
|
||||
int32_t stream_id)
|
||||
{
|
||||
|
@ -62,6 +64,7 @@ static void frame_set_hd(nghttp2_frame_hd *hd, size_t length,
|
|||
hd->type = type;
|
||||
hd->flags = flags;
|
||||
hd->stream_id = stream_id;
|
||||
hd->reserved = 0;
|
||||
}
|
||||
|
||||
void nghttp2_frame_headers_init(nghttp2_headers *frame,
|
||||
|
@ -70,7 +73,7 @@ void nghttp2_frame_headers_init(nghttp2_headers *frame,
|
|||
const nghttp2_priority_spec *pri_spec,
|
||||
nghttp2_nv *nva, size_t nvlen)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 0, NGHTTP2_HEADERS, flags, stream_id);
|
||||
nghttp2_frame_hd_init(&frame->hd, 0, NGHTTP2_HEADERS, flags, stream_id);
|
||||
frame->padlen = 0;
|
||||
frame->nva = nva;
|
||||
frame->nvlen = nvlen;
|
||||
|
@ -91,7 +94,7 @@ void nghttp2_frame_headers_free(nghttp2_headers *frame)
|
|||
void nghttp2_frame_priority_init(nghttp2_priority *frame, int32_t stream_id,
|
||||
const nghttp2_priority_spec *pri_spec)
|
||||
{
|
||||
frame_set_hd(&frame->hd, NGHTTP2_PRIORITY_SPECLEN, NGHTTP2_PRIORITY,
|
||||
nghttp2_frame_hd_init(&frame->hd, NGHTTP2_PRIORITY_SPECLEN, NGHTTP2_PRIORITY,
|
||||
NGHTTP2_FLAG_NONE, stream_id);
|
||||
frame->pri_spec = *pri_spec;
|
||||
}
|
||||
|
@ -103,7 +106,7 @@ void nghttp2_frame_rst_stream_init(nghttp2_rst_stream *frame,
|
|||
int32_t stream_id,
|
||||
uint32_t error_code)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 4, NGHTTP2_RST_STREAM, NGHTTP2_FLAG_NONE,
|
||||
nghttp2_frame_hd_init(&frame->hd, 4, NGHTTP2_RST_STREAM, NGHTTP2_FLAG_NONE,
|
||||
stream_id);
|
||||
frame->error_code = error_code;
|
||||
}
|
||||
|
@ -115,7 +118,7 @@ void nghttp2_frame_rst_stream_free(nghttp2_rst_stream *frame)
|
|||
void nghttp2_frame_settings_init(nghttp2_settings *frame, uint8_t flags,
|
||||
nghttp2_settings_entry *iv, size_t niv)
|
||||
{
|
||||
frame_set_hd(&frame->hd, niv * NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH,
|
||||
nghttp2_frame_hd_init(&frame->hd, niv * NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH,
|
||||
NGHTTP2_SETTINGS, flags, 0);
|
||||
frame->niv = niv;
|
||||
frame->iv = iv;
|
||||
|
@ -131,11 +134,12 @@ void nghttp2_frame_push_promise_init(nghttp2_push_promise *frame,
|
|||
int32_t promised_stream_id,
|
||||
nghttp2_nv *nva, size_t nvlen)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 0, NGHTTP2_PUSH_PROMISE, flags, stream_id);
|
||||
nghttp2_frame_hd_init(&frame->hd, 0, NGHTTP2_PUSH_PROMISE, flags, stream_id);
|
||||
frame->padlen = 0;
|
||||
frame->nva = nva;
|
||||
frame->nvlen = nvlen;
|
||||
frame->promised_stream_id = promised_stream_id;
|
||||
frame->reserved = 0;
|
||||
}
|
||||
|
||||
void nghttp2_frame_push_promise_free(nghttp2_push_promise *frame)
|
||||
|
@ -146,7 +150,7 @@ void nghttp2_frame_push_promise_free(nghttp2_push_promise *frame)
|
|||
void nghttp2_frame_ping_init(nghttp2_ping *frame, uint8_t flags,
|
||||
const uint8_t *opaque_data)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 8, NGHTTP2_PING, flags, 0);
|
||||
nghttp2_frame_hd_init(&frame->hd, 8, NGHTTP2_PING, flags, 0);
|
||||
if(opaque_data) {
|
||||
memcpy(frame->opaque_data, opaque_data, sizeof(frame->opaque_data));
|
||||
} else {
|
||||
|
@ -161,12 +165,13 @@ void nghttp2_frame_goaway_init(nghttp2_goaway *frame, int32_t last_stream_id,
|
|||
uint32_t error_code,
|
||||
uint8_t *opaque_data, size_t opaque_data_len)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 8+opaque_data_len, NGHTTP2_GOAWAY,
|
||||
nghttp2_frame_hd_init(&frame->hd, 8+opaque_data_len, NGHTTP2_GOAWAY,
|
||||
NGHTTP2_FLAG_NONE, 0);
|
||||
frame->last_stream_id = last_stream_id;
|
||||
frame->error_code = error_code;
|
||||
frame->opaque_data = opaque_data;
|
||||
frame->opaque_data_len = opaque_data_len;
|
||||
frame->reserved = 0;
|
||||
}
|
||||
|
||||
void nghttp2_frame_goaway_free(nghttp2_goaway *frame)
|
||||
|
@ -179,8 +184,10 @@ void nghttp2_frame_window_update_init(nghttp2_window_update *frame,
|
|||
int32_t stream_id,
|
||||
int32_t window_size_increment)
|
||||
{
|
||||
frame_set_hd(&frame->hd, 4, NGHTTP2_WINDOW_UPDATE, flags, stream_id);
|
||||
nghttp2_frame_hd_init(&frame->hd, 4, NGHTTP2_WINDOW_UPDATE, flags,
|
||||
stream_id);
|
||||
frame->window_size_increment = window_size_increment;
|
||||
frame->reserved = 0;
|
||||
}
|
||||
|
||||
void nghttp2_frame_window_update_free(nghttp2_window_update *frame)
|
||||
|
@ -201,8 +208,8 @@ void nghttp2_frame_altsvc_init(nghttp2_extension *frame, int32_t stream_id,
|
|||
|
||||
payloadlen = NGHTTP2_ALTSVC_MINLEN + protocol_id_len + host_len + origin_len;
|
||||
|
||||
frame_set_hd(&frame->hd, payloadlen, NGHTTP2_EXT_ALTSVC, NGHTTP2_FLAG_NONE,
|
||||
stream_id);
|
||||
nghttp2_frame_hd_init(&frame->hd, payloadlen, NGHTTP2_EXT_ALTSVC,
|
||||
NGHTTP2_FLAG_NONE, stream_id);
|
||||
|
||||
altsvc->max_age = max_age;
|
||||
altsvc->port = port;
|
||||
|
@ -249,7 +256,7 @@ void nghttp2_frame_private_data_init(nghttp2_private_data *frame,
|
|||
const nghttp2_data_provider *data_prd)
|
||||
{
|
||||
/* At this moment, the length of DATA frame is unknown */
|
||||
frame_set_hd(&frame->hd, 0, NGHTTP2_DATA, flags, stream_id);
|
||||
nghttp2_frame_hd_init(&frame->hd, 0, NGHTTP2_DATA, flags, stream_id);
|
||||
frame->data_prd = *data_prd;
|
||||
frame->padlen = 0;
|
||||
frame->eof = 0;
|
||||
|
|
|
@ -127,6 +127,14 @@ void nghttp2_frame_pack_frame_hd(uint8_t *buf, const nghttp2_frame_hd *hd);
|
|||
|
||||
void nghttp2_frame_unpack_frame_hd(nghttp2_frame_hd *hd, const uint8_t* buf);
|
||||
|
||||
/**
|
||||
* Initializes frame header |hd| with given parameters. Reserved bit
|
||||
* is set to 0.
|
||||
*/
|
||||
void nghttp2_frame_hd_init(nghttp2_frame_hd *hd, size_t length,
|
||||
uint8_t type, uint8_t flags,
|
||||
int32_t stream_id);
|
||||
|
||||
/**
|
||||
* Returns the number of priority field depending on the |flags|. If
|
||||
* |flags| has neither NGHTTP2_FLAG_PRIORITY_GROUP nor
|
||||
|
|
|
@ -5736,10 +5736,8 @@ int nghttp2_session_pack_data(nghttp2_session *session,
|
|||
}
|
||||
|
||||
/* The primary reason of data_frame is pass to the user callback */
|
||||
data_frame.hd.length = payloadlen;
|
||||
data_frame.hd.stream_id = frame->hd.stream_id;
|
||||
data_frame.hd.type = NGHTTP2_DATA;
|
||||
data_frame.hd.flags = flags;
|
||||
nghttp2_frame_hd_init(&data_frame.hd, payloadlen, NGHTTP2_DATA, flags,
|
||||
frame->hd.stream_id);
|
||||
data_frame.data.padlen = 0;
|
||||
|
||||
max_payloadlen = nghttp2_min(datamax,
|
||||
|
|
|
@ -68,6 +68,7 @@ static void check_frame_header(size_t length, uint8_t type, uint8_t flags,
|
|||
CU_ASSERT(type == hd->type);
|
||||
CU_ASSERT(flags == hd->flags);
|
||||
CU_ASSERT(stream_id == hd->stream_id);
|
||||
CU_ASSERT(0 == hd->reserved);
|
||||
}
|
||||
|
||||
void test_nghttp2_frame_pack_headers()
|
||||
|
|
|
@ -830,10 +830,8 @@ void test_nghttp2_session_recv_continuation(void)
|
|||
nghttp2_put_uint32be(data, (1 << 8) + data[3]);
|
||||
|
||||
/* First CONTINUATION, 2 bytes */
|
||||
cont_hd.length = 2;
|
||||
cont_hd.type = NGHTTP2_CONTINUATION;
|
||||
cont_hd.flags = NGHTTP2_FLAG_NONE;
|
||||
cont_hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&cont_hd, 2, NGHTTP2_CONTINUATION,
|
||||
NGHTTP2_FLAG_NONE, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data + datalen, &cont_hd);
|
||||
datalen += NGHTTP2_FRAME_HDLEN;
|
||||
|
@ -843,9 +841,8 @@ void test_nghttp2_session_recv_continuation(void)
|
|||
buf->pos += cont_hd.length;
|
||||
|
||||
/* Second CONTINUATION, rest of the bytes */
|
||||
cont_hd.length = nghttp2_buf_len(buf);
|
||||
cont_hd.flags = NGHTTP2_FLAG_END_HEADERS;
|
||||
cont_hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&cont_hd, nghttp2_buf_len(buf), NGHTTP2_CONTINUATION,
|
||||
NGHTTP2_FLAG_END_HEADERS, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data + datalen, &cont_hd);
|
||||
datalen += NGHTTP2_FRAME_HDLEN;
|
||||
|
@ -1239,10 +1236,7 @@ void test_nghttp2_session_recv_unknown_frame(void)
|
|||
nghttp2_frame_hd hd;
|
||||
ssize_t rv;
|
||||
|
||||
hd.length = 16000;
|
||||
hd.stream_id = 0;
|
||||
hd.type = 99;
|
||||
hd.flags = NGHTTP2_FLAG_NONE;
|
||||
nghttp2_frame_hd_init(&hd, 16000, 99, NGHTTP2_FLAG_NONE, 0);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data, &hd);
|
||||
datalen = NGHTTP2_FRAME_HDLEN + hd.length;
|
||||
|
@ -1275,10 +1269,8 @@ void test_nghttp2_session_recv_unexpected_continuation(void)
|
|||
ssize_t rv;
|
||||
nghttp2_outbound_item *item;
|
||||
|
||||
hd.length = 16000;
|
||||
hd.stream_id = 1;
|
||||
hd.type = NGHTTP2_CONTINUATION;
|
||||
hd.flags = NGHTTP2_FLAG_END_HEADERS;
|
||||
nghttp2_frame_hd_init(&hd, 16000, NGHTTP2_CONTINUATION,
|
||||
NGHTTP2_FLAG_END_HEADERS, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data, &hd);
|
||||
datalen = NGHTTP2_FRAME_HDLEN + hd.length;
|
||||
|
@ -1487,13 +1479,12 @@ void test_nghttp2_session_recv_too_large_frame_length(void)
|
|||
nghttp2_session_callbacks callbacks;
|
||||
uint8_t buf[NGHTTP2_FRAME_HDLEN];
|
||||
nghttp2_outbound_item *item;
|
||||
nghttp2_frame_hd hd = {
|
||||
nghttp2_frame_hd hd;
|
||||
|
||||
/* Initial max frame size is NGHTTP2_MAX_FRAME_SIZE_MIN */
|
||||
NGHTTP2_MAX_FRAME_SIZE_MIN + 1,
|
||||
1,
|
||||
NGHTTP2_HEADERS,
|
||||
NGHTTP2_FLAG_NONE
|
||||
};
|
||||
nghttp2_frame_hd_init(&hd, NGHTTP2_MAX_FRAME_SIZE_MIN + 1,
|
||||
NGHTTP2_HEADERS, NGHTTP2_FLAG_NONE, 1);
|
||||
|
||||
memset(&callbacks, 0, sizeof(nghttp2_session_callbacks));
|
||||
|
||||
nghttp2_session_server_new(&session, &callbacks, NULL);
|
||||
|
@ -1665,10 +1656,7 @@ void test_nghttp2_session_continue(void)
|
|||
CU_ASSERT(1 == user_data.frame_recv_cb_called);
|
||||
|
||||
/* Receive DATA */
|
||||
data_hd.length = 16;
|
||||
data_hd.type = NGHTTP2_DATA;
|
||||
data_hd.flags = NGHTTP2_FLAG_NONE;
|
||||
data_hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&data_hd, 16, NGHTTP2_DATA, NGHTTP2_FLAG_NONE, 1);
|
||||
|
||||
nghttp2_buf_reset(&databuf);
|
||||
nghttp2_frame_pack_frame_hd(databuf.pos, &data_hd);
|
||||
|
@ -2630,9 +2618,7 @@ void test_nghttp2_session_on_data_received(void)
|
|||
&pri_spec_default,
|
||||
NGHTTP2_STREAM_OPENING, NULL);
|
||||
|
||||
frame.hd.length = 4096;
|
||||
frame.hd.flags = NGHTTP2_FLAG_NONE;
|
||||
frame.hd.stream_id = 2;
|
||||
nghttp2_frame_hd_init(&frame.hd, 4096, NGHTTP2_DATA, NGHTTP2_FLAG_NONE, 2);
|
||||
|
||||
CU_ASSERT(0 == nghttp2_session_on_data_received(session, &frame));
|
||||
CU_ASSERT(0 == stream->shut_flags);
|
||||
|
@ -4725,10 +4711,9 @@ void test_nghttp2_session_flow_control_data_recv(void)
|
|||
|
||||
/* Create DATA frame */
|
||||
memset(data, 0, sizeof(data));
|
||||
hd.length = NGHTTP2_MAX_PAYLOADLEN;
|
||||
hd.type = NGHTTP2_DATA;
|
||||
hd.flags = NGHTTP2_FLAG_END_STREAM;
|
||||
hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&hd, NGHTTP2_MAX_PAYLOADLEN, NGHTTP2_DATA,
|
||||
NGHTTP2_FLAG_END_STREAM, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data, &hd);
|
||||
CU_ASSERT(NGHTTP2_MAX_PAYLOADLEN+NGHTTP2_FRAME_HDLEN ==
|
||||
nghttp2_session_mem_recv(session, data,
|
||||
|
@ -4792,10 +4777,9 @@ void test_nghttp2_session_flow_control_data_with_padding_recv(void)
|
|||
|
||||
/* Create DATA frame */
|
||||
memset(data, 0, sizeof(data));
|
||||
hd.length = 357;
|
||||
hd.type = NGHTTP2_DATA;
|
||||
hd.flags = NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PADDED;
|
||||
hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&hd, 357, NGHTTP2_DATA,
|
||||
NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PADDED, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(data, &hd);
|
||||
/* Set Pad Length field, which itself is padding */
|
||||
data[NGHTTP2_FRAME_HDLEN] = 255;
|
||||
|
@ -6396,10 +6380,9 @@ void test_nghttp2_session_on_header_temporal_failure(void)
|
|||
|
||||
nghttp2_hd_deflate_hd_bufs(&deflater, &bufs, &nv[1], 1);
|
||||
|
||||
hd.length = nghttp2_bufs_len(&bufs) - hdpos - NGHTTP2_FRAME_HDLEN;
|
||||
hd.type = NGHTTP2_CONTINUATION;
|
||||
hd.flags = NGHTTP2_FLAG_END_HEADERS;
|
||||
hd.stream_id = 1;
|
||||
nghttp2_frame_hd_init(&hd,
|
||||
nghttp2_bufs_len(&bufs) - hdpos - NGHTTP2_FRAME_HDLEN,
|
||||
NGHTTP2_CONTINUATION, NGHTTP2_FLAG_END_HEADERS, 1);
|
||||
|
||||
nghttp2_frame_pack_frame_hd(&buf->pos[hdpos], &hd);
|
||||
|
||||
|
|
Loading…
Reference in New Issue