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 
35 typedef 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 
49 typedef void ( *TCPReadEventHandler )( TCPSocket * sock );
50 typedef void ( *TCPUserCallback )();
51 
52 struct 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 
73 struct 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 
99 typedef struct	mDNSInterfaceData	mDNSInterfaceData;
100 struct	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 */
115 typedef void		(*RegisterWaitableEventHandler)(mDNS * const inMDNS, HANDLE event, void * context );
116 
117 //---------------------------------------------------------------------------------------------------------------------------
118 /*!	@typedef	RegisterWaitableEventFunc
119 */
120 typedef mStatus		(*RegisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event, void * context, RegisterWaitableEventHandler handler );
121 
122 //---------------------------------------------------------------------------------------------------------------------------
123 /*!	@typedef	UnregisterWaitableEventHandler
124 */
125 typedef void		(*UnregisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event );
126 
127 //---------------------------------------------------------------------------------------------------------------------------
128 /*!	@typedef	ReportStatusFunc
129 */
130 typedef 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 
139 struct	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 
168 struct 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 
191 extern void		InterfaceListDidChange( mDNS * const inMDNS );
192 extern void		ComputerDescriptionDidChange( mDNS * const inMDNS );
193 extern void		TCPIPConfigDidChange( mDNS * const inMDNS );
194 extern void		DynDNSConfigDidChange( mDNS * const inMDNS );
195 extern void		FileSharingDidChange( mDNS * const inMDNS );
196 extern void		FirewallDidChange( mDNS * const inMDNS );
197 extern mStatus  TCPAddSocket( mDNS * const inMDNS, TCPSocket *sock );
198 extern mStatus	SetupInterfaceList( mDNS * const inMDNS );
199 extern mStatus	TearDownInterfaceList( mDNS * const inMDNS );
200 extern BOOL		IsWOMPEnabled();
201 extern void     DispatchSocketEvents( mDNS * const inMDNS );
202 
203 
204 #ifdef	__cplusplus
205 	}
206 #endif
207 
208 #endif	// __MDNS_WIN32__
209