Esempio n. 1
0
static void
accept_cb(struct ev_loop *loop, ev_uinet *w, int revents)
{
	struct passive_context *passive = w->data;
	struct uinet_socket *newso = NULL;
	struct uinet_socket *newpeerso = NULL;
	struct connection_context *conn = NULL;
	struct connection_context *peerconn = NULL;
	int error;
	int batch_limit = 32;
	int processed = 0;

	while ((processed < batch_limit) &&
	       (UINET_EWOULDBLOCK != (error = uinet_soaccept(w->so, NULL, &newso)))) {
		processed++;

		if (0 == error) {
			newpeerso = NULL;
			conn = NULL;
			peerconn = NULL;

			if (passive->verbose)
				printf("accept succeeded\n");

			conn = create_conn(passive, newso, 1);
			if (NULL == conn)
				goto fail;

			newpeerso = uinet_sogetpassivepeer(newso);
			peerconn = create_conn(passive, newpeerso, 0);
			if (NULL == peerconn)
				goto fail;

			conn->peer = peerconn;
			peerconn->peer = conn;
			
			ev_uinet_start(loop, &conn->watcher);

			if (!passive->extract)
				ev_uinet_start(loop, &peerconn->watcher);

			passive->interface->num_sockets += 2;

			continue;
		fail:
			if (conn) destroy_conn(conn);
			if (newso) uinet_soclose(newso);
			if (newpeerso) uinet_soclose(newpeerso);
		}
	}

	if (processed > passive->interface->max_accept_batch)
		passive->interface->max_accept_batch = processed;
}
Esempio n. 2
0
static void
echo_accept_cb(struct ev_loop *loop, ev_uinet *w, int revents)
{
	struct uinet_demo_echo *echo = w->data;
	struct uinet_socket *newso = NULL;
	struct ev_uinet_ctx *soctx = NULL;
	struct echo_connection *conn = NULL;
	int error;

	if (0 != (error = uinet_soaccept(w->so, NULL, &newso))) {
		printf("%s: Accept failed (%d)\n", echo->cfg.name, error);
	} else {
		if (echo->cfg.verbose)
			printf("%s: Accept succeeded\n", echo->cfg.name);
		
		soctx = ev_uinet_attach(newso);
		if (NULL == soctx) {
			printf("%s: Failed to alloc libev context for new connection\n",
			       echo->cfg.name);
			goto fail;
		}

		conn = malloc(sizeof(*conn));
		if (NULL == conn) {
			printf("%s: Failed to alloc new connection context\n",
			       echo->cfg.name);
			goto fail;
		}
		conn->echo = echo;
		conn->id = echo->next_id++;
		conn->verbose = echo->cfg.verbose;

		ev_init(&conn->connected_watcher, echo_connected_cb);
		ev_uinet_set(&conn->connected_watcher, soctx, EV_WRITE);
		conn->connected_watcher.data = conn;
		if (conn->verbose || (echo->cfg.copy_mode & UINET_IP_COPY_MODE_MAYBE))
			ev_uinet_start(loop, &conn->connected_watcher);

		ev_init(&conn->watcher, echo_cb);
		ev_uinet_set(&conn->watcher, soctx, EV_READ);
		conn->watcher.data = conn;
		ev_uinet_start(loop, &conn->watcher);
	}

	return;

fail:
	if (conn) free(conn);
	if (soctx) ev_uinet_detach(soctx);
	if (newso) uinet_soclose(newso);
}
Esempio n. 3
0
static void
accept_cb(struct ev_loop *loop, ev_uinet *w, int revents)
{
	struct echo_context *echo = w->data;
	struct uinet_socket *newso = NULL;
	struct connection_context *conn = NULL;
	struct ev_uinet_ctx *soctx = NULL;
	int error;

	if (0 != (error = uinet_soaccept(w->so, NULL, &newso))) {
		printf("accept failed (%d)\n", error);
	} else {
		printf("accept succeeded\n");
		
		soctx = ev_uinet_attach(newso);
		if (NULL == soctx) {
			printf("Failed to alloc libev context for new connection socket\n");
			goto fail;
		}

		conn = malloc(sizeof(*conn));
		if (NULL == conn) {
			printf("Failed to alloc connection context for new connection\n");
			goto fail;
		}

		ev_init(&conn->watcher, echo_cb);
		ev_uinet_set(&conn->watcher, soctx, EV_READ);
		conn->watcher.data = conn;
		ev_uinet_start(loop, &conn->watcher);
	}

	return;
fail:
	if (conn) free(conn);
	if (soctx) ev_uinet_detach(soctx);
	if (newso) uinet_soclose(newso);
}
Esempio n. 4
0
static void
passive_accept_cb(struct ev_loop *loop, ev_uinet *w, int revents)
{
	struct uinet_demo_passive *passive = w->data;
	struct uinet_socket *newso = NULL;
	struct uinet_socket *newpeerso = NULL;
	struct passive_connection *conn = NULL;
	struct passive_connection *peerconn = NULL;
	int error;
	unsigned int batch_limit = 32;
	unsigned int processed = 0;

	while ((processed < batch_limit) &&
	       (UINET_EWOULDBLOCK != (error = uinet_soaccept(w->so, NULL, &newso)))) {
		processed++;

		if (0 == error) {
			newpeerso = NULL;
			conn = NULL;
			peerconn = NULL;

			if (passive->cfg.verbose)
				printf("%s: Accept succeeded\n", passive->cfg.name);

			conn = create_conn(passive, newso, 1);
			if (NULL == conn) {
				printf("%s: Failed to alloc new connection context\n",
				       passive->cfg.name);
				goto fail;
			}

			newpeerso = uinet_sogetpassivepeer(newso);
			peerconn = create_conn(passive, newpeerso, 0);
			if (NULL == peerconn) {
				printf("%s: Failed to alloc new peer connection context\n",
				       passive->cfg.name);
				goto fail;
			}

			conn->peer = peerconn;
			peerconn->peer = conn;
			
			ev_uinet_start(loop, &conn->watcher);
			ev_uinet_start(loop, &peerconn->watcher);

			if (conn->verbose || (passive->cfg.copy_mode & UINET_IP_COPY_MODE_MAYBE))
				ev_uinet_start(loop, &conn->connected_watcher);

			if (peerconn->verbose || (passive->cfg.copy_mode & UINET_IP_COPY_MODE_MAYBE))
				ev_uinet_start(loop, &peerconn->connected_watcher);

			passive->num_sockets += 2;

			continue;
		fail:
			if (conn) destroy_conn(conn);
			if (newso) uinet_soclose(newso);
			if (newpeerso) uinet_soclose(newpeerso);
		}
	}

	if (processed > passive->max_accept_batch)
		passive->max_accept_batch = processed;
}
Esempio n. 5
0
static void
nproxy_accept_cb(struct ev_loop *loop, ev_uinet *w, int revents)
{
	struct uinet_demo_nproxy *nproxy = w->data;
	struct uinet_socket *newso = NULL;
	struct ev_uinet_ctx *soctx = NULL;
	struct nproxy_splice *splice = NULL;
	int error;

	if (0 != (error = uinet_soaccept(w->so, NULL, &newso))) {
		printf("%s: Accept failed (%d)\n", nproxy->cfg.name, error);
	} else {
		if (nproxy->cfg.verbose)
			printf("%s: Accept succeeded\n", nproxy->cfg.name);
		
		soctx = ev_uinet_attach(newso);
		if (NULL == soctx) {
			printf("%s: Failed to alloc libev context for new splice\n",
			       nproxy->cfg.name);
			goto fail;
		}

		splice = malloc(sizeof(*splice));
		if (NULL == splice) {
			printf("%s: Failed to alloc new splice context\n",
			       nproxy->cfg.name);
			goto fail;
		}
		splice->nproxy = nproxy;
		splice->id = nproxy->next_id++;
		splice->verbose = nproxy->cfg.verbose;
		splice->inbound.name = "inbound";
		splice->inbound.splice = splice;
		splice->inbound.other_side = &splice->outbound;
		splice->outbound.name = "outbound";
		splice->outbound.splice = splice;
		splice->outbound.other_side = &splice->inbound;
		
		ev_init(&splice->inbound.connected_watcher, nproxy_inbound_connected_cb);
		ev_uinet_set(&splice->inbound.connected_watcher, soctx, EV_WRITE);
		splice->inbound.connected_watcher.data = splice;
		ev_uinet_start(loop, &splice->inbound.connected_watcher);

		ev_init(&splice->inbound.writable_watcher, nproxy_writable_cb);
		ev_uinet_set(&splice->inbound.writable_watcher, soctx, EV_WRITE);
		splice->inbound.writable_watcher.data = &splice->inbound;
		/* will be started as necessary by the outbound copy watcher */

		ev_init(&splice->inbound.copy_watcher, nproxy_copy_cb);
		ev_uinet_set(&splice->inbound.copy_watcher, soctx, EV_READ);
		splice->inbound.copy_watcher.data = &splice->inbound;
		/* will be started when the outbound connection is established */
	}

	return;

fail:
	if (splice) free(splice);
	if (soctx) ev_uinet_detach(soctx);
	if (newso) uinet_soclose(newso);
}