X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=python%2Fovs%2Fsocket_util.py;h=dd45fe4b92520561442d990ffdbe55f3ec2d5623;hb=85813857630f6a09786f3ab2b2129a8513491e64;hp=d00d3989b699c07f791417c61f9e7245942f6133;hpb=daad9316430795b0a9ee5d4ec89b9538101424ed;p=openvswitch diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py index d00d3989..dd45fe4b 100644 --- a/python/ovs/socket_util.py +++ b/python/ovs/socket_util.py @@ -1,4 +1,4 @@ -# Copyright (c) 2010, 2012 Nicira Networks +# Copyright (c) 2010, 2012 Nicira, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import socket import sys import ovs.fatal_signal +import ovs.poller import ovs.vlog vlog = ovs.vlog.Vlog("socket_util") @@ -75,7 +76,7 @@ def make_unix_socket(style, nonblock, bind_path, connect_path): def check_connection_completion(sock): - p = select.poll() + p = ovs.poller.SelectPoll() p.register(sock, select.POLLOUT) if len(p.poll(0)) == 1: return get_socket_error(sock) @@ -83,6 +84,41 @@ def check_connection_completion(sock): return errno.EAGAIN +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 + else: + raise ValueError("%s: port number must be specified" % 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) + except socket.error, e: + return get_exception_errno(e), None + + try: + set_nonblocking(sock) + set_dscp(sock, dscp) + try: + sock.connect(address) + except socket.error, e: + if get_exception_errno(e) != errno.EINPROGRESS: + raise + return 0, sock + except socket.error, e: + sock.close() + return get_exception_errno(e), None + + def get_socket_error(sock): """Returns the errno value associated with 'socket' (0 if no error) and resets the socket's error status.""" @@ -147,3 +183,10 @@ def set_nonblocking(sock): except socket.error, e: vlog.err("could not set nonblocking mode on socket: %s" % os.strerror(get_socket_error(e))) + + +def set_dscp(sock, dscp): + if dscp > 63: + raise ValueError("Invalid dscp %d" % dscp) + val = dscp << 2 + sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, val)