On 10/27/21 22:57, Terry Wilson wrote: > On Mon, Oct 25, 2021 at 8:46 AM Timothy Redaelli <[email protected]> wrote: >> >> In an upcoming patch, PyOpenSSL will be replaced with Python ssl module, >> but in order to do an async connection with Python ssl module the ssl >> socket must be created when the socket is created, but before the >> socket is connected. >> >> So, inet_open_active function is splitted in 3 parts: >> - inet_create_socket_active: creates the socket and returns the family and >> the socket, or (error, None) if some error needs to be returned. >> - inet_connect_active: connect the socket and returns the errno (it >> returns 0 if errno is EINPROGRESS or EWOULDBLOCK). >> >> connect is replaced by connect_ex, since Python suggest to use it for >> asynchronous connects and it's also cleaner since inet_connect_active >> returns errno that connect_ex already returns, moreover due to a Python >> limitation connect cannot not be used with ssl module. >> >> inet_open_active function is changed in order to use the new functions >> inet_create_socket_active and inet_connect_active. >> >> Signed-off-by: Timothy Redaelli <[email protected]> >> --- >> python/ovs/socket_util.py | 36 ++++++++++++++++++++++-------------- >> 1 file changed, 22 insertions(+), 14 deletions(-) >> >> diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py >> index 3faa64e9d..651012bf0 100644 >> --- a/python/ovs/socket_util.py >> +++ b/python/ovs/socket_util.py >> @@ -222,8 +222,7 @@ def inet_parse_active(target, default_port): >> return (host_name, port) >> >> >> -def inet_open_active(style, target, default_port, dscp): >> - address = inet_parse_active(target, default_port) >> +def inet_create_socket_active(style, address): >> try: >> is_addr_inet = is_valid_ipv4_address(address[0]) >> if is_addr_inet: >> @@ -235,23 +234,32 @@ def inet_open_active(style, target, default_port, >> dscp): >> except socket.error as e: >> return get_exception_errno(e), None >> >> + return family, sock >> + >> + >> +def inet_connect_active(sock, address, family, dscp): >> try: >> set_nonblocking(sock) >> set_dscp(sock, family, dscp) >> - try: >> - sock.connect(address) >> - except socket.error as e: >> - error = get_exception_errno(e) >> - if sys.platform == 'win32' and error == errno.WSAEWOULDBLOCK: >> - # WSAEWOULDBLOCK would be the equivalent on Windows >> - # for EINPROGRESS on Unix. >> - error = errno.EINPROGRESS >> - if error != errno.EINPROGRESS: >> - raise >> - return 0, sock >> + error = sock.connect_ex(address) >> + if error not in (0, errno.EINPROGRESS, errno.EWOULDBLOCK): >> + sock.close() >> + return error >> + return 0 >> except socket.error as e: >> sock.close() >> - return get_exception_errno(e), None >> + return get_exception_errno(e) >> + >> + >> +def inet_open_active(style, target, default_port, dscp): >> + address = inet_parse_active(target, default_port) >> + family, sock = inet_create_socket_active(style, address) >> + if sock is None: >> + return family, sock >> + error = inet_connect_active(sock, address, family, dscp) >> + if error: >> + return error, None >> + return 0, sock >> >> >> def get_exception_errno(e): >> -- >> 2.31.1 >> > > Tested against neutron "OverSsl" tests, and everything worked as it should. > > Acked-by: Terry Wilson <[email protected]> > Tested-by: Terry Wilson <[email protected]> >
Thanks, Terry and Timothy! Applied. Best regards, Ilya Maximets. _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
