ReactOS 0.4.17-dev-934-g091855f
broadcast.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Test for local delivery of UDP broadcasts
5 * COPYRIGHT: Copyright 2026 Justin Miller <justinmiller100@gmail.com>
6 */
7
8#include "ws2_32.h"
9#include <iphlpapi.h>
10
11static
12VOID
15{
16 SOCKET RecvSock;
17 SOCKET SendSock;
18 SOCKADDR_IN Addr;
19 INT AddrLen = sizeof(Addr);
21 CHAR Buffer[16];
22 fd_set Fds;
23 struct timeval Timeout = { 2, 0 };
24 INT Result;
25
27 ok(RecvSock != INVALID_SOCKET, "socket failed, error %d\n", WSAGetLastError());
28 if (RecvSock == INVALID_SOCKET)
29 return;
30
31 ZeroMemory(&Addr, sizeof(Addr));
32 Addr.sin_family = AF_INET;
33 Addr.sin_addr.s_addr = htonl(INADDR_ANY);
34 Result = bind(RecvSock, (SOCKADDR *)&Addr, sizeof(Addr));
35 ok(Result == 0, "bind failed, error %d\n", WSAGetLastError());
36
37 Result = getsockname(RecvSock, (SOCKADDR *)&Addr, &AddrLen);
38 ok(Result == 0, "getsockname failed, error %d\n", WSAGetLastError());
39
41 ok(SendSock != INVALID_SOCKET, "socket failed, error %d\n", WSAGetLastError());
42 if (SendSock == INVALID_SOCKET)
43 {
44 closesocket(RecvSock);
45 return;
46 }
47
48 Result = setsockopt(SendSock, SOL_SOCKET, SO_BROADCAST, (PCHAR)&Enable, sizeof(Enable));
49 ok(Result == 0, "setsockopt failed, error %d\n", WSAGetLastError());
50
51 Addr.sin_addr.s_addr = Destination;
52 Result = sendto(SendSock, "ping", 4, 0, (SOCKADDR *)&Addr, sizeof(Addr));
53 ok(Result == 4, "sendto returned %d, error %d\n", Result, WSAGetLastError());
54
55 FD_ZERO(&Fds);
56 FD_SET(RecvSock, &Fds);
57 Result = select(0, &Fds, NULL, NULL, &Timeout);
58 ok(Result == 1, "select returned %d for 0x%08lx\n", Result, ntohl(Destination));
59
60 if (Result == 1)
61 {
62 Result = recv(RecvSock, Buffer, sizeof(Buffer), 0);
63 ok(Result == 4 && !memcmp(Buffer, "ping", 4), "recv returned %d\n", Result);
64 }
65
66 closesocket(SendSock);
67 closesocket(RecvSock);
68}
69
70static
73{
75 ULONG TableSize = 0;
76 ULONG Broadcast = 0;
78
80 return 0;
81
83 if (!Table)
84 return 0;
85
87 {
88 for (Index = 0; Index < Table->dwNumEntries; Index++)
89 {
90 if (Table->table[Index].dwAddr == 0 ||
91 Table->table[Index].dwAddr == htonl(INADDR_LOOPBACK))
92 {
93 continue;
94 }
95
96 Broadcast = Table->table[Index].dwAddr | ~Table->table[Index].dwMask;
97 break;
98 }
99 }
100
102 return Broadcast;
103}
104
106{
107 WSADATA WsaData;
108 ULONG Directed;
109
110 if (WSAStartup(MAKEWORD(2, 2), &WsaData) != 0)
111 {
112 skip("WSAStartup failed\n");
113 return;
114 }
115
117
118 Directed = GetDirectedBroadcast();
119 if (Directed)
120 TestBroadcastLoopback(Directed);
121 else
122 skip("No configured adapter for directed broadcast\n");
123
124 WSACleanup();
125}
static ULONG GetDirectedBroadcast(VOID)
Definition: broadcast.c:72
static VOID TestBroadcastLoopback(_In_ ULONG Destination)
Definition: broadcast.c:13
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
Definition: bufpool.h:45
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
Definition: select.c:41
INT WSAAPI sendto(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags, IN CONST struct sockaddr *to, IN INT tolen)
Definition: send.c:82
#define IPPROTO_UDP
Definition: ip.h:198
#define AF_INET
Definition: tcpip.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
ASMGENDATA Table[]
Definition: genincdata.c:61
DWORD WINAPI GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder)
#define INADDR_BROADCAST
Definition: inet.h:82
#define INADDR_ANY
Definition: inet.h:80
#define INADDR_LOOPBACK
Definition: inet.h:78
#define ZeroMemory
Definition: minwinbase.h:31
#define ntohl(x)
Definition: module.h:205
#define htonl(x)
Definition: module.h:214
#define closesocket
Definition: ncftp.h:477
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
#define _In_
Definition: no_sal2.h:158
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
char CHAR
Definition: pedump.c:57
static ULONG Timeout
Definition: ping.c:61
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
Definition: sockctrl.c:213
INT WSAAPI setsockopt(IN SOCKET s, IN INT level, IN INT optname, IN CONST CHAR FAR *optval, IN INT optlen)
Definition: sockctrl.c:421
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
Definition: winsock.h:60
struct in_addr sin_addr
Definition: winsock.h:506
short sin_family
Definition: winsock.h:504
static const u8_t broadcast[6]
Definition: test_dhcp.c:23
#define MAKEWORD(a, b)
Definition: typedefs.h:248
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_In_ WDFCOLLECTION _In_ ULONG Index
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
int PASCAL FAR WSAGetLastError(void)
Definition: dllmain.c:131
#define FD_ZERO(set)
Definition: winsock.h:90
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60
#define INVALID_SOCKET
Definition: winsock.h:326
#define SOCK_DGRAM
Definition: winsock.h:330
UINT_PTR SOCKET
Definition: winsock.h:41
#define SOL_SOCKET
Definition: winsock.h:392
#define FD_SET(fd, set)
Definition: winsock.h:83
#define SO_BROADCAST
Definition: winsock.h:177
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ typedef _Out_ PULONG TableSize
Definition: iotypes.h:4330