2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

improve readability of radix code

- use RADIX_V4 and RADIX_V6 instead of 0 and 1 as array indices
- remove some unused macros
This commit is contained in:
Evan Hunt
2018-05-25 13:25:54 -07:00
parent e7b2b097ed
commit 3006ccb7f0
4 changed files with 50 additions and 67 deletions

View File

@@ -219,12 +219,13 @@ dns_acl_match(const isc_netaddr_t *reqaddr,
/* Found a match. */ /* Found a match. */
if (result == ISC_R_SUCCESS && node != NULL) { if (result == ISC_R_SUCCESS && node != NULL) {
int off = ISC_RADIX_OFF(&pfx); int fam = ISC_RADIX_FAMILY(&pfx);
match_num = node->node_num[off]; match_num = node->node_num[fam];
if (*(isc_boolean_t *) node->data[off]) if (*(isc_boolean_t *) node->data[fam]) {
*match = match_num; *match = match_num;
else } else {
*match = -match_num; *match = -match_num;
}
} }
isc_refcount_destroy(&pfx.refcount); isc_refcount_destroy(&pfx.refcount);

View File

@@ -78,16 +78,16 @@ dns_iptable_addprefix(dns_iptable_t *tab, const isc_netaddr_t *addr,
if (pfx.family == AF_UNSPEC) { if (pfx.family == AF_UNSPEC) {
/* "any" or "none" */ /* "any" or "none" */
INSIST(pfx.bitlen == 0); INSIST(pfx.bitlen == 0);
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
if (node->data[i] == NULL) if (node->data[i] == NULL)
node->data[i] = pos ? &dns_iptable_pos node->data[i] = pos ? &dns_iptable_pos
: &dns_iptable_neg; : &dns_iptable_neg;
} }
} else { } else {
/* any other prefix */ /* any other prefix */
int offset = ISC_RADIX_OFF(&pfx); int fam = ISC_RADIX_FAMILY(&pfx);
if (node->data[offset] == NULL) { if (node->data[fam] == NULL) {
node->data[offset] = pos ? &dns_iptable_pos node->data[fam] = pos ? &dns_iptable_pos
: &dns_iptable_neg; : &dns_iptable_neg;
} }
} }
@@ -121,7 +121,7 @@ dns_iptable_merge(dns_iptable_t *tab, dns_iptable_t *source, isc_boolean_t pos)
* could be a security risk. To prevent this, we * could be a security risk. To prevent this, we
* just leave the negative nodes negative. * just leave the negative nodes negative.
*/ */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
if (!pos) { if (!pos) {
if (node->data[i] && if (node->data[i] &&
*(isc_boolean_t *) node->data[i]) *(isc_boolean_t *) node->data[i])

View File

@@ -9,13 +9,6 @@
* information regarding copyright ownership. * information regarding copyright ownership.
*/ */
/*
* This source was adapted from MRT's RCS Ids:
* Id: radix.h,v 1.6 1999/08/03 03:32:53 masaki Exp
* Id: mrt.h,v 1.57.2.6 1999/12/28 23:41:27 labovit Exp
* Id: defs.h,v 1.5.2.2 2000/01/15 14:19:16 masaki Exp
*/
#include <isc/magic.h> #include <isc/magic.h>
#include <isc/types.h> #include <isc/types.h>
#include <isc/mutex.h> #include <isc/mutex.h>
@@ -85,7 +78,11 @@ typedef void (*isc_radix_processfunc_t)(isc_prefix_t *, void **);
* but matches all IPv6 addresses too. * but matches all IPv6 addresses too.
*/ */
#define ISC_RADIX_OFF(p) (((p)->family == AF_INET6) ? 1 : 0) #define RADIX_V4 0
#define RADIX_V6 1
#define RADIX_FAMILIES 2
#define ISC_RADIX_FAMILY(p) (((p)->family == AF_INET6) ? RADIX_V6 : RADIX_V4)
typedef struct isc_radix_node { typedef struct isc_radix_node {
isc_mem_t *mctx; isc_mem_t *mctx;
@@ -93,8 +90,8 @@ typedef struct isc_radix_node {
isc_prefix_t *prefix; /* who we are in radix tree */ isc_prefix_t *prefix; /* who we are in radix tree */
struct isc_radix_node *l, *r; /* left and right children */ struct isc_radix_node *l, *r; /* left and right children */
struct isc_radix_node *parent; /* may be used */ struct isc_radix_node *parent; /* may be used */
void *data[2]; /* pointers to IPv4 and IPV6 data */ void *data[RADIX_FAMILIES]; /* pointers to IPv4 and IPV6 data */
int node_num[2]; /* which node this was in the tree, int node_num[RADIX_FAMILIES]; /* which node this was in the tree,
or -1 for glue nodes */ or -1 for glue nodes */
} isc_radix_node_t; } isc_radix_node_t;
@@ -193,9 +190,6 @@ isc_radix_process(isc_radix_tree_t *radix, isc_radix_processfunc_t func);
#define RADIX_NBIT(x) (0x80 >> ((x) & 0x7f)) #define RADIX_NBIT(x) (0x80 >> ((x) & 0x7f))
#define RADIX_NBYTE(x) ((x) >> 3) #define RADIX_NBYTE(x) ((x) >> 3)
#define RADIX_DATA_GET(node, type) (type *)((node)->data)
#define RADIX_DATA_SET(node, value) ((node)->data = (void *)(value))
#define RADIX_WALK(Xhead, Xnode) \ #define RADIX_WALK(Xhead, Xnode) \
do { \ do { \
isc_radix_node_t *Xstack[RADIX_MAXBITS+1]; \ isc_radix_node_t *Xstack[RADIX_MAXBITS+1]; \
@@ -204,22 +198,6 @@ isc_radix_process(isc_radix_tree_t *radix, isc_radix_processfunc_t func);
while ((Xnode = Xrn)) { \ while ((Xnode = Xrn)) { \
if (Xnode->prefix) if (Xnode->prefix)
#define RADIX_WALK_ALL(Xhead, Xnode) \
do { \
isc_radix_node_t *Xstack[RADIX_MAXBITS+1]; \
isc_radix_node_t **Xsp = Xstack; \
isc_radix_node_t *Xrn = (Xhead); \
while ((Xnode = Xrn)) { \
if (1)
#define RADIX_WALK_BREAK { \
if (Xsp != Xstack) { \
Xrn = *(--Xsp); \
} else { \
Xrn = (radix_node_t *) 0; \
} \
continue; }
#define RADIX_WALK_END \ #define RADIX_WALK_END \
if (Xrn->l) { \ if (Xrn->l) { \
if (Xrn->r) { \ if (Xrn->r) { \

View File

@@ -178,8 +178,8 @@ _clear_radix(isc_radix_tree_t *radix, isc_radix_destroyfunc_t func) {
if (func != NULL) if (func != NULL)
func(Xrn->data); func(Xrn->data);
} else { } else {
INSIST(Xrn->data[0] == NULL && INSIST(Xrn->data[RADIX_V4] == NULL &&
Xrn->data[1] == NULL); Xrn->data[RADIX_V6] == NULL);
} }
isc_mem_put(radix->mctx, Xrn, sizeof(*Xrn)); isc_mem_put(radix->mctx, Xrn, sizeof(*Xrn));
@@ -234,7 +234,7 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target,
isc_radix_node_t *stack[RADIX_MAXBITS + 1]; isc_radix_node_t *stack[RADIX_MAXBITS + 1];
u_char *addr; u_char *addr;
isc_uint32_t bitlen; isc_uint32_t bitlen;
int toff = -1, cnt = 0; int tfam = -1, cnt = 0;
REQUIRE(radix != NULL); REQUIRE(radix != NULL);
REQUIRE(prefix != NULL); REQUIRE(prefix != NULL);
@@ -277,13 +277,13 @@ isc_radix_search(isc_radix_tree_t *radix, isc_radix_node_t **target,
isc_prefix_tochar(prefix), isc_prefix_tochar(prefix),
node->prefix->bitlen)) node->prefix->bitlen))
{ {
int off = ISC_RADIX_OFF(prefix); int fam = ISC_RADIX_FAMILY(prefix);
if (node->node_num[off] != -1 && if (node->node_num[fam] != -1 &&
((*target == NULL) || ((*target == NULL) ||
(*target)->node_num[toff] > node->node_num[off])) (*target)->node_num[tfam] > node->node_num[fam]))
{ {
*target = node; *target = node;
toff = off; tfam = fam;
} }
} }
} }
@@ -323,7 +323,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
if (node == NULL) if (node == NULL)
return (ISC_R_NOMEMORY); return (ISC_R_NOMEMORY);
node->bit = bitlen; node->bit = bitlen;
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
node->node_num[i] = -1; node->node_num[i] = -1;
} }
node->prefix = NULL; node->prefix = NULL;
@@ -344,22 +344,23 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
* added to num_added_node at the end of * added to num_added_node at the end of
* the merge operation--we don't do it here. * the merge operation--we don't do it here.
*/ */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
if (source->node_num[i] != -1) if (source->node_num[i] != -1) {
node->node_num[i] = node->node_num[i] =
radix->num_added_node + radix->num_added_node +
source->node_num[i]; source->node_num[i];
}
node->data[i] = source->data[i]; node->data[i] = source->data[i];
} }
} else { } else {
int next = ++radix->num_added_node; int next = ++radix->num_added_node;
if (fam == AF_UNSPEC) { if (fam == AF_UNSPEC) {
/* "any" or "none" */ /* "any" or "none" */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
node->node_num[i] = next; node->node_num[i] = next;
} }
} else { } else {
node->node_num[ISC_RADIX_OFF(prefix)] = next; node->node_num[ISC_RADIX_FAMILY(prefix)] = next;
} }
memset(node->data, 0, sizeof(node->data)); memset(node->data, 0, sizeof(node->data));
@@ -395,14 +396,14 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
/* Find the first bit different. */ /* Find the first bit different. */
check_bit = (node->bit < bitlen) ? node->bit : bitlen; check_bit = (node->bit < bitlen) ? node->bit : bitlen;
differ_bit = 0; differ_bit = 0;
for (i = 0; i*8 < check_bit; i++) { for (i = 0; i * 8 < check_bit; i++) {
if ((r = (addr[i] ^ test_addr[i])) == 0) { if ((r = (addr[i] ^ test_addr[i])) == 0) {
differ_bit = (i + 1) * 8; differ_bit = (i + 1) * 8;
continue; continue;
} }
/* I know the better way, but for now. */ /* I know the better way, but for now. */
for (j = 0; j < 8; j++) { for (j = 0; j < 8; j++) {
if (BIT_TEST (r, (0x80 >> j))) if (BIT_TEST(r, (0x80 >> j)))
break; break;
} }
/* Must be found. */ /* Must be found. */
@@ -425,7 +426,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
/* Set node_num only if it hasn't been set before */ /* Set node_num only if it hasn't been set before */
if (source != NULL) { if (source != NULL) {
/* Merging nodes */ /* Merging nodes */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
if (node->node_num[i] == -1 && if (node->node_num[i] == -1 &&
source->node_num[i] != -1) source->node_num[i] != -1)
{ {
@@ -439,7 +440,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
if (fam == AF_UNSPEC) { if (fam == AF_UNSPEC) {
/* "any" or "none" */ /* "any" or "none" */
int next = radix->num_added_node + 1; int next = radix->num_added_node + 1;
for (i = 0; i < 2; i++) for (i = 0; i < RADIX_FAMILIES; i++)
{ {
if (node->node_num[i] == -1) { if (node->node_num[i] == -1) {
node->node_num[i] = node->node_num[i] =
@@ -449,10 +450,11 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
} }
} }
} else { } else {
int off = ISC_RADIX_OFF(prefix); int foff = ISC_RADIX_FAMILY(prefix);
if (node->node_num[off] == -1) if (node->node_num[foff] == -1) {
node->node_num[off] = node->node_num[foff] =
++radix->num_added_node; ++radix->num_added_node;
}
} }
} }
*target = node; *target = node;
@@ -463,11 +465,13 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
return (result); return (result);
} }
INSIST(node->data[0] == NULL && node->node_num[0] == -1 && INSIST(node->data[RADIX_V4] == NULL &&
node->data[1] == NULL && node->node_num[1] == -1); node->node_num[RADIX_V4] == -1 &&
node->data[RADIX_V4] == NULL &&
node->node_num[RADIX_V4] == -1);
if (source != NULL) { if (source != NULL) {
/* Merging node */ /* Merging node */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
int cur = radix->num_added_node; int cur = radix->num_added_node;
if (source->node_num[i] != -1) { if (source->node_num[i] != -1) {
node->node_num[i] = node->node_num[i] =
@@ -479,11 +483,11 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
int next = ++radix->num_added_node; int next = ++radix->num_added_node;
if (fam == AF_UNSPEC) { if (fam == AF_UNSPEC) {
/* "any" or "none" */ /* "any" or "none" */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
node->node_num[i] = next; node->node_num[i] = next;
} }
} else { } else {
node->node_num[ISC_RADIX_OFF(prefix)] = next; node->node_num[ISC_RADIX_FAMILY(prefix)] = next;
} }
} }
*target = node; *target = node;
@@ -513,7 +517,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
} }
new_node->parent = NULL; new_node->parent = NULL;
new_node->l = new_node->r = NULL; new_node->l = new_node->r = NULL;
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
new_node->node_num[i] = -1; new_node->node_num[i] = -1;
new_node->data[i] = NULL; new_node->data[i] = NULL;
} }
@@ -521,7 +525,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
if (source != NULL) { if (source != NULL) {
/* Merging node */ /* Merging node */
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
int cur = radix->num_added_node; int cur = radix->num_added_node;
if (source->node_num[i] != -1) { if (source->node_num[i] != -1) {
new_node->node_num[i] = new_node->node_num[i] =
@@ -533,10 +537,10 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
int next = ++radix->num_added_node; int next = ++radix->num_added_node;
if (fam == AF_UNSPEC) { if (fam == AF_UNSPEC) {
/* "any" or "none" */ /* "any" or "none" */
for (i = 0; i < 2; i++) for (i = 0; i < RADIX_FAMILIES; i++)
new_node->node_num[i] = next; new_node->node_num[i] = next;
} else { } else {
new_node->node_num[ISC_RADIX_OFF(prefix)] = next; new_node->node_num[ISC_RADIX_FAMILY(prefix)] = next;
} }
memset(new_node->data, 0, sizeof(new_node->data)); memset(new_node->data, 0, sizeof(new_node->data));
} }
@@ -580,7 +584,7 @@ isc_radix_insert(isc_radix_tree_t *radix, isc_radix_node_t **target,
glue->bit = differ_bit; glue->bit = differ_bit;
glue->prefix = NULL; glue->prefix = NULL;
glue->parent = node->parent; glue->parent = node->parent;
for (i = 0; i < 2; i++) { for (i = 0; i < RADIX_FAMILIES; i++) {
glue->data[i] = NULL; glue->data[i] = NULL;
glue->node_num[i] = -1; glue->node_num[i] = -1;
} }