1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef	__MDNS_WIN32__
19#define	__MDNS_WIN32__
20
21#include	"CommonServices.h"
22
23#if( !defined( _WIN32_WCE ) )
24	#include	<mswsock.h>
25#endif
26
27#include	"mDNSEmbeddedAPI.h"
28#include	"uDNS.h"
29
30#ifdef	__cplusplus
31	extern "C" {
32#endif
33
34
35typedef struct Overlapped
36{
37	BOOL		pending;
38	OVERLAPPED	data;
39	WSABUF		wbuf;
40	DWORD		error;
41	DWORD		bytesTransferred;
42	mDNSAddr	srcAddr;
43	mDNSIPPort	srcPort;
44	mDNSAddr	dstAddr;
45	mDNSIPPort	dstPort;
46} Overlapped;
47
48
49typedef void ( *TCPReadEventHandler )( TCPSocket * sock );
50typedef void ( *TCPUserCallback )();
51
52struct TCPSocket_struct
53{
54	TCPSocketFlags				flags;		// MUST BE FIRST FIELD -- mDNSCore expects every TCPSocket_struct to begin with TCPSocketFlags flags
55	SOCKET						fd;
56	TCPReadEventHandler			readEventHandler;
57	HANDLE						connectEvent;
58	BOOL						connected;
59	TCPUserCallback				userCallback;
60	void					*	userContext;
61	Overlapped					overlapped;
62	DWORD						lastError;
63	BOOL						closed;
64	uint8_t						bbuf[ 4192 ];
65	uint8_t					*	bptr;
66	uint8_t					*	eptr;
67	uint8_t					*	ebuf;
68	TCPSocket				*	nextDispatchable;
69	mDNS					*	m;
70};
71
72
73struct UDPSocket_struct
74{
75	mDNSIPPort						port; 			// MUST BE FIRST FIELD -- mDNSCoreReceive expects every UDPSocket_struct to begin with mDNSIPPort port
76	mDNSAddr						addr;			// This is initialized by our code. If we don't get the
77													// dstAddr from WSARecvMsg we use this value instead.
78	SOCKET							fd;
79	LPFN_WSARECVMSG					recvMsgPtr;
80	Overlapped						overlapped;
81	WSAMSG							wmsg;
82	DNSMessage						packet;
83	uint8_t							controlBuffer[ 128 ];
84	struct sockaddr_storage			srcAddr;		// This is filled in by the WSARecv* function
85	INT								srcAddrLen;		// See above
86	struct mDNSInterfaceData	*	ifd;
87	UDPSocket					*	nextDispatchable;
88	UDPSocket					*	next;
89	mDNS						*	m;
90};
91
92
93//---------------------------------------------------------------------------------------------------------------------------
94/*!	@struct		mDNSInterfaceData
95
96	@abstract	Structure containing interface-specific data.
97*/
98
99typedef struct	mDNSInterfaceData	mDNSInterfaceData;
100struct	mDNSInterfaceData
101{
102	char						name[ 128 ];
103	uint32_t					index;
104	uint32_t					scopeID;
105	struct UDPSocket_struct		sock;
106	NetworkInterfaceInfo		interfaceInfo;
107	mDNSBool					hostRegistered;
108	mDNSInterfaceData		*	next;
109};
110
111
112//---------------------------------------------------------------------------------------------------------------------------
113/*!	@typedef	RegisterWaitableEventHandler
114*/
115typedef void		(*RegisterWaitableEventHandler)(mDNS * const inMDNS, HANDLE event, void * context );
116
117//---------------------------------------------------------------------------------------------------------------------------
118/*!	@typedef	RegisterWaitableEventFunc
119*/
120typedef mStatus		(*RegisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event, void * context, RegisterWaitableEventHandler handler );
121
122//---------------------------------------------------------------------------------------------------------------------------
123/*!	@typedef	UnregisterWaitableEventHandler
124*/
125typedef void		(*UnregisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event );
126
127//---------------------------------------------------------------------------------------------------------------------------
128/*!	@typedef	ReportStatusFunc
129*/
130typedef void		(*ReportStatusFunc)(int inType, const char *inFormat, ...);
131
132
133//---------------------------------------------------------------------------------------------------------------------------
134/*!	@struct		mDNS_PlatformSupport_struct
135
136	@abstract	Structure containing platform-specific data.
137*/
138
139struct	mDNS_PlatformSupport_struct
140{
141	HANDLE						mainThread;
142	HANDLE						checkFileSharesTimer;
143	mDNSs32						checkFileSharesTimeout;
144	RegisterWaitableEventFunc	registerWaitableEventFunc;
145	UnregisterWaitableEventFunc	unregisterWaitableEventFunc;
146	ReportStatusFunc			reportStatusFunc;
147	time_t						nextDHCPLeaseExpires;
148	char						nbname[ 32 ];
149	char						nbdomain[ 32 ];
150	mDNSBool					smbFileSharing;
151	mDNSBool					smbPrintSharing;
152	ServiceRecordSet			smbSRS;
153	AuthRecord					smbSubTypes[ 2 ];
154	mDNSBool					registeredLoopback4;
155	int							interfaceCount;
156	mDNSInterfaceData *			interfaceList;
157	mDNSInterfaceData *			inactiveInterfaceList;
158	struct UDPSocket_struct		unicastSock4;
159	struct UDPSocket_struct		unicastSock6;
160};
161
162//---------------------------------------------------------------------------------------------------------------------------
163/*!	@struct		ifaddrs
164
165	@abstract	Interface information
166*/
167
168struct ifaddrs
169{
170	struct ifaddrs *	ifa_next;
171	char *				ifa_name;
172	u_int				ifa_flags;
173	struct sockaddr	*	ifa_addr;
174	struct sockaddr	*	ifa_netmask;
175	struct sockaddr	*	ifa_broadaddr;
176	struct sockaddr	*	ifa_dstaddr;
177	BYTE				ifa_physaddr[6];
178	BOOL				ifa_dhcpEnabled;
179	time_t				ifa_dhcpLeaseExpires;
180	mDNSu8				ifa_womp;
181	void *				ifa_data;
182
183	struct
184	{
185		uint32_t		index;
186
187	}	ifa_extra;
188};
189
190
191extern void		InterfaceListDidChange( mDNS * const inMDNS );
192extern void		ComputerDescriptionDidChange( mDNS * const inMDNS );
193extern void		TCPIPConfigDidChange( mDNS * const inMDNS );
194extern void		DynDNSConfigDidChange( mDNS * const inMDNS );
195extern void		FileSharingDidChange( mDNS * const inMDNS );
196extern void		FirewallDidChange( mDNS * const inMDNS );
197extern mStatus  TCPAddSocket( mDNS * const inMDNS, TCPSocket *sock );
198extern mStatus	SetupInterfaceList( mDNS * const inMDNS );
199extern mStatus	TearDownInterfaceList( mDNS * const inMDNS );
200extern BOOL		IsWOMPEnabled();
201extern void     DispatchSocketEvents( mDNS * const inMDNS );
202
203
204#ifdef	__cplusplus
205	}
206#endif
207
208#endif	// __MDNS_WIN32__
209