1 /* include/net/dsfield.h - Manipulation of the Differentiated Services field */
3 /* Written 1998-2000 by Werner Almesberger, EPFL ICA */
6 #ifndef __NET_DSFIELD_H
7 #define __NET_DSFIELD_H
9 #include <linux/types.h>
11 #include <linux/ipv6.h>
12 #include <asm/byteorder.h>
15 static inline __u8
ipv4_get_dsfield(const struct iphdr
*iph
)
21 static inline __u8
ipv6_get_dsfield(const struct ipv6hdr
*ipv6h
)
23 return ntohs(*(const __be16
*)ipv6h
) >> 4;
27 static inline void ipv4_change_dsfield(struct iphdr
*iph
,__u8 mask
,
30 __u32 check
= ntohs((__force __be16
)iph
->check
);
33 dsfield
= (iph
->tos
& mask
) | value
;
35 if ((check
+1) >> 16) check
= (check
+1) & 0xffff;
37 check
+= check
>> 16; /* adjust carry */
38 iph
->check
= (__force __sum16
)htons(check
);
43 static inline void ipv6_change_dsfield(struct ipv6hdr
*ipv6h
,__u8 mask
,
46 __be16
*p
= (__force __be16
*)ipv6h
;
48 *p
= (*p
& htons((((u16
)mask
<< 4) | 0xf00f))) | htons((u16
)value
<< 4);