| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* include/net/dsfield.h - Manipulation of the Differentiated Services field */ | 
|  | 2 |  | 
|  | 3 | /* Written 1998-2000 by Werner Almesberger, EPFL ICA */ | 
|  | 4 |  | 
|  | 5 |  | 
|  | 6 | #ifndef __NET_DSFIELD_H | 
|  | 7 | #define __NET_DSFIELD_H | 
|  | 8 |  | 
|  | 9 | #include <linux/types.h> | 
|  | 10 | #include <linux/ip.h> | 
|  | 11 | #include <linux/ipv6.h> | 
|  | 12 | #include <asm/byteorder.h> | 
|  | 13 |  | 
|  | 14 |  | 
|  | 15 | static inline __u8 ipv4_get_dsfield(struct iphdr *iph) | 
|  | 16 | { | 
|  | 17 | return iph->tos; | 
|  | 18 | } | 
|  | 19 |  | 
|  | 20 |  | 
|  | 21 | static inline __u8 ipv6_get_dsfield(struct ipv6hdr *ipv6h) | 
|  | 22 | { | 
| Al Viro | 8a9ae21 | 2006-11-08 00:24:26 -0800 | [diff] [blame] | 23 | return ntohs(*(__be16 *) ipv6h) >> 4; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 24 | } | 
|  | 25 |  | 
|  | 26 |  | 
|  | 27 | static inline void ipv4_change_dsfield(struct iphdr *iph,__u8 mask, | 
|  | 28 | __u8 value) | 
|  | 29 | { | 
| Al Viro | 5c78f27 | 2006-11-14 21:42:26 -0800 | [diff] [blame] | 30 | __u32 check = ntohs((__force __be16)iph->check); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 31 | __u8 dsfield; | 
|  | 32 |  | 
|  | 33 | dsfield = (iph->tos & mask) | value; | 
|  | 34 | check += iph->tos; | 
|  | 35 | if ((check+1) >> 16) check = (check+1) & 0xffff; | 
|  | 36 | check -= dsfield; | 
|  | 37 | check += check >> 16; /* adjust carry */ | 
| Al Viro | 5c78f27 | 2006-11-14 21:42:26 -0800 | [diff] [blame] | 38 | iph->check = (__force __sum16)htons(check); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 39 | iph->tos = dsfield; | 
|  | 40 | } | 
|  | 41 |  | 
|  | 42 |  | 
|  | 43 | static inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask, | 
|  | 44 | __u8 value) | 
|  | 45 | { | 
|  | 46 | __u16 tmp; | 
|  | 47 |  | 
| Al Viro | 8a9ae21 | 2006-11-08 00:24:26 -0800 | [diff] [blame] | 48 | tmp = ntohs(*(__be16 *) ipv6h); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 49 | tmp = (tmp & ((mask << 4) | 0xf00f)) | (value << 4); | 
| Al Viro | 8a9ae21 | 2006-11-08 00:24:26 -0800 | [diff] [blame] | 50 | *(__be16 *) ipv6h = htons(tmp); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 51 | } | 
|  | 52 |  | 
|  | 53 |  | 
|  | 54 | #endif |