Skip to content

Commit ae1b3e1

Browse files
authored
Merge pull request #8769 from jepler/merge-8.2.x
Merge 8.2.x
2 parents a21a71c + 2f32574 commit ae1b3e1

File tree

5 files changed

+42
-17
lines changed

5 files changed

+42
-17
lines changed

ports/espressif/common-hal/socketpool/Socket.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,11 @@ STATIC void mark_user_socket(int fd, socketpool_socket_obj_t *obj) {
182182

183183
STATIC bool _socketpool_socket(socketpool_socketpool_obj_t *self,
184184
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type,
185+
int proto,
185186
socketpool_socket_obj_t *sock) {
186187
int addr_family;
187188
int ipproto;
189+
188190
if (family == SOCKETPOOL_AF_INET) {
189191
addr_family = AF_INET;
190192
ipproto = IPPROTO_IP;
@@ -202,6 +204,7 @@ STATIC bool _socketpool_socket(socketpool_socketpool_obj_t *self,
202204
socket_type = SOCK_DGRAM;
203205
} else { // SOCKETPOOL_SOCK_RAW
204206
socket_type = SOCK_RAW;
207+
ipproto = proto;
205208
}
206209
sock->type = socket_type;
207210
sock->family = addr_family;
@@ -226,9 +229,9 @@ STATIC bool _socketpool_socket(socketpool_socketpool_obj_t *self,
226229
// special entry for workflow listener (register system socket)
227230
bool socketpool_socket(socketpool_socketpool_obj_t *self,
228231
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type,
229-
socketpool_socket_obj_t *sock) {
232+
int proto, socketpool_socket_obj_t *sock) {
230233

231-
if (!_socketpool_socket(self, family, type, sock)) {
234+
if (!_socketpool_socket(self, family, type, proto, sock)) {
232235
return false;
233236
}
234237

@@ -241,15 +244,15 @@ bool socketpool_socket(socketpool_socketpool_obj_t *self,
241244
}
242245

243246
socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_t *self,
244-
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type) {
247+
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type, int proto) {
245248
if (family != SOCKETPOOL_AF_INET) {
246249
mp_raise_NotImplementedError(MP_ERROR_TEXT("Only IPv4 sockets supported"));
247250
}
248251

249252
socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t);
250253
sock->base.type = &socketpool_socket_type;
251254

252-
if (!_socketpool_socket(self, family, type, sock)) {
255+
if (!_socketpool_socket(self, family, type, proto, sock)) {
253256
mp_raise_RuntimeError(MP_ERROR_TEXT("Out of sockets"));
254257
}
255258
mark_user_socket(sock->num, sock);

ports/raspberrypi/common-hal/socketpool/Socket.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ STATIC void mark_user_socket(socketpool_socket_obj_t *obj) {
663663

664664
bool socketpool_socket(socketpool_socketpool_obj_t *self,
665665
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type,
666+
int proto,
666667
socketpool_socket_obj_t *socket) {
667668

668669
if (!register_open_socket(socket)) {
@@ -692,7 +693,7 @@ bool socketpool_socket(socketpool_socketpool_obj_t *self,
692693
break;
693694
#if MICROPY_PY_LWIP_SOCK_RAW
694695
case SOCKETPOOL_SOCK_RAW: {
695-
socket->pcb.raw = raw_new(0);
696+
socket->pcb.raw = raw_new(proto);
696697
break;
697698
}
698699
#endif
@@ -730,15 +731,15 @@ bool socketpool_socket(socketpool_socketpool_obj_t *self,
730731
}
731732

732733
socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_t *self,
733-
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type) {
734+
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type, int proto) {
734735
if (family != SOCKETPOOL_AF_INET) {
735736
mp_raise_NotImplementedError(MP_ERROR_TEXT("Only IPv4 sockets supported"));
736737
}
737738

738739
socketpool_socket_obj_t *socket = m_new_obj_with_finaliser(socketpool_socket_obj_t);
739740
socket->base.type = &socketpool_socket_type;
740741

741-
if (!socketpool_socket(self, family, type, socket)) {
742+
if (!socketpool_socket(self, family, type, proto, socket)) {
742743
mp_raise_RuntimeError(MP_ERROR_TEXT("Out of sockets"));
743744
}
744745
mark_user_socket(socket);

shared-bindings/socketpool/SocketPool.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,34 @@ MP_DEFINE_EXCEPTION(gaierror, OSError)
8181
//|
8282
//| TCP_NODELAY: int
8383
//|
84-
//| IPPROTO_TCP: int
8584
//| IPPROTO_IP: int
85+
//| IPPROTO_ICMP: int
86+
//| IPPROTO_TCP: int
87+
//| IPPROTO_UDP: int
88+
//| IPPROTO_IPV6: int
89+
//| IPPROTO_RAW: int
8690
//|
8791
//| IP_MULTICAST_TTL: int
8892
//|
89-
//| def socket(self, family: int = AF_INET, type: int = SOCK_STREAM) -> socketpool.Socket:
93+
//| def socket(
94+
//| self, family: int = AF_INET, type: int = SOCK_STREAM, proto: int = IPPROTO_IP
95+
//| ) -> socketpool.Socket:
9096
//| """Create a new socket
9197
//|
9298
//| :param ~int family: AF_INET or AF_INET6
9399
//| :param ~int type: SOCK_STREAM, SOCK_DGRAM or SOCK_RAW
100+
//| :param ~int proto: IPPROTO_IP, IPPROTO_ICMP, IPPROTO_TCP, IPPROTO_UDP, IPPROTO_IPV6or IPPROTO_RAW. Only works with SOCK_RAW
94101
//|
95-
//| The ``proto`` (protocol) and ``fileno`` arguments available in ``socket.socket()``
96-
//| in CPython are not supported.
102+
//| The ``fileno`` argument available in ``socket.socket()``
103+
//| in CPython is not supported.
97104
//| """
98105
//| ...
99106
STATIC mp_obj_t socketpool_socketpool_socket(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
100-
enum { ARG_family, ARG_type };
107+
enum { ARG_family, ARG_type, ARG_proto };
101108
static const mp_arg_t allowed_args[] = {
102109
{ MP_QSTR_family, MP_ARG_INT, {.u_int = SOCKETPOOL_AF_INET} },
103110
{ MP_QSTR_type, MP_ARG_INT, {.u_int = SOCKETPOOL_SOCK_STREAM} },
111+
{ MP_QSTR_proto, MP_ARG_INT, {.u_int = SOCKETPOOL_IPPROTO_IP} },
104112
};
105113
socketpool_socketpool_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
106114

@@ -109,8 +117,13 @@ STATIC mp_obj_t socketpool_socketpool_socket(size_t n_args, const mp_obj_t *pos_
109117

110118
socketpool_socketpool_addressfamily_t family = args[ARG_family].u_int;
111119
socketpool_socketpool_sock_t type = args[ARG_type].u_int;
120+
socketpool_socketpool_ipproto_t proto = args[ARG_proto].u_int;
121+
122+
if (proto < 0) {
123+
proto = 0;
124+
}
112125

113-
return common_hal_socketpool_socket(self, family, type);
126+
return common_hal_socketpool_socket(self, family, type, proto);
114127
}
115128
MP_DEFINE_CONST_FUN_OBJ_KW(socketpool_socketpool_socket_obj, 1, socketpool_socketpool_socket);
116129

@@ -185,8 +198,12 @@ STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = {
185198

186199
{ MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(SOCKETPOOL_TCP_NODELAY) },
187200

188-
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_TCP), MP_ROM_INT(SOCKETPOOL_IPPROTO_TCP) },
189201
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(SOCKETPOOL_IPPROTO_IP) },
202+
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_ICMP), MP_ROM_INT(SOCKETPOOL_IPPROTO_ICMP) },
203+
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_TCP), MP_ROM_INT(SOCKETPOOL_IPPROTO_TCP) },
204+
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_UDP), MP_ROM_INT(SOCKETPOOL_IPPROTO_UDP) },
205+
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_IPV6), MP_ROM_INT(SOCKETPOOL_IPPROTO_IPV6) },
206+
{ MP_ROM_QSTR(MP_QSTR_IPPROTO_RAW), MP_ROM_INT(SOCKETPOOL_IPPROTO_RAW) },
190207
{ MP_ROM_QSTR(MP_QSTR_IP_MULTICAST_TTL), MP_ROM_INT(SOCKETPOOL_IP_MULTICAST_TTL) },
191208

192209
{ MP_ROM_QSTR(MP_QSTR_EAI_NONAME), MP_ROM_INT(SOCKETPOOL_EAI_NONAME) },

shared-bindings/socketpool/SocketPool.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ typedef enum {
4646

4747
typedef enum {
4848
SOCKETPOOL_IPPROTO_IP = 0,
49+
SOCKETPOOL_IPPROTO_ICMP = 1,
4950
SOCKETPOOL_IPPROTO_TCP = 6,
51+
SOCKETPOOL_IPPROTO_UDP = 17,
52+
SOCKETPOOL_IPPROTO_IPV6 = 41,
53+
SOCKETPOOL_IPPROTO_RAW = 255,
5054
} socketpool_socketpool_ipproto_t;
5155

5256
typedef enum {
@@ -64,7 +68,7 @@ typedef enum {
6468
void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *self, mp_obj_t radio);
6569

6670
socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_t *self,
67-
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type);
71+
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type, int proto);
6872

6973
mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self,
7074
const char *host);
@@ -76,7 +80,7 @@ mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketp
7680
// closed automatically.
7781
bool socketpool_socket(socketpool_socketpool_obj_t *self,
7882
socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type,
79-
socketpool_socket_obj_t *sock);
83+
int proto, socketpool_socket_obj_t *sock);
8084

8185
NORETURN void common_hal_socketpool_socketpool_raise_gaierror_noname(void);
8286

supervisor/shared/web_workflow/web_workflow.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ bool supervisor_start_web_workflow(bool reload) {
360360
#endif
361361

362362
if (common_hal_socketpool_socket_get_closed(&listening)) {
363-
socketpool_socket(&pool, SOCKETPOOL_AF_INET, SOCKETPOOL_SOCK_STREAM, &listening);
363+
socketpool_socket(&pool, SOCKETPOOL_AF_INET, SOCKETPOOL_SOCK_STREAM, 0, &listening);
364364
common_hal_socketpool_socket_settimeout(&listening, 0);
365365
// Bind to any ip. (Not checking for failures)
366366
common_hal_socketpool_socket_bind(&listening, "", 0, web_api_port);

0 commit comments

Comments
 (0)