Annotation of embedaddon/ntp/lib/isc/portset.c, revision 1.1.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>