On Mon, Oct 25, 2021 at 8:46 AM Timothy Redaelli <tredae...@redhat.com> 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 <tredae...@redhat.com>
> ---
>  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 <twil...@redhat.com>
Tested-by: Terry Wilson <twil...@redhat.com>

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to