/* * Copyright (c) 2021 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 MDNS_ADDR_TAIL_QUEUE_H #define MDNS_ADDR_TAIL_QUEUE_H //====================================================================================================================== // MARK: - Headers #include "nullability.h" // For NULLABLE and NONNULL. #include "bsd_queue.h" // For STAILQ. #include #include // For bool. #include "mDNSEmbeddedAPI.h" // For mDNSAddr, mDNSIPPort and mStatus. #if defined(POSIX_BUILD) #include "DebugServices.h" #endif // defined(POSIX_BUILD) //====================================================================================================================== // MARK: - Structures typedef struct mdns_addr_with_port mdns_addr_with_port_t; struct mdns_addr_with_port { STAILQ_ENTRY(mdns_addr_with_port) __entries; // The entry used by STAILQ to form the linked list. mDNSAddr address; // IPv4 or IPv6 address. mDNSIPPort port; // The port number that is associated with the address above. }; typedef struct mdns_addr_tailq mdns_addr_tailq_t; // The tail queue struct mdns_addr_tailq that contains struct mdns_addr_with_port. STAILQ_HEAD(mdns_addr_tailq, mdns_addr_with_port); //====================================================================================================================== // MARK: - Function Declarations /*! * @brief * Creates a tail queue that contains IP address and port number. * * @result * A pointer to the tail queue or NULL if the system was out of memory. */ mdns_addr_tailq_t * NULLABLE mdns_addr_tailq_create(void); /*! * @brief * Disposes a tail queue that is created by mdns_addr_tailq_create(). * * @param me * The tail queue that will be disposed. * * @discussion * Use MDNS_DISPOSE_MDNS_ADDR_TAILQ() to dispose a tail queue safely. */ void mdns_addr_tailq_dispose(mdns_addr_tailq_t * NONNULL me); #define MDNS_DISPOSE_MDNS_ADDR_TAILQ(obj) _MDNS_STRICT_DISPOSE_TEMPLATE(obj, mdns_addr_tailq_dispose) /*! * @brief * Checks if the current tail queue is empty. * * @param me * The tail queue to be checked. * * @result * True if the tail queue does not contain any element. Otherwise, false. */ bool mdns_addr_tailq_empty(const mdns_addr_tailq_t * NONNULL me); /*! * @brief * Adds an IP address with its corresponding port number into the front of the tail queue. * * @param me * The tail queue where the address and port number to be added into. * * @param address * The IP address to be added. * * @param port * The corresponding port number of the added address to be added. * * @result * The added address with its port number in the front of the tail queue, or NULL if the system was out of memory. */ const mdns_addr_with_port_t * NULLABLE mdns_addr_tailq_add_front(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port); /*! * @brief * Adds an IP address with its corresponding port number into the back of the tail queue. * * @param me * The tail queue where the address and port number to be added into. * * @param address * The IP address to be added. * * @param port * The corresponding port number of the added address to be added. * * @result * The added address with its port number in the back of the tail queue, or NULL if the system was out of memory. */ const mdns_addr_with_port_t * NULLABLE mdns_addr_tailq_add_back(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port); /*! * @brief * Gets the pointer to mdns_addr_with_port_t (which contains the IP address and port number added before) in the front of the tail queue. * * @param me * The tail queue where the mdns_addr_with_port_t to be get from. * * @result * The pointer to the mdns_addr_with_port_t in the front of the tail queue, or NULL if the tail queue is empty. */ const mdns_addr_with_port_t * NULLABLE mdns_addr_tailq_get_front(const mdns_addr_tailq_t * NONNULL me); /*! * @brief * Removes the first IP address and its port number in the front of the tail queue. * * @param me * The tail queue where the IP address and its port number to be removed. */ void mdns_addr_tailq_remove_front(mdns_addr_tailq_t * NONNULL me); /*! * @brief * Removes mdns_addr_with_port_t object in the tail queue with the IP address and port number specified in the parameters. * * @param me * The tail queue where the IP address and its port number to be removed. * * @param address * The IP address to be matched. * * @param port * The corresponding port number of the IP address to be matched. * * @result * True if the mdns_addr_with_port_t object is found and removed from the tail queue, for the IP address and port number specified in the parameters. * False if such mdns_addr_with_port_t object does not exist in the tail queue. */ bool mdns_addr_tailq_remove(mdns_addr_tailq_t * NONNULL me, const mDNSAddr * NONNULL address, mDNSIPPort port); /*! * @brief * Checks if two mdns_addr_with_port_t object are equal in value. * * @param addr_1 * mdns_addr_with_port_t object to be compared. * * @param addr_2 * mdns_addr_with_port_t object to be compared. * * @result * True if two mdns_addr_with_port_t are equal in value, otherwise, false. */ bool mdns_addr_with_port_equal(const mdns_addr_with_port_t * NONNULL addr_1, const mdns_addr_with_port_t * NONNULL addr_2); #endif // MDNS_ADDR_TAIL_QUEUE_H