예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}