diff options
-rw-r--r-- | zephyr/modusocket.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/zephyr/modusocket.c b/zephyr/modusocket.c index 7898f55766..36ccdbc3b7 100644 --- a/zephyr/modusocket.c +++ b/zephyr/modusocket.c @@ -45,7 +45,10 @@ typedef struct _socket_obj_t { mp_obj_base_t base; struct net_context *ctx; - struct k_fifo recv_q; + union { + struct k_fifo recv_q; + struct k_fifo accept_q; + }; struct net_buf *cur_buf; #define STATE_NEW 0 @@ -164,6 +167,15 @@ static void sock_received_cb(struct net_context *context, struct net_buf *net_bu k_fifo_put(&socket->recv_q, net_buf); } +// Callback for incoming connections. +static void sock_accepted_cb(struct net_context *new_ctx, struct sockaddr *addr, socklen_t addrlen, int status, void *user_data) { + socket_obj_t *socket = (socket_obj_t*)user_data; + DEBUG_printf("accept cb: context: %p, status: %d, new ctx: %p\n", socket->ctx, status, new_ctx); + DEBUG_printf("new_ctx ref_cnt: %d\n", new_ctx->refcount); + + k_fifo_put(&socket->accept_q, new_ctx); +} + socket_obj_t *socket_new(void) { socket_obj_t *socket = m_new_obj_with_finaliser(socket_obj_t); socket->base.type = (mp_obj_t)&socket_type; @@ -255,10 +267,33 @@ STATIC mp_obj_t socket_listen(mp_obj_t self_in, mp_obj_t backlog_in) { mp_int_t backlog = mp_obj_get_int(backlog_in); RAISE_ERRNO(net_context_listen(socket->ctx, backlog)); + RAISE_ERRNO(net_context_accept(socket->ctx, sock_accepted_cb, K_NO_WAIT, socket)); return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen); +STATIC mp_obj_t socket_accept(mp_obj_t self_in) { + socket_obj_t *socket = self_in; + socket_check_closed(socket); + + struct net_context *ctx = k_fifo_get(&socket->accept_q, K_FOREVER); + // Was overwritten by fifo + ctx->refcount = 1; + + socket_obj_t *socket2 = socket_new(); + socket2->ctx = ctx; + DEBUG_printf("Setting recv cb after accept()\n"); + RAISE_ERRNO(net_context_recv(ctx, sock_received_cb, K_NO_WAIT, socket2)); + + mp_obj_tuple_t *client = mp_obj_new_tuple(2, NULL); + client->items[0] = MP_OBJ_FROM_PTR(socket2); + // TODO + client->items[1] = mp_const_none; + + return MP_OBJ_FROM_PTR(client); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept); + STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) { socket_obj_t *socket = self_in; socket_check_closed(socket); @@ -384,6 +419,7 @@ STATIC const mp_map_elem_t socket_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_listen), (mp_obj_t)&socket_listen_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_accept), (mp_obj_t)&socket_accept_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&socket_send_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&socket_recv_obj }, }; |