From 07a9401d84804d7f0181aa4fb0f13a54b2a1c9a8 Mon Sep 17 00:00:00 2001 From: Nate Karstens Date: Tue, 1 Aug 2017 17:06:01 -0500 Subject: [PATCH 07/11] Indicate loopback interface to mDNS core Tells the mDNS core if an interface is a loopback interface, similar to AddInterfaceToList() in the MacOS implementation. Also reorganizes SetupOneInterface() to use a const struct rather than growing its parameter list again. Upstream-Status: Submitted [dts@apple.com] Signed-off-by: Nate Karstens --- mDNSPosix/mDNSPosix.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c index 3fc5451..798ab10 100644 --- a/mDNSPosix/mDNSPosix.c +++ b/mDNSPosix/mDNSPosix.c @@ -889,16 +889,14 @@ mDNSlocal void CleanRecentInterfaces(void) // Creates a PosixNetworkInterface for the interface whose IP address is // intfAddr and whose name is intfName and registers it with mDNS core. -mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct sockaddr *intfMask, const char *intfName, int intfIndex) +mDNSlocal int SetupOneInterface(mDNS *const m, struct ifi_info *const ifi) { int err = 0; PosixNetworkInterface *intf; PosixNetworkInterface *alias = NULL; assert(m != NULL); - assert(intfAddr != NULL); - assert(intfName != NULL); - assert(intfMask != NULL); + assert(ifi != NULL); // Allocate the interface structure itself. intf = (PosixNetworkInterface*)calloc(1, sizeof(*intf)); @@ -907,26 +905,27 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct // And make a copy of the intfName. if (err == 0) { - intf->intfName = strdup(intfName); + intf->intfName = strdup(ifi->ifi_name); if (intf->intfName == NULL) { assert(0); err = ENOMEM; } } if (err == 0) { // Set up the fields required by the mDNS core. - SockAddrTomDNSAddr(intfAddr, &intf->coreIntf.ip, NULL); - SockAddrTomDNSAddr(intfMask, &intf->coreIntf.mask, NULL); + SockAddrTomDNSAddr(ifi->ifi_addr, &intf->coreIntf.ip, NULL); + SockAddrTomDNSAddr(ifi->ifi_netmask, &intf->coreIntf.mask, NULL); //LogMsg("SetupOneInterface: %#a %#a", &intf->coreIntf.ip, &intf->coreIntf.mask); - strncpy(intf->coreIntf.ifname, intfName, sizeof(intf->coreIntf.ifname)); + strncpy(intf->coreIntf.ifname, ifi->ifi_name, sizeof(intf->coreIntf.ifname)); intf->coreIntf.ifname[sizeof(intf->coreIntf.ifname)-1] = 0; intf->coreIntf.Advertise = m->AdvertiseLocalAddresses; intf->coreIntf.McastTxRx = mDNStrue; + intf->coreIntf.Loopback = ((ifi->ifi_flags & IFF_LOOPBACK) != 0) ? mDNStrue : mDNSfalse; // Set up the extra fields in PosixNetworkInterface. assert(intf->intfName != NULL); // intf->intfName already set up above - intf->index = intfIndex; - intf->sa_family = intfAddr->sa_family; + intf->index = ifi->ifi_index; + intf->sa_family = ifi->ifi_addr->sa_family; intf->multicastSocket4 = -1; #if HAVE_IPV6 intf->multicastSocket6 = -1; @@ -936,17 +935,17 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct intf->coreIntf.InterfaceID = (mDNSInterfaceID)alias; if (alias != intf) - debugf("SetupOneInterface: %s %#a is an alias of %#a", intfName, &intf->coreIntf.ip, &alias->coreIntf.ip); + debugf("SetupOneInterface: %s %#a is an alias of %#a", ifi->ifi_name, &intf->coreIntf.ip, &alias->coreIntf.ip); } // Set up the multicast socket if (err == 0) { - if (alias->multicastSocket4 == -1 && intfAddr->sa_family == AF_INET) - err = SetupSocket(intfAddr, MulticastDNSPort, intf->index, &alias->multicastSocket4); + if (alias->multicastSocket4 == -1 && ifi->ifi_addr->sa_family == AF_INET) + err = SetupSocket(ifi->ifi_addr, MulticastDNSPort, intf->index, &alias->multicastSocket4); #if HAVE_IPV6 - else if (alias->multicastSocket6 == -1 && intfAddr->sa_family == AF_INET6) - err = SetupSocket(intfAddr, MulticastDNSPort, intf->index, &alias->multicastSocket6); + else if (alias->multicastSocket6 == -1 && ifi->ifi_addr->sa_family == AF_INET6) + err = SetupSocket(ifi->ifi_addr, MulticastDNSPort, intf->index, &alias->multicastSocket6); #endif } @@ -973,8 +972,8 @@ mDNSlocal int SetupOneInterface(mDNS *const m, struct sockaddr *intfAddr, struct } else { - // Use intfName instead of intf->intfName in the next line to avoid dereferencing NULL. - debugf("SetupOneInterface: %s %#a failed to register %d", intfName, &intf->coreIntf.ip, err); + // Use ifi->ifi_name instead of intf->intfName in the next line to avoid dereferencing NULL. + debugf("SetupOneInterface: %s %#a failed to register %d", ifi->ifi_name, &intf->coreIntf.ip, err); if (intf) { FreePosixNetworkInterface(intf); intf = NULL; } } @@ -1023,7 +1022,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m) } else { - if (SetupOneInterface(m, i->ifi_addr, i->ifi_netmask, i->ifi_name, i->ifi_index) == 0) + if (SetupOneInterface(m, i) == 0) if (i->ifi_addr->sa_family == AF_INET) foundav4 = mDNStrue; } @@ -1037,7 +1036,7 @@ mDNSlocal int SetupInterfaceList(mDNS *const m) // In the interim, we skip loopback interface only if we found at least one v4 interface to use // if ((m->HostInterfaces == NULL) && (firstLoopback != NULL)) if (!foundav4 && firstLoopback) - (void) SetupOneInterface(m, firstLoopback->ifi_addr, firstLoopback->ifi_netmask, firstLoopback->ifi_name, firstLoopback->ifi_index); + (void) SetupOneInterface(m, firstLoopback); } // Clean up. -- 2.17.1