Annotation of embedaddon/ntp/lib/isc/portset.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008 Internet Systems Consortium, Inc. ("ISC")
! 3: *
! 4: * Permission to use, copy, modify, and/or distribute this software for any
! 5: * purpose with or without fee is hereby granted, provided that the above
! 6: * copyright notice and this permission notice appear in all copies.
! 7: *
! 8: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
! 9: * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
! 10: * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
! 11: * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
! 12: * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
! 13: * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
! 14: * PERFORMANCE OF THIS SOFTWARE.
! 15: */
! 16:
! 17: /* $Id: portset.c,v 1.4 2008/06/24 23:24:35 marka Exp $ */
! 18:
! 19: /*! \file */
! 20:
! 21: #include <config.h>
! 22:
! 23: #include <isc/mem.h>
! 24: #include <isc/portset.h>
! 25: #include <isc/string.h>
! 26: #include <isc/types.h>
! 27: #include <isc/util.h>
! 28:
! 29: #define ISC_PORTSET_BUFSIZE (65536 / (sizeof(isc_uint32_t) * 8))
! 30:
! 31: /*%
! 32: * Internal representation of portset. It's an array of 32-bit integers, each
! 33: * bit corresponding to a single port in the ascending order. For example,
! 34: * the second most significant bit of buf[0] corresponds to port 1.
! 35: */
! 36: struct isc_portset {
! 37: unsigned int nports; /*%< number of ports in the set */
! 38: isc_uint32_t buf[ISC_PORTSET_BUFSIZE];
! 39: };
! 40:
! 41: static inline isc_boolean_t
! 42: portset_isset(isc_portset_t *portset, in_port_t port) {
! 43: return (ISC_TF((portset->buf[port >> 5] & (1 << (port & 31))) != 0));
! 44: }
! 45:
! 46: static inline void
! 47: portset_add(isc_portset_t *portset, in_port_t port) {
! 48: if (!portset_isset(portset, port)) {
! 49: portset->nports++;
! 50: portset->buf[port >> 5] |= (1 << (port & 31));
! 51: }
! 52: }
! 53:
! 54: static inline void
! 55: portset_remove(isc_portset_t *portset, in_port_t port) {
! 56: if (portset_isset(portset, port)) {
! 57: portset->nports--;
! 58: portset->buf[port >> 5] &= ~(1 << (port & 31));
! 59: }
! 60: }
! 61:
! 62: isc_result_t
! 63: isc_portset_create(isc_mem_t *mctx, isc_portset_t **portsetp) {
! 64: isc_portset_t *portset;
! 65:
! 66: REQUIRE(portsetp != NULL && *portsetp == NULL);
! 67:
! 68: portset = isc_mem_get(mctx, sizeof(*portset));
! 69: if (portset == NULL)
! 70: return (ISC_R_NOMEMORY);
! 71:
! 72: /* Make the set 'empty' by default */
! 73: memset(portset, 0, sizeof(*portset));
! 74: *portsetp = portset;
! 75:
! 76: return (ISC_R_SUCCESS);
! 77: }
! 78:
! 79: void
! 80: isc_portset_destroy(isc_mem_t *mctx, isc_portset_t **portsetp) {
! 81: isc_portset_t *portset;
! 82:
! 83: REQUIRE(portsetp != NULL);
! 84: portset = *portsetp;
! 85:
! 86: isc_mem_put(mctx, portset, sizeof(*portset));
! 87: }
! 88:
! 89: isc_boolean_t
! 90: isc_portset_isset(isc_portset_t *portset, in_port_t port) {
! 91: REQUIRE(portset != NULL);
! 92:
! 93: return (portset_isset(portset, port));
! 94: }
! 95:
! 96: unsigned int
! 97: isc_portset_nports(isc_portset_t *portset) {
! 98: REQUIRE(portset != NULL);
! 99:
! 100: return (portset->nports);
! 101: }
! 102:
! 103: void
! 104: isc_portset_add(isc_portset_t *portset, in_port_t port) {
! 105: REQUIRE(portset != NULL);
! 106:
! 107: portset_add(portset, port);
! 108: }
! 109:
! 110: void
! 111: isc_portset_remove(isc_portset_t *portset, in_port_t port) {
! 112: portset_remove(portset, port);
! 113: }
! 114:
! 115: void
! 116: isc_portset_addrange(isc_portset_t *portset, in_port_t port_lo,
! 117: in_port_t port_hi)
! 118: {
! 119: in_port_t p;
! 120:
! 121: REQUIRE(portset != NULL);
! 122: REQUIRE(port_lo <= port_hi);
! 123:
! 124: p = port_lo;
! 125: do {
! 126: portset_add(portset, p);
! 127: } while (p++ < port_hi);
! 128: }
! 129:
! 130: void
! 131: isc_portset_removerange(isc_portset_t *portset, in_port_t port_lo,
! 132: in_port_t port_hi)
! 133: {
! 134: in_port_t p;
! 135:
! 136: REQUIRE(portset != NULL);
! 137: REQUIRE(port_lo <= port_hi);
! 138:
! 139: p = port_lo;
! 140: do {
! 141: portset_remove(portset, p);
! 142: } while (p++ < port_hi);
! 143: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>