|
45 | 45 | typedef struct _socket_obj_t {
|
46 | 46 | mp_obj_base_t base;
|
47 | 47 | 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 | + }; |
49 | 52 | struct net_buf *cur_buf;
|
50 | 53 |
|
51 | 54 | #define STATE_NEW 0
|
@@ -164,6 +167,15 @@ static void sock_received_cb(struct net_context *context, struct net_buf *net_bu
|
164 | 167 | k_fifo_put(&socket->recv_q, net_buf);
|
165 | 168 | }
|
166 | 169 |
|
| 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 | + |
167 | 179 | socket_obj_t *socket_new(void) {
|
168 | 180 | socket_obj_t *socket = m_new_obj_with_finaliser(socket_obj_t);
|
169 | 181 | 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) {
|
255 | 267 |
|
256 | 268 | mp_int_t backlog = mp_obj_get_int(backlog_in);
|
257 | 269 | RAISE_ERRNO(net_context_listen(socket->ctx, backlog));
|
| 270 | + RAISE_ERRNO(net_context_accept(socket->ctx, sock_accepted_cb, K_NO_WAIT, socket)); |
258 | 271 | return mp_const_none;
|
259 | 272 | }
|
260 | 273 | STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_listen_obj, socket_listen);
|
261 | 274 |
|
| 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 | + |
262 | 297 | STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) {
|
263 | 298 | socket_obj_t *socket = self_in;
|
264 | 299 | socket_check_closed(socket);
|
@@ -384,6 +419,7 @@ STATIC const mp_map_elem_t socket_locals_dict_table[] = {
|
384 | 419 | { MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj },
|
385 | 420 | { MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj },
|
386 | 421 | { 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 }, |
387 | 423 | { MP_OBJ_NEW_QSTR(MP_QSTR_send), (mp_obj_t)&socket_send_obj },
|
388 | 424 | { MP_OBJ_NEW_QSTR(MP_QSTR_recv), (mp_obj_t)&socket_recv_obj },
|
389 | 425 | };
|
|
0 commit comments