bool endpoint_free(NetworkInterface* ni, Endpoint* endpoint) { if(endpoint->protocol == IP_PROTOCOL_TCP) { tcp_port_free(ni, endpoint->addr, endpoint->port); } else if(endpoint->protocol == IP_PROTOCOL_UDP) { udp_port_free(ni, endpoint->addr, endpoint->port); } //delete if port is empty IPv4Interface* interface = ni_ip_get(ni, endpoint->addr); if(set_is_empty(interface->tcp_ports) && set_is_empty(interface->udp_ports)) { ni_ip_remove(ni, endpoint->addr); } __free(endpoint, ni->pool); return true; }
Endpoint* endpoint_alloc(NetworkInterface* ni, uint32_t addr, uint8_t protocol, uint16_t port) { if(!ni_ip_get(ni, addr)) { if(!ni_ip_add(ni, addr)) return NULL; } if(protocol == IP_PROTOCOL_TCP) { if(!tcp_port_alloc0(ni, addr, port)) goto port_alloc_fail; } else if(protocol == IP_PROTOCOL_UDP) { if(!udp_port_alloc0(ni, addr, port)) goto port_alloc_fail; } Endpoint* endpoint = __malloc(sizeof(Endpoint), ni->pool); if(!endpoint) goto endpoint_alloc_fail; endpoint->ni = ni; endpoint->addr = addr; endpoint->protocol = protocol; endpoint->port = port; return endpoint; endpoint_alloc_fail: //port free if(endpoint->protocol == IP_PROTOCOL_TCP) { tcp_port_free(ni, endpoint->addr, endpoint->port); } else if (endpoint->protocol == IP_PROTOCOL_UDP) { udp_port_free(ni, endpoint->addr, endpoint->port); } port_alloc_fail: ; //delete if port is empty IPv4Interface* interface = ni_ip_get(ni, addr); if(set_is_empty(interface->tcp_ports) && set_is_empty(interface->udp_ports)) { ni_ip_remove(ni, addr); } return NULL; }
static flowloop_t * make_loop (flowgraph_t *graph, unsigned n, unsigned d) { flowloop_t *loop = new_loop (); flownode_t *node; set_t *stack = set_new (); set_iter_t *pred; loop->head = d; set_add (loop->nodes, d); insert_loop_node (loop, n, stack); while (!set_is_empty (stack)) { set_iter_t *ss = set_first (stack); unsigned m = ss->element; set_del_iter (ss); set_remove (stack, m); node = graph->nodes[m]; for (pred = set_first (node->predecessors); pred; pred = set_next (pred)) insert_loop_node (loop, pred->element, stack); } set_delete (stack); return loop; }