| // Copyright 2015 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef NET_SOCKET_DIFF_SERV_CODE_POINT_H_ | |
| #define NET_SOCKET_DIFF_SERV_CODE_POINT_H_ | |
| #include <cstdint> | |
| #include "base/check_op.h" | |
| namespace net { | |
| // Differentiated Services Code Point. | |
| // See http://tools.ietf.org/html/rfc2474 for details. | |
| enum DiffServCodePoint { | |
| DSCP_NO_CHANGE = -1, | |
| DSCP_FIRST = DSCP_NO_CHANGE, | |
| 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 | |
| DSCP_LAST = DSCP_CS7 | |
| }; | |
| // Explicit Congestion Notification | |
| // See RFC3168 and RFC9330 for details. | |
| enum EcnCodePoint { | |
| ECN_NO_CHANGE = -1, | |
| ECN_FIRST = ECN_NO_CHANGE, | |
| ECN_DEFAULT = 0, | |
| ECN_NOT_ECT = 0, | |
| ECN_ECT1 = 1, | |
| ECN_ECT0 = 2, | |
| ECN_CE = 3, | |
| ECN_LAST = ECN_CE, | |
| }; | |
| struct DscpAndEcn { | |
| DiffServCodePoint dscp; | |
| EcnCodePoint ecn; | |
| }; | |
| // Converts an 8-bit IP TOS field to its DSCP and ECN parts. | |
| inline DscpAndEcn TosToDscpAndEcn(uint8_t tos) { | |
| // Bitmasks to find the DSCP and ECN pieces of the TOS byte. | |
| constexpr uint8_t kEcnMask = 0b11; | |
| constexpr uint8_t kDscpMask = ~kEcnMask; | |
| return DscpAndEcn{static_cast<DiffServCodePoint>((tos & kDscpMask) >> 2), | |
| static_cast<EcnCodePoint>(tos & kEcnMask)}; | |
| } | |
| // Converts DSCP and ECN parts back to an 8-bit IP TOS field. The inverse of | |
| // TosToDscpAndEcn(); the NO_CHANGE sentinels are not valid inputs (callers | |
| // must resolve them to concrete values first). | |
| inline uint8_t DscpAndEcnToTos(DiffServCodePoint dscp, EcnCodePoint ecn) { | |
| CHECK_NE(dscp, DSCP_NO_CHANGE); | |
| CHECK_NE(ecn, ECN_NO_CHANGE); | |
| return static_cast<uint8_t>((static_cast<int>(dscp) << 2) | | |
| static_cast<int>(ecn)); | |
| } | |
| } // namespace net | |
| #endif // NET_SOCKET_DIFF_SERV_CODE_POINT_H_ |