@@ -81,26 +81,34 @@ MP_DEFINE_EXCEPTION(gaierror, OSError)
81
81
//|
82
82
//| TCP_NODELAY: int
83
83
//|
84
- //| IPPROTO_TCP: int
85
84
//| IPPROTO_IP: int
85
+ //| IPPROTO_ICMP: int
86
+ //| IPPROTO_TCP: int
87
+ //| IPPROTO_UDP: int
88
+ //| IPPROTO_IPV6: int
89
+ //| IPPROTO_RAW: int
86
90
//|
87
91
//| IP_MULTICAST_TTL: int
88
92
//|
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:
90
96
//| """Create a new socket
91
97
//|
92
98
//| :param ~int family: AF_INET or AF_INET6
93
99
//| :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
94
101
//|
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.
97
104
//| """
98
105
//| ...
99
106
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 };
101
108
static const mp_arg_t allowed_args [] = {
102
109
{ MP_QSTR_family , MP_ARG_INT , {.u_int = SOCKETPOOL_AF_INET } },
103
110
{ MP_QSTR_type , MP_ARG_INT , {.u_int = SOCKETPOOL_SOCK_STREAM } },
111
+ { MP_QSTR_proto , MP_ARG_INT , {.u_int = SOCKETPOOL_IPPROTO_IP } },
104
112
};
105
113
socketpool_socketpool_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
106
114
@@ -109,8 +117,13 @@ STATIC mp_obj_t socketpool_socketpool_socket(size_t n_args, const mp_obj_t *pos_
109
117
110
118
socketpool_socketpool_addressfamily_t family = args [ARG_family ].u_int ;
111
119
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
+ }
112
125
113
- return common_hal_socketpool_socket (self , family , type );
126
+ return common_hal_socketpool_socket (self , family , type , proto );
114
127
}
115
128
MP_DEFINE_CONST_FUN_OBJ_KW (socketpool_socketpool_socket_obj , 1 , socketpool_socketpool_socket );
116
129
@@ -185,8 +198,12 @@ STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = {
185
198
186
199
{ MP_ROM_QSTR (MP_QSTR_TCP_NODELAY ), MP_ROM_INT (SOCKETPOOL_TCP_NODELAY ) },
187
200
188
- { MP_ROM_QSTR (MP_QSTR_IPPROTO_TCP ), MP_ROM_INT (SOCKETPOOL_IPPROTO_TCP ) },
189
201
{ 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 ) },
190
207
{ MP_ROM_QSTR (MP_QSTR_IP_MULTICAST_TTL ), MP_ROM_INT (SOCKETPOOL_IP_MULTICAST_TTL ) },
191
208
192
209
{ MP_ROM_QSTR (MP_QSTR_EAI_NONAME ), MP_ROM_INT (SOCKETPOOL_EAI_NONAME ) },
0 commit comments