// 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_ 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. static 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((tos & kDscpMask) >> 2), static_cast(tos & kEcnMask)}; } } // namespace net #endif // NET_SOCKET_DIFF_SERV_CODE_POINT_H_