Skip to content
This repository has been archived by the owner on Aug 11, 2020. It is now read-only.

Commit

Permalink
quic: additional refinements to address handling
Browse files Browse the repository at this point in the history
PR-URL: #223
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
jasnell committed Dec 13, 2019
1 parent 3703689 commit f0906cd
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 3 deletions.
4 changes: 2 additions & 2 deletions src/node_quic_session.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1814,7 +1814,7 @@ bool QuicSession::ReceiveRetry() {
bool QuicSession::Receive(
ssize_t nread,
const uint8_t* data,
const struct sockaddr* addr,
const struct sockaddr* remote_addr,
unsigned int flags) {
if (IsFlagSet(QUICSESSION_FLAG_DESTROYED)) {
Debug(this, "Ignoring packet because session is destroyed");
Expand Down Expand Up @@ -1857,7 +1857,7 @@ bool QuicSession::Receive(
// It's possible for the remote address to change from one
// packet to the next so we have to look at the addr on
// every packet.
remote_address_ = addr;
remote_address_ = remote_addr;
QuicPath path(Socket()->GetLocalAddress(), &remote_address_);

{
Expand Down
2 changes: 1 addition & 1 deletion src/node_quic_session.h
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,7 @@ class QuicSession : public AsyncWrap,
bool Receive(
ssize_t nread,
const uint8_t* data,
const struct sockaddr* addr,
const struct sockaddr* remote_addr,
unsigned int flags);

// Receive a chunk of QUIC stream data received from the peer
Expand Down
60 changes: 60 additions & 0 deletions src/node_sockaddr-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,30 +184,90 @@ SocketAddress* SocketAddress::FromUVHandle(
return addr;
}

template <typename T, typename F>
SocketAddress* SocketAddress::FromUVHandle(
F fn,
const T* handle,
SocketAddress* addr) {
if (addr == nullptr)
addr = new SocketAddress();
int len = sizeof(sockaddr_storage);
fn(handle, reinterpret_cast<sockaddr*>(&addr->address_), &len);
return addr;
}

SocketAddress* SocketAddress::FromSockName(
uv_tcp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getsockname, handle, addr);
}

SocketAddress* SocketAddress::FromSockName(
const uv_tcp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getsockname, handle, addr);
}

SocketAddress* SocketAddress::FromSockName(
const uv_tcp_t& handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getsockname, &handle, addr);
}

SocketAddress* SocketAddress::FromSockName(
uv_udp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getsockname, handle, addr);
}

SocketAddress* SocketAddress::FromSockName(
const uv_udp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getsockname, handle, addr);
}

SocketAddress* SocketAddress::FromSockName(
const uv_udp_t& handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getsockname, &handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
uv_tcp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getpeername, handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
const uv_tcp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getpeername, handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
const uv_tcp_t& handle,
SocketAddress* addr) {
return FromUVHandle<uv_tcp_t>(uv_tcp_getpeername, &handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
uv_udp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getpeername, handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
const uv_udp_t* handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getpeername, handle, addr);
}

SocketAddress* SocketAddress::FromPeerName(
const uv_udp_t& handle,
SocketAddress* addr) {
return FromUVHandle<uv_udp_t>(uv_udp_getpeername, &handle, addr);
}

SocketAddress* SocketAddress::New(
const char* host,
uint32_t port,
Expand Down
38 changes: 38 additions & 0 deletions src/node_sockaddr.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,50 @@ class SocketAddress {
uv_tcp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromSockName(
const uv_tcp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromSockName(
const uv_tcp_t& handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromSockName(
uv_udp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromSockName(
const uv_udp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromSockName(
const uv_udp_t& handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
uv_tcp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
const uv_tcp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
const uv_tcp_t& handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
uv_udp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
const uv_udp_t* handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* FromPeerName(
const uv_udp_t& handle,
SocketAddress* addr = nullptr);

inline static SocketAddress* New(
const char* host,
uint32_t port,
Expand All @@ -101,6 +133,12 @@ class SocketAddress {
T* handle,
SocketAddress* addr = nullptr);

template <typename T, typename F>
static SocketAddress* FromUVHandle(
F fn,
const T* handle,
SocketAddress* addr = nullptr);

sockaddr_storage address_;
};

Expand Down

0 comments on commit f0906cd

Please sign in to comment.