/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
}
}
+/* Sets the DSCP value of socket 'fd' to 'dscp', which must be 63 or less.
+ * 'family' must indicate the socket's address family (AF_INET or AF_INET6, to
+ * do anything useful). */
int
-set_dscp(int fd, uint8_t dscp)
+set_dscp(int fd, int family, uint8_t dscp)
{
+ int retval;
int val;
- bool success;
if (dscp > 63) {
return EINVAL;
}
-
- /* Note: this function is used for both of IPv4 and IPv6 sockets */
- success = false;
val = dscp << 2;
- if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val)) {
-#ifndef _WIN32
- if (sock_errno() != ENOPROTOOPT) {
-#else
- if (sock_errno() != WSAENOPROTOOPT) {
-#endif
- return sock_errno();
- }
- } else {
- success = true;
- }
- if (setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val, sizeof val)) {
-#ifndef _WIN32
- if (sock_errno() != ENOPROTOOPT) {
-#else
- if (sock_errno() != WSAENOPROTOOPT) {
-#endif
- return sock_errno();
- }
- } else {
- success = true;
- }
- if (!success) {
+
+ switch (family) {
+ case AF_INET:
+ retval = setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val);
+ break;
+
+ case AF_INET6:
+ retval = setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val, sizeof val);
+ break;
+
+ default:
return ENOPROTOOPT;
}
- return 0;
+ return retval ? sock_errno() : 0;
}
/* Translates 'host_name', which must be a string representation of an IP
/* The dscp bits must be configured before connect() to ensure that the
* TOS field is set during the connection establishment. If set after
* connect(), the handshake SYN frames will be sent with a TOS of 0. */
- error = set_dscp(fd, dscp);
+ error = set_dscp(fd, ss.ss_family, dscp);
if (error) {
VLOG_ERR("%s: set_dscp: %s", target, sock_strerror(error));
goto exit;
/* The dscp bits must be configured before connect() to ensure that the TOS
* field is set during the connection establishment. If set after
* connect(), the handshake SYN frames will be sent with a TOS of 0. */
- error = set_dscp(fd, dscp);
+ error = set_dscp(fd, ss.ss_family, dscp);
if (error) {
VLOG_ERR("%s: set_dscp: %s", target, sock_strerror(error));
goto error;
/*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
int set_nonblocking(int fd);
void xset_nonblocking(int fd);
-int set_dscp(int fd, uint8_t dscp);
+int set_dscp(int fd, int family, uint8_t dscp);
int lookup_ip(const char *host_name, struct in_addr *address);
int lookup_ipv6(const char *host_name, struct in6_addr *address);
-# Copyright (c) 2010, 2012, 2014 Nicira, Inc.
+# Copyright (c) 2010, 2012, 2014, 2015 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
is_addr_inet = is_valid_ipv4_address(address[0])
if is_addr_inet:
sock = socket.socket(socket.AF_INET, style, 0)
+ family = socket.AF_INET
else:
sock = socket.socket(socket.AF_INET6, style, 0)
+ family = socket.AF_INET6
except socket.error, e:
return get_exception_errno(e), None
try:
set_nonblocking(sock)
- set_dscp(sock, dscp)
+ set_dscp(sock, family, dscp)
try:
sock.connect(address)
except socket.error, e:
% os.strerror(get_exception_errno(e)))
-def set_dscp(sock, dscp):
+def set_dscp(sock, family, dscp):
if dscp > 63:
raise ValueError("Invalid dscp %d" % dscp)
- # Note: this function is used for both of IPv4 and IPv6 sockets
- success = False
val = dscp << 2
- try:
- sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, val)
- except socket.error, e:
- if get_exception_errno(e) != errno.ENOPROTOOPT:
+ if family == socket.AF_INET:
+ try:
+ sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, val)
+ except socket.error, e:
raise
- success = True
- try:
- sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_TCLASS, val)
- except socket.error, e:
- if get_exception_errno(e) != errno.ENOPROTOOPT or not success:
+ elif family == socket.AF_INET6:
+ try:
+ sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_TCLASS, val)
+ except socket.error, e:
raise
+ else:
+ raise