1 /* 2 * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 1999-2001 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /* $Id: interfaceiter.h,v 1.17 2007/06/19 23:47:18 tbox Exp $ */ 19 20 #ifndef ISC_INTERFACEITER_H 21 #define ISC_INTERFACEITER_H 1 22 23 /***** 24 ***** Module Info 25 *****/ 26 27 /*! \file isc/interfaceiter.h 28 * \brief Iterates over the list of network interfaces. 29 * 30 * Interfaces whose address family is not supported are ignored and never 31 * returned by the iterator. Interfaces whose netmask, interface flags, 32 * or similar cannot be obtained are also ignored, and the failure is logged. 33 * 34 * Standards: 35 * The API for scanning varies greatly among operating systems. 36 * This module attempts to hide the differences. 37 */ 38 39 /*** 40 *** Imports 41 ***/ 42 43 #include <isc/lang.h> 44 #include <isc/netaddr.h> 45 #include <isc/types.h> 46 47 /*! 48 * \brief Public structure describing a network interface. 49 */ 50 51 struct isc_interface { 52 char name[32]; /*%< Interface name, null-terminated. */ 53 unsigned int af; /*%< Address family. */ 54 isc_netaddr_t address; /*%< Local address. */ 55 isc_netaddr_t netmask; /*%< Network mask. */ 56 isc_netaddr_t broadcast; /*&< Broadcast address. */ 57 isc_netaddr_t dstaddress; /*%< Destination address (point-to-point only). */ 58 isc_uint32_t flags; /*%< Flags; see INTERFACE flags. */ 59 unsigned int ifindex; /*%< Interface index for IP(V6)_MULTICAST_IF. */ 60 }; 61 62 /*@{*/ 63 /*! Interface flags. */ 64 65 #define INTERFACE_F_UP 0x00000001U 66 #define INTERFACE_F_POINTTOPOINT 0x00000002U 67 #define INTERFACE_F_LOOPBACK 0x00000004U 68 #define INTERFACE_F_BROADCAST 0x00000008U 69 #define INTERFACE_F_MULTICAST 0x00000010U 70 #define INTERFACE_F_PRIVACY 0x00000020U /* RFC 4941 */ 71 /*@}*/ 72 73 /*** 74 *** Functions 75 ***/ 76 77 ISC_LANG_BEGINDECLS 78 79 isc_result_t 80 isc_interfaceiter_create(isc_mem_t *mctx, isc_interfaceiter_t **iterp); 81 /*!< 82 * \brief Create an iterator for traversing the operating system's list 83 * of network interfaces. 84 * 85 * Returns: 86 *\li #ISC_R_SUCCESS 87 * \li #ISC_R_NOMEMORY 88 *\li Various network-related errors 89 */ 90 91 isc_result_t 92 isc_interfaceiter_first(isc_interfaceiter_t *iter); 93 /*!< 94 * \brief Position the iterator on the first interface. 95 * 96 * Returns: 97 *\li #ISC_R_SUCCESS Success. 98 *\li #ISC_R_NOMORE There are no interfaces. 99 */ 100 101 isc_result_t 102 isc_interfaceiter_current(isc_interfaceiter_t *iter, 103 isc_interface_t *ifdata); 104 /*!< 105 * \brief Get information about the interface the iterator is currently 106 * positioned at and store it at *ifdata. 107 * 108 * Requires: 109 *\li The iterator has been successfully positioned using 110 * isc_interface_iter_first() / isc_interface_iter_next(). 111 * 112 * Returns: 113 *\li #ISC_R_SUCCESS Success. 114 */ 115 116 isc_result_t 117 isc_interfaceiter_next(isc_interfaceiter_t *iter); 118 /*!< 119 * \brief Position the iterator on the next interface. 120 * 121 * Requires: 122 * \li The iterator has been successfully positioned using 123 * isc_interface_iter_first() / isc_interface_iter_next(). 124 * 125 * Returns: 126 *\li #ISC_R_SUCCESS Success. 127 *\li #ISC_R_NOMORE There are no more interfaces. 128 */ 129 130 void 131 isc_interfaceiter_destroy(isc_interfaceiter_t **iterp); 132 /*!< 133 * \brief Destroy the iterator. 134 */ 135 136 ISC_LANG_ENDDECLS 137 138 #endif /* ISC_INTERFACEITER_H */ 139