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