+ for(dev_class_t devclass = 0; devclass <= mesh->devclass; ++devclass) {
+ for list_each(connection_t, c, mesh->connections) {
+ if(c->status.active && 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->outgoing && c->node && c->node->devclass >= devclass) {
+ splay_insert(nodes, c->node);
+ }
+ }
+
+ if(nodes->head) {
+ logger(mesh, MESHLINK_DEBUG, "* disconnect suboptimal outgoing connection");
+ disconnect_from = (node_t *)nodes->head->data;
+ }
+
+ splay_delete_tree(nodes);
+ break;
+ }
+ }
+
+ if(!disconnect_from) {
+ logger(mesh, MESHLINK_DEBUG, "* 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.active && c->node) {
+ splay_insert(nodes, c->node);
+ }
+ }
+
+ if(nodes->head) {
+ logger(mesh, MESHLINK_DEBUG, "* disconnect connection (too many connections)");
+
+ //timeout = 0;
+ disconnect_from = (node_t *)nodes->head->data;
+ } else {
+ logger(mesh, MESHLINK_DEBUG, "* no node we want to disconnect, even though we have too many connections");
+ }