summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/base/net_util.h28
-rw-r--r--net/dns/mock_mdns_socket_factory.h2
-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
9 files changed, 74 insertions, 0 deletions
diff --git a/net/base/net_util.h b/net/base/net_util.h
index d137fe5..5735111 100644
--- a/net/base/net_util.h
+++ b/net/base/net_util.h
@@ -561,6 +561,34 @@ unsigned CommonPrefixLength(const IPAddressNumber& a1,
// Computes the number of leading 1-bits in |mask|.
unsigned MaskPrefixLength(const IPAddressNumber& mask);
+// Differentiated Services Code Point.
+// See http://tools.ietf.org/html/rfc2474 for details.
+enum DiffServCodePoint {
+ DSCP_NO_CHANGE = -1,
+ DSCP_DEFAULT = 0, // Same as DSCP_CS0
+ DSCP_CS0 = 0, // The default
+ DSCP_CS1 = 8, // Bulk/background traffic
+ DSCP_AF11 = 10,
+ DSCP_AF12 = 12,
+ DSCP_AF13 = 14,
+ DSCP_CS2 = 16,
+ DSCP_AF21 = 18,
+ DSCP_AF22 = 20,
+ DSCP_AF23 = 22,
+ DSCP_CS3 = 24,
+ DSCP_AF31 = 26,
+ DSCP_AF32 = 28,
+ DSCP_AF33 = 30,
+ DSCP_CS4 = 32,
+ DSCP_AF41 = 34, // Video
+ DSCP_AF42 = 36, // Video
+ DSCP_AF43 = 38, // Video
+ DSCP_CS5 = 40, // Video
+ DSCP_EF = 46, // Voice
+ DSCP_CS6 = 48, // Voice
+ DSCP_CS7 = 56, // Control messages
+};
+
} // namespace net
#endif // NET_BASE_NET_UTIL_H_
diff --git a/net/dns/mock_mdns_socket_factory.h b/net/dns/mock_mdns_socket_factory.h
index f60b08c5..af54e32 100644
--- a/net/dns/mock_mdns_socket_factory.h
+++ b/net/dns/mock_mdns_socket_factory.h
@@ -57,6 +57,8 @@ class MockMDnsDatagramServerSocket : public DatagramServerSocket {
MOCK_METHOD1(SetMulticastLoopbackMode, int(bool loopback));
+ MOCK_METHOD1(SetDiffServCodePoint, int(DiffServCodePoint dscp));
+
void SetResponsePacket(std::string response_packet);
int HandleRecvNow(IOBuffer* buffer, int size, IPEndPoint* address,
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,