mirror of
https://github.com/bgp/bgpq4
synced 2025-02-28 08:53:11 +00:00
@@ -229,7 +229,7 @@ bgpq_expander_add_prefix(struct bgpq_expander *b, char *prefix)
|
|||||||
sx_radix_tree_insert(b->tree, p);
|
sx_radix_tree_insert(b->tree, p);
|
||||||
|
|
||||||
if (p)
|
if (p)
|
||||||
sx_prefix_destroy(p);
|
sx_prefix_free(p);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -1113,7 +1113,7 @@ sx_radix_node_freeall(struct sx_radix_node *n) {
|
|||||||
if (n->payload)
|
if (n->payload)
|
||||||
free(n->payload);
|
free(n->payload);
|
||||||
|
|
||||||
sx_prefix_destroy(n->prefix);
|
sx_prefix_free(n->prefix);
|
||||||
|
|
||||||
free(n);
|
free(n);
|
||||||
}
|
}
|
||||||
|
|||||||
49
sx_prefix.c
49
sx_prefix.c
@@ -259,28 +259,19 @@ sx_prefix_setbit(struct sx_prefix *p, int n)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sx_radix_tree_insert_specifics(struct sx_radix_tree *t, struct sx_prefix *p,
|
sx_radix_tree_insert_specifics(struct sx_radix_tree *t, struct sx_prefix p,
|
||||||
unsigned min, unsigned max)
|
unsigned min, unsigned max)
|
||||||
{
|
{
|
||||||
struct sx_prefix *np;
|
if (p.masklen >= min)
|
||||||
struct sx_radix_node *nn;
|
sx_radix_tree_insert(t, &p);
|
||||||
|
|
||||||
np = sx_prefix_alloc(p);
|
if (p.masklen + 1 > max)
|
||||||
|
|
||||||
if (np->masklen >= min) {
|
|
||||||
nn = sx_radix_tree_insert(t, np);
|
|
||||||
sx_prefix_free(np);
|
|
||||||
np = nn->prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (np->masklen + 1 > max)
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
p.masklen += 1;
|
||||||
np->masklen += 1;
|
sx_radix_tree_insert_specifics(t, p, min, max);
|
||||||
sx_radix_tree_insert_specifics(t, np, min, max);
|
sx_prefix_setbit(&p, p.masklen);
|
||||||
sx_prefix_setbit(np, np->masklen);
|
sx_radix_tree_insert_specifics(t, p, min, max);
|
||||||
sx_radix_tree_insert_specifics(t, np, min, max);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -289,18 +280,16 @@ int
|
|||||||
sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
|
sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
|
||||||
char *text)
|
char *text)
|
||||||
{
|
{
|
||||||
char *d = strchr(text, '^');
|
struct sx_prefix p;
|
||||||
struct sx_prefix *p;
|
|
||||||
unsigned long min, max = 0;
|
unsigned long min, max = 0;
|
||||||
|
char *d = strchr(text, '^');
|
||||||
p = sx_prefix_alloc(NULL);
|
|
||||||
|
|
||||||
if (!d || !d[1])
|
if (!d || !d[1])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*d = 0;
|
*d = 0;
|
||||||
|
|
||||||
if (!sx_prefix_parse(p, 0, text)) {
|
if (!sx_prefix_parse(&p, 0, text)) {
|
||||||
sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text,
|
sx_report(SX_ERROR, "Unable to parse prefix %s^%s\n", text,
|
||||||
d + 1);
|
d + 1);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -308,23 +297,23 @@ sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
|
|||||||
|
|
||||||
*d = '^';
|
*d = '^';
|
||||||
|
|
||||||
if (af && p->family != af) {
|
if (af && p.family != af) {
|
||||||
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
|
sx_report(SX_ERROR, "Ignoring prefix %s, wrong af %i\n", text,
|
||||||
p->family);
|
p.family);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxlen && p->masklen > maxlen) {
|
if (maxlen && p.masklen > maxlen) {
|
||||||
SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max"
|
SX_DEBUG(debug_expander, "Ignoring prefix %s, masklen %i > max"
|
||||||
" masklen %u\n", text, p->masklen, maxlen);
|
" masklen %u\n", text, p.masklen, maxlen);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d[1] == '-') {
|
if (d[1] == '-') {
|
||||||
min = p->masklen + 1;
|
min = p.masklen + 1;
|
||||||
max = maxlen;
|
max = maxlen;
|
||||||
} else if (d[1] == '+') {
|
} else if (d[1] == '+') {
|
||||||
min = p->masklen;
|
min = p.masklen;
|
||||||
max = maxlen;
|
max = maxlen;
|
||||||
} else if (isdigit(d[1])) {
|
} else if (isdigit(d[1])) {
|
||||||
char *dm = NULL;
|
char *dm = NULL;
|
||||||
@@ -341,9 +330,9 @@ sx_prefix_range_parse(struct sx_radix_tree *tree, int af, unsigned int maxlen,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (min < p->masklen) {
|
if (min < p.masklen) {
|
||||||
sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < "
|
sx_report(SX_ERROR, "Invalid prefix-range %s: min %lu < "
|
||||||
"masklen %u\n", text, min, p->masklen);
|
"masklen %u\n", text, min, p.masklen);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user