Skip to content

Commit 88582e3

Browse files
committed
zephyr/modusocket: Implement bind() and connect().
1 parent b6c7e4b commit 88582e3

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

zephyr/modusocket.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,24 @@ STATIC const mp_obj_type_t socket_type;
4444

4545
#define RAISE_ERRNO(x) { int _err = x; if (_err < 0) mp_raise_OSError(-_err); }
4646

47+
STATIC void socket_check_closed(socket_obj_t *socket) {
48+
if (socket->ctx == NULL) {
49+
// already closed
50+
mp_raise_OSError(EBADF);
51+
}
52+
}
53+
54+
STATIC void parse_inet_addr(socket_obj_t *socket, mp_obj_t addr_in, struct sockaddr *sockaddr) {
55+
// We employ the fact that port and address offsets are the same for IPv4 & IPv6
56+
struct sockaddr_in *sockaddr_in = (struct sockaddr_in*)sockaddr;
57+
58+
mp_obj_t *addr_items;
59+
mp_obj_get_array_fixed_n(addr_in, 2, &addr_items);
60+
sockaddr_in->sin_family = net_context_get_family(socket->ctx);
61+
RAISE_ERRNO(net_addr_pton(sockaddr_in->sin_family, mp_obj_str_get_str(addr_items[0]), &sockaddr_in->sin_addr));
62+
sockaddr_in->sin_port = htons(mp_obj_get_int(addr_items[1]));
63+
}
64+
4765
// Methods
4866

4967
STATIC void socket_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -88,6 +106,30 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t
88106
return socket;
89107
}
90108

109+
STATIC mp_obj_t socket_bind(mp_obj_t self_in, mp_obj_t addr_in) {
110+
socket_obj_t *socket = self_in;
111+
socket_check_closed(socket);
112+
113+
struct sockaddr sockaddr;
114+
parse_inet_addr(socket, addr_in, &sockaddr);
115+
116+
RAISE_ERRNO(net_context_bind(socket->ctx, &sockaddr, sizeof(sockaddr)));
117+
return mp_const_none;
118+
}
119+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_bind_obj, socket_bind);
120+
121+
STATIC mp_obj_t socket_connect(mp_obj_t self_in, mp_obj_t addr_in) {
122+
socket_obj_t *socket = self_in;
123+
socket_check_closed(socket);
124+
125+
struct sockaddr sockaddr;
126+
parse_inet_addr(socket, addr_in, &sockaddr);
127+
128+
RAISE_ERRNO(net_context_connect(socket->ctx, &sockaddr, sizeof(sockaddr), NULL, K_FOREVER, NULL));
129+
return mp_const_none;
130+
}
131+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_connect_obj, socket_connect);
132+
91133
STATIC mp_obj_t socket_close(mp_obj_t self_in) {
92134
socket_obj_t *socket = self_in;
93135
if (socket->ctx != NULL) {
@@ -101,6 +143,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_close_obj, socket_close);
101143
STATIC const mp_map_elem_t socket_locals_dict_table[] = {
102144
{ MP_OBJ_NEW_QSTR(MP_QSTR___del__), (mp_obj_t)&socket_close_obj },
103145
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&socket_close_obj },
146+
{ MP_OBJ_NEW_QSTR(MP_QSTR_bind), (mp_obj_t)&socket_bind_obj },
147+
{ MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&socket_connect_obj },
104148
};
105149
STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table);
106150

0 commit comments

Comments
 (0)