Skip to content

Commit 8ef469f

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

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy