}
- // disconnect suboptimal outgoing connections
-
- if(min_connects < cur_connects && cur_connects <= max_connects)
- {
- unsigned int connects = 0;
-
- for(int devclass = 0; devclass <= mesh->devclass; ++devclass)
- {
- for list_each(connection_t, c, mesh->connections)
- {
- if(!c->status.remove_unused && c->node && c->node->devclass == devclass)
- { connects += 1; }
- }
-
- if( min_connects < connects )
- {
- splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_desc, NULL);
-
- for list_each(connection_t, c, mesh->connections)
- {
- if(!c->status.remove_unused && c->outgoing && c->node && c->node->devclass >= devclass)
- { splay_insert(nodes, c->node); }
- }
-
- if(nodes->head)
- {
- logger(mesh, MESHLINK_INFO, "* disconnect suboptimal outgoing connection");
- disconnect_from = (node_t*)nodes->head->data;
- }
-
- splay_free_tree(nodes);
- break;
- }
- }
-
- if(!disconnect_from)
- { logger(mesh, MESHLINK_INFO, "* no suboptimal outgoing connections"); }
- }
-
-
- // disconnect connections (too many connections)
-
- if(!disconnect_from && max_connects < cur_connects)
- {
- splay_tree_t *nodes = splay_alloc_tree(node_compare_devclass_desc, NULL);
-
- for list_each(connection_t, c, mesh->connections)
- {
- if(!c->status.remove_unused && c->node)
- { splay_insert(nodes, c->node); }
- }
-
- if(nodes->head)
- {
- logger(mesh, MESHLINK_INFO, "* disconnect connection (too many connections)");
-
- //timeout = 0;
- disconnect_from = (node_t*)nodes->head->data;
- }
- else
- { logger(mesh, MESHLINK_INFO, "* no node we want to disconnect, even though we have too many connections"); }
-
- splay_free_tree(nodes);
- }
-
-
- // perform disconnect
-
- if(disconnect_from && disconnect_from->connection)
- {
- logger(mesh, MESHLINK_INFO, "Autodisconnecting from %s", disconnect_from->connection->name);
- list_delete(mesh->outgoings, disconnect_from->connection->outgoing);
- disconnect_from->connection->outgoing = NULL;
- terminate_connection(mesh, disconnect_from->connection, disconnect_from->connection->status.active);
- }
// done!