Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
nghttp2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
nghttp2
Commits
fd107ab4
Commit
fd107ab4
authored
Sep 17, 2021
by
Tatsuhiro Tsujikawa
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nghttpx: Refactor quic
parent
1320d7ef
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
54 additions
and
57 deletions
+54
-57
src/shrpx_http3_upstream.cc
src/shrpx_http3_upstream.cc
+10
-10
src/shrpx_quic.cc
src/shrpx_quic.cc
+17
-17
src/shrpx_quic.h
src/shrpx_quic.h
+7
-7
src/shrpx_quic_connection_handler.cc
src/shrpx_quic_connection_handler.cc
+16
-19
src/shrpx_quic_connection_handler.h
src/shrpx_quic_connection_handler.h
+4
-4
No files found.
src/shrpx_http3_upstream.cc
View file @
fd107ab4
...
...
@@ -222,7 +222,7 @@ int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token,
auto
&
quicconf
=
config
->
quic
;
if
(
generate_encrypted_quic_connection_id
(
cid
,
cidlen
,
worker
->
get_cid_prefix
(),
*
cid
,
cidlen
,
worker
->
get_cid_prefix
(),
quicconf
.
upstream
.
cid_encryption_key
.
data
())
!=
0
)
{
return
NGTCP2_ERR_CALLBACK_FAILURE
;
}
...
...
@@ -230,14 +230,14 @@ int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token,
auto
&
quic_secret
=
worker
->
get_quic_secret
();
auto
&
secret
=
quic_secret
->
stateless_reset_secret
;
if
(
generate_quic_stateless_reset_token
(
token
,
cid
,
secret
.
data
(),
if
(
generate_quic_stateless_reset_token
(
token
,
*
cid
,
secret
.
data
(),
secret
.
size
())
!=
0
)
{
return
NGTCP2_ERR_CALLBACK_FAILURE
;
}
auto
quic_connection_handler
=
worker
->
get_quic_connection_handler
();
quic_connection_handler
->
add_connection_id
(
cid
,
handler
);
quic_connection_handler
->
add_connection_id
(
*
cid
,
handler
);
return
0
;
}
...
...
@@ -251,7 +251,7 @@ int remove_connection_id(ngtcp2_conn *conn, const ngtcp2_cid *cid,
auto
worker
=
handler
->
get_worker
();
auto
quic_conn_handler
=
worker
->
get_quic_connection_handler
();
quic_conn_handler
->
remove_connection_id
(
cid
);
quic_conn_handler
->
remove_connection_id
(
*
cid
);
return
0
;
}
...
...
@@ -560,7 +560,7 @@ int Http3Upstream::init(const UpstreamAddr *faddr, const Address &remote_addr,
ngtcp2_cid
scid
;
if
(
generate_encrypted_quic_connection_id
(
&
scid
,
SHRPX_QUIC_SCIDLEN
,
worker
->
get_cid_prefix
(),
scid
,
SHRPX_QUIC_SCIDLEN
,
worker
->
get_cid_prefix
(),
quicconf
.
upstream
.
cid_encryption_key
.
data
())
!=
0
)
{
return
-
1
;
}
...
...
@@ -611,7 +611,7 @@ int Http3Upstream::init(const UpstreamAddr *faddr, const Address &remote_addr,
auto
&
quic_secret
=
worker
->
get_quic_secret
();
auto
&
stateless_reset_secret
=
quic_secret
->
stateless_reset_secret
;
rv
=
generate_quic_stateless_reset_token
(
params
.
stateless_reset_token
,
&
scid
,
rv
=
generate_quic_stateless_reset_token
(
params
.
stateless_reset_token
,
scid
,
stateless_reset_secret
.
data
(),
stateless_reset_secret
.
size
());
if
(
rv
!=
0
)
{
...
...
@@ -643,8 +643,8 @@ int Http3Upstream::init(const UpstreamAddr *faddr, const Address &remote_addr,
return
-
1
;
}
quic_connection_handler
->
add_connection_id
(
&
hashed_scid_
,
handler_
);
quic_connection_handler
->
add_connection_id
(
&
scid
,
handler_
);
quic_connection_handler
->
add_connection_id
(
hashed_scid_
,
handler_
);
quic_connection_handler
->
add_connection_id
(
scid
,
handler_
);
return
0
;
}
...
...
@@ -1336,7 +1336,7 @@ void Http3Upstream::on_handler_delete() {
scids
.
back
()
=
hashed_scid_
;
for
(
auto
&
cid
:
scids
)
{
quic_conn_handler
->
remove_connection_id
(
&
cid
);
quic_conn_handler
->
remove_connection_id
(
cid
);
}
if
(
idle_close_
||
retry_close_
)
{
...
...
@@ -1632,7 +1632,7 @@ int Http3Upstream::on_read(const UpstreamAddr *faddr,
ngtcp2_cid_init
(
&
ini_scid
,
scid
,
scidlen
);
quic_conn_handler
->
send_connection_close
(
faddr
,
version
,
&
ini_dcid
,
&
ini_scid
,
remote_addr
,
local_addr
,
faddr
,
version
,
ini_dcid
,
ini_scid
,
remote_addr
,
local_addr
,
NGTCP2_CONNECTION_REFUSED
);
return
-
1
;
...
...
src/shrpx_quic.cc
View file @
fd107ab4
...
...
@@ -143,30 +143,30 @@ int quic_send_packet(const UpstreamAddr *faddr, const sockaddr *remote_sa,
return
0
;
}
int
generate_quic_connection_id
(
ngtcp2_cid
*
cid
,
size_t
cidlen
)
{
if
(
RAND_bytes
(
cid
->
data
,
cidlen
)
!=
1
)
{
int
generate_quic_connection_id
(
ngtcp2_cid
&
cid
,
size_t
cidlen
)
{
if
(
RAND_bytes
(
cid
.
data
,
cidlen
)
!=
1
)
{
return
-
1
;
}
cid
->
datalen
=
cidlen
;
cid
.
datalen
=
cidlen
;
return
0
;
}
int
generate_encrypted_quic_connection_id
(
ngtcp2_cid
*
cid
,
size_t
cidlen
,
int
generate_encrypted_quic_connection_id
(
ngtcp2_cid
&
cid
,
size_t
cidlen
,
const
uint8_t
*
cid_prefix
,
const
uint8_t
*
key
)
{
assert
(
cidlen
>
SHRPX_QUIC_CID_PREFIXLEN
);
auto
p
=
std
::
copy_n
(
cid_prefix
,
SHRPX_QUIC_CID_PREFIXLEN
,
cid
->
data
);
auto
p
=
std
::
copy_n
(
cid_prefix
,
SHRPX_QUIC_CID_PREFIXLEN
,
cid
.
data
);
if
(
RAND_bytes
(
p
,
cidlen
-
SHRPX_QUIC_CID_PREFIXLEN
)
!=
1
)
{
return
-
1
;
}
cid
->
datalen
=
cidlen
;
cid
.
datalen
=
cidlen
;
return
encrypt_quic_connection_id
(
cid
->
data
,
cid
->
data
,
key
);
return
encrypt_quic_connection_id
(
cid
.
data
,
cid
.
data
,
key
);
}
int
encrypt_quic_connection_id
(
uint8_t
*
dest
,
const
uint8_t
*
src
,
...
...
@@ -237,11 +237,11 @@ int generate_quic_hashed_connection_id(ngtcp2_cid &dest,
return
0
;
}
int
generate_quic_stateless_reset_token
(
uint8_t
*
token
,
const
ngtcp2_cid
*
cid
,
int
generate_quic_stateless_reset_token
(
uint8_t
*
token
,
const
ngtcp2_cid
&
cid
,
const
uint8_t
*
secret
,
size_t
secretlen
)
{
if
(
ngtcp2_crypto_generate_stateless_reset_token
(
token
,
secret
,
secretlen
,
cid
)
!=
0
)
{
&
cid
)
!=
0
)
{
return
-
1
;
}
...
...
@@ -265,15 +265,15 @@ int generate_quic_token_secret(uint8_t *secret) {
}
int
generate_retry_token
(
uint8_t
*
token
,
size_t
&
tokenlen
,
const
sockaddr
*
sa
,
socklen_t
salen
,
const
ngtcp2_cid
*
retry_scid
,
const
ngtcp2_cid
*
odcid
,
const
uint8_t
*
token_secret
)
{
socklen_t
salen
,
const
ngtcp2_cid
&
retry_scid
,
const
ngtcp2_cid
&
odcid
,
const
uint8_t
*
token_secret
)
{
auto
t
=
std
::
chrono
::
duration_cast
<
std
::
chrono
::
nanoseconds
>
(
std
::
chrono
::
system_clock
::
now
().
time_since_epoch
())
.
count
();
auto
stokenlen
=
ngtcp2_crypto_generate_retry_token
(
token
,
token_secret
,
SHRPX_QUIC_TOKEN_SECRETLEN
,
sa
,
salen
,
retry_scid
,
odcid
,
t
);
token
,
token_secret
,
SHRPX_QUIC_TOKEN_SECRETLEN
,
sa
,
salen
,
&
retry_scid
,
&
odcid
,
t
);
if
(
stokenlen
<
0
)
{
return
-
1
;
}
...
...
@@ -283,17 +283,17 @@ int generate_retry_token(uint8_t *token, size_t &tokenlen, const sockaddr *sa,
return
0
;
}
int
verify_retry_token
(
ngtcp2_cid
*
odcid
,
const
uint8_t
*
token
,
size_t
tokenlen
,
const
ngtcp2_cid
*
dcid
,
const
sockaddr
*
sa
,
int
verify_retry_token
(
ngtcp2_cid
&
odcid
,
const
uint8_t
*
token
,
size_t
tokenlen
,
const
ngtcp2_cid
&
dcid
,
const
sockaddr
*
sa
,
socklen_t
salen
,
const
uint8_t
*
token_secret
)
{
auto
t
=
std
::
chrono
::
duration_cast
<
std
::
chrono
::
nanoseconds
>
(
std
::
chrono
::
system_clock
::
now
().
time_since_epoch
())
.
count
();
if
(
ngtcp2_crypto_verify_retry_token
(
odcid
,
token
,
tokenlen
,
token_secret
,
if
(
ngtcp2_crypto_verify_retry_token
(
&
odcid
,
token
,
tokenlen
,
token_secret
,
SHRPX_QUIC_TOKEN_SECRETLEN
,
sa
,
salen
,
dcid
,
10
*
NGTCP2_SECONDS
,
t
)
!=
0
)
{
&
dcid
,
10
*
NGTCP2_SECONDS
,
t
)
!=
0
)
{
return
-
1
;
}
...
...
src/shrpx_quic.h
View file @
fd107ab4
...
...
@@ -78,9 +78,9 @@ int quic_send_packet(const UpstreamAddr *faddr, const sockaddr *remote_sa,
size_t
local_salen
,
const
uint8_t
*
data
,
size_t
datalen
,
size_t
gso_size
);
int
generate_quic_connection_id
(
ngtcp2_cid
*
cid
,
size_t
cidlen
);
int
generate_quic_connection_id
(
ngtcp2_cid
&
cid
,
size_t
cidlen
);
int
generate_encrypted_quic_connection_id
(
ngtcp2_cid
*
cid
,
size_t
cidlen
,
int
generate_encrypted_quic_connection_id
(
ngtcp2_cid
&
cid
,
size_t
cidlen
,
const
uint8_t
*
cid_prefix
,
const
uint8_t
*
key
);
...
...
@@ -95,7 +95,7 @@ int generate_quic_hashed_connection_id(ngtcp2_cid &dest,
const
Address
&
local_addr
,
const
ngtcp2_cid
&
cid
);
int
generate_quic_stateless_reset_token
(
uint8_t
*
token
,
const
ngtcp2_cid
*
cid
,
int
generate_quic_stateless_reset_token
(
uint8_t
*
token
,
const
ngtcp2_cid
&
cid
,
const
uint8_t
*
secret
,
size_t
secretlen
);
...
...
@@ -104,11 +104,11 @@ int generate_quic_stateless_reset_secret(uint8_t *secret);
int
generate_quic_token_secret
(
uint8_t
*
secret
);
int
generate_retry_token
(
uint8_t
*
token
,
size_t
&
tokenlen
,
const
sockaddr
*
sa
,
socklen_t
salen
,
const
ngtcp2_cid
*
retry_scid
,
const
ngtcp2_cid
*
odcid
,
const
uint8_t
*
token_secret
);
socklen_t
salen
,
const
ngtcp2_cid
&
retry_scid
,
const
ngtcp2_cid
&
odcid
,
const
uint8_t
*
token_secret
);
int
verify_retry_token
(
ngtcp2_cid
*
odcid
,
const
uint8_t
*
token
,
size_t
tokenlen
,
const
ngtcp2_cid
*
dcid
,
const
sockaddr
*
sa
,
int
verify_retry_token
(
ngtcp2_cid
&
odcid
,
const
uint8_t
*
token
,
size_t
tokenlen
,
const
ngtcp2_cid
&
dcid
,
const
sockaddr
*
sa
,
socklen_t
salen
,
const
uint8_t
*
token_secret
);
int
generate_token
(
uint8_t
*
token
,
size_t
&
tokenlen
,
const
sockaddr
*
sa
,
...
...
src/shrpx_quic_connection_handler.cc
View file @
fd107ab4
...
...
@@ -181,7 +181,7 @@ int QUICConnectionHandler::handle_packet(const UpstreamAddr *faddr,
}
if
(
worker_
->
get_graceful_shutdown
())
{
send_connection_close
(
faddr
,
version
,
&
hd
.
dcid
,
&
hd
.
scid
,
remote_addr
,
send_connection_close
(
faddr
,
version
,
hd
.
dcid
,
hd
.
scid
,
remote_addr
,
local_addr
,
NGTCP2_CONNECTION_REFUSED
);
return
0
;
}
...
...
@@ -202,7 +202,7 @@ int QUICConnectionHandler::handle_packet(const UpstreamAddr *faddr,
switch
(
hd
.
token
.
base
[
0
])
{
case
NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY
:
if
(
verify_retry_token
(
&
odcid
,
hd
.
token
.
base
,
hd
.
token
.
len
,
&
hd
.
dcid
,
if
(
verify_retry_token
(
odcid
,
hd
.
token
.
base
,
hd
.
token
.
len
,
hd
.
dcid
,
&
remote_addr
.
su
.
sa
,
remote_addr
.
len
,
secret
.
data
())
!=
0
)
{
if
(
LOG_ENABLED
(
INFO
))
{
...
...
@@ -212,7 +212,7 @@ int QUICConnectionHandler::handle_packet(const UpstreamAddr *faddr,
// 2nd Retry packet is not allowed, so send CONNECTION_CLOSE
// with INVALID_TOKEN.
send_connection_close
(
faddr
,
version
,
&
hd
.
dcid
,
&
hd
.
scid
,
remote_addr
,
send_connection_close
(
faddr
,
version
,
hd
.
dcid
,
hd
.
scid
,
remote_addr
,
local_addr
,
NGTCP2_INVALID_TOKEN
);
return
0
;
}
...
...
@@ -269,7 +269,7 @@ int QUICConnectionHandler::handle_packet(const UpstreamAddr *faddr,
}
case
NGTCP2_ERR_RETRY
:
if
(
worker_
->
get_graceful_shutdown
())
{
send_connection_close
(
faddr
,
version
,
&
hd
.
dcid
,
&
hd
.
scid
,
remote_addr
,
send_connection_close
(
faddr
,
version
,
hd
.
dcid
,
hd
.
scid
,
remote_addr
,
local_addr
,
NGTCP2_CONNECTION_REFUSED
);
return
0
;
}
...
...
@@ -421,9 +421,7 @@ int QUICConnectionHandler::send_retry(
ngtcp2_cid
retry_scid
;
retry_scid
.
datalen
=
SHRPX_QUIC_SCIDLEN
;
// We do not steer packet based on Retry CID.
if
(
RAND_bytes
(
retry_scid
.
data
,
retry_scid
.
datalen
)
!=
1
)
{
if
(
generate_quic_connection_id
(
retry_scid
,
SHRPX_QUIC_SCIDLEN
)
!=
0
)
{
return
-
1
;
}
...
...
@@ -438,7 +436,7 @@ int QUICConnectionHandler::send_retry(
auto
&
secret
=
quic_secret
->
token_secret
;
if
(
generate_retry_token
(
token
.
data
(),
tokenlen
,
&
remote_addr
.
su
.
sa
,
remote_addr
.
len
,
&
retry_scid
,
&
idcid
,
remote_addr
.
len
,
retry_scid
,
idcid
,
secret
.
data
())
!=
0
)
{
return
-
1
;
}
...
...
@@ -539,7 +537,7 @@ int QUICConnectionHandler::send_stateless_reset(const UpstreamAddr *faddr,
auto
&
quic_secret
=
worker_
->
get_quic_secret
();
auto
&
secret
=
quic_secret
->
stateless_reset_secret
;
rv
=
generate_quic_stateless_reset_token
(
token
.
data
(),
&
cid
,
secret
.
data
(),
rv
=
generate_quic_stateless_reset_token
(
token
.
data
(),
cid
,
secret
.
data
(),
secret
.
size
());
if
(
rv
!=
0
)
{
return
-
1
;
...
...
@@ -574,13 +572,13 @@ int QUICConnectionHandler::send_stateless_reset(const UpstreamAddr *faddr,
}
int
QUICConnectionHandler
::
send_connection_close
(
const
UpstreamAddr
*
faddr
,
uint32_t
version
,
const
ngtcp2_cid
*
ini_dcid
,
const
ngtcp2_cid
*
ini_scid
,
const
Address
&
remote_addr
,
const
UpstreamAddr
*
faddr
,
uint32_t
version
,
const
ngtcp2_cid
&
ini_dcid
,
const
ngtcp2_cid
&
ini_scid
,
const
Address
&
remote_addr
,
const
Address
&
local_addr
,
uint64_t
error_code
)
{
std
::
array
<
uint8_t
,
NGTCP2_MAX_UDP_PAYLOAD_SIZE
>
buf
;
auto
nwrite
=
ngtcp2_crypto_write_connection_close
(
buf
.
data
(),
buf
.
size
(),
version
,
ini_scid
,
ini_dcid
,
error_code
);
buf
.
data
(),
buf
.
size
(),
version
,
&
ini_scid
,
&
ini_dcid
,
error_code
);
if
(
nwrite
<
0
)
{
LOG
(
ERROR
)
<<
"ngtcp2_crypto_write_connection_close failed"
;
return
-
1
;
...
...
@@ -590,9 +588,8 @@ int QUICConnectionHandler::send_connection_close(
LOG
(
INFO
)
<<
"Send Initial CONNECTION_CLOSE with error_code="
<<
log
::
hex
<<
error_code
<<
log
::
dec
<<
" to remote="
<<
util
::
to_numeric_addr
(
&
remote_addr
)
<<
" dcid="
<<
util
::
format_hex
(
ini_scid
->
data
,
ini_scid
->
datalen
)
<<
" scid="
<<
util
::
format_hex
(
ini_dcid
->
data
,
ini_dcid
->
datalen
);
<<
" dcid="
<<
util
::
format_hex
(
ini_scid
.
data
,
ini_scid
.
datalen
)
<<
" scid="
<<
util
::
format_hex
(
ini_dcid
.
data
,
ini_dcid
.
datalen
);
}
return
quic_send_packet
(
faddr
,
&
remote_addr
.
su
.
sa
,
remote_addr
.
len
,
...
...
@@ -600,13 +597,13 @@ int QUICConnectionHandler::send_connection_close(
0
);
}
void
QUICConnectionHandler
::
add_connection_id
(
const
ngtcp2_cid
*
cid
,
void
QUICConnectionHandler
::
add_connection_id
(
const
ngtcp2_cid
&
cid
,
ClientHandler
*
handler
)
{
connections_
.
emplace
(
*
cid
,
handler
);
connections_
.
emplace
(
cid
,
handler
);
}
void
QUICConnectionHandler
::
remove_connection_id
(
const
ngtcp2_cid
*
cid
)
{
connections_
.
erase
(
*
cid
);
void
QUICConnectionHandler
::
remove_connection_id
(
const
ngtcp2_cid
&
cid
)
{
connections_
.
erase
(
cid
);
}
void
QUICConnectionHandler
::
add_close_wait
(
CloseWait
*
cw
)
{
...
...
src/shrpx_quic_connection_handler.h
View file @
fd107ab4
...
...
@@ -110,8 +110,8 @@ public:
// |ini_scid| is the source Connection ID which appeared in Client
// Initial packet.
int
send_connection_close
(
const
UpstreamAddr
*
faddr
,
uint32_t
version
,
const
ngtcp2_cid
*
ini_dcid
,
const
ngtcp2_cid
*
ini_scid
,
const
ngtcp2_cid
&
ini_dcid
,
const
ngtcp2_cid
&
ini_scid
,
const
Address
&
remote_addr
,
const
Address
&
local_addr
,
uint64_t
error_code
);
ClientHandler
*
handle_new_connection
(
const
UpstreamAddr
*
faddr
,
...
...
@@ -120,8 +120,8 @@ public:
const
ngtcp2_pkt_hd
&
hd
,
const
ngtcp2_cid
*
odcid
,
const
uint8_t
*
token
,
size_t
tokenlen
);
void
add_connection_id
(
const
ngtcp2_cid
*
cid
,
ClientHandler
*
handler
);
void
remove_connection_id
(
const
ngtcp2_cid
*
cid
);
void
add_connection_id
(
const
ngtcp2_cid
&
cid
,
ClientHandler
*
handler
);
void
remove_connection_id
(
const
ngtcp2_cid
&
cid
);
void
add_close_wait
(
CloseWait
*
cw
);
void
remove_close_wait
(
const
CloseWait
*
cw
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment