"Fossies" - the Fresh Open Source Software Archive

Member "bind-9.11.23/bin/named/include/named/interfacemgr.h" (7 Sep 2020, 5170 Bytes) of package /linux/misc/dns/bind9/9.11.23/bind-9.11.23.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "interfacemgr.h" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
    3  *
    4  * This Source Code Form is subject to the terms of the Mozilla Public
    5  * License, v. 2.0. If a copy of the MPL was not distributed with this
    6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
    7  *
    8  * See the COPYRIGHT file distributed with this work for additional
    9  * information regarding copyright ownership.
   10  */
   11 
   12 #ifndef NAMED_INTERFACEMGR_H
   13 #define NAMED_INTERFACEMGR_H 1
   14 
   15 /*****
   16  ***** Module Info
   17  *****/
   18 
   19 /*! \file
   20  * \brief
   21  * The interface manager monitors the operating system's list
   22  * of network interfaces, creating and destroying listeners
   23  * as needed.
   24  *
   25  * Reliability:
   26  *\li   No impact expected.
   27  *
   28  * Resources:
   29  *
   30  * Security:
   31  * \li  The server will only be able to bind to the DNS port on
   32  *  newly discovered interfaces if it is running as root.
   33  *
   34  * Standards:
   35  *\li   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 <stdbool.h>
   44 
   45 #include <isc/magic.h>
   46 #include <isc/mem.h>
   47 #include <isc/socket.h>
   48 #include <isc/refcount.h>
   49 
   50 #include <dns/result.h>
   51 
   52 #include <named/listenlist.h>
   53 #include <named/types.h>
   54 
   55 /***
   56  *** Types
   57  ***/
   58 
   59 #define IFACE_MAGIC     ISC_MAGIC('I',':','-',')')
   60 #define NS_INTERFACE_VALID(t)   ISC_MAGIC_VALID(t, IFACE_MAGIC)
   61 
   62 #define NS_INTERFACEFLAG_ANYADDR    0x01U   /*%< bound to "any" address */
   63 #define MAX_UDP_DISPATCH 128        /*%< Maximum number of UDP dispatchers
   64                              to start per interface */
   65 /*% The nameserver interface structure */
   66 struct ns_interface {
   67     unsigned int        magic;      /*%< Magic number. */
   68     ns_interfacemgr_t * mgr;        /*%< Interface manager. */
   69     isc_mutex_t     lock;
   70     int         references; /*%< Locked */
   71     unsigned int        generation;     /*%< Generation number. */
   72     isc_sockaddr_t      addr;           /*%< Address and port. */
   73     unsigned int        flags;      /*%< Interface characteristics */
   74     char            name[32];   /*%< Null terminated. */
   75     dns_dispatch_t *    udpdispatch[MAX_UDP_DISPATCH];
   76                         /*%< UDP dispatchers. */
   77     isc_socket_t *      tcpsocket;  /*%< TCP socket. */
   78     isc_dscp_t      dscp;       /*%< "listen-on" DSCP value */
   79     isc_refcount_t      ntcpaccepting;  /*%< Number of clients
   80                              ready to accept new
   81                              TCP connections on this
   82                              interface */
   83     isc_refcount_t      ntcpactive; /*%< Number of clients
   84                              servicing TCP queries
   85                              (whether accepting or
   86                              connected) */
   87     int         nudpdispatch;   /*%< Number of UDP dispatches */
   88     ns_clientmgr_t *    clientmgr;  /*%< Client manager. */
   89     ISC_LINK(ns_interface_t) link;
   90 };
   91 
   92 /***
   93  *** Functions
   94  ***/
   95 
   96 isc_result_t
   97 ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
   98                isc_socketmgr_t *socketmgr,
   99                dns_dispatchmgr_t *dispatchmgr,
  100                isc_task_t *task, ns_interfacemgr_t **mgrp);
  101 /*%
  102  * Create a new interface manager.
  103  *
  104  * Initially, the new manager will not listen on any interfaces.
  105  * Call ns_interfacemgr_setlistenon() and/or ns_interfacemgr_setlistenon6()
  106  * to set nonempty listen-on lists.
  107  */
  108 
  109 void
  110 ns_interfacemgr_attach(ns_interfacemgr_t *source, ns_interfacemgr_t **target);
  111 
  112 void
  113 ns_interfacemgr_detach(ns_interfacemgr_t **targetp);
  114 
  115 void
  116 ns_interfacemgr_shutdown(ns_interfacemgr_t *mgr);
  117 
  118 bool
  119 ns_interfacemgr_islistening(ns_interfacemgr_t *mgr);
  120 /*%
  121  * Return if the manager is listening on any interface. It can be called
  122  * after a scan or adjust.
  123  */
  124 
  125 isc_result_t
  126 ns_interfacemgr_scan(ns_interfacemgr_t *mgr, bool verbose);
  127 /*%
  128  * Scan the operatings system's list of network interfaces
  129  * and create listeners when new interfaces are discovered.
  130  * Shut down the sockets for interfaces that go away.
  131  *
  132  * This should be called once on server startup and then
  133  * periodically according to the 'interface-interval' option
  134  * in named.conf.
  135  */
  136 
  137 isc_result_t
  138 ns_interfacemgr_adjust(ns_interfacemgr_t *mgr, ns_listenlist_t *list,
  139                bool verbose);
  140 /*%
  141  * Similar to ns_interfacemgr_scan(), but this function also tries to see the
  142  * need for an explicit listen-on when a list element in 'list' is going to
  143  * override an already-listening a wildcard interface.
  144  *
  145  * This function does not update localhost and localnets ACLs.
  146  *
  147  * This should be called once on server startup, after configuring views and
  148  * zones.
  149  */
  150 
  151 void
  152 ns_interfacemgr_setlistenon4(ns_interfacemgr_t *mgr, ns_listenlist_t *value);
  153 /*%
  154  * Set the IPv4 "listen-on" list of 'mgr' to 'value'.
  155  * The previous IPv4 listen-on list is freed.
  156  */
  157 
  158 void
  159 ns_interfacemgr_setlistenon6(ns_interfacemgr_t *mgr, ns_listenlist_t *value);
  160 /*%
  161  * Set the IPv6 "listen-on" list of 'mgr' to 'value'.
  162  * The previous IPv6 listen-on list is freed.
  163  */
  164 
  165 dns_aclenv_t *
  166 ns_interfacemgr_getaclenv(ns_interfacemgr_t *mgr);
  167 
  168 void
  169 ns_interface_attach(ns_interface_t *source, ns_interface_t **target);
  170 
  171 void
  172 ns_interface_detach(ns_interface_t **targetp);
  173 
  174 void
  175 ns_interface_shutdown(ns_interface_t *ifp);
  176 /*%
  177  * Stop listening for queries on interface 'ifp'.
  178  * May safely be called multiple times.
  179  */
  180 
  181 void
  182 ns_interfacemgr_dumprecursing(FILE *f, ns_interfacemgr_t *mgr);
  183 
  184 bool
  185 ns_interfacemgr_listeningon(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr);
  186 
  187 #endif /* NAMED_INTERFACEMGR_H */