37 #include "../tas/internal.h" 61 static pthread_mutex_t context_init_mutex = PTHREAD_MUTEX_INITIALIZER;
69 if ((ctx = calloc(1,
sizeof(*ctx))) == NULL) {
70 fprintf(stderr,
"flextcp socket flextcp_sockctx_get: calloc failed\n");
74 pthread_mutex_lock(&context_init_mutex);
76 pthread_mutex_unlock(&context_init_mutex);
78 fprintf(stderr,
"flextcp socket flextcp_sockctx_get: flextcp_context_create " 92 return &flextcp_sockctx_getfull()->ctx;
101 fprintf(stderr,
"sockets poll_ctx: flextcp_context_poll failed\n");
105 for (i = 0; i < num; i++) {
106 switch (evs[i].event_type) {
108 ev_listen_open(ctx, &evs[i]);
112 ev_listen_newconn(ctx, &evs[i]);
116 ev_listen_accept(ctx, &evs[i]);
120 ev_conn_open(ctx, &evs[i]);
124 ev_conn_received(ctx, &evs[i]);
128 ev_conn_sendbuf(ctx, &evs[i]);
132 ev_conn_moved(ctx, &evs[i]);
136 ev_conn_rxclosed(ctx, &evs[i]);
140 ev_conn_txclosed(ctx, &evs[i]);
144 ev_conn_closed(ctx, &evs[i]);
148 fprintf(stderr,
"sockets poll_ctx: unexpected event: %u\n",
162 nevents += flextcp_sockctx_poll(ctx);
163 n = (n >= 16 ? n - 16 : 0);
177 ((uint8_t *) l - offsetof(
struct socket, data.listener.l));
181 assert(s->type == SOCK_LISTENER);
182 assert(s->data.listener.status == SOL_OPENING);
184 s->data.listener.status = SOL_OPEN;
186 s->data.listener.status = SOL_FAILED;
200 ((uint8_t *) l - offsetof(
struct socket, data.listener.l));
204 assert(s->type == SOCK_LISTENER);
206 flextcp_epoll_set(s, EPOLLIN);
219 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
223 assert(s->type == SOCK_CONNECTION);
224 assert(s->data.connection.status == SOC_CONNECTING);
225 sl = s->data.connection.listener;
228 flextcp_epoll_set(sl, EPOLLIN);
231 s->data.connection.status = SOC_CONNECTED;
232 flextcp_epoll_set(s, EPOLLOUT);
234 s->data.connection.status = SOC_FAILED;
235 flextcp_epoll_set(s, EPOLLERR);
249 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
253 assert(s->type == SOCK_CONNECTION);
254 assert(s->data.connection.status == SOC_CONNECTING);
257 s->data.connection.status = SOC_CONNECTED;
258 flextcp_epoll_set(s, EPOLLOUT);
260 s->data.connection.status = SOC_FAILED;
261 flextcp_epoll_set(s, EPOLLERR);
277 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
281 if (s->data.connection.status == SOC_CLOSED) {
286 assert(s->type == SOCK_CONNECTION);
287 assert(s->data.connection.status == SOC_CONNECTED);
292 if (s->data.connection.rx_len_1 == 0) {
294 s->data.connection.rx_len_1 = len;
295 s->data.connection.rx_buf_1 = buf;
296 s->data.connection.rx_len_2 = 0;
297 }
else if (s->data.connection.rx_len_2 == 0 && buf ==
298 (uint8_t *) s->data.connection.rx_buf_1 + s->data.connection.rx_len_1)
301 s->data.connection.rx_len_1 += len;
303 (uint8_t *) s->data.connection.rx_buf_2 + s->data.connection.rx_len_2)
306 s->data.connection.rx_len_2 += len;
310 if (s->data.connection.rx_len_2 != 0) {
311 fprintf(stderr,
"ev_conn_received: More than two non-contiguous " 312 "buffer pieces, this should not happen\n");
316 s->data.connection.rx_len_2 = len;
317 s->data.connection.rx_buf_2 = buf;
320 flextcp_epoll_set(s, EPOLLIN);
334 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
338 assert(s->type == SOCK_CONNECTION);
339 assert(s->data.connection.status == SOC_CONNECTED);
341 flextcp_epoll_set(s, EPOLLOUT);
354 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
358 assert(s->type == SOCK_CONNECTION);
359 assert(s->data.connection.status == SOC_CONNECTED);
361 s->data.connection.move_status = ev->ev.
conn_moved.status;
374 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
378 assert(s->type == SOCK_CONNECTION);
379 assert(s->data.connection.status == SOC_CONNECTED ||
380 s->data.connection.status == SOC_CLOSED);
382 s->data.connection.st_flags |= CSTF_RXCLOSED;
383 flextcp_epoll_set(s, EPOLLIN | EPOLLRDHUP);
385 if (s->data.connection.status == SOC_CLOSED &&
386 (s->data.connection.st_flags & CSTF_TXCLOSED_ACK))
390 flextcp_sockclose_finish(ctx, s);
404 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
408 assert(s->type == SOCK_CONNECTION);
409 assert(s->data.connection.status == SOC_CONNECTED ||
410 s->data.connection.status == SOC_CLOSED);
412 s->data.connection.st_flags |= CSTF_TXCLOSED_ACK;
414 if (s->data.connection.status == SOC_CLOSED &&
415 (s->data.connection.st_flags & CSTF_RXCLOSED))
419 flextcp_sockclose_finish(ctx, s);
433 ((uint8_t *) c - offsetof(
struct socket, data.connection.c));
437 assert(s->type == SOCK_CONNECTION);
438 assert(s->data.connection.status == SOC_CLOSED);
struct flextcp_event::@5::@12 conn_rxclosed
int flextcp_context_poll(struct flextcp_context *ctx, int num, struct flextcp_event *events)
int flextcp_context_create(struct flextcp_context *ctx)
struct flextcp_event::@5::@8 listen_accept
struct flextcp_event::@5::@9 conn_open
struct flextcp_event::@5::@15 conn_closed
struct flextcp_event::@5::@10 conn_received
struct flextcp_event::@5::@6 listen_open
Public low-level application interface for TAS.
struct flextcp_event::@5::@13 conn_txclosed
struct flextcp_event::@5::@7 listen_newconn
struct flextcp_event::@5::@14 conn_moved
struct flextcp_event::@5::@11 conn_sendbuf