diff options
Diffstat (limited to 'python/ovs/socket_util.py')
-rw-r--r-- | python/ovs/socket_util.py | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py index c65704762..be9fc95a0 100644 --- a/python/ovs/socket_util.py +++ b/python/ovs/socket_util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010, 2012 Nicira, Inc. +# Copyright (c) 2010, 2012, 2014 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -177,24 +177,44 @@ def check_connection_completion(sock): return errno.EAGAIN +def is_valid_ipv4_address(address): + try: + socket.inet_pton(socket.AF_INET, address) + except AttributeError: + try: + socket.inet_aton(address) + except socket.error: + return False + except socket.error: + return False + + return True + + def inet_parse_active(target, default_port): address = target.split(":") - host_name = address[0] - if not host_name: - raise ValueError("%s: bad peer name format" % target) if len(address) >= 2: - port = int(address[1]) - elif default_port: - port = default_port + host_name = ":".join(address[0:-1]).lstrip('[').rstrip(']') + port = int(address[-1]) else: - raise ValueError("%s: port number must be specified" % target) + if default_port: + port = default_port + else: + raise ValueError("%s: port number must be specified" % target) + host_name = address[0] + if not host_name: + raise ValueError("%s: bad peer name format" % target) return (host_name, port) def inet_open_active(style, target, default_port, dscp): address = inet_parse_active(target, default_port) try: - sock = socket.socket(socket.AF_INET, style, 0) + is_addr_inet = is_valid_ipv4_address(address[0]) + if is_addr_inet: + sock = socket.socket(socket.AF_INET, style, 0) + else: + sock = socket.socket(socket.AF_INET6, style, 0) except socket.error, e: return get_exception_errno(e), None |