summaryrefslogtreecommitdiffstats
path: root/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h
diff options
context:
space:
mode:
Diffstat (limited to 'mDNSResponder/mDNSMacOSX/mDNSMacOSX.h')
-rw-r--r--mDNSResponder/mDNSMacOSX/mDNSMacOSX.h295
1 files changed, 295 insertions, 0 deletions
diff --git a/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h
new file mode 100644
index 00000000..00bfb87c
--- /dev/null
+++ b/mDNSResponder/mDNSMacOSX/mDNSMacOSX.h
@@ -0,0 +1,295 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ *
+ * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __mDNSMacOSX_h
+#define __mDNSMacOSX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <SystemConfiguration/SystemConfiguration.h>
+#include <IOKit/pwr_mgt/IOPM.h>
+#include <IOKit/pwr_mgt/IOPMLib.h>
+#include <IOKit/pwr_mgt/IOPMLibPrivate.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "mDNSEmbeddedAPI.h" // for domain name structure
+
+#include <net/if.h>
+
+//#define MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+#ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+#include <dispatch/dispatch.h>
+#include <dispatch/private.h>
+#endif
+
+#if TARGET_OS_EMBEDDED
+#define NO_SECURITYFRAMEWORK 1
+#define NO_CFUSERNOTIFICATION 1
+#include <MobileGestalt.h> // for IsAppleTV()
+#include <SystemConfiguration/scprefs_observer.h> // for _scprefs_observer_watch()
+extern mDNSBool GetmDNSManagedPref(CFStringRef key);
+#endif
+
+#ifndef NO_SECURITYFRAMEWORK
+#include <Security/SecureTransport.h>
+#include <Security/Security.h>
+#endif /* NO_SECURITYFRAMEWORK */
+
+#if TARGET_OS_IPHONE
+#include "cellular_usage_policy.h"
+#endif
+
+#define kmDNSResponderServName "com.apple.mDNSResponder"
+
+enum mDNSDynamicStoreSetConfigKey
+{
+ kmDNSMulticastConfig = 1,
+ kmDNSDynamicConfig,
+ kmDNSPrivateConfig,
+ kmDNSBackToMyMacConfig,
+ kmDNSSleepProxyServersState,
+ kmDNSDebugState,
+};
+
+typedef struct NetworkInterfaceInfoOSX_struct NetworkInterfaceInfoOSX;
+
+typedef void (*KQueueEventCallback)(int fd, short filter, void *context);
+typedef struct
+{
+ KQueueEventCallback KQcallback;
+ void *KQcontext;
+ const char *KQtask; // For debugging messages
+#ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+ dispatch_source_t readSource;
+ dispatch_source_t writeSource;
+ mDNSBool fdClosed;
+#endif
+} KQueueEntry;
+
+typedef struct
+{
+ mDNSIPPort port; // MUST BE FIRST FIELD -- UDPSocket_struct begins with a KQSocketSet,
+ // and mDNSCore requires every UDPSocket_struct to begin with a mDNSIPPort port
+ mDNS *m;
+ int sktv4;
+ KQueueEntry kqsv4;
+ int sktv6;
+ KQueueEntry kqsv6;
+ int *closeFlag;
+ mDNSBool proxy;
+} KQSocketSet;
+
+struct UDPSocket_struct
+{
+ KQSocketSet ss; // First field of KQSocketSet has to be mDNSIPPort -- mDNSCore requires every UDPSocket_struct to begin with mDNSIPPort port
+};
+
+// TCP socket support
+
+typedef enum
+{
+ handshake_required,
+ handshake_in_progress,
+ handshake_completed,
+ handshake_to_be_closed
+} handshakeStatus;
+
+struct TCPSocket_struct
+{
+ TCPSocketFlags flags; // MUST BE FIRST FIELD -- mDNSCore expects every TCPSocket_struct to begin with TCPSocketFlags flags
+ TCPConnectionCallback callback;
+ int fd;
+ KQueueEntry *kqEntry;
+ KQSocketSet ss;
+#ifndef NO_SECURITYFRAMEWORK
+ SSLContextRef tlsContext;
+ pthread_t handshake_thread;
+#endif /* NO_SECURITYFRAMEWORK */
+ domainname hostname;
+ void *context;
+ mDNSBool setup;
+ mDNSBool connected;
+ handshakeStatus handshake;
+ mDNS *m; // So we can call KQueueLock from the SSLHandshake thread
+ mStatus err;
+};
+
+struct NetworkInterfaceInfoOSX_struct
+{
+ NetworkInterfaceInfo ifinfo; // MUST be the first element in this structure
+ NetworkInterfaceInfoOSX *next;
+ mDNS *m;
+ mDNSu8 Exists; // 1 = currently exists in getifaddrs list; 0 = doesn't
+ // 2 = exists, but McastTxRx state changed
+ mDNSu8 Flashing; // Set if interface appeared for less than 60 seconds and then vanished
+ mDNSu8 Occulting; // Set if interface vanished for less than 60 seconds and then came back
+ mDNSu8 D2DInterface; // IFEF_LOCALNET_PRIVATE flag indicates we should call
+ // D2D plugin for operations over this interface
+ mDNSu8 DirectLink; // IFEF_DIRECTLINK flag is set for interface
+
+ mDNSs32 AppearanceTime; // Time this interface appeared most recently in getifaddrs list
+ // i.e. the first time an interface is seen, AppearanceTime is set.
+ // If an interface goes away temporarily and then comes back then
+ // AppearanceTime is updated to the time of the most recent appearance.
+ mDNSs32 LastSeen; // If Exists==0, last time this interface appeared in getifaddrs list
+ unsigned int ifa_flags;
+ struct in_addr ifa_v4addr;
+ mDNSu32 scope_id; // interface index / IPv6 scope ID
+ mDNSEthAddr BSSID; // BSSID of 802.11 base station, if applicable
+ u_short sa_family;
+ int BPF_fd; // -1 uninitialized; -2 requested BPF; -3 failed
+ int BPF_mcfd; // Socket for our IPv6 ND group membership
+ u_int BPF_len;
+#ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+ dispatch_source_t BPF_source;
+#else
+ CFSocketRef BPF_cfs;
+ CFRunLoopSourceRef BPF_rls;
+#endif
+ NetworkInterfaceInfoOSX *Registered; // non-NULL means registered with mDNS Core
+};
+
+struct mDNS_PlatformSupport_struct
+{
+ NetworkInterfaceInfoOSX *InterfaceList;
+ KQSocketSet permanentsockets;
+ domainlabel userhostlabel; // The hostlabel as it was set in System Preferences the last time we looked
+ domainlabel usernicelabel; // The nicelabel as it was set in System Preferences the last time we looked
+ // Following four variables are used for optimization where the helper is not
+ // invoked when not needed. It records the state of what we told helper the
+ // last time we invoked mDNSPreferencesSetName
+ domainlabel prevoldhostlabel; // Previous m->p->userhostlabel
+ domainlabel prevnewhostlabel; // Previous m->hostlabel
+ domainlabel prevoldnicelabel; // Previous m->p->usernicelabel
+ domainlabel prevnewnicelabel; // Previous m->nicelabel
+ mDNSs32 NotifyUser;
+ mDNSs32 HostNameConflict; // Time we experienced conflict on our link-local host name
+ mDNSs32 NetworkChanged;
+ mDNSs32 KeyChainTimer;
+
+ CFRunLoopRef CFRunLoop;
+ SCDynamicStoreRef Store;
+ CFRunLoopSourceRef StoreRLS;
+ CFRunLoopSourceRef PMRLS;
+ int SysEventNotifier;
+ KQueueEntry SysEventKQueue;
+ IONotificationPortRef PowerPortRef;
+ io_connect_t PowerConnection;
+ io_object_t PowerNotifier;
+#ifdef kIOPMAcknowledgmentOptionSystemCapabilityRequirements
+ IOPMConnection IOPMConnection;
+#endif
+ IOPMAssertionID IOPMAssertion;
+ long SleepCookie; // Cookie we need to pass to IOAllowPowerChange()
+ long WakeAtUTC;
+ mDNSs32 RequestReSleep;
+#ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+ dispatch_source_t timer;
+ dispatch_source_t custom;
+#else
+ pthread_mutex_t BigMutex;
+#endif
+ mDNSs32 BigMutexStartTime;
+ int WakeKQueueLoopFD;
+ mDNSu8 v4answers; // non-zero if we are receiving answers
+ mDNSu8 v6answers; // for A/AAAA from external DNS servers
+ mDNSs32 DNSTrigger; // Time the DNSTrigger was given
+ uint64_t LastConfigGeneration; // DNS configuration generation number
+ UDPSocket UDPProxy;
+ TCPSocket TCPProxy;
+ ProxyCallback *UDPProxyCallback;
+ ProxyCallback *TCPProxyCallback;
+#if TARGET_OS_IPHONE
+ cellular_usage_policy_client_t handle;
+#endif
+};
+
+extern int OfferSleepProxyService;
+extern int DisableSleepProxyClient;
+extern int UseInternalSleepProxy;
+extern int OSXVers, iOSVers;
+
+extern int KQueueFD;
+
+extern void NotifyOfElusiveBug(const char *title, const char *msg); // Both strings are UTF-8 text
+extern void SetDomainSecrets(mDNS *m);
+extern void mDNSMacOSXNetworkChanged(mDNS *const m);
+extern void mDNSMacOSXSystemBuildNumber(char *HINFO_SWstring);
+extern NetworkInterfaceInfoOSX *IfindexToInterfaceInfoOSX(const mDNS *const m, mDNSInterfaceID ifindex);
+extern void mDNSUpdatePacketFilter(const ResourceRecord *const excludeRecord);
+extern void myKQSocketCallBack(int s1, short filter, void *context);
+extern void mDNSDynamicStoreSetConfig(int key, const char *subkey, CFPropertyListRef value);
+extern void UpdateDebugState(void);
+
+#ifdef MDNSRESPONDER_USES_LIB_DISPATCH_AS_PRIMARY_EVENT_LOOP_MECHANISM
+extern int KQueueSet(int fd, u_short flags, short filter, KQueueEntry *const entryRef);
+mDNSexport void TriggerEventCompletion(void);
+#else
+extern int KQueueSet(int fd, u_short flags, short filter, const KQueueEntry *const entryRef);
+#endif
+
+// When events are processed on the non-kqueue thread (i.e. CFRunLoop notifications like Sleep/Wake,
+// Interface changes, Keychain changes, etc.) they must use KQueueLock/KQueueUnlock to lock out the kqueue thread
+extern void KQueueLock(mDNS *const m);
+extern void KQueueUnlock(mDNS *const m, const char* task);
+extern void mDNSPlatformCloseFD(KQueueEntry *kq, int fd);
+extern ssize_t myrecvfrom(const int s, void *const buffer, const size_t max,
+ struct sockaddr *const from, size_t *const fromlen, mDNSAddr *dstaddr, char *ifname, mDNSu8 *ttl);
+
+extern mDNSBool DictionaryIsEnabled(CFDictionaryRef dict);
+
+extern void CUPInit(mDNS *const m);
+extern const char *DNSScopeToString(mDNSu32 scope);
+
+// If any event takes more than WatchDogReportingThreshold milliseconds to be processed, we log a warning message
+// General event categories are:
+// o Mach client request initiated / terminated
+// o UDS client request
+// o Handling UDP packets received from the network
+// o Environmental change events:
+// - network interface changes
+// - sleep/wake
+// - keychain changes
+// o Name conflict dialog dismissal
+// o Reception of Unix signal (e.g. SIGINFO)
+// o Idle task processing
+// If we find that we're getting warnings for any of these categories, and it's not evident
+// what's causing the problem, we may need to subdivide some categories into finer-grained
+// sub-categories (e.g. "Idle task processing" covers a pretty broad range of sub-tasks).
+
+extern int WatchDogReportingThreshold;
+
+struct CompileTimeAssertionChecks_mDNSMacOSX
+{
+ // Check our structures are reasonable sizes. Including overly-large buffers, or embedding
+ // other overly-large structures instead of having a pointer to them, can inadvertently
+ // cause structure sizes (and therefore memory usage) to balloon unreasonably.
+
+ // Checks commented out when sizeof(DNSQuestion) change cascaded into having to change yet another
+ // set of hardcoded size values because these structures contain one or more DNSQuestion
+ // instances.
+// char sizecheck_NetworkInterfaceInfoOSX[(sizeof(NetworkInterfaceInfoOSX) <= 7084) ? 1 : -1];
+ char sizecheck_mDNS_PlatformSupport [(sizeof(mDNS_PlatformSupport) <= 1378) ? 1 : -1];
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif