53 assert(ctx->evfd != 0);
54 notify_app_core(ctx->evfd, &ctx->last_ts);
61 uint32_t kout_pos = ctx->kout_pos;
66 if (kout->type != KERNEL_APPIN_INVALID) {
67 fprintf(stderr,
"appif_conn_opened: No space in kout queue (TODO)\n");
71 kout->data.conn_opened.opaque = c->
opaque;
72 kout->data.conn_opened.status = status;
74 kout->data.conn_opened.rx_off = c->
rx_buf - (uint8_t *) tas_shm;
75 kout->data.conn_opened.tx_off = c->
tx_buf - (uint8_t *) tas_shm;
76 kout->data.conn_opened.rx_len = c->
rx_len;
77 kout->data.conn_opened.tx_len = c->
tx_len;
80 kout->data.conn_opened.seq_tx = c->
local_seq;
81 kout->data.conn_opened.local_ip = config.
ip;
82 kout->data.conn_opened.local_port = c->
local_port;
83 kout->data.conn_opened.flow_id = c->
flow_id;
84 kout->data.conn_opened.fn_core = c->
fn_core;
90 kout->type = KERNEL_APPIN_CONN_OPENED;
94 if (kout_pos >= ctx->kout_len) {
97 ctx->kout_pos = kout_pos;
106 uint32_t kout_pos = ctx->kout_pos;
111 if (kout->type != KERNEL_APPIN_INVALID) {
112 fprintf(stderr,
"appif_conn_closed: No space in kout queue (TODO)\n");
116 kout->data.status.opaque = c->
opaque;
117 kout->data.status.status = status;
120 kout->type = KERNEL_APPIN_STATUS_CONN_CLOSE;
124 if (kout_pos >= ctx->kout_len) {
127 ctx->kout_pos = kout_pos;
130 if (app->conns == c) {
133 for (c_i = app->conns; c_i != NULL && c_i->
app_next != c;
136 fprintf(stderr,
"appif_conn_closed: connection not found\n");
144 uint16_t remote_port)
148 uint32_t kout_pos = ctx->kout_pos;
153 if (kout->type != KERNEL_APPIN_INVALID) {
154 fprintf(stderr,
"appif_listen_newconn: No space in kout queue (TODO)\n");
158 kout->data.listen_newconn.opaque = l->
opaque;
159 kout->data.listen_newconn.remote_ip = remote_ip;
160 kout->data.listen_newconn.remote_port = remote_port;
162 kout->type = KERNEL_APPIN_LISTEN_NEWCONN;
166 if (kout_pos >= ctx->kout_len) {
169 ctx->kout_pos = kout_pos;
178 uint32_t kout_pos = ctx->kout_pos;
183 if (kout->type != KERNEL_APPIN_INVALID) {
184 fprintf(stderr,
"appif_accept_conn: No space in kout queue (TODO)\n");
188 kout->data.accept_connection.opaque = c->
opaque;
189 kout->data.accept_connection.status = status;
191 kout->data.accept_connection.rx_off = c->
rx_buf - (uint8_t *) tas_shm;
192 kout->data.accept_connection.tx_off = c->
tx_buf - (uint8_t *) tas_shm;
193 kout->data.accept_connection.rx_len = c->
rx_len;
194 kout->data.accept_connection.tx_len = c->
tx_len;
196 kout->data.accept_connection.seq_rx = c->
remote_seq;
197 kout->data.accept_connection.seq_tx = c->
local_seq;
198 kout->data.accept_connection.local_ip = config.
ip;
199 kout->data.accept_connection.remote_ip = c->
remote_ip;
200 kout->data.accept_connection.remote_port = c->
remote_port;
201 kout->data.accept_connection.flow_id = c->
flow_id;
202 kout->data.accept_connection.fn_core = c->
fn_core;
211 kout->type = KERNEL_APPIN_ACCEPTED_CONN;
215 if (kout_pos >= ctx->kout_len) {
218 ctx->kout_pos = kout_pos;
226 uint32_t kin_pos = ctx->kin_pos;
227 uint32_t kout_pos = ctx->kout_pos;
235 if (kout->type != KERNEL_APPIN_INVALID) {
243 case KERNEL_APPOUT_INVALID:
247 case KERNEL_APPOUT_CONN_OPEN:
249 kout_inc += kin_conn_open(app, ctx, kin, kout);
252 case KERNEL_APPOUT_CONN_MOVE:
254 kout_inc += kin_conn_move(app, ctx, kin, kout);
257 case KERNEL_APPOUT_CONN_CLOSE:
259 kout_inc += kin_conn_close(app, ctx, kin, kout);
262 case KERNEL_APPOUT_LISTEN_OPEN:
264 kout_inc += kin_listen_open(app, ctx, kin, kout);
267 case KERNEL_APPOUT_ACCEPT_CONN:
269 kout_inc += kin_accept_conn(app, ctx, kin, kout);
272 case KERNEL_APPOUT_REQ_SCALE:
274 kout_inc += kin_req_scale(app, ctx, kin, kout);
277 case KERNEL_APPOUT_LISTEN_CLOSE:
279 fprintf(stderr,
"kin_poll: unsupported request type %u\n", kin->type);
288 if (kin_pos >= ctx->kin_len) {
291 ctx->kin_pos = kin_pos;
295 kout_pos += kout_inc;
296 if (kout_pos >= ctx->kout_len) {
299 ctx->kout_pos = kout_pos;
310 if (
tcp_open(ctx, kin->data.conn_open.opaque, kin->data.conn_open.remote_ip,
311 kin->data.conn_open.remote_port, ctx->doorbell->id, &conn) != 0)
313 fprintf(stderr,
"kin_conn_open: tcp_open failed\n");
323 kout->data.conn_opened.opaque = kin->data.conn_open.opaque;
324 kout->data.conn_opened.status = -1;
326 kout->type = KERNEL_APPIN_CONN_OPENED;
337 for (conn = app->conns; conn != NULL; conn = conn->
app_next) {
338 if (conn->
local_ip == kin->data.conn_move.local_ip &&
339 conn->
remote_ip == kin->data.conn_move.remote_ip &&
340 conn->
local_port == kin->data.conn_move.local_port &&
341 conn->
remote_port == kin->data.conn_move.remote_port &&
342 conn->
opaque == kin->data.conn_move.opaque)
348 fprintf(stderr,
"kin_conn_move: connection not found\n");
352 for (new_ctx = app->contexts; new_ctx != NULL; new_ctx = new_ctx->next) {
353 if (new_ctx->doorbell->id == kin->data.conn_move.db_id) {
357 if (new_ctx == NULL) {
358 fprintf(stderr,
"kin_conn_move: destination context not found\n");
363 fprintf(stderr,
"kin_conn_move: connection not open\n");
368 fprintf(stderr,
"kin_conn_move: nicif_connection_move failed\n");
372 kout->data.status.opaque = kin->data.conn_move.opaque;
373 kout->data.status.status = 0;
375 kout->type = KERNEL_APPIN_STATUS_CONN_MOVE;
380 kout->data.status.opaque = kin->data.conn_move.opaque;
381 kout->data.status.status = -1;
383 kout->type = KERNEL_APPIN_STATUS_CONN_MOVE;
393 for (conn = app->conns; conn != NULL; conn = conn->
app_next) {
394 if (conn->
local_ip == kin->data.conn_close.local_ip &&
395 conn->
remote_ip == kin->data.conn_close.remote_ip &&
396 conn->
local_port == kin->data.conn_close.local_port &&
397 conn->
remote_port == kin->data.conn_close.remote_port &&
398 conn->
opaque == kin->data.conn_close.opaque)
404 fprintf(stderr,
"kin_conn_close: connection not found\n");
409 fprintf(stderr,
"kin_conn_close: tcp_close failed\n");
416 kout->data.status.opaque = kin->data.conn_close.opaque;
417 kout->data.status.status = -1;
419 kout->type = KERNEL_APPIN_STATUS_CONN_CLOSE;
429 if (
tcp_listen(ctx, kin->data.listen_open.opaque,
430 kin->data.listen_open.local_port, kin->data.listen_open.backlog,
431 !!(kin->data.listen_open.flags & KERNEL_APPOUT_LISTEN_REUSEPORT),
434 fprintf(stderr,
"kin_listen_open: tcp_listen failed\n");
439 app->listeners = listen;
441 kout->data.status.opaque = kin->data.listen_open.opaque;
442 kout->data.status.status = 0;
444 kout->type = KERNEL_APPIN_STATUS_LISTEN_OPEN;
450 kout->data.status.opaque = kin->data.listen_open.opaque;
451 kout->data.status.status = -1;
453 kout->type = KERNEL_APPIN_STATUS_LISTEN_OPEN;
464 for (listen = app->listeners; listen != NULL; listen = listen->
app_next) {
465 if (listen->
port == kin->data.accept_conn.local_port &&
466 listen->
opaque == kin->data.accept_conn.listen_opaque)
472 if (
tcp_accept(ctx, kin->data.accept_conn.conn_opaque, listen,
473 ctx->doorbell->id) != 0)
475 fprintf(stderr,
"kin_accept_conn\n");
482 kout->data.accept_connection.opaque = kin->data.accept_conn.conn_opaque;
483 kout->data.accept_connection.status = -1;
485 kout->type = KERNEL_APPIN_ACCEPTED_CONN;
490 extern int flexnic_scale_to(uint32_t cores);
495 uint32_t num_cores = kin->data.req_scale.num_cores;
497 flexnic_scale_to(num_cores);
void tcp_destroy(struct connection *conn)
void appif_conn_closed(struct connection *c, int status)
int tcp_listen(struct app_context *ctx, uint64_t opaque, uint16_t local_port, uint32_t backlog, int reuseport, struct listener **listen)
struct listener * app_next
int nicif_connection_move(uint32_t dst_db, uint32_t f_id)
enum connection_status status
void appif_listen_newconn(struct listener *l, uint32_t remote_ip, uint16_t remote_port)
int tcp_accept(struct app_context *ctx, uint64_t opaque, struct listener *listen, uint32_t db_id)
int tcp_open(struct app_context *ctx, uint64_t opaque, uint32_t remote_ip, uint16_t remote_port, uint32_t db_id, struct connection **conn)
int tcp_close(struct connection *conn)
void appif_conn_opened(struct connection *c, int status)
void appif_accept_conn(struct connection *c, int status)
struct connection * app_next
unsigned appif_ctx_poll(struct application *app, struct app_context *ctx)