summaryrefslogtreecommitdiffstats
path: root/net/udp
diff options
context:
space:
mode:
authorhubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-22 00:34:41 +0000
committerhubbe@chromium.org <hubbe@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-22 00:34:41 +0000
commita8a442b37af870c13cf4d68f5e1a63b7764f2f1e (patch)
tree5ab2eca565092e6a5feb721b8c037a5866f1f577 /net/udp
parent86ff11ca424f22a71738426abb6244cafca45e7d (diff)
downloadchromium_src-a8a442b37af870c13cf4d68f5e1a63b7764f2f1e.zip
chromium_src-a8a442b37af870c13cf4d68f5e1a63b7764f2f1e.tar.gz
chromium_src-a8a442b37af870c13cf4d68f5e1a63b7764f2f1e.tar.bz2
Implement support for p2p socket UDP packages to set the Differntiated Services Code Point for each package. Will be used by webrtc to hopefully improve performance. (See bug for how we will test this.)
BUG=277022 Review URL: https://codereview.chromium.org/22381012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@229975 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/udp')
-rw-r--r--net/udp/datagram_server_socket.h4
-rw-r--r--net/udp/udp_server_socket.cc4
-rw-r--r--net/udp/udp_server_socket.h1
-rw-r--r--net/udp/udp_socket_libevent.cc20
-rw-r--r--net/udp/udp_socket_libevent.h5
-rw-r--r--net/udp/udp_socket_win.cc6
-rw-r--r--net/udp/udp_socket_win.h4
7 files changed, 44 insertions, 0 deletions
diff --git a/net/udp/datagram_server_socket.h b/net/udp/datagram_server_socket.h
index f2016c0..0561d8a 100644
--- a/net/udp/datagram_server_socket.h
+++ b/net/udp/datagram_server_socket.h
@@ -93,6 +93,10 @@ class NET_EXPORT DatagramServerSocket : public DatagramSocket {
// Should be called before Bind().
// Returns a network error code.
virtual int SetMulticastLoopbackMode(bool loopback) = 0;
+
+ // Set the Differentiated Services Code Point. May do nothing on
+ // some platforms. Returns a network error code.
+ virtual int SetDiffServCodePoint(DiffServCodePoint dscp) = 0;
};
} // namespace net
diff --git a/net/udp/udp_server_socket.cc b/net/udp/udp_server_socket.cc
index 16e4061..79086f8 100644
--- a/net/udp/udp_server_socket.cc
+++ b/net/udp/udp_server_socket.cc
@@ -85,4 +85,8 @@ int UDPServerSocket::SetMulticastLoopbackMode(bool loopback) {
return socket_.SetMulticastLoopbackMode(loopback);
}
+int UDPServerSocket::SetDiffServCodePoint(DiffServCodePoint dscp) {
+ return socket_.SetDiffServCodePoint(dscp);
+}
+
} // namespace net
diff --git a/net/udp/udp_server_socket.h b/net/udp/udp_server_socket.h
index cc475f4..6586f7e 100644
--- a/net/udp/udp_server_socket.h
+++ b/net/udp/udp_server_socket.h
@@ -44,6 +44,7 @@ class NET_EXPORT UDPServerSocket : public DatagramServerSocket {
virtual int LeaveGroup(const IPAddressNumber& group_address) const OVERRIDE;
virtual int SetMulticastTimeToLive(int time_to_live) OVERRIDE;
virtual int SetMulticastLoopbackMode(bool loopback) OVERRIDE;
+ virtual int SetDiffServCodePoint(DiffServCodePoint dscp) OVERRIDE;
private:
UDPSocket socket_;
diff --git a/net/udp/udp_socket_libevent.cc b/net/udp/udp_socket_libevent.cc
index 5ed52f5..990aa57 100644
--- a/net/udp/udp_socket_libevent.cc
+++ b/net/udp/udp_socket_libevent.cc
@@ -652,4 +652,24 @@ int UDPSocketLibevent::SetMulticastLoopbackMode(bool loopback) {
socket_options_ &= ~SOCKET_OPTION_MULTICAST_LOOP;
return OK;
}
+
+int UDPSocketLibevent::SetDiffServCodePoint(DiffServCodePoint dscp) {
+ if (dscp == DSCP_NO_CHANGE) {
+ return OK;
+ }
+ int rv;
+ int dscp_and_ecn = dscp << 2;
+ if (addr_family_ == AF_INET) {
+ rv = setsockopt(socket_, IPPROTO_IP, IP_TOS,
+ &dscp_and_ecn, sizeof(dscp_and_ecn));
+ } else {
+ rv = setsockopt(socket_, IPPROTO_IPV6, IPV6_TCLASS,
+ &dscp_and_ecn, sizeof(dscp_and_ecn));
+ }
+ if (rv < 0)
+ return MapSystemError(errno);
+
+ return OK;
+}
+
} // namespace net
diff --git a/net/udp/udp_socket_libevent.h b/net/udp/udp_socket_libevent.h
index 6c8bf61e0..6e737de 100644
--- a/net/udp/udp_socket_libevent.h
+++ b/net/udp/udp_socket_libevent.h
@@ -152,6 +152,11 @@ class NET_EXPORT UDPSocketLibevent : public base::NonThreadSafe {
// other applications on the same host. See MSDN: http://goo.gl/6vqbj
int SetMulticastLoopbackMode(bool loopback);
+ // Set the differentiated services flags on outgoing packets. May not
+ // do anything on some platforms.
+ // Return a network error code.
+ int SetDiffServCodePoint(DiffServCodePoint dscp);
+
private:
enum SocketOptions {
SOCKET_OPTION_REUSE_ADDRESS = 1 << 0,
diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc
index f9ce679..c9f30a7 100644
--- a/net/udp/udp_socket_win.cc
+++ b/net/udp/udp_socket_win.cc
@@ -753,4 +753,10 @@ int UDPSocketWin::SetMulticastLoopbackMode(bool loopback) {
return OK;
}
+// TODO(hubbe): Implement differentiated services for windows.
+// Note: setsockopt(IP_TOS) does not work on windows XP and later.
+int UDPSocketWin::SetDiffServCodePoint(DiffServCodePoint dscp) {
+ return ERR_NOT_IMPLEMENTED;
+}
+
} // namespace net
diff --git a/net/udp/udp_socket_win.h b/net/udp/udp_socket_win.h
index 807b403..142c692 100644
--- a/net/udp/udp_socket_win.h
+++ b/net/udp/udp_socket_win.h
@@ -151,6 +151,10 @@ class NET_EXPORT UDPSocketWin : NON_EXPORTED_BASE(public base::NonThreadSafe) {
// other applications on the same host. See MSDN: http://goo.gl/6vqbj
int SetMulticastLoopbackMode(bool loopback);
+ // Set the differentiated services flags on outgoing packets. May not
+ // do anything on some platforms.
+ int SetDiffServCodePoint(DiffServCodePoint dscp);
+
private:
enum SocketOptions {
SOCKET_OPTION_REUSE_ADDRESS = 1 << 0,