예제 #1
0
파일: net.c 프로젝트: fridbergsmar/kore
int
net_send(struct connection *c)
{
	int			r;
	u_int32_t		len, smin;

	c->snb = TAILQ_FIRST(&(c->send_queue));
	if (c->snb->b_len != 0) {
		smin = c->snb->b_len - c->snb->s_off;
		len = MIN(NETBUF_SEND_PAYLOAD_MAX, smin);

		if (!c->write(c, len, &r))
			return (KORE_RESULT_ERROR);
		if (!(c->flags & CONN_WRITE_POSSIBLE))
			return (KORE_RESULT_OK);

		kore_debug("net_send(%p/%d/%d bytes), progress with %d",
		    c->snb, c->snb->s_off, c->snb->b_len, r);

		c->snb->s_off += (size_t)r;
		c->snb->flags &= ~NETBUF_MUST_RESEND;
	}

	if (c->snb->s_off == c->snb->b_len ||
	    (c->snb->flags & NETBUF_FORCE_REMOVE)) {
		net_remove_netbuf(&(c->send_queue), c->snb);
		c->snb = NULL;
	}

	return (KORE_RESULT_OK);
}
예제 #2
0
파일: net.c 프로젝트: jdiego/kore
int
net_send(struct connection *c)
{
	int			r;
	u_int32_t		len, smin;

	c->snb = TAILQ_FIRST(&(c->send_queue));
	if (c->snb->b_len != 0) {
		if (c->snb->stream != NULL &&
		    (c->snb->stream->flags & SPDY_DATAFRAME_PRELUDE)) {
			if (!spdy_dataframe_begin(c)) {
				c->snb = NULL;
				return (KORE_RESULT_OK);
			}

			c->snb = TAILQ_FIRST(&(c->send_queue));
		}

		smin = c->snb->b_len - c->snb->s_off;
		if (c->snb->stream != NULL &&
		    c->snb->stream->frame_size > 0) {
			smin = MIN(smin, c->snb->stream->frame_size);
		}

		len = MIN(NETBUF_SEND_PAYLOAD_MAX, smin);

		if (!c->write(c, len, &r))
			return (KORE_RESULT_ERROR);
		if (!(c->flags & CONN_WRITE_POSSIBLE))
			return (KORE_RESULT_OK);

		kore_debug("net_send(%p/%d/%d bytes), progress with %d",
		    c->snb, c->snb->s_off, c->snb->b_len, r);

		c->snb->s_off += (size_t)r;
		c->snb->flags &= ~NETBUF_MUST_RESEND;
		if (c->snb->stream != NULL)
			spdy_update_wsize(c, c->snb->stream, r);
	}

	if (c->snb->s_off == c->snb->b_len ||
	    (c->snb->flags & NETBUF_FORCE_REMOVE)) {
		net_remove_netbuf(&(c->send_queue), c->snb);
		c->snb = NULL;
	}

	return (KORE_RESULT_OK);
}