|  | /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|  | /* | 
|  | * inet_dscp.h: helpers for handling differentiated services codepoints (DSCP) | 
|  | * | 
|  | * DSCP is defined in RFC 2474: | 
|  | * | 
|  | *        0   1   2   3   4   5   6   7 | 
|  | *      +---+---+---+---+---+---+---+---+ | 
|  | *      |         DSCP          |  CU   | | 
|  | *      +---+---+---+---+---+---+---+---+ | 
|  | * | 
|  | *        DSCP: differentiated services codepoint | 
|  | *        CU:   currently unused | 
|  | * | 
|  | * The whole DSCP + CU bits form the DS field. | 
|  | * The DS field is also commonly called TOS or Traffic Class (for IPv6). | 
|  | * | 
|  | * Note: the CU bits are now used for Explicit Congestion Notification | 
|  | *       (RFC 3168). | 
|  | */ | 
|  |  | 
|  | #ifndef _INET_DSCP_H | 
|  | #define _INET_DSCP_H | 
|  |  | 
|  | #include <linux/types.h> | 
|  |  | 
|  | /* Special type for storing DSCP values. | 
|  | * | 
|  | * A dscp_t variable stores a DS field with the CU (ECN) bits cleared. | 
|  | * Using dscp_t allows to strictly separate DSCP and ECN bits, thus avoiding | 
|  | * bugs where ECN bits are erroneously taken into account during FIB lookups | 
|  | * or policy routing. | 
|  | * | 
|  | * Note: to get the real DSCP value contained in a dscp_t variable one would | 
|  | * have to do a bit shift after calling inet_dscp_to_dsfield(). We could have | 
|  | * a helper for that, but there's currently no users. | 
|  | */ | 
|  | typedef u8 __bitwise dscp_t; | 
|  |  | 
|  | #define INET_DSCP_MASK 0xfc | 
|  |  | 
|  | static inline dscp_t inet_dsfield_to_dscp(__u8 dsfield) | 
|  | { | 
|  | return (__force dscp_t)(dsfield & INET_DSCP_MASK); | 
|  | } | 
|  |  | 
|  | static inline __u8 inet_dscp_to_dsfield(dscp_t dscp) | 
|  | { | 
|  | return (__force __u8)dscp; | 
|  | } | 
|  |  | 
|  | static inline bool inet_validate_dscp(__u8 val) | 
|  | { | 
|  | return !(val & ~INET_DSCP_MASK); | 
|  | } | 
|  |  | 
|  | #endif /* _INET_DSCP_H */ |