@@ -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//| ...
99106STATIC 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}
115128MP_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 ) },
0 commit comments