/* * * Copyright (c) 2022 Project CHIP Authors * * 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. */ #pragma once #include #include #include #include #include namespace chip { namespace Dnssd { typedef std::pair InetInterface; typedef std::pair Inet6Interface; typedef std::vector InetInterfacesVector; typedef std::vector> Inet6InterfacesVector; typedef void (^OnInterfaceChanges)(InetInterfacesVector inetInterfaces, Inet6InterfacesVector inet6Interfaces); class HostNameRegistrar { public: ~HostNameRegistrar(); DNSServiceErrorType Init(const char * hostname, Inet::IPAddressType addressType, uint32_t interfaceId); CHIP_ERROR Register(); void Unregister(); private: bool IsLocalOnly() const { return mInterfaceId == kDNSServiceInterfaceIndexLocalOnly; }; template void RegisterInterfaces(std::vector> interfaces, uint16_t type) { for (auto & interface : interfaces) { auto interfaceId = interface.first; LogErrorOnFailure(RegisterInterface(interfaceId, interface.second, type)); } } template CHIP_ERROR RegisterInterface(uint32_t interfaceId, const T & interfaceAddress, uint16_t type) { auto interfaceAddressLen = sizeof(interfaceAddress); return RegisterInterface(interfaceId, type, &interfaceAddress, static_cast(interfaceAddressLen)); } CHIP_ERROR RegisterInterface(uint32_t interfaceId, uint16_t rtype, const void * rdata, uint16_t rdlen); CHIP_ERROR StartSharedConnection(); void StopSharedConnection(); CHIP_ERROR ResetSharedConnection(); CHIP_ERROR StartMonitorInterfaces(OnInterfaceChanges interfaceChangesBlock); void StopMonitorInterfaces(); DNSServiceRef mServiceRef = nullptr; nw_path_monitor_t mInterfaceMonitor = nullptr; std::string mHostname; // Default to kDNSServiceInterfaceIndexLocalOnly so we don't mess around // with un-registration if we never get Init() called. uint32_t mInterfaceId = kDNSServiceInterfaceIndexLocalOnly; Inet::IPAddressType mAddressType; // We use mLivenessTracker to indicate to blocks that close over us that // we've been destroyed. This is needed because we're not a refcounted // object, so the blocks can't keep us alive; they just close over the // raw pointer to "this". std::shared_ptr mLivenessTracker; }; } // namespace Dnssd } // namespace chip