AddressTree now supports mac addresses

This commit is contained in:
Luca 2016-12-21 22:56:42 +01:00
parent 64ab94910e
commit 6fa12fc08f
4 changed files with 86 additions and 30 deletions

View file

@ -27,13 +27,38 @@
AddressTree::AddressTree() {
numAddresses = 0;
ptree_v4 = New_Patricia(32), ptree_v6 = New_Patricia(128);
ptree_v4 = New_Patricia(32), ptree_v6 = New_Patricia(128), ptree_mac = New_Patricia(48);
}
/* **************************************** */
static void free_ptree_data(void *data) { ; }
/* **************************************** */
AddressTree::~AddressTree() {
if(ptree_v4) Destroy_Patricia(ptree_v4, free_ptree_data);
if(ptree_v6) Destroy_Patricia(ptree_v6, free_ptree_data);
if(ptree_mac) Destroy_Patricia(ptree_mac, free_ptree_data);
}
/* ******************************************* */
patricia_tree_t* AddressTree::getPatricia(char* what) {
u_int32_t _mac[6];
if(sscanf(what, "%02X:%02X:%02X:%02X:%02X:%02X",
&_mac[0], &_mac[1], &_mac[2],
&_mac[3], &_mac[4], &_mac[5]) == 6)
return(ptree_mac);
else
return(strchr(what, '.') ? ptree_v4 : ptree_v6);
}
/* ******************************************* */
bool AddressTree::removeAddress(char *net) {
bool rc = Utils::ptree_remove_rule(strchr(net, '.') ? ptree_v4 : ptree_v6, net) == 1 ? false /* not found */ : true /* found */;
bool rc = Utils::ptree_remove_rule(getPatricia(net), net) == 1 ? false /* not found */ : true /* found */;
if(rc) numAddresses--;
@ -43,7 +68,7 @@ bool AddressTree::removeAddress(char *net) {
/* ******************************************* */
patricia_node_t* AddressTree::addAddress(char *_net) {
patricia_node_t *node = Utils::ptree_add_rule(strchr(_net, '.') ? ptree_v4 : ptree_v6, _net);
patricia_node_t *node = Utils::ptree_add_rule(getPatricia(_net), _net);
if(node) node->user_data = numAddresses++;
return(node);
@ -78,17 +103,6 @@ int16_t AddressTree::findAddress(int family, void *addr) {
return(node->user_data);
}
/* **************************************** */
static void free_ptree_data(void *data) { ; }
/* **************************************** */
AddressTree::~AddressTree() {
if(ptree_v4) Destroy_Patricia(ptree_v4, free_ptree_data);
if(ptree_v6) Destroy_Patricia(ptree_v6, free_ptree_data);
}
/* **************************************************** */
static void address_tree_dump_funct(prefix_t *prefix, void *data, void *user_data) {
@ -96,17 +110,23 @@ static void address_tree_dump_funct(prefix_t *prefix, void *data, void *user_dat
if(!prefix) return;
if(prefix->family == AF_INET) {
// if((prefix->bitlen == 0) || (prefix->bitlen == 32)) return;
switch(prefix->family) {
case AF_INET:
a = Utils::intoaV4(ntohl(prefix->add.sin.s_addr), address, sizeof(address));
} else {
// if((prefix->bitlen == 0) || (prefix->bitlen == 128)) return;
snprintf(ret, sizeof(ret), "%s/%d", a, prefix->bitlen);
break;
case AF_INET6:
a = Utils::intoaV6(*((struct ndpi_in6_addr*)&prefix->add.sin6), prefix->bitlen, address, sizeof(address));
}
snprintf(ret, sizeof(ret), "%s/%d", a, prefix->bitlen);
break;
snprintf(ret, sizeof(ret), "%s/%d", a, prefix->bitlen);
default: /* Mac */
snprintf(ret, sizeof(ret), "%02X:%02X:%02X:%02X:%02X:%02X",
prefix->add.mac[0], prefix->add.mac[1], prefix->add.mac[2],
prefix->add.mac[3], prefix->add.mac[4], prefix->add.mac[5]);
break;
}
if(user_data)
lua_push_str_table_entry((lua_State*)user_data, ret, (char*)"");
@ -117,14 +137,16 @@ static void address_tree_dump_funct(prefix_t *prefix, void *data, void *user_dat
/* **************************************************** */
void AddressTree::getAddresses(lua_State* vm) {
if(ptree_v4->head) patricia_walk_inorder(ptree_v4->head, address_tree_dump_funct, vm);
if(ptree_v6->head) patricia_walk_inorder(ptree_v6->head, address_tree_dump_funct, vm);
if(ptree_v4->head) patricia_walk_inorder(ptree_v4->head, address_tree_dump_funct, vm);
if(ptree_v6->head) patricia_walk_inorder(ptree_v6->head, address_tree_dump_funct, vm);
if(ptree_mac->head) patricia_walk_inorder(ptree_mac->head, address_tree_dump_funct, vm);
}
/* **************************************************** */
void AddressTree::dump() {
if(ptree_v4->head) patricia_walk_inorder(ptree_v4->head, address_tree_dump_funct, NULL);
if(ptree_v6->head) patricia_walk_inorder(ptree_v6->head, address_tree_dump_funct, NULL);
if(ptree_v4->head) patricia_walk_inorder(ptree_v4->head, address_tree_dump_funct, NULL);
if(ptree_v6->head) patricia_walk_inorder(ptree_v6->head, address_tree_dump_funct, NULL);
if(ptree_mac->head) patricia_walk_inorder(ptree_mac->head, address_tree_dump_funct, NULL);
}