1 //==========================================================================
3 // src/sys/netinet/ip_ecn.c
5 //==========================================================================
6 //####BSDCOPYRIGHTBEGIN####
8 // -------------------------------------------
10 // Portions of this software may have been derived from OpenBSD,
11 // FreeBSD or other sources, and are covered by the appropriate
12 // copyright disclaimers included herein.
14 // Portions created by Red Hat are
15 // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved.
17 // -------------------------------------------
19 //####BSDCOPYRIGHTEND####
20 //==========================================================================
22 /* $KAME: ip_ecn.c,v 1.11 2001/05/03 16:09:29 itojun Exp $ */
25 * Copyright (C) 1999 WIDE Project.
26 * All rights reserved.
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. Neither the name of the project nor the names of its contributors
37 * may be used to endorse or promote products derived from this software
38 * without specific prior written permission.
40 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * ECN consideration on tunnel ingress/egress operation.
55 * http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt
58 #include <sys/param.h>
59 #include <sys/malloc.h>
61 #include <sys/errno.h>
63 #include <netinet/in.h>
64 #include <netinet/in_systm.h>
65 #include <netinet/ip.h>
67 #include <netinet/ip6.h>
70 #include <netinet/ip_ecn.h>
73 * modify outer ECN (TOS) field on ingress operation (tunnel encapsulation).
76 ip_ecn_ingress(mode, outer, inner)
79 const u_int8_t *inner;
82 panic("NULL pointer passed to ip_ecn_ingress");
86 case ECN_ALLOWED: /* ECN allowed */
89 case ECN_FORBIDDEN: /* ECN forbidden */
90 *outer &= ~(IPTOS_ECT | IPTOS_CE);
92 case ECN_NOCARE: /* no consideration to ECN */
98 * modify inner ECN (TOS) field on egress operation (tunnel decapsulation).
101 ip_ecn_egress(mode, outer, inner)
103 const u_int8_t *outer;
106 if (!outer || !inner)
107 panic("NULL pointer passed to ip_ecn_egress");
111 if (*outer & IPTOS_CE)
114 case ECN_FORBIDDEN: /* ECN forbidden */
115 case ECN_NOCARE: /* no consideration to ECN */
122 ip6_ecn_ingress(mode, outer, inner)
125 const u_int32_t *inner;
127 u_int8_t outer8, inner8;
129 if (!outer || !inner)
130 panic("NULL pointer passed to ip6_ecn_ingress");
132 inner8 = (ntohl(*inner) >> 20) & 0xff;
133 ip_ecn_ingress(mode, &outer8, &inner8);
134 *outer &= ~htonl(0xff << 20);
135 *outer |= htonl((u_int32_t)outer8 << 20);
139 ip6_ecn_egress(mode, outer, inner)
141 const u_int32_t *outer;
144 u_int8_t outer8, inner8;
146 if (!outer || !inner)
147 panic("NULL pointer passed to ip6_ecn_egress");
149 outer8 = (ntohl(*outer) >> 20) & 0xff;
150 ip_ecn_egress(mode, &outer8, &inner8);
151 *inner &= ~htonl(0xff << 20);
152 *inner |= htonl((u_int32_t)inner8 << 20);