blob: b4c5b3cde854946c7cce7b336b76af395686ce85 [file] [log] [blame]
/*
* Copyright (c) 2021-2023 Apple 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
*
* https://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 MRCS_DNS_PROXY_H
#define MRCS_DNS_PROXY_H
#include "mrcs_object.h"
#include <MacTypes.h>
#include <mdns/base.h>
#include <nw/private.h>
MRCS_DECL(dns_proxy);
MRCS_DECL(dns_proxy_manager);
MDNS_ASSUME_NONNULL_BEGIN
__BEGIN_DECLS
/*!
* @brief
* Creates a DNS proxy object to represent an instance of a DNS proxy.
*
* @param out_error
* A variable to set to either kNoErr if creation succeeds, or a non-zero error code if creation fails.
*
* @result
* A reference to the new DNS proxy object, or NULL if creation failed.
*
* @discussion
* If not using Objective-C ARC, use mrcs_retain() and mrcs_release() to retain and release references to
* the object.
*/
MDNS_RETURNS_RETAINED MDNS_WARN_RESULT
mrcs_dns_proxy_t _Nullable
mrcs_dns_proxy_create(OSStatus * _Nullable out_error);
/*!
* @brief
* Adds an input interface to a DNS proxy.
*
* @param proxy
* The DNS proxy.
*
* @param ifindex
* The input interface's index.
*
* @discussion
* This function can be called more than once to specify a set of multiple input interfaces.
*/
OSStatus
mrcs_dns_proxy_add_input_interface(mrcs_dns_proxy_t proxy, uint32_t ifindex);
/*!
* @brief
* Sets a DNS proxy's output interface.
*
* @param proxy
* The DNS proxy.
*
* @param ifindex
* The output interface's index.
*
* @discussion
* By default, the output interface index is 0, which means that the remote DNS proxy instance will use the
* most suitable interface for its DNS network traffic.
*/
void
mrcs_dns_proxy_set_output_interface(mrcs_dns_proxy_t proxy, uint32_t ifindex);
/*!
* @brief
* Sets a DNS proxy's NAT64 IPv6 prefix.
*
* @param proxy
* The parameters.
*
* @param prefix
* A pointer to the prefix.
*
* @param prefix_bit_length
* The bit length of the prefix.
*
* @result
* kNoErr if the NAT64 prefix was successfully set. Otherwise, a non-zero error code indicating why it
* wasn't set.
*
* @discussion
* If a NAT64 prefix is set, then the DNS proxy instance will carry out DNS64 functionality using the
* specified NAT64 prefix. If not set, then no DNS64 functionality will be performed.
*/
OSStatus
mrcs_dns_proxy_set_nat64_prefix(mrcs_dns_proxy_t proxy, const uint8_t *prefix, size_t prefix_bit_length);
/*!
* @brief
* Enables a DNS proxy's option to force AAAA synthesis when performing DNS64 functionality.
*
* @param proxy
* The DNS proxy.
*
* @param enable
* Pass true to enable the option. Pass false to disable the option.
*
* @discussion
* This option is disabled by default and only applies when the DNS proxy's DNS64 functionality is enabled
* by specifying a NAT64 prefix.
*/
void
mrcs_dns_proxy_enable_force_aaaa_synthesis(mrcs_dns_proxy_t proxy, bool enable);
/*!
* @brief
* Sets a DNS proxy's effective user ID.
*
* @param proxy
* The DNS proxy.
*
* @param euid
* The effective user ID.
*
* @discussion
* Any policy decisions that need to be made for a DNS proxy's query that take a user ID into account, such
* as path evaluation, will use the DNS proxy's effective user ID.
*/
void
mrcs_dns_proxy_set_euid(mrcs_dns_proxy_t proxy, uid_t euid);
/*!
* @brief
* Determines whether a DNS proxy contains an input interface.
*
* @param proxy
* The DNS proxy.
*
* @param ifindex
* The intput interface's index.
*
* @result
* The truth value.
*/
bool
mrcs_dns_proxy_contains_input_interface(mrcs_dns_proxy_t proxy, uint32_t ifindex);
/*!
* @brief
* Gets a DNS proxy's output interface index.
*
* @param proxy
* The DNS proxy.
*
* @result
* The output interface index.
*
* @discussion
* By default, the output interface index is 0, which means that the DNS proxy instance will use the most
* suitable interface for its DNS network traffic.
*/
uint32_t
mrcs_dns_proxy_get_output_interface(mrcs_dns_proxy_t proxy);
/*!
* @brief
* Gets a DNS proxy's NAT64 prefix.
*
* @param proxy
* The DNS proxy.
*
* @result
* The NAT64 prefix if the DNS proxy has one. Otherwise, NULL.
*
* @discussion
* The NAT64 prefix returned by this function is valid for the lifetime of the DNS proxy object and is
* guaranteed to not change until the next successful call to mrcs_dns_proxy_set_nat64_prefix().
*/
const nw_nat64_prefix_t * _Nullable
mrcs_dns_proxy_get_nat64_prefix(mrcs_dns_proxy_t proxy);
/*!
* @brief
* Determines whether a DNS proxy forces AAAA synthesis when performing DNS64 functionality.
*
* @param proxy
* The DNS proxy.
*
* @result
* The truth value.
*/
bool
mrcs_dns_proxy_forces_aaaa_synthesis(mrcs_dns_proxy_t proxy);
/*!
* @brief
* Gets a DNS proxy's effective user ID.
*
* @param proxy
* The DNS proxy.
*
* @result
* The effective user ID.
*/
uid_t
mrcs_dns_proxy_get_euid(mrcs_dns_proxy_t proxy);
/*!
* @brief
* Creates a DNS proxy manager which can be uses to contain DNS proxy objects.
*
* @param out_error
* A variable to set to either kNoErr if creation succeeds, or a non-zero error code if creation fails.
*
* @result
* A reference to the new DNS proxy manager, or NULL if creation failed.
*
* @discussion
* If not using Objective-C ARC, use mrcs_retain() and mrcs_release() to retain and release references to
* the object.
*/
MDNS_RETURNS_RETAINED MDNS_WARN_RESULT
mrcs_dns_proxy_manager_t _Nullable
mrcs_dns_proxy_manager_create(OSStatus * _Nullable out_error);
/*!
* @brief
* Adds a DNS proxy to a DNS proxy manager if it doesn't conflict with its current set of DNS proxies.
*
* @param manager
* The DNS proxy manager.
*
* @param proxy
* The DNS proxy.
*
* @result
* kNoErr if the DNS proxy was added. Otherwise, a non-zero error code if there was a conflict.
*
* @discussion
* The DNS proxy manager will retain a reference to each DNS proxy that it successfully adds.
*
* A DNS proxy is considered to conflict with another DNS proxy if they have at least one input interface
* in common and either their output interfaces don't match or their output interfaces do match, but their
* DNS64 settings do not.
*/
OSStatus
mrcs_dns_proxy_manager_add_proxy(mrcs_dns_proxy_manager_t manager, mrcs_dns_proxy_t proxy);
/*!
* @brief
* Removes a DNS proxy from a DNS proxy manager.
*
* @param manager
* The DNS proxy manager.
*
* @param proxy
* The DNS proxy.
*
* @result
* kNoErr if the DNS proxy was successfully removed. Otherwise, a non-zero error code if the DNS proxy was
* not contained by the DNS proxy manager.
*
* @discussion
* The DNS proxy manager will release its reference to each DNS proxy that gets removed.
*/
OSStatus
mrcs_dns_proxy_manager_remove_proxy(mrcs_dns_proxy_manager_t manager, mrcs_dns_proxy_t proxy);
/*!
* @brief
* Gets the number of DNS proxies contained by a DNS proxy manager.
*
* @param manager
* The DNS proxy manager.
*
* @result
* The number or DNS proxies.
*/
size_t
mrcs_dns_proxy_manager_get_count(mrcs_dns_proxy_manager_t manager);
/*!
* @brief
* Gets a DNS proxy that contains the specified input interface from a DNS proxy manager if such a DNS
* proxy exists.
*
* @param manager
* The DNS proxy manager.
*
* @param ifindex
* The input interface's index.
*
* @result
* The DNS proxy if such a DNS proxy exists. Otherwise, NULL.
*/
mrcs_dns_proxy_t _Nullable
mrcs_dns_proxy_manager_get_proxy_by_input_interface(mrcs_dns_proxy_manager_t manager, uint32_t ifindex);
__END_DECLS
MDNS_ASSUME_NONNULL_END
#endif // MRCS_DNS_PROXY_H