mirror of
https://github.com/ntop/ntopng.git
synced 2026-05-20 09:03:24 +00:00
AddressTree now supports mac addresses
This commit is contained in:
parent
64ab94910e
commit
6fa12fc08f
4 changed files with 86 additions and 30 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue