Skip to content

Commit a6a9f0f

Browse files
thhous-msftnibanks
andauthored
Add error code and docs for invalid address error (#2032)
Co-authored-by: Nick Banks <[email protected]>
1 parent 2588334 commit a6a9f0f

File tree

8 files changed

+71
-1
lines changed

8 files changed

+71
-1
lines changed

docs/api/QUIC_STATUS.md

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ Value | Meaning
4343
**QUIC_STATUS_HANDSHAKE_FAILURE** | The connection handshake failed.
4444
**QUIC_STATUS_ABORTED** | The connection or stream was aborted.
4545
**QUIC_STATUS_ADDRESS_IN_USE** | The local address is already in use.
46+
**QUIC_STATUS_INVALID_ADDRESS** | Binding to socket failed, likely caused by a family mismatch between local and remote address.
4647
**QUIC_STATUS_CONNECTION_TIMEOUT** | The connection timed out waiting for a response from the peer.
4748
**QUIC_STATUS_CONNECTION_IDLE** | The connection timed out from inactivity.
4849
**QUIC_STATUS_INTERNAL_ERROR** | An internal error was encountered.

src/inc/msquic_posix.h

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) throw() { return (ENUMTYP
113113
#define QUIC_STATUS_HANDSHAKE_FAILURE ((QUIC_STATUS)ECONNABORTED) // 103 (53 on macOS)
114114
#define QUIC_STATUS_ABORTED ((QUIC_STATUS)ECANCELED) // 125 (89 on macOS)
115115
#define QUIC_STATUS_ADDRESS_IN_USE ((QUIC_STATUS)EADDRINUSE) // 98 (48 on macOS)
116+
#define QUIC_STATUS_INVALID_ADDRESS ((QUIC_STATUS)EAFNOSUPPORT) // 97 (47 on macOS)
116117
#define QUIC_STATUS_CONNECTION_TIMEOUT ((QUIC_STATUS)ETIMEDOUT) // 110 (60 on macOS)
117118
#define QUIC_STATUS_CONNECTION_IDLE ((QUIC_STATUS)ETIME) // 62 (101 on macOS)
118119
#define QUIC_STATUS_INTERNAL_ERROR ((QUIC_STATUS)EIO) // 5

src/inc/msquic_winkernel.h

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ typedef UINT64 uint64_t;
9797
#define QUIC_STATUS_HANDSHAKE_FAILURE STATUS_QUIC_HANDSHAKE_FAILURE // 0xc0240000
9898
#define QUIC_STATUS_ABORTED STATUS_CANCELLED // 0xc0000120
9999
#define QUIC_STATUS_ADDRESS_IN_USE STATUS_ADDRESS_ALREADY_EXISTS // 0xc000020a
100+
#define QUIC_STATUS_INVALID_ADDRESS STATUS_INVALID_ADDRESS_COMPONENT // 0xc0000207
100101
#define QUIC_STATUS_CONNECTION_TIMEOUT STATUS_QUIC_CONNECTION_TIMEOUT // 0xc0240006
101102
#define QUIC_STATUS_CONNECTION_IDLE STATUS_QUIC_CONNECTION_IDLE // 0xc0240005
102103
#define QUIC_STATUS_UNREACHABLE STATUS_HOST_UNREACHABLE // 0xc000023d

src/inc/msquic_winuser.h

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
#define QUIC_STATUS_HANDSHAKE_FAILURE ERROR_QUIC_HANDSHAKE_FAILURE // 0x80410000
9797
#define QUIC_STATUS_ABORTED E_ABORT // 0x80004004
9898
#define QUIC_STATUS_ADDRESS_IN_USE HRESULT_FROM_WIN32(WSAEADDRINUSE) // 0x80072740
99+
#define QUIC_STATUS_INVALID_ADDRESS HRESULT_FROM_WIN32(WSAEADDRNOTAVAIL) // 0x80072741
99100
#define QUIC_STATUS_CONNECTION_TIMEOUT ERROR_QUIC_CONNECTION_TIMEOUT // 0x80410006
100101
#define QUIC_STATUS_CONNECTION_IDLE ERROR_QUIC_CONNECTION_IDLE // 0x80410005
101102
#define QUIC_STATUS_UNREACHABLE HRESULT_FROM_WIN32(ERROR_HOST_UNREACHABLE) // 0x800704d0

src/test/MsQuicTests.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ QuicTestConnectUnreachable(
205205
_In_ int Family
206206
);
207207

208+
void
209+
QuicTestConnectInvalidAddress(
210+
);
211+
208212
void
209213
QuicTestConnectBadAlpn(
210214
_In_ int Family
@@ -926,4 +930,7 @@ typedef struct {
926930
QUIC_CTL_CODE(76, METHOD_BUFFERED, FILE_WRITE_DATA)
927931
// int - Family
928932

929-
#define QUIC_MAX_IOCTL_FUNC_CODE 76
933+
#define IOCTL_QUIC_RUN_CONNECT_INVALID_ADDRESS \
934+
QUIC_CTL_CODE(77, METHOD_BUFFERED, FILE_WRITE_DATA)
935+
936+
#define QUIC_MAX_IOCTL_FUNC_CODE 77

src/test/bin/quic_gtest.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,15 @@ TEST_P(WithFamilyArgs, Unreachable) {
957957
}
958958
}
959959

960+
TEST(HandshakeTest, InvalidAddress) {
961+
TestLogger Logger("QuicTestConnectInvalidAddress");
962+
if (TestingKernelMode) {
963+
ASSERT_TRUE(DriverClient.Run(IOCTL_QUIC_RUN_CONNECT_INVALID_ADDRESS));
964+
} else {
965+
QuicTestConnectInvalidAddress();
966+
}
967+
}
968+
960969
TEST_P(WithFamilyArgs, BadALPN) {
961970
TestLoggerT<ParamType> Logger("QuicTestConnectBadAlpn", GetParam());
962971
if (TestingKernelMode) {

src/test/bin/winkernel/control.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ size_t QUIC_IOCTL_BUFFER_SIZES[] =
447447
0,
448448
sizeof(UINT8),
449449
sizeof(INT32),
450+
0,
450451
};
451452

452453
CXPLAT_STATIC_ASSERT(
@@ -1110,6 +1111,10 @@ QuicTestCtlEvtIoDeviceControl(
11101111
QuicTestCtlRun(QuicTestInterfaceBinding(Params->Family));
11111112
break;
11121113

1114+
case IOCTL_QUIC_RUN_CONNECT_INVALID_ADDRESS:
1115+
QuicTestCtlRun(QuicTestConnectInvalidAddress());
1116+
break;
1117+
11131118
default:
11141119
Status = STATUS_NOT_IMPLEMENTED;
11151120
break;

src/test/lib/HandshakeTest.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,51 @@ QuicTestConnectUnreachable(
807807
}
808808
}
809809

810+
void
811+
QuicTestConnectInvalidAddress(
812+
)
813+
{
814+
MsQuicRegistration Registration;
815+
TEST_TRUE(Registration.IsValid());
816+
817+
MsQuicAlpn Alpn("MsQuicTest");
818+
819+
MsQuicSettings Settings;
820+
Settings.SetIdleTimeoutMs(3000);
821+
822+
MsQuicCredentialConfig ClientCredConfig;
823+
MsQuicConfiguration ClientConfiguration(Registration, Alpn, Settings, ClientCredConfig);
824+
TEST_TRUE(ClientConfiguration.IsValid());
825+
826+
{
827+
TestConnection Client(Registration);
828+
TEST_TRUE(Client.IsValid());
829+
830+
QuicAddr LocalAddr{QUIC_ADDRESS_FAMILY_INET, true};
831+
LocalAddr.SetPort(TestUdpPortBase - 2);
832+
833+
QuicAddr RemoteAddr{QUIC_ADDRESS_FAMILY_INET6, true};
834+
RemoteAddr.SetPort(TestUdpPortBase - 1);
835+
836+
TEST_QUIC_SUCCEEDED(Client.SetLocalAddr(LocalAddr));
837+
TEST_QUIC_SUCCEEDED(Client.SetRemoteAddr(RemoteAddr));
838+
839+
Client.SetExpectedTransportCloseStatus(QUIC_STATUS_INVALID_ADDRESS);
840+
TEST_QUIC_SUCCEEDED(
841+
Client.Start(
842+
ClientConfiguration,
843+
QUIC_ADDRESS_FAMILY_INET6,
844+
QUIC_LOCALHOST_FOR_AF(QUIC_ADDRESS_FAMILY_INET6),
845+
TestUdpPortBase - 1));
846+
if (!Client.WaitForConnectionComplete()) {
847+
return;
848+
}
849+
850+
TEST_FALSE(Client.GetIsConnected());
851+
TEST_TRUE(Client.GetTransportClosed());
852+
}
853+
}
854+
810855
void
811856
QuicTestVersionNegotiation(
812857
_In_ int Family

0 commit comments

Comments
 (0)