linux/include/net/dsfield.h
<<
>>
Prefs
   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
  15static inline __u8 ipv4_get_dsfield(const struct iphdr *iph)
  16{
  17        return iph->tos;
  18}
  19
  20
  21static inline __u8 ipv6_get_dsfield(const struct ipv6hdr *ipv6h)
  22{
  23        return ntohs(*(const __be16 *)ipv6h) >> 4;
  24}
  25
  26
  27static inline void ipv4_change_dsfield(struct iphdr *iph,__u8 mask,
  28    __u8 value)
  29{
  30        __u32 check = ntohs((__force __be16)iph->check);
  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 */
  38        iph->check = (__force __sum16)htons(check);
  39        iph->tos = dsfield;
  40}
  41
  42
  43static inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask,
  44    __u8 value)
  45{
  46        __be16 *p = (__force __be16 *)ipv6h;
  47
  48        *p = (*p & htons((((u16)mask << 4) | 0xf00f))) | htons((u16)value << 4);
  49}
  50
  51
  52#endif
  53