diff options
Diffstat (limited to 'mDNSResponder/mDNSMacOSX/helper-stubs.c')
-rw-r--r-- | mDNSResponder/mDNSMacOSX/helper-stubs.c | 823 |
1 files changed, 472 insertions, 351 deletions
diff --git a/mDNSResponder/mDNSMacOSX/helper-stubs.c b/mDNSResponder/mDNSMacOSX/helper-stubs.c index e08f5050..a1e804fd 100644 --- a/mDNSResponder/mDNSMacOSX/helper-stubs.c +++ b/mDNSResponder/mDNSMacOSX/helper-stubs.c @@ -23,9 +23,10 @@ #include <CoreFoundation/CoreFoundation.h> #include "mDNSDebug.h" #include "helper.h" -#include "helpermsg.h" #include <dispatch/dispatch.h> #include <arpa/inet.h> +#include <xpc/private.h> +#include <Block.h> // // Implementation Notes about the HelperQueue: @@ -40,67 +41,176 @@ // an argument to the function, the blocks can reference them as they are passed in as pointers. But care should // be taken to copy them locally as they may cease to exist when the function returns. // + + +//************************************************************************************************************* +// Globals static dispatch_queue_t HelperQueue; +static xpc_connection_t helper_xpc_conn = NULL; + +static int64_t maxwait_secs = 5LL; + +#define mDNSHELPER_DEBUG LogOperation -#define ERROR(x, y) y, -static const char *errorstring[] = +//************************************************************************************************************* +// Utility Functions + +static void LogDebug(const char *prefix, xpc_object_t o) { - #include "helper-error.h" - NULL -}; -#undef ERROR + char *desc = xpc_copy_description(o); + mDNSHELPER_DEBUG("LogDebug %s: %s", prefix, desc); + free(desc); +} -mDNSexport mStatus mDNSHelperInit() +//************************************************************************************************************* +// XPC Funcs: +//************************************************************************************************************* + + +mDNSlocal void Init_Connection(const char *servname) { - HelperQueue = dispatch_queue_create("com.apple.mDNSResponder.HelperQueue", NULL); - if (HelperQueue == NULL) + helper_xpc_conn = xpc_connection_create_mach_service(servname, HelperQueue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED); + + xpc_connection_set_event_handler(helper_xpc_conn, ^(xpc_object_t event) { - LogMsg("dispatch_queue_create: Helper queue NULL"); - return mStatus_NoMemoryErr; - } - return mStatus_NoError; + mDNSHELPER_DEBUG("Init_Connection xpc: [%s] \n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION)); + }); + + xpc_connection_resume(helper_xpc_conn); } -static mach_port_t getHelperPort(int retry) +mDNSlocal int SendDict_ToServer(xpc_object_t msg) { - static mach_port_t port = MACH_PORT_NULL; - if (retry) port = MACH_PORT_NULL; - if (port == MACH_PORT_NULL && BOOTSTRAP_SUCCESS != bootstrap_look_up(bootstrap_port, kmDNSHelperServiceName, &port)) - LogMsg("%s: cannot contact helper", __func__); - return port; + __block int errorcode = kHelperErr_NoResponse; + + LogDebug("SendDict_ToServer Sending msg to Daemon", msg); + + dispatch_semaphore_t sem = dispatch_semaphore_create(0); + dispatch_retain(sem); // for the block below + + xpc_connection_send_message_with_reply(helper_xpc_conn, msg, HelperQueue, ^(xpc_object_t recv_msg) + { + xpc_type_t type = xpc_get_type(recv_msg); + + if (type == XPC_TYPE_DICTIONARY) + { + LogDebug("SendDict_ToServer Received reply msg from Daemon", recv_msg); + uint64_t reply_status = xpc_dictionary_get_uint64(recv_msg, kHelperReplyStatus); + errorcode = xpc_dictionary_get_int64(recv_msg, kHelperErrCode); + + switch (reply_status) + { + case kHelperReply_ACK: + mDNSHELPER_DEBUG("NoError: successful reply"); + break; + default: + LogMsg("default: Unexpected reply from Helper"); + break; + } + } + else + { + LogMsg("SendDict_ToServer Received unexpected reply from daemon [%s]", + xpc_dictionary_get_string(recv_msg, XPC_ERROR_KEY_DESCRIPTION)); + LogDebug("SendDict_ToServer Unexpected Reply contents", recv_msg); + } + + dispatch_semaphore_signal(sem); + dispatch_release(sem); + + }); + + if (dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, (maxwait_secs * NSEC_PER_SEC))) != 0) + LogMsg("SendDict_ToServer: UNEXPECTED WAIT_TIME in dispatch_semaphore_wait"); + + dispatch_release(sem); + + mDNSHELPER_DEBUG("SendDict_ToServer returning with errorcode[%d]", errorcode); + + return errorcode; } -const char *mDNSHelperError(int err) +mDNSlocal xpc_object_t SendDict_GetReply(xpc_object_t msg) { - static const char *p = "<unknown error>"; - if (mDNSHelperErrorBase < err && mDNSHelperErrorEnd > err) - p = errorstring[err - mDNSHelperErrorBase - 1]; - return p; + // Create empty dictionary + __block xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + if (!dict) return NULL; + xpc_retain(dict); + + LogDebug("SendDict_GetReply Sending msg to Daemon", msg); + + dispatch_semaphore_t sem = dispatch_semaphore_create(0); + dispatch_retain(sem); // for the block below + + xpc_connection_send_message_with_reply(helper_xpc_conn, msg, HelperQueue, ^(xpc_object_t recv_msg) + { + xpc_type_t type = xpc_get_type(recv_msg); + + if (type == XPC_TYPE_DICTIONARY) + { + LogDebug("SendDict_GetReply Received reply msg from Daemon", recv_msg); + uint64_t reply_status = xpc_dictionary_get_uint64(recv_msg, kHelperReplyStatus); + + switch (reply_status) + { + case kHelperReply_ACK: + mDNSHELPER_DEBUG("NoError: successful reply"); + break; + default: + LogMsg("default: Unexpected reply from Helper"); + break; + } + // Copy result into dict reply + xpc_dictionary_apply(recv_msg, ^bool(const char *key, xpc_object_t value) + { + xpc_dictionary_set_value(dict, key, value); + return true; + }); + } + else + { + LogMsg("SendDict_GetReply Received unexpected reply from daemon [%s]", + xpc_dictionary_get_string(recv_msg, XPC_ERROR_KEY_DESCRIPTION)); + LogDebug("SendDict_GetReply Unexpected Reply contents", recv_msg); + } + + dispatch_semaphore_signal(sem); + dispatch_release(sem); + xpc_release(dict); + + }); + + if (dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, (maxwait_secs * NSEC_PER_SEC))) != 0) + { + LogMsg("SendDict_GetReply: UNEXPECTED WAIT_TIME in dispatch_semaphore_wait"); + xpc_release(dict); + dispatch_release(sem); + + return NULL; + } + + dispatch_release(sem); + + return dict; } -/* Ugly but handy. */ -// We don't bother reporting kIOReturnNotReady because that error code occurs in "normal" operation -// and doesn't indicate anything unexpected that needs to be investigated +//************************************************************************************************************** -#define MACHRETRYLOOP_BEGIN(kr, retry, err, fin) \ - for (;;) \ +mDNSexport mStatus mDNSHelperInit() +{ + HelperQueue = dispatch_queue_create("com.apple.mDNSResponder.HelperQueue", NULL); + if (HelperQueue == NULL) { -#define MACHRETRYLOOP_END(kr, retry, err, fin) \ - if (KERN_SUCCESS == (kr)) break; \ - else if (MACH_SEND_INVALID_DEST == (kr) && 0 == (retry)++) continue; \ - else \ - { \ - (err) = kmDNSHelperCommunicationFailed; \ - LogMsg("%s: Mach communication failed: %d %X %s", __func__, kr, kr, mach_error_string(kr)); \ - goto fin; \ - } \ - } \ - if (0 != (err) && kIOReturnNotReady != (err)) \ - { LogMsg("%s: %d 0x%X (%s)", __func__, (err), (err), mDNSHelperError(err)); goto fin; } + LogMsg("dispatch_queue_create: Helper queue NULL"); + return mStatus_NoMemoryErr; + } + return mStatus_NoError; +} void mDNSPreferencesSetName(int key, domainlabel *old, domainlabel *new) { - struct { + struct + { char oldname[MAX_DOMAIN_LABEL+1]; char newname[MAX_DOMAIN_LABEL+1]; } names; @@ -109,250 +219,272 @@ void mDNSPreferencesSetName(int key, domainlabel *old, domainlabel *new) mDNSPlatformMemZero(names.newname, MAX_DOMAIN_LABEL + 1); ConvertDomainLabelToCString_unescaped(old, names.oldname); - if (new) ConvertDomainLabelToCString_unescaped(new, names.newname); - dispatch_async(HelperQueue, ^{ - - kern_return_t kr = KERN_FAILURE; - int retry = 0; - int err = 0; - - LogInfo("%s: oldname %s newname %s", __func__, names.oldname, names.newname); - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSPreferencesSetName(getHelperPort(retry), key, names.oldname, names.newname); - MACHRETRYLOOP_END(kr, retry, err, fin); - -fin: - (void)err; - }); + + if (new) + ConvertDomainLabelToCString_unescaped(new, names.newname); + + + mDNSHELPER_DEBUG("mDNSPreferencesSetName: XPC IPC Test oldname %s newname %s", names.oldname, names.newname); + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, set_name); + + xpc_dictionary_set_uint64(dict, kPrefsNameKey, key); + xpc_dictionary_set_string(dict, kPrefsOldName, names.oldname); + xpc_dictionary_set_string(dict, kPrefsNewName, names.newname); + + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + } -void mDNSRequestBPF(void) +void mDNSRequestBPF() { - dispatch_async(HelperQueue, ^{ - - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - LogInfo("%s: BPF", __func__); - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSRequestBPF(getHelperPort(retry)); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - (void)err; - }); + mDNSHELPER_DEBUG("mDNSRequestBPF: Using XPC IPC"); + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, bpf_request); + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + } int mDNSPowerRequest(int key, int interval) { - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSPowerRequest(getHelperPort(retry), key, interval, &err); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - return err; + int err_code = kHelperErr_NotConnected; + + mDNSHELPER_DEBUG("mDNSPowerRequest: Using XPC IPC calling out to Helper key is [%d] interval is [%d]", key, interval); + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, power_req); + xpc_dictionary_set_uint64(dict, "powerreq_key", key); + xpc_dictionary_set_uint64(dict, "powerreq_interval", interval); + + err_code = SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + + mDNSHELPER_DEBUG("mDNSPowerRequest: Using XPC IPC returning error_code %d", err_code); + return err_code; } int mDNSSetLocalAddressCacheEntry(int ifindex, int family, const v6addr_t ip, const ethaddr_t eth) { - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSSetLocalAddressCacheEntry(getHelperPort(retry), ifindex, family, (uint8_t*)ip, (uint8_t*)eth, &err); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - return err; + int err_code = kHelperErr_NotConnected; + + mDNSHELPER_DEBUG("mDNSSetLocalAddressCacheEntry: Using XPC IPC calling out to Helper: ifindex is [%d] family is [%d]", ifindex, family); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, set_localaddr_cacheentry); + + xpc_dictionary_set_uint64(dict, "slace_ifindex", ifindex); + xpc_dictionary_set_uint64(dict, "slace_family", family); + + xpc_dictionary_set_data(dict, "slace_ip", (uint8_t*)ip, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "slace_eth", (uint8_t*)eth, sizeof(ethaddr_t)); + + err_code = SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + + mDNSHELPER_DEBUG("mDNSSetLocalAddressCacheEntry: Using XPC IPC returning error_code %d", err_code); + return err_code; } + void mDNSNotify(const char *title, const char *msg) // Both strings are UTF-8 text { - char *titleCopy = NULL; - char *msgCopy = NULL; - - if (title) - { - // Don’t try to call mDNSPlatformMem* routines here, because they call validatelists, - // which calls back into mDNSNotify, resulting an infinite loop until stack space is exhausted - int len = strlen(title); - titleCopy = malloc(len + 1); - if (!titleCopy) - { - LogMsg("mDNSNotify: titleCopy NULL for %s", msg); - return; - } - memcpy(titleCopy, title, len); - titleCopy[len] = 0; - } - if (msg) - { - int len = strlen(msg); - msgCopy = malloc(len + 1); - if (!msgCopy) - { - LogMsg("mDNSNotify: msgCopy NULL for %s", msg); - return; - } - memcpy(msgCopy, msg, len); - msgCopy[len] = 0; - } - - dispatch_async(HelperQueue, ^{ - - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - - LogInfo("%s: title %s, msg %s", __func__, titleCopy, msgCopy); + mDNSHELPER_DEBUG("mDNSNotify() calling out to Helper XPC IPC title[%s] msg[%s]", title, msg); - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSNotify(getHelperPort(retry), titleCopy, msgCopy); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - // Don’t try to call mDNSPlatformMem* routines here, because they call validatelists, - // which calls back into mDNSNotify, resulting an infinite loop until stack space is exhausted - free(titleCopy); - free(msgCopy); - (void)err; - }); + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, user_notify); + + xpc_dictionary_set_string(dict, "notify_title", title); + xpc_dictionary_set_string(dict, "notify_msg", msg); + + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + } + int mDNSKeychainGetSecrets(CFArrayRef *result) { + CFPropertyListRef plist = NULL; CFDataRef bytes = NULL; - kern_return_t kr = KERN_FAILURE; unsigned int numsecrets = 0; - vm_offset_t secrets = 0; - mach_msg_type_number_t secretsCnt = 0; - int retry = 0, err = 0; - - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSKeychainGetSecrets(getHelperPort(retry), &numsecrets, &secrets, &secretsCnt, &err); - MACHRETRYLOOP_END(kr, retry, err, fin); + unsigned int secretsCnt = 0; + int error_code = kHelperErr_NotConnected; + xpc_object_t reply_dict = NULL; + const void *sec = NULL; + size_t secrets_size = 0; + + mDNSHELPER_DEBUG("mDNSKeychainGetSecrets: Using XPC IPC calling out to Helper"); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, keychain_getsecrets); - if (NULL == (bytes = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (void*)secrets, secretsCnt, kCFAllocatorNull))) + reply_dict = SendDict_GetReply(dict); + + if (reply_dict != NULL) { - err = kmDNSHelperCreationFailed; - LogMsg("%s: CFDataCreateWithBytesNoCopy failed", __func__); + numsecrets = xpc_dictionary_get_uint64(reply_dict, "keychain_num_secrets"); + sec = xpc_dictionary_get_data(reply_dict, "keychain_secrets", &secrets_size); + secretsCnt = xpc_dictionary_get_uint64(reply_dict, "keychain_secrets_count"); + error_code = xpc_dictionary_get_int64(reply_dict, kHelperErrCode); + } + + mDNSHELPER_DEBUG("mDNSKeychainGetSecrets: Using XPC IPC calling out to Helper: numsecrets is %d, secretsCnt is %d error_code is %d secret_size is %d", + numsecrets, secretsCnt, error_code, secrets_size); + + if (NULL == (bytes = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (void*)sec, secretsCnt, kCFAllocatorNull))) + { + error_code = kHelperErr_ApiErr; + LogMsg("mDNSKeychainGetSecrets: CFDataCreateWithBytesNoCopy failed"); goto fin; } + if (NULL == (plist = CFPropertyListCreateWithData(kCFAllocatorDefault, bytes, kCFPropertyListImmutable, NULL, NULL))) { - err = kmDNSHelperInvalidPList; - LogMsg("%s: CFPropertyListCreateFromXMLData failed", __func__); + error_code = kHelperErr_ApiErr; + LogMsg("mDNSKeychainGetSecrets: CFPropertyListCreateFromXMLData failed"); goto fin; } + if (CFArrayGetTypeID() != CFGetTypeID(plist)) { - err = kmDNSHelperTypeError; - LogMsg("%s: Unexpected result type", __func__); + error_code = kHelperErr_ApiErr; + LogMsg("mDNSKeychainGetSecrets: Unexpected result type"); CFRelease(plist); plist = NULL; goto fin; } + *result = (CFArrayRef)plist; - + + fin: - if (bytes) CFRelease(bytes); - if (secrets) vm_deallocate(mach_task_self(), secrets, secretsCnt); - return err; + if (bytes) + CFRelease(bytes); + if (dict) + xpc_release(dict); + if (reply_dict) + xpc_release(reply_dict); + + dict = NULL; + reply_dict = NULL; + + return error_code; } -void mDNSConfigureServer(int updown, const char *const prefix, const domainname *const fqdn) -{ - struct - { - // Assume the prefix is no larger than 10 chars - char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10]; - } name; - - mDNSPlatformMemZero(name.fqdnStr, MAX_DOMAIN_LABEL + 10); - - if (fqdn) - { - mDNSPlatformStrCopy(name.fqdnStr, prefix); - ConvertDomainNameToCString(fqdn, name.fqdnStr + mDNSPlatformStrLen(prefix)); - } - - dispatch_async(HelperQueue, ^{ - - kern_return_t kr = KERN_SUCCESS; - int retry = 0, err = 0; - - LogInfo("%s: fqdnStr %s", __func__, name.fqdnStr); - - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSConfigureServer(getHelperPort(retry), updown, name.fqdnStr); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - (void)err; - - }); -} int mDNSAutoTunnelSetKeys(int replacedelete, v6addr_t local_inner, v6addr_t local_outer, short local_port, v6addr_t remote_inner, v6addr_t remote_outer, short remote_port, const char* const prefix, const domainname *const fqdn) { - kern_return_t kr = KERN_SUCCESS; - int retry = 0, err = 0; + + int err_code = kHelperErr_NotConnected; + + mDNSHELPER_DEBUG("mDNSAutoTunnelSetKeys: Using XPC IPC calling out to Helper. Parameters are repdel[%d], lport[%d], rport[%d], prefix[%s], fqdn[%##s]", + replacedelete, local_port, remote_port, prefix, fqdn->c); + + + char buf1[INET6_ADDRSTRLEN]; + char buf2[INET6_ADDRSTRLEN]; + char buf3[INET6_ADDRSTRLEN]; + char buf4[INET6_ADDRSTRLEN]; + + buf1[0] = 0; + buf2[0] = 0; + buf3[0] = 0; + buf4[0] = 0; + + inet_ntop(AF_INET6, local_inner, buf1, sizeof(buf1)); + inet_ntop(AF_INET6, local_outer, buf2, sizeof(buf2)); + inet_ntop(AF_INET6, remote_inner, buf3, sizeof(buf3)); + inet_ntop(AF_INET6, remote_outer, buf4, sizeof(buf4)); + char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10] = { 0 }; // Assume the prefix is no larger than 10 chars if (fqdn) { mDNSPlatformStrCopy(fqdnStr, prefix); ConvertDomainNameToCString(fqdn, fqdnStr + mDNSPlatformStrLen(prefix)); } - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSAutoTunnelSetKeys(getHelperPort(retry), replacedelete, local_inner, local_outer, local_port, remote_inner, remote_outer, remote_port, fqdnStr, &err); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - return err; -} + + mDNSHELPER_DEBUG("mDNSAutoTunnelSetKeys: Using XPC IPC calling out to Helper: Parameters are local_inner is %s, local_outeris %s, remote_inner is %s, remote_outer is %s", + buf1, buf2, buf3, buf4); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, autotunnel_setkeys); + + xpc_dictionary_set_data(dict, "autotunnelsetkeys_localinner", (uint8_t*)local_inner, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "autotunnelsetkeys_localouter", (uint8_t*)local_outer, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "autotunnelsetkeys_remoteinner", (uint8_t*)remote_inner, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "autotunnelsetkeys_remoteouter", (uint8_t*)remote_outer, sizeof(v6addr_t)); + + xpc_dictionary_set_uint64(dict, "autotunnelsetkeys_lport", local_port); + xpc_dictionary_set_uint64(dict, "autotunnelsetkeys_rport", remote_port); + xpc_dictionary_set_uint64(dict, "autotunnelsetkeys_repdel", replacedelete); -void mDNSSendWakeupPacket(unsigned ifid, char *eth_addr, char *ip_addr, int iteration) -{ - char *ip_addr_copy = NULL; - char *eth_addr_copy = NULL; + // xpc_dictionary_set_string(dict, "autotunnelsetkeys_prefix", prefix); + xpc_dictionary_set_string(dict, "autotunnelsetkeys_fqdnStr", fqdnStr); + + err_code = SendDict_ToServer(dict); + + xpc_release(dict); + dict = NULL; - if (eth_addr) - { - int len = strlen(eth_addr); - eth_addr_copy = mDNSPlatformMemAllocate(len + 1); - if (!eth_addr_copy) - { - LogMsg("mDNSSendWakeupPacket: eth_addr_copy NULL for %s", eth_addr); - return; - } - mDNSPlatformMemCopy(eth_addr_copy, eth_addr, len); - eth_addr_copy[len] = 0; - } - if (ip_addr) - { - int len = strlen(ip_addr); - ip_addr_copy = mDNSPlatformMemAllocate(len + 1); - if (!ip_addr_copy) - { - LogMsg("mDNSSendWakeupPacket: ip_addr_copy NULL for %s", ip_addr); - return; - } - mDNSPlatformMemCopy(ip_addr_copy, ip_addr, len); - ip_addr_copy[len] = 0; - } - dispatch_async(HelperQueue, ^{ + mDNSHELPER_DEBUG("mDNSAutoTunnelSetKeys: Using XPC IPC returning error_code %d", err_code); + + mDNSHELPER_DEBUG("mDNSAutoTunnelSetKeys: this should NOT be done in mDNSResponder/Helper. For future we shall be using <rdar://problem/13792729>"); + return err_code; +} - kern_return_t kr = KERN_SUCCESS; - int retry = 0, err = 0; +void mDNSSendWakeupPacket(unsigned int ifid, char *eth_addr, char *ip_addr, int iteration) +{ + // (void) ip_addr; // unused + // (void) iteration; // unused - LogInfo("%s: Entered ethernet address %s, ip address %s", __func__, eth_addr_copy, ip_addr_copy); + mDNSHELPER_DEBUG("mDNSSendWakeupPacket: Entered ethernet address[%s],ip_address[%s], interface_id[%d], iteration[%d]", + eth_addr, ip_addr, ifid, iteration); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, send_wakepkt); + + xpc_dictionary_set_uint64(dict, "interface_index", ifid); + xpc_dictionary_set_string(dict, "ethernet_address", eth_addr); + xpc_dictionary_set_string(dict, "ip_address", ip_addr); + xpc_dictionary_set_uint64(dict, "swp_iteration", iteration); + + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSSendWakeupPacket(getHelperPort(retry), ifid, eth_addr_copy, ip_addr_copy, iteration); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - if (eth_addr_copy) - mDNSPlatformMemFree(eth_addr_copy); - if (ip_addr_copy) - mDNSPlatformMemFree(ip_addr_copy); - (void) err; - }); } void mDNSPacketFilterControl(uint32_t command, char * ifname, uint32_t count, pfArray_t portArray, pfArray_t protocolArray) @@ -362,138 +494,127 @@ void mDNSPacketFilterControl(uint32_t command, char * ifname, uint32_t count, pf pfArray_t portArray; pfArray_t protocolArray; } pfa; - char *ifnameCopy = NULL; mDNSPlatformMemCopy(pfa.portArray, portArray, sizeof(pfArray_t)); mDNSPlatformMemCopy(pfa.protocolArray, protocolArray, sizeof(pfArray_t)); - if (ifname) - { - int len = strlen(ifname); - ifnameCopy = mDNSPlatformMemAllocate(len + 1); - if (!ifnameCopy) - { - LogMsg("mDNSPacketFilterControl: ifnameCopy NULL"); - return; - } - mDNSPlatformMemCopy(ifnameCopy, ifname, len); - ifnameCopy[len] = 0; - } - dispatch_async(HelperQueue, ^{ - kern_return_t kr = KERN_SUCCESS; - int retry = 0, err = 0; - - LogInfo("%s, ifname %s", __func__, ifnameCopy); + mDNSHELPER_DEBUG("mDNSPacketFilterControl: XPC IPC, ifname %s", ifname); + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, p2p_packetfilter); + + xpc_dictionary_set_uint64(dict, "pf_opcode", command); + if (ifname) + xpc_dictionary_set_string(dict, "pf_ifname", ifname); + xpc_dictionary_set_uint64(dict, "pf_count", count); - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSPacketFilterControl(getHelperPort(retry), command, ifnameCopy, count, (uint16_t *)pfa.portArray, (uint16_t *)pfa.protocolArray); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - if (ifnameCopy) - mDNSPlatformMemFree(ifnameCopy); - (void) err; - }); + xpc_dictionary_set_uint64(dict, "pf_port0", pfa.portArray[0]); + xpc_dictionary_set_uint64(dict, "pf_port1", pfa.portArray[1]); + xpc_dictionary_set_uint64(dict, "pf_port2", pfa.portArray[2]); + xpc_dictionary_set_uint64(dict, "pf_port3", pfa.portArray[3]); + + xpc_dictionary_set_uint64(dict, "pf_protocol0", pfa.protocolArray[0]); + xpc_dictionary_set_uint64(dict, "pf_protocol1", pfa.protocolArray[1]); + xpc_dictionary_set_uint64(dict, "pf_protocol2", pfa.protocolArray[2]); + xpc_dictionary_set_uint64(dict, "pf_protocol3", pfa.protocolArray[3]); + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + + mDNSHELPER_DEBUG("mDNSPacketFilterControl: portArray0[%d] portArray1[%d] portArray2[%d] portArray3[%d] protocolArray0[%d] protocolArray1[%d] protocolArray2[%d] protocolArray3[%d]", + pfa.portArray[0], pfa.portArray[1], pfa.portArray[2], pfa.portArray[3], pfa.protocolArray[0], pfa.protocolArray[1], pfa.protocolArray[2], pfa.protocolArray[3]); + } -void mDNSSendKeepalive(v6addr_t sadd, v6addr_t dadd, uint16_t lport, uint16_t rport, unsigned seq, unsigned ack, uint16_t win) +void mDNSSendKeepalive(const v6addr_t sadd, const v6addr_t dadd, uint16_t lport, uint16_t rport, uint32_t seq, uint32_t ack, uint16_t win) { - struct - { - v6addr_t sadd; - v6addr_t dadd; - } addr; - - mDNSPlatformMemCopy(addr.sadd, sadd, sizeof(v6addr_t)); - mDNSPlatformMemCopy(addr.dadd, dadd, sizeof(v6addr_t)); - - dispatch_async(HelperQueue, ^{ - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - char buf1[INET6_ADDRSTRLEN]; - char buf2[INET6_ADDRSTRLEN]; - - buf1[0] = 0; - buf2[0] = 0; - - inet_ntop(AF_INET6, addr.sadd, buf1, sizeof(buf1)); - inet_ntop(AF_INET6, addr.dadd, buf2, sizeof(buf2)); - LogInfo("%s: sadd is %s, dadd is %s", __func__, buf1, buf2); - - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSSendKeepalive(getHelperPort(retry), (uint8_t *)addr.sadd, (uint8_t *)addr.dadd, lport, rport, seq, ack, win); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - (void) err; - }); + mDNSHELPER_DEBUG("mDNSSendKeepalive: Using XPC IPC calling out to Helper: lport is[%d] rport is[%d] seq is[%d] ack is[%d] win is[%d]", + lport, rport, seq, ack, win); + + char buf1[INET6_ADDRSTRLEN]; + char buf2[INET6_ADDRSTRLEN]; + + buf1[0] = 0; + buf2[0] = 0; + + inet_ntop(AF_INET6, sadd, buf1, sizeof(buf1)); + inet_ntop(AF_INET6, dadd, buf2, sizeof(buf2)); + mDNSHELPER_DEBUG("mDNSSendKeepalive: Using XPC IPC calling out to Helper: sadd is %s, dadd is %s", buf1, buf2); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, send_keepalive); + + xpc_dictionary_set_data(dict, "send_keepalive_sadd", (uint8_t*)sadd, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "send_keepalive_dadd", (uint8_t*)dadd, sizeof(v6addr_t)); + + xpc_dictionary_set_uint64(dict, "send_keepalive_lport", lport); + xpc_dictionary_set_uint64(dict, "send_keepalive_rport", rport); + xpc_dictionary_set_uint64(dict, "send_keepalive_seq", seq); + xpc_dictionary_set_uint64(dict, "send_keepalive_ack", ack); + xpc_dictionary_set_uint64(dict, "send_keepalive_win", win); + + SendDict_ToServer(dict); + xpc_release(dict); + dict = NULL; + } int mDNSRetrieveTCPInfo(int family, v6addr_t laddr, uint16_t lport, v6addr_t raddr, uint16_t rport, uint32_t *seq, uint32_t *ack, uint16_t *win, int32_t *intfid) { - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSRetrieveTCPInfo(getHelperPort(retry), family, (uint8_t *)laddr, lport, (uint8_t *)raddr, rport, seq, ack, win, intfid); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - return err; -} - -void mDNSGetRemoteMAC(mDNS *const m, int family, v6addr_t raddr) -{ - struct { - v6addr_t addr; - } dst; - - mDNSPlatformMemCopy(dst.addr, raddr, sizeof(v6addr_t)); - dispatch_async(HelperQueue, ^{ - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - ethaddr_t eth; - IPAddressMACMapping *addrMapping; - - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSGetRemoteMAC(getHelperPort(retry), family, (uint8_t *)dst.addr, eth); - MACHRETRYLOOP_END(kr, retry, err, fin); - // If the call to get the remote MAC address succeeds, allocate and copy - // the values and schedule a task to update the MAC address in the TCP Keepalive record. - if (kr == KERN_SUCCESS) - { - addrMapping = mDNSPlatformMemAllocate(sizeof(IPAddressMACMapping)); - snprintf(addrMapping->ethaddr, sizeof(addrMapping->ethaddr), "%02x:%02x:%02x:%02x:%02x:%02x", - eth[0], eth[1], eth[2], eth[3], eth[4], eth[5]); - if (family == AF_INET) - { - addrMapping->ipaddr.type = mDNSAddrType_IPv4; - mDNSPlatformMemCopy(addrMapping->ipaddr.ip.v4.b, dst.addr, sizeof(v6addr_t)); - } - else - { - addrMapping->ipaddr.type = mDNSAddrType_IPv6; - mDNSPlatformMemCopy(addrMapping->ipaddr.ip.v6.b, dst.addr, sizeof(v6addr_t)); - } - mDNSPlatformDispatchAsync(m, addrMapping, UpdateRMACCallback); - } -fin: - (void) err; - }); - -} - -void mDNSStoreSPSMACAddress(int family, v6addr_t spsaddr, char *ifname) -{ - struct { - v6addr_t saddr; - } addr; - mDNSPlatformMemCopy(addr.saddr, spsaddr, sizeof(v6addr_t)); - - dispatch_async(HelperQueue, ^{ - kern_return_t kr = KERN_FAILURE; - int retry = 0, err = 0; - MACHRETRYLOOP_BEGIN(kr, retry, err, fin); - kr = proxy_mDNSStoreSPSMACAddress(getHelperPort(retry), family, (uint8_t *)addr.saddr, ifname); - MACHRETRYLOOP_END(kr, retry, err, fin); -fin: - (void)err; - }); + int error_code = kHelperErr_NotConnected; + xpc_object_t reply_dict = NULL; + + mDNSHELPER_DEBUG("mDNSRetrieveTCPInfo: Using XPC IPC calling out to Helper: lport is[%d] rport is[%d] family is[%d]", + lport, rport, family); + + char buf1[INET6_ADDRSTRLEN]; + char buf2[INET6_ADDRSTRLEN]; + buf1[0] = 0; + buf2[0] = 0; + + inet_ntop(AF_INET6, laddr, buf1, sizeof(buf1)); + inet_ntop(AF_INET6, raddr, buf2, sizeof(buf2)); + mDNSHELPER_DEBUG("mDNSRetrieveTCPInfo:: Using XPC IPC calling out to Helper: laddr is %s, raddr is %s", buf1, buf2); + + Init_Connection(kHelperService); + + // Create Dictionary To Send + xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_uint64(dict, kHelperMode, retreive_tcpinfo); + + xpc_dictionary_set_data(dict, "retreive_tcpinfo_laddr", (uint8_t*)laddr, sizeof(v6addr_t)); + xpc_dictionary_set_data(dict, "retreive_tcpinfo_raddr", (uint8_t*)raddr, sizeof(v6addr_t)); + + xpc_dictionary_set_uint64(dict, "retreive_tcpinfo_family", family); + xpc_dictionary_set_uint64(dict, "retreive_tcpinfo_lport", lport); + xpc_dictionary_set_uint64(dict, "retreive_tcpinfo_rport", rport); + + reply_dict = SendDict_GetReply(dict); + + if (reply_dict != NULL) + { + *seq = xpc_dictionary_get_uint64(reply_dict, "retreive_tcpinfo_seq"); + *ack = xpc_dictionary_get_uint64(reply_dict, "retreive_tcpinfo_ack"); + *win = xpc_dictionary_get_uint64(reply_dict, "retreive_tcpinfo_win"); + *intfid = (int32_t)xpc_dictionary_get_uint64(reply_dict, "retreive_tcpinfo_ifid"); + error_code = xpc_dictionary_get_int64(reply_dict, kHelperErrCode); + } + + mDNSHELPER_DEBUG("mDNSRetrieveTCPInfo: Using XPC IPC calling out to Helper: seq is %d, ack is %d, win is %d, intfid is %d, error is %d", + *seq, *ack, *win, *intfid, error_code); + + if (dict) + xpc_release(dict); + if (reply_dict) + xpc_release(reply_dict); + dict = NULL; + reply_dict = NULL; + + return error_code; } |