Home | History | Annotate | Line # | Download | only in ns
      1 /*	$NetBSD: listenlist.h,v 1.8 2025/01/26 16:25:46 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      5  *
      6  * SPDX-License-Identifier: MPL-2.0
      7  *
      8  * This Source Code Form is subject to the terms of the Mozilla Public
      9  * License, v. 2.0. If a copy of the MPL was not distributed with this
     10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
     11  *
     12  * See the COPYRIGHT file distributed with this work for additional
     13  * information regarding copyright ownership.
     14  */
     15 
     16 #pragma once
     17 
     18 /*****
     19 ***** Module Info
     20 *****/
     21 
     22 /*! \file
     23  * \brief
     24  * "Listen lists", as in the "listen-on" configuration statement.
     25  */
     26 
     27 /***
     28  *** Imports
     29  ***/
     30 
     31 #include <stdbool.h>
     32 
     33 #include <isc/net.h>
     34 #include <isc/netmgr.h>
     35 #include <isc/tls.h>
     36 
     37 #include <dns/types.h>
     38 
     39 /***
     40  *** Types
     41  ***/
     42 
     43 typedef struct ns_listenelt  ns_listenelt_t;
     44 typedef struct ns_listenlist ns_listenlist_t;
     45 
     46 struct ns_listenelt {
     47 	isc_mem_t	   *mctx;
     48 	in_port_t	    port;
     49 	bool		    is_http;
     50 	dns_acl_t	   *acl;
     51 	isc_tlsctx_t	   *sslctx;
     52 	isc_tlsctx_cache_t *sslctx_cache;
     53 	char		  **http_endpoints;
     54 	size_t		    http_endpoints_number;
     55 	uint32_t	    http_max_clients;
     56 	uint32_t	    max_concurrent_streams;
     57 	isc_nm_proxy_type_t proxy;
     58 	ISC_LINK(ns_listenelt_t) link;
     59 };
     60 
     61 struct ns_listenlist {
     62 	isc_mem_t *mctx;
     63 	int	   refcount;
     64 	ISC_LIST(ns_listenelt_t) elts;
     65 };
     66 
     67 typedef struct ns_listen_tls_params {
     68 	const char *name;
     69 	const char *key;
     70 	const char *cert;
     71 	const char *ca_file;
     72 	uint32_t    protocols;
     73 	const char *dhparam_file;
     74 	const char *ciphers;
     75 	const char *cipher_suites;
     76 	bool	    prefer_server_ciphers;
     77 	bool	    prefer_server_ciphers_set;
     78 	bool	    session_tickets;
     79 	bool	    session_tickets_set;
     80 } ns_listen_tls_params_t;
     81 
     82 /***
     83  *** Functions
     84  ***/
     85 
     86 isc_result_t
     87 ns_listenelt_create(isc_mem_t *mctx, in_port_t port, dns_acl_t *acl,
     88 		    const uint16_t family, bool tls,
     89 		    const ns_listen_tls_params_t *tls_params,
     90 		    isc_tlsctx_cache_t *tlsctx_cache, isc_nm_proxy_type_t proxy,
     91 		    ns_listenelt_t **target);
     92 /*%<
     93  * Create a listen-on list element.
     94  *
     95  * Requires:
     96  * \li	'targetp' is a valid pointer to a pointer containing 'NULL';
     97  * \li	'tls_params' is a valid, non-'NULL' pointer if 'tls' equals 'true'.
     98  * \li	'tlsctx_cache' is a valid, non-'NULL' pointer if 'tls' equals 'true'.
     99  */
    100 
    101 isc_result_t
    102 ns_listenelt_create_http(isc_mem_t *mctx, in_port_t http_port, dns_acl_t *acl,
    103 			 const uint16_t family, bool tls,
    104 			 const ns_listen_tls_params_t *tls_params,
    105 			 isc_tlsctx_cache_t	      *tlsctx_cache,
    106 			 isc_nm_proxy_type_t proxy, char **endpoints,
    107 			 size_t nendpoints, const uint32_t max_clients,
    108 			 const uint32_t max_streams, ns_listenelt_t **target);
    109 /*%<
    110  * Create a listen-on list element for HTTP(S).
    111  */
    112 
    113 void
    114 ns_listenelt_destroy(ns_listenelt_t *elt);
    115 /*%<
    116  * Destroy a listen-on list element.
    117  */
    118 
    119 isc_result_t
    120 ns_listenlist_create(isc_mem_t *mctx, ns_listenlist_t **target);
    121 /*%<
    122  * Create a new, empty listen-on list.
    123  */
    124 
    125 void
    126 ns_listenlist_attach(ns_listenlist_t *source, ns_listenlist_t **target);
    127 /*%<
    128  * Attach '*target' to '*source'.
    129  */
    130 
    131 void
    132 ns_listenlist_detach(ns_listenlist_t **listp);
    133 /*%<
    134  * Detach 'listp'.
    135  */
    136 
    137 isc_result_t
    138 ns_listenlist_default(isc_mem_t *mctx, in_port_t port, bool enabled,
    139 		      const uint16_t family, ns_listenlist_t **target);
    140 /*%<
    141  * Create a listen-on list with default contents, matching
    142  * all addresses with port 'port' (if 'enabled' is true),
    143  * or no addresses (if 'enabled' is false).
    144  */
    145