From c134680321ca9344779f8d554c12f415fb65a432 Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Sun, 5 Dec 2010 17:09:15 -0700 Subject: [PATCH] ws2_32/tests: Add regression tests for WSARecvMsg and IP_PKTINFO. --- dlls/ws2_32/tests/sock.c | 177 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 9e0b4cbc531..528c65742aa 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -1085,6 +1085,182 @@ static void test_so_reuseaddr(void) closesocket(s2); } +#define IP_PKTINFO_LEN (sizeof(WSACMSGHDR) + WSA_CMSG_ALIGN(sizeof(struct in_pktinfo))) + +static void test_ip_pktinfo(void) +{ + ULONG addresses[2] = {inet_addr("127.0.0.1"), htonl(INADDR_ANY)}; + char recvbuf[10], pktbuf[512], msg[] = "HELLO"; + struct sockaddr_in s1addr, s2addr, s3addr; + GUID WSARecvMsg_GUID = WSAID_WSARECVMSG; + LPFN_WSARECVMSG pWSARecvMsg = NULL; + unsigned int rc, foundhdr, yes = 1; + DWORD dwBytes, dwSize, dwFlags; + socklen_t addrlen; + WSACMSGHDR *cmsg; + WSAOVERLAPPED ov; + WSABUF iovec[1]; + SOCKET s1, s2; + WSAMSG hdr; + int i, err; + + memset(&ov, 0, sizeof(ov)); + ov.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (ov.hEvent == INVALID_HANDLE_VALUE) + { + skip("Could not create event object, some tests will be skipped. errno = %d\n", GetLastError()); + return; + } + + memset(&hdr, 0x00, sizeof(hdr)); + s1addr.sin_family = AF_INET; + s1addr.sin_port = htons(0); + /* Note: s1addr.sin_addr is set below */ + iovec[0].buf = recvbuf; + iovec[0].len = sizeof(recvbuf); + hdr.name = (struct sockaddr*)&s3addr; + hdr.namelen = sizeof(s3addr); + hdr.lpBuffers = &iovec[0]; + hdr.dwBufferCount = 1; + hdr.Control.buf = pktbuf; + /* Note: hdr.Control.len is set below */ + hdr.dwFlags = 0; + + for (i=0;icmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) + { + struct in_pktinfo *pi = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg); + + ok(pi->ipi_addr.s_addr == s2addr.sin_addr.s_addr, "destination ip mismatch!\n"); + foundhdr = TRUE; + } + } + ok(foundhdr, "IP_PKTINFO header information was not returned!\n"); + + closesocket(s2); + closesocket(s1); + } + +cleanup: + CloseHandle(ov.hEvent); +} + /************* Array containing the tests to run **********/ #define STD_STREAM_SOCKET \ @@ -4422,6 +4598,7 @@ START_TEST( sock ) test_set_getsockopt(); test_so_reuseaddr(); + test_ip_pktinfo(); test_extendedSocketOptions(); for (i = 0; i < NUM_TESTS; i++)