1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* include/net/dsfield.h - Manipulation of the Differentiated Services field */
4 /* Written 1998-2000 by Werner Almesberger, EPFL ICA */
7 #ifndef __NET_DSFIELD_H
8 #define __NET_DSFIELD_H
10 #include <linux/types.h>
12 #include <linux/ipv6.h>
13 #include <asm/byteorder.h>
16 static inline __u8
ipv4_get_dsfield(const struct iphdr
*iph
)
22 static inline __u8
ipv6_get_dsfield(const struct ipv6hdr
*ipv6h
)
24 return ntohs(*(const __be16
*)ipv6h
) >> 4;
28 static inline void ipv4_change_dsfield(struct iphdr
*iph
,__u8 mask
,
31 __u32 check
= ntohs((__force __be16
)iph
->check
);
34 dsfield
= (iph
->tos
& mask
) | value
;
36 if ((check
+1) >> 16) check
= (check
+1) & 0xffff;
38 check
+= check
>> 16; /* adjust carry */
39 iph
->check
= (__force __sum16
)htons(check
);
44 static inline void ipv6_change_dsfield(struct ipv6hdr
*ipv6h
,__u8 mask
,
47 __be16
*p
= (__force __be16
*)ipv6h
;
49 *p
= (*p
& htons((((u16
)mask
<< 4) | 0xf00f))) | htons((u16
)value
<< 4);