Commit | Line | Data |
---|---|---|
a410a0cf GN |
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* | |
3 | * inet_dscp.h: helpers for handling differentiated services codepoints (DSCP) | |
4 | * | |
5 | * DSCP is defined in RFC 2474: | |
6 | * | |
7 | * 0 1 2 3 4 5 6 7 | |
8 | * +---+---+---+---+---+---+---+---+ | |
9 | * | DSCP | CU | | |
10 | * +---+---+---+---+---+---+---+---+ | |
11 | * | |
12 | * DSCP: differentiated services codepoint | |
13 | * CU: currently unused | |
14 | * | |
15 | * The whole DSCP + CU bits form the DS field. | |
16 | * The DS field is also commonly called TOS or Traffic Class (for IPv6). | |
17 | * | |
18 | * Note: the CU bits are now used for Explicit Congestion Notification | |
19 | * (RFC 3168). | |
20 | */ | |
21 | ||
22 | #ifndef _INET_DSCP_H | |
23 | #define _INET_DSCP_H | |
24 | ||
25 | #include <linux/types.h> | |
26 | ||
27 | /* Special type for storing DSCP values. | |
28 | * | |
29 | * A dscp_t variable stores a DS field with the CU (ECN) bits cleared. | |
30 | * Using dscp_t allows to strictly separate DSCP and ECN bits, thus avoiding | |
31 | * bugs where ECN bits are erroneously taken into account during FIB lookups | |
32 | * or policy routing. | |
33 | * | |
34 | * Note: to get the real DSCP value contained in a dscp_t variable one would | |
35 | * have to do a bit shift after calling inet_dscp_to_dsfield(). We could have | |
36 | * a helper for that, but there's currently no users. | |
37 | */ | |
38 | typedef u8 __bitwise dscp_t; | |
39 | ||
40 | #define INET_DSCP_MASK 0xfc | |
41 | ||
42 | static inline dscp_t inet_dsfield_to_dscp(__u8 dsfield) | |
43 | { | |
44 | return (__force dscp_t)(dsfield & INET_DSCP_MASK); | |
45 | } | |
46 | ||
47 | static inline __u8 inet_dscp_to_dsfield(dscp_t dscp) | |
48 | { | |
49 | return (__force __u8)dscp; | |
50 | } | |
51 | ||
52 | static inline bool inet_validate_dscp(__u8 val) | |
53 | { | |
54 | return !(val & ~INET_DSCP_MASK); | |
55 | } | |
56 | ||
57 | #endif /* _INET_DSCP_H */ |