18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* include/net/dsfield.h - Manipulation of the Differentiated Services field */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci/* Written 1998-2000 by Werner Almesberger, EPFL ICA */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef __NET_DSFIELD_H 88c2ecf20Sopenharmony_ci#define __NET_DSFIELD_H 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/ip.h> 128c2ecf20Sopenharmony_ci#include <linux/ipv6.h> 138c2ecf20Sopenharmony_ci#include <asm/byteorder.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic inline __u8 ipv4_get_dsfield(const struct iphdr *iph) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci return iph->tos; 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic inline __u8 ipv6_get_dsfield(const struct ipv6hdr *ipv6h) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci return ntohs(*(__force const __be16 *)ipv6h) >> 4; 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic inline void ipv4_change_dsfield(struct iphdr *iph,__u8 mask, 298c2ecf20Sopenharmony_ci __u8 value) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci __u32 check = ntohs((__force __be16)iph->check); 328c2ecf20Sopenharmony_ci __u8 dsfield; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci dsfield = (iph->tos & mask) | value; 358c2ecf20Sopenharmony_ci check += iph->tos; 368c2ecf20Sopenharmony_ci if ((check+1) >> 16) check = (check+1) & 0xffff; 378c2ecf20Sopenharmony_ci check -= dsfield; 388c2ecf20Sopenharmony_ci check += check >> 16; /* adjust carry */ 398c2ecf20Sopenharmony_ci iph->check = (__force __sum16)htons(check); 408c2ecf20Sopenharmony_ci iph->tos = dsfield; 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_cistatic inline void ipv6_change_dsfield(struct ipv6hdr *ipv6h,__u8 mask, 458c2ecf20Sopenharmony_ci __u8 value) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci __be16 *p = (__force __be16 *)ipv6h; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci *p = (*p & htons((((u16)mask << 4) | 0xf00f))) | htons((u16)value << 4); 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#endif 54