Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deps: update ngtcp2 to 1.2.0 #51584

Merged
merged 1 commit into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h
Original file line number Diff line number Diff line change
Expand Up @@ -4269,6 +4269,9 @@ NGTCP2_EXTERN int ngtcp2_conn_open_uni_stream(ngtcp2_conn *conn,
*
* |flags| is currently unused, and should be set to 0.
*
* This function returns 0 if a stream denoted by |stream_id| is not
* found.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
Expand All @@ -4291,6 +4294,9 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream(ngtcp2_conn *conn, uint32_t flags,
*
* |flags| is currently unused, and should be set to 0.
*
* This function returns 0 if a stream denoted by |stream_id| is not
* found.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
Expand All @@ -4315,6 +4321,9 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_write(ngtcp2_conn *conn,
*
* |flags| is currently unused, and should be set to 0.
*
* This function returns 0 if a stream denoted by |stream_id| is not
* found.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
Expand Down Expand Up @@ -4675,6 +4684,9 @@ NGTCP2_EXTERN int ngtcp2_conn_in_draining_period(ngtcp2_conn *conn);
* specifies the stream ID. This function only extends stream-level
* flow control window.
*
* This function returns 0 if a stream denoted by |stream_id| is not
* found.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
Expand Down Expand Up @@ -5340,6 +5352,11 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr,
* CONNECTION_CLOSE (type 0x1d) frame. Otherwise, it does not produce
* any data, and returns 0.
*
* |destlen| could be shorten by some factors (e.g., server side
* amplification limit). This function returns
* :macro:`NGTCP2_ERR_NOBUF` if the resulting buffer is too small even
* if the given buffer has enough space.
*
* This function must not be called from inside the callback
* functions.
*
Expand Down
4 changes: 2 additions & 2 deletions deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
*
* Version number of the ngtcp2 library release.
*/
#define NGTCP2_VERSION "1.1.0"
#define NGTCP2_VERSION "1.2.0"

/**
* @macro
Expand All @@ -46,6 +46,6 @@
* number, 8 bits for minor and 8 bits for patch. Version 1.2.3
* becomes 0x010203.
*/
#define NGTCP2_VERSION_NUM 0x010100
#define NGTCP2_VERSION_NUM 0x010200

#endif /* VERSION_H */
3 changes: 3 additions & 0 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "ngtcp2_mem.h"
#include "ngtcp2_rcvry.h"
#include "ngtcp2_conn_stat.h"
#include "ngtcp2_unreachable.h"

/* NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN is the window length of
delivery rate filter driven by ACK clocking. */
Expand Down Expand Up @@ -247,6 +248,8 @@ uint64_t ngtcp2_cbrt(uint64_t n) {
# if defined(_WIN64)
if (_BitScanReverse64(&index, n)) {
d = 61 - index;
} else {
ngtcp2_unreachable();
}
# else /* !defined(_WIN64) */
if (_BitScanReverse(&index, (unsigned int)(n >> 32))) {
Expand Down
74 changes: 23 additions & 51 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c
Original file line number Diff line number Diff line change
Expand Up @@ -5329,7 +5329,6 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr,
num_acked = ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns,
pkt_ts, ts);
if (num_acked < 0) {
/* TODO assert this */
assert(ngtcp2_err_is_fatal((int)num_acked));
return (int)num_acked;
}
Expand Down Expand Up @@ -5790,9 +5789,8 @@ static int conn_recv_path_response(ngtcp2_conn *conn, ngtcp2_path_response *fr,
}

if (!(pv->flags & NGTCP2_PV_FLAG_DONT_CARE)) {
if (!(pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE)) {
if (pv->dcid.seq != conn->dcid.current.seq) {
assert(!conn->server);
assert(pv->dcid.seq != conn->dcid.current.seq);
assert(conn->dcid.current.cid.datalen);

rv = conn_retire_dcid(conn, &conn->dcid.current, ts);
Expand Down Expand Up @@ -5871,25 +5869,6 @@ static int conn_recv_path_response(ngtcp2_conn *conn, ngtcp2_path_response *fr,
return conn_stop_pv(conn, ts);
}

/*
* pkt_num_bits returns the number of bits available when packet
* number is encoded in |pkt_numlen| bytes.
*/
static size_t pkt_num_bits(size_t pkt_numlen) {
switch (pkt_numlen) {
case 1:
return 8;
case 2:
return 16;
case 3:
return 24;
case 4:
return 32;
default:
ngtcp2_unreachable();
}
}

/*
* pktns_pkt_num_is_duplicate returns nonzero if |pkt_num| is
* duplicated packet number.
Expand Down Expand Up @@ -6020,9 +5999,7 @@ static int conn_verify_fixed_bit(ngtcp2_conn *conn, ngtcp2_pkt_hd *hd) {
case NGTCP2_PKT_INITIAL:
case NGTCP2_PKT_0RTT:
case NGTCP2_PKT_HANDSHAKE:
/* TODO we cannot determine whether a token comes from NEW_TOKEN
frame or Retry packet. RFC 9287 requires that a token from
NEW_TOKEN. */
/* RFC 9287 requires that a token from NEW_TOKEN. */
if (!(conn->flags & NGTCP2_CONN_FLAG_INITIAL_PKT_PROCESSED) &&
(conn->local.settings.token_type != NGTCP2_TOKEN_TYPE_NEW_TOKEN ||
!conn->local.settings.tokenlen)) {
Expand Down Expand Up @@ -6145,7 +6122,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
return NGTCP2_ERR_DISCARD_PKT;
}

if (hd.type == NGTCP2_PKT_VERSION_NEGOTIATION) {
switch (hd.type) {
case NGTCP2_PKT_VERSION_NEGOTIATION:
hdpktlen = (size_t)nread;

ngtcp2_log_rx_pkt_hd(&conn->log, &hd);
Expand Down Expand Up @@ -6181,7 +6159,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
return NGTCP2_ERR_DISCARD_PKT;
}
return NGTCP2_ERR_RECV_VERSION_NEGOTIATION;
} else if (hd.type == NGTCP2_PKT_RETRY) {
case NGTCP2_PKT_RETRY:
hdpktlen = (size_t)nread;

ngtcp2_log_rx_pkt_hd(&conn->log, &hd);
Expand Down Expand Up @@ -6402,10 +6380,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,

break;
default:
/* unknown packet type */
ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT,
"packet was ignored because of unknown packet type");
return (ngtcp2_ssize)pktlen;
ngtcp2_unreachable();
}

hp_mask = conn->callbacks.hp_mask;
Expand Down Expand Up @@ -6438,7 +6413,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
payloadlen = hd.len - hd.pkt_numlen;

hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num,
pkt_num_bits(hd.pkt_numlen));
hd.pkt_numlen);
if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) {
ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT,
"pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num);
Expand Down Expand Up @@ -6624,14 +6599,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,

pktns_increase_ecn_counts(pktns, pi);

/* TODO Initial and Handshake are always acknowledged without
delay. */
if (require_ack &&
(++pktns->acktr.rx_npkt >= conn->local.settings.ack_thresh ||
(pi->ecn & NGTCP2_ECN_MASK) == NGTCP2_ECN_CE)) {
ngtcp2_acktr_immediate_ack(&pktns->acktr);
}

/* Initial and Handshake are always acknowledged without delay. No
need to call ngtcp2_acktr_immediate_ack(). */
rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack,
pkt_ts);
if (rv != 0) {
Expand Down Expand Up @@ -7057,7 +7026,7 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr) {
if (strm == NULL) {
return NGTCP2_ERR_NOMEM;
}
/* TODO Perhaps, call new_stream callback? */

rv = ngtcp2_conn_init_stream(conn, strm, fr->stream_id, NULL);
if (rv != 0) {
ngtcp2_objalloc_strm_release(&conn->strm_objalloc, strm);
Expand Down Expand Up @@ -7464,7 +7433,7 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn,
return 0;
}

/* Frame is received reset before we create ngtcp2_strm
/* STOP_SENDING frame is received before we create ngtcp2_strm
object. */
strm = ngtcp2_objalloc_strm_get(&conn->strm_objalloc);
if (strm == NULL) {
Expand All @@ -7482,6 +7451,10 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn,
}
}

if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING_RECVED) {
return 0;
}

ngtcp2_strm_set_app_error_code(strm, fr->app_error_code);

/* No RESET_STREAM is required if we have sent FIN and all data have
Expand All @@ -7494,7 +7467,9 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn,
}
}

strm->flags |= NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_RESET_STREAM;
strm->flags |= NGTCP2_STRM_FLAG_SHUT_WR |
NGTCP2_STRM_FLAG_STOP_SENDING_RECVED |
NGTCP2_STRM_FLAG_RESET_STREAM;

ngtcp2_strm_streamfrq_clear(strm);

Expand Down Expand Up @@ -8751,12 +8726,8 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi,

pktns_increase_ecn_counts(pktns, pi);

if (require_ack &&
(++pktns->acktr.rx_npkt >= conn->local.settings.ack_thresh ||
(pi->ecn & NGTCP2_ECN_MASK) == NGTCP2_ECN_CE)) {
ngtcp2_acktr_immediate_ack(&pktns->acktr);
}

/* Initial and Handshake are always acknowledged without delay. No
need to call ngtcp2_acktr_immediate_ack(). */
rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd->pkt_num, require_ack,
pkt_ts);
if (rv != 0) {
Expand Down Expand Up @@ -9020,7 +8991,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path,
payloadlen = pktlen - hdpktlen;

hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num,
pkt_num_bits(hd.pkt_numlen));
hd.pkt_numlen);
if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) {
ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT,
"pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num);
Expand Down Expand Up @@ -12551,7 +12522,8 @@ static int conn_shutdown_stream_read(ngtcp2_conn *conn, ngtcp2_strm *strm,
uint64_t app_error_code) {
ngtcp2_strm_set_app_error_code(strm, app_error_code);

if (strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING) {
if (strm->flags &
(NGTCP2_STRM_FLAG_STOP_SENDING | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED)) {
return 0;
}
if ((strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) &&
Expand Down
3 changes: 1 addition & 2 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid,
* Source Connection ID in hex string.
*
* <EVENT>:
* Event. pkt=packet, frm=frame, ldc=loss-detection, cry=crypto,
* con=connection(catch all)
* Event. See ngtcp2_log_event.
*
* # Frame event
*
Expand Down
2 changes: 1 addition & 1 deletion deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
#if defined(WIN32)
/* Windows requires ws2_32 library for ntonl family functions. We
define inline functions for those function so that we don't have
dependeny on that lib. */
dependency on that lib. */

# ifdef _MSC_VER
# define STIN static __inline
Expand Down
6 changes: 3 additions & 3 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_stream_frame(ngtcp2_stream *dest,
uint8_t type;
size_t len = 1 + 1;
const uint8_t *p;
size_t datalen;
size_t datalen = 0;
size_t ndatalen = 0;
size_t n;
uint64_t vi;
Expand Down Expand Up @@ -2139,9 +2139,9 @@ int ngtcp2_pkt_decode_retry(ngtcp2_pkt_retry *dest, const uint8_t *payload,
}

int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num,
size_t n) {
size_t pkt_numlen) {
int64_t expected = max_pkt_num + 1;
int64_t win = (int64_t)1 << n;
int64_t win = (int64_t)1 << (pkt_numlen * 8);
int64_t hwin = win / 2;
int64_t mask = win - 1;
int64_t cand = (expected & ~mask) | pkt_num;
Expand Down
4 changes: 2 additions & 2 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h
Original file line number Diff line number Diff line change
Expand Up @@ -1120,12 +1120,12 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen,

/*
* ngtcp2_pkt_adjust_pkt_num find the full 64 bits packet number for
* |pkt_num|, which is expected to be least significant |n| bits. The
* |pkt_num|, which is encoded in |pkt_numlen| bytes. The
* |max_pkt_num| is the highest successfully authenticated packet
* number.
*/
int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num,
size_t n);
size_t pkt_numlen);

/*
* ngtcp2_pkt_validate_ack checks that ack is malformed or not.
Expand Down
18 changes: 12 additions & 6 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen,
ppe->pkt_num_offset = 0;
ppe->pkt_numlen = 0;
ppe->pkt_num = 0;
ppe->sample_offset = 0;
ppe->cc = cc;
}

Expand Down Expand Up @@ -69,8 +68,6 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) {
return (int)rv;
}

ppe->sample_offset = ppe->pkt_num_offset + 4;

buf->last += rv;

ppe->pkt_numlen = hd->pkt_numlen;
Expand Down Expand Up @@ -101,6 +98,14 @@ int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr) {
return 0;
}

/*
* ppe_sample_offset returns the offset to sample for packet number
* encryption.
*/
static size_t ppe_sample_offset(ngtcp2_ppe *ppe) {
return ppe->pkt_num_offset + 4;
}

ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) {
ngtcp2_buf *buf = &ppe->buf;
ngtcp2_crypto_cc *cc = ppe->cc;
Expand Down Expand Up @@ -132,9 +137,10 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) {
buf->last = payload + payloadlen + cc->aead.max_overhead;

/* TODO Check that we have enough space to get sample */
assert(ppe->sample_offset + NGTCP2_HP_SAMPLELEN <= ngtcp2_buf_len(buf));
assert(ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN <= ngtcp2_buf_len(buf));

rv = cc->hp_mask(mask, &cc->hp, &cc->hp_ctx, buf->begin + ppe->sample_offset);
rv = cc->hp_mask(mask, &cc->hp, &cc->hp_ctx,
buf->begin + ppe_sample_offset(ppe));
if (rv != 0) {
return NGTCP2_ERR_CALLBACK_FAILURE;
}
Expand Down Expand Up @@ -197,7 +203,7 @@ size_t ngtcp2_ppe_padding_hp_sample(ngtcp2_ppe *ppe) {
assert(cc->aead.max_overhead);

max_samplelen =
ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe->sample_offset;
ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe);
if (max_samplelen < NGTCP2_HP_SAMPLELEN) {
len = NGTCP2_HP_SAMPLELEN - max_samplelen;
assert(ngtcp2_ppe_left(ppe) >= len);
Expand Down
3 changes: 0 additions & 3 deletions deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ typedef struct ngtcp2_ppe {
/* pkt_numlen is the number of bytes used to encode a packet
number */
size_t pkt_numlen;
/* sample_offset is the offset to sample for packet number
encryption. */
size_t sample_offset;
/* pkt_num is the packet number written in buf. */
int64_t pkt_num;
/* nonce is the buffer to store nonce. It should be equal or longer
Expand Down
Loading
Loading