search added
This commit is contained in:
parent
6474eb8a5d
commit
9d2d565657
|
@ -11,13 +11,13 @@ radix_node_t create_node(ipv6_t key, unsigned end_bit, unsigned rule) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline radix_node_t clone_node(radix_node_t n) {
|
static radix_node_t clone_node(radix_node_t n) {
|
||||||
radix_node_t ret = calloc(1, sizeof(struct radix_node));
|
radix_node_t ret = calloc(1, sizeof(struct radix_node));
|
||||||
memcpy(ret, n, sizeof(struct radix_node));
|
memcpy(ret, n, sizeof(struct radix_node));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void split_node(radix_node_t n, unsigned bit) {
|
static void split_node(radix_node_t n, unsigned bit) {
|
||||||
radix_node_t tmp = clone_node(n);
|
radix_node_t tmp = clone_node(n);
|
||||||
n->_ip_end_bit = bit;
|
n->_ip_end_bit = bit;
|
||||||
n->_l = n->_r = tmp;
|
n->_l = n->_r = tmp;
|
||||||
|
@ -100,7 +100,28 @@ int radix_insert(radix_holder_t t, ipv6_t key, int val, int mask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int radix_search(radix_holder_t t, ipv6_t key) {
|
int radix_search(radix_holder_t t, ipv6_t key) {
|
||||||
|
unsigned char b;
|
||||||
|
int ret = INVALID_RULE;
|
||||||
|
radix_node_t iter = t->_root;
|
||||||
|
int ibit = 0;
|
||||||
|
if (!iter)
|
||||||
|
return INVALID_RULE;
|
||||||
|
|
||||||
|
|
||||||
|
for (;ibit < 128; ++ibit) {
|
||||||
|
b = GET_BIT(key, ibit);
|
||||||
|
if (ibit < iter->_ip_end_bit &&
|
||||||
|
b == GET_BIT(iter->_ip, ibit))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ibit == iter->_ip_end_bit) /* set result if full match */
|
||||||
|
ret = iter->_rule_valid ? iter->_rule : ret;
|
||||||
|
|
||||||
|
iter = b ? iter->_l : iter->_r;
|
||||||
|
if (!iter)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,7 +133,7 @@ int radix_search(radix_holder_t t, ipv6_t key) {
|
||||||
|
|
||||||
#define RULES_FILE "../data/routing-data"
|
#define RULES_FILE "../data/routing-data"
|
||||||
#define TEST_FILE "../data/test-data"
|
#define TEST_FILE "../data/test-data"
|
||||||
#define TEST_ROWS 5721
|
#define TEST_ROWS 5527
|
||||||
#define READ_MODE "r"
|
#define READ_MODE "r"
|
||||||
|
|
||||||
int parse_line(ipv6_t* key, int* val, int* mask, FILE* f) { /*! assumes only good input */
|
int parse_line(ipv6_t* key, int* val, int* mask, FILE* f) { /*! assumes only good input */
|
||||||
|
@ -201,10 +222,9 @@ int main() {
|
||||||
radix_holder_t t = create_holder();
|
radix_holder_t t = create_holder();
|
||||||
|
|
||||||
printf("Loaded %d rules\n", load_input(t) );
|
printf("Loaded %d rules\n", load_input(t) );
|
||||||
/*
|
|
||||||
printf("Loaded %d tests\n", load_tests(&ips, &ref) );
|
printf("Loaded %d tests\n", load_tests(&ips, &ref) );
|
||||||
printf("%d tests wrong\n", fire_tests(t, ips, ref, TEST_ROWS) );
|
printf("%d tests wrong\n", fire_tests(t, ips, ref, TEST_ROWS) );
|
||||||
*/
|
|
||||||
destory_holder(t);
|
destory_holder(t);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in New Issue