Skip to content
Open
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
33 changes: 33 additions & 0 deletions src/inc/msquic_posix.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ QUIC_INLINE ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (EN
#define ERROR_BASE 200000000 // 0xBEBC200
#define TLS_ERROR_BASE 256 + ERROR_BASE // 0xBEBC300
#define CERT_ERROR_BASE 512 + ERROR_BASE // 0xBEBC400
#define QUIC_NET_DB_ERROR_BASE 1024 + ERROR_BASE // 0xBEBC600

#define QUIC_STATUS_SUCCESS ((QUIC_STATUS)0) // 0
#define QUIC_STATUS_PENDING ((QUIC_STATUS)-2) // -2
Expand Down Expand Up @@ -133,6 +134,38 @@ QUIC_INLINE ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (EN
#define QUIC_STATUS_ALPN_IN_USE ((QUIC_STATUS)EPROTOTYPE) // 91 (41 on macOS)
#define QUIC_STATUS_ADDRESS_NOT_AVAILABLE ((QUIC_STATUS)EADDRNOTAVAIL) // 99 (47 on macOS)

#define NETDB_ERR_CODE_TO_QUIC_STATUS(Alert) (Alert + QUIC_NET_DB_ERROR_BASE)

# define QUIC_STATUS_BADFLAGS NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_BADFLAGS) // 200001023
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure I like this solution.

Largely (ignoring QUIC_STATUS_ADDRESS_NOT_AVAILABLE which seems a strange case), QUIC_STATUS are defined for both Windows and Unix with similar names (and different values based on what makes sense for the OS). This allows the application code to be platform agnostic.

If we add QUIC_STATUS in the Unix header only, the application code stops being compatible cross-plateform if it uses one of them.

Unless we can find an ERRNO that would make sense as a generic "address resolution failed" (in which case, we can define a single new QUIC_STATUS_ADDRESS_RESOLUTION_FAILED mapped to HRESULT_FROM_WIN32(WSAHOST_NOT_FOUND) on Windows and that ERRNO on Unix), I would rather simply use one of the existing QUIC_STATUS, like QUIC_STATUS_UNREACHABLE or QUIC_STATUS_INVALID_PARAMETER.

# define QUIC_STATUS_NONAME NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_NONAME) // 200001022
# define QUIC_STATUS_AGAIN NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_AGAIN) // 200001021
# define QUIC_STATUS_FAIL NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_FAIL) // 200001020
# define QUIC_STATUS_FAMILY NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_FAMILY) // 200001018
# define QUIC_STATUS_SOCKTYPE NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_SOCKTYPE) // 200001017
# define QUIC_STATUS_SERVICE NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_SERVICE) // 200001016
# define QUIC_STATUS_MEMORY NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_MEMORY) // 200001014
# define QUIC_STATUS_SYSTEM NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_SYSTEM) // 200001013

// EAI_OVERFLOW is part of POSIX.1-2008 extension
// macOS and some GNU versions do not support it
#ifdef EAI_OVERFLOW
# define QUIC_STATUS_OVERFLOW NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_OVERFLOW) // 200001012
#endif

# ifdef __USE_GNU // GNU specific
# define QUIC_STATUS_NODATA NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_NODATA) // 200001019
# define QUIC_STATUS_ADDRFAMILY NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_ADDRFAMILY) // 200001015
# define QUIC_STATUS_INPROGRESS NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_INPROGRESS) // 200000924
# define QUIC_STATUS_CANCELED NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_CANCELED) // 200000923
# define QUIC_STATUS_NOTCANCELED NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_NOTCANCELED) // 200000922
# define QUIC_STATUS_ALLDONE NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_ALLDONE) // 200000921
# define QUIC_STATUS_INTR NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_INTR) // 200000920
# define QUIC_STATUS_IDN_ENCODE NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_IDN_ENCODE) // 200000919
# else // macOS specific
# define QUIC_STATUS_BAD_HINTS NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_BADHINTS)
# define QUIC_STATUS_BAD_PROTOCOL NETDB_ERR_CODE_TO_QUIC_STATUS(EAI_PROTOCOL)
# endif

#define QUIC_STATUS_TLS_ALERT(Alert) ((QUIC_STATUS)(0xff & Alert) + TLS_ERROR_BASE)

#define QUIC_STATUS_CLOSE_NOTIFY QUIC_STATUS_TLS_ALERT(0) // 0xBEBC300 - Close notify
Expand Down
2 changes: 2 additions & 0 deletions src/inc/msquic_winuser.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@
#define QUIC_STATUS_STREAM_LIMIT_REACHED ERROR_QUIC_STREAM_LIMIT_REACHED // 0x80410008
#define QUIC_STATUS_ALPN_IN_USE ERROR_QUIC_ALPN_IN_USE // 0x80410009

#define NETDB_ERR_CODE_TO_QUIC_STATUS(Alert) (Alert)

#define QUIC_STATUS_TLS_ALERT(Alert) (QUIC_TLS_ALERT_HRESULT_PREFIX | (0xff & Alert))

#define QUIC_STATUS_CLOSE_NOTIFY QUIC_STATUS_TLS_ALERT(0) // Close notify
Expand Down
9 changes: 5 additions & 4 deletions src/platform/datapath_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ CxPlatDataPathResolveAddress(
)
{
UNREFERENCED_PARAMETER(Datapath);
QUIC_STATUS Status = QUIC_STATUS_SUCCESS;
ADDRINFO Hints = {0};
ADDRINFO* AddrInfo = NULL;
int Result = 0;
Expand Down Expand Up @@ -155,9 +154,11 @@ CxPlatDataPathResolveAddress(
"[%p] Couldn't resolve hostname '%s' to an IP address",
Datapath,
HostName);
Status = (QUIC_STATUS)Result;

Exit:

return Status;
if(Result != 0) {
return NETDB_ERR_CODE_TO_QUIC_STATUS(Result);
} else {
return QUIC_STATUS_SUCCESS;
}
}