diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/base/net_util.h | 28 | ||||
-rw-r--r-- | net/dns/mock_mdns_socket_factory.h | 2 | ||||
-rw-r--r-- | net/udp/datagram_server_socket.h | 4 | ||||
-rw-r--r-- | net/udp/udp_server_socket.cc | 4 | ||||
-rw-r--r-- | net/udp/udp_server_socket.h | 1 | ||||
-rw-r--r-- | net/udp/udp_socket_libevent.cc | 20 | ||||
-rw-r--r-- | net/udp/udp_socket_libevent.h | 5 | ||||
-rw-r--r-- | net/udp/udp_socket_win.cc | 6 | ||||
-rw-r--r-- | net/udp/udp_socket_win.h | 4 |
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, |