31 #include <kernel_appif.h> 45 uint32_t pos = ctx->kin_head;
49 memset(lst, 0,
sizeof(*lst));
51 if ((flags & ~(FLEXTCP_LISTEN_REUSEPORT)) != 0) {
52 fprintf(stderr,
"flextcp_listen_open: unknown flags (%x)\n", flags);
56 if ((flags & FLEXTCP_LISTEN_REUSEPORT) == FLEXTCP_LISTEN_REUSEPORT) {
57 f |= KERNEL_APPOUT_LISTEN_REUSEPORT;
62 if (kin->type != KERNEL_APPOUT_INVALID) {
63 fprintf(stderr,
"flextcp_listen_open: no queue space\n");
68 lst->local_port = port;
71 kin->data.listen_open.opaque = OPAQUE(lst);
72 kin->data.listen_open.local_port = port;
73 kin->data.listen_open.backlog = backlog;
74 kin->data.listen_open.flags = f;
76 kin->type = KERNEL_APPOUT_LISTEN_OPEN;
77 flextcp_kernel_kick();
80 if (pos >= ctx->kin_len) {
92 uint32_t pos = ctx->kin_head;
95 connection_init(conn);
99 if (kin->type != KERNEL_APPOUT_INVALID) {
100 fprintf(stderr,
"flextcp_listen_accept: no queue space\n");
104 conn->status = CONN_ACCEPT_REQUESTED;
105 conn->local_port = lst->local_port;
107 kin->data.accept_conn.listen_opaque = OPAQUE(lst);
108 kin->data.accept_conn.conn_opaque = OPAQUE(conn);
109 kin->data.accept_conn.local_port = lst->local_port;
111 kin->type = KERNEL_APPOUT_ACCEPT_CONN;
112 flextcp_kernel_kick();
115 if (pos >= ctx->kin_len) {
126 uint32_t pos = ctx->kin_head, f = 0;
129 connection_init(conn);
133 if (kin->type != KERNEL_APPOUT_INVALID) {
134 fprintf(stderr,
"flextcp_connection_open: no queue space\n");
138 conn->status = CONN_OPEN_REQUESTED;
139 conn->remote_ip = dst_ip;
140 conn->remote_port = dst_port;
142 kin->data.conn_open.opaque = OPAQUE(conn);
143 kin->data.conn_open.remote_ip = dst_ip;
144 kin->data.conn_open.remote_port = dst_port;
145 kin->data.conn_open.flags = f;
147 kin->type = KERNEL_APPOUT_CONN_OPEN;
148 flextcp_kernel_kick();
151 if (pos >= ctx->kin_len) {
164 uint32_t pos = ctx->kin_head, f = 0;
169 if (conn->bump_pending != 0) {
170 if (conn == ctx->bump_pending_first) {
171 ctx->bump_pending_first = conn->bump_next;
173 for (p_c = ctx->bump_pending_first;
174 p_c != NULL && p_c->bump_next != conn;
175 p_c = p_c->bump_next);
178 fprintf(stderr,
"connection_close: didn't find connection in " 183 p_c->bump_next = conn->bump_next;
184 if (p_c->bump_next == NULL) {
185 ctx->bump_pending_last = p_c;
189 conn->bump_pending = 0;
194 if (kin->type != KERNEL_APPOUT_INVALID) {
195 fprintf(stderr,
"connection_close: no queue space\n");
202 conn->status = CONN_CLOSE_REQUESTED;
204 kin->data.conn_close.opaque = (uintptr_t) conn;
205 kin->data.conn_close.remote_ip = conn->remote_ip;
206 kin->data.conn_close.remote_port = conn->remote_port;
207 kin->data.conn_close.local_ip = conn->local_ip;
208 kin->data.conn_close.local_port = conn->local_port;
209 kin->data.conn_close.flags = f;
211 kin->type = KERNEL_APPOUT_CONN_CLOSE;
212 flextcp_kernel_kick();
215 if (pos >= ctx->kin_len) {
235 if(conn->
rxb_bump > conn->rxb_len / 4) {
236 conn_mark_bump(ctx, conn);
249 if ((conn->flags & CONN_FLAG_TXEOS) == CONN_FLAG_TXEOS)
253 avail = conn_tx_allocbytes(conn);
260 if (head >= conn->txb_len) {
261 head -= conn->txb_len;
265 if (head + len > conn->txb_len) {
266 len = conn->txb_len - head;
269 *buf = conn->txb_base + head;
278 void **buf_1,
size_t *len_1,
void **buf_2)
280 uint32_t avail, head;
283 if ((conn->flags & CONN_FLAG_TXEOS) == CONN_FLAG_TXEOS)
287 avail = conn_tx_allocbytes(conn);
294 if (head >= conn->txb_len) {
295 head -= conn->txb_len;
298 *buf_1 = conn->txb_base + head;
301 if (head + len > conn->txb_len) {
302 *len_1 = conn->txb_len - head;
303 *buf_2 = conn->txb_base;
319 if (conn_tx_sendbytes(conn) < len) {
327 if (next_head >= conn->txb_len) {
328 next_head -= conn->txb_len;
333 conn_mark_bump(ctx, conn);
341 if (conn_tx_sendbytes(conn) > 0) {
342 fprintf(stderr,
"flextcp_connection_tx_close: has unsent data\n");
347 if ((conn->flags & CONN_FLAG_TXEOS) == CONN_FLAG_TXEOS) {
348 fprintf(stderr,
"flextcp_connection_tx_close: already closed\n");
352 conn->flags |= CONN_FLAG_TXEOS;
355 flextcp_conn_pushtxeos(ctx, conn);
364 assert(conn_tx_sendbytes(conn) == 0);
365 assert((conn->flags & CONN_FLAG_TXEOS));
368 if (conn_tx_allocbytes(conn) == 0) {
374 if (head >= conn->txb_len) {
375 head -= conn->txb_len;
379 conn->flags |= CONN_FLAG_TXEOS_ALLOC;
382 conn_mark_bump(ctx, conn);
394 return conn_tx_allocbytes(conn);
400 uint32_t pos = ctx->kin_head;
405 if (kin->type != KERNEL_APPOUT_INVALID) {
406 fprintf(stderr,
"flextcp_connection_move: no queue space\n");
410 kin->data.conn_move.local_ip = conn->local_ip;
411 kin->data.conn_move.remote_ip = conn->remote_ip;
412 kin->data.conn_move.local_port = conn->local_port;
413 kin->data.conn_move.remote_port = conn->remote_port;
414 kin->data.conn_move.db_id = ctx->db_id;
415 kin->data.conn_move.opaque = OPAQUE(conn);
417 kin->type = KERNEL_APPOUT_CONN_MOVE;
418 flextcp_kernel_kick();
421 if (pos >= ctx->kin_len) {
431 memset(conn, 0,
sizeof(*conn));
440 if (conn->bump_pending) {
444 c_prev = ctx->bump_pending_last;
445 conn->bump_next = NULL;
446 conn->bump_prev = c_prev;
447 if (c_prev != NULL) {
448 c_prev->bump_next = conn;
450 ctx->bump_pending_first = conn;
452 ctx->bump_pending_last = conn;
454 conn->bump_pending = 1;
int flextcp_connection_tx_send(struct flextcp_context *ctx, struct flextcp_connection *conn, size_t len)
int flextcp_listen_open(struct flextcp_context *ctx, struct flextcp_listener *lst, uint16_t port, uint32_t backlog, uint32_t flags)
int flextcp_connection_rx_done(struct flextcp_context *ctx, struct flextcp_connection *conn, size_t len)
int flextcp_connection_tx_close(struct flextcp_context *ctx, struct flextcp_connection *conn)
int flextcp_connection_close(struct flextcp_context *ctx, struct flextcp_connection *conn)
Public low-level application interface for TAS.
int flextcp_connection_move(struct flextcp_context *ctx, struct flextcp_connection *conn)
ssize_t flextcp_connection_tx_alloc2(struct flextcp_connection *conn, size_t len, void **buf_1, size_t *len_1, void **buf_2)
int flextcp_connection_tx_possible(struct flextcp_context *ctx, struct flextcp_connection *conn)
int flextcp_connection_open(struct flextcp_context *ctx, struct flextcp_connection *conn, uint32_t dst_ip, uint16_t dst_port)
ssize_t flextcp_connection_tx_alloc(struct flextcp_connection *conn, size_t len, void **buf)
int flextcp_listen_accept(struct flextcp_context *ctx, struct flextcp_listener *lst, struct flextcp_connection *conn)