Skip to content

Commit 8ef469f

Browse files
committed
zephyr/modusocket: Implement accept().
1 parent 96166ec commit 8ef469f

1 file changed

Lines changed: 37 additions & 1 deletion

File tree

zephyr/modusocket.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@
4545
typedef struct _socket_obj_t {
4646
mp_obj_base_t base;
4747
struct net_context *ctx;
48-
struct k_fifo recv_q;
48+
union {
49+
struct k_fifo recv_q;
50+
struct k_fifo accept_q;
51+
};
4952
struct net_buf *cur_buf;
5053

5154
#define STATE_NEW 0
@@ -164,6 +167,15 @@ static void sock_received_cb(struct net_context *context, struct net_buf *net_bu
164167
k_fifo_put(&socket->recv_q, net_buf);
165168
}
166169

170+
// Callback for incoming connections.
171+
static void sock_accepted_cb(struct net_context *new_ctx, struct sockaddr *addr, socklen_t addrlen, int status, void *user_data) {
172+
socket_obj_t *socket = (socket_obj_t*)user_data;
173+
DEBUG_printf("accept cb: context: %p, status: %d, new ctx: %p\n", socket->ctx, status, new_ctx);
174+
DEBUG_printf("new_ctx ref_cnt: %d\n", new_ctx->refcount);
175+
176+
k_fifo_put(&socket->accept_q, new_ctx);
177+
}
178+
167179
socket_obj_t *socket_new(void) {
168180
socket_obj_t *socket = m_new_obj_with_finaliser(socket_obj_t);
169181
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) {
255267

256268
mp_int_t backlog = mp_obj_get_int(backlog_in);
257269
RAISE_ERRNO(net_context_listen(socket->ctx, backlog));
270+
RAISE_ERRNO(net_context_accept(socket->ctx, sock_accepted_cb, K_NO_WAIT, socket));
258271
return mp_const_none;
259272
}
260273
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen);
261274

275+
STATIC mp_obj_t socket_accept(mp_obj_t self_in) {
276+
socket_obj_t *socket = self_in;
277+
socket_check_closed(socket);
278+
279+
struct net_context *ctx = k_fifo_get(&socket->accept_q, K_FOREVER);
280+
// Was overwritten by fifo
281+
ctx->refcount = 1;
282+
283+
socket_obj_t *socket2 = socket_new();
284+
socket2->ctx = ctx;
285+
DEBUG_printf("Setting recv cb after accept()\n");
286+
RAISE_ERRNO(net_context_recv(ctx, sock_received_cb, K_NO_WAIT, socket2));
287+
288+
mp_obj_tuple_t *client = mp_obj_new_tuple(2, NULL);
289+
client->items[0] = MP_OBJ_FROM_PTR(socket2);
290+
// TODO
291+
client->items[1] = mp_const_none;
292+
293+
return MP_OBJ_FROM_PTR(client);
294+
}
295+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept);
296+
262297
STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
263298
socket_obj_t *socket = self_in;
264299
socket_check_closed(socket);
@@ -384,6 +419,7 @@ STATIC const mp_map_elem_t socket_locals_dict_table[] = {
384419
{ MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj },
385420
{ MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj },
386421
{ MP_OBJ_NEW_QSTR(MP_QSTR_listen), (mp_obj_t)&socket_listen_obj },
422+
{ MP_OBJ_NEW_QSTR(MP_QSTR_accept), (mp_obj_t)&socket_accept_obj },
387423
{ MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&socket_send_obj },
388424
{ MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&socket_recv_obj },
389425
};

0 commit comments

Comments
 (0)