ip_ecn.c (62587) | ip_ecn.c (78064) |
---|---|
1/* $FreeBSD: head/sys/netinet/ip_ecn.c 62587 2000-07-04 16:35:15Z itojun $ */ 2/* $KAME: ip_ecn.c,v 1.7 2000/05/05 11:00:56 sumikawa Exp $ */ | 1/* $FreeBSD: head/sys/netinet/ip_ecn.c 78064 2001-06-11 12:39:29Z ume $ */ 2/* $KAME: ip_ecn.c,v 1.11 2001/05/03 16:09:29 itojun Exp $ */ |
3 4/* 5 * Copyright (C) 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: --- 27 unchanged lines hidden (view full) --- 38#include "opt_inet.h" 39#include "opt_inet6.h" 40 41#include <sys/param.h> 42#include <sys/systm.h> 43#include <sys/mbuf.h> 44#include <sys/errno.h> 45 | 3 4/* 5 * Copyright (C) 1999 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: --- 27 unchanged lines hidden (view full) --- 38#include "opt_inet.h" 39#include "opt_inet6.h" 40 41#include <sys/param.h> 42#include <sys/systm.h> 43#include <sys/mbuf.h> 44#include <sys/errno.h> 45 |
46#ifdef INET | |
47#include <netinet/in.h> 48#include <netinet/in_systm.h> 49#include <netinet/ip.h> | 46#include <netinet/in.h> 47#include <netinet/in_systm.h> 48#include <netinet/ip.h> |
50#endif 51 | |
52#ifdef INET6 | 49#ifdef INET6 |
53#ifndef INET 54#include <netinet/in.h> 55#endif | |
56#include <netinet/ip6.h> 57#endif 58 59#include <netinet/ip_ecn.h> 60#ifdef INET6 61#include <netinet6/ip6_ecn.h> 62#endif 63 64/* 65 * modify outer ECN (TOS) field on ingress operation (tunnel encapsulation). | 50#include <netinet/ip6.h> 51#endif 52 53#include <netinet/ip_ecn.h> 54#ifdef INET6 55#include <netinet6/ip6_ecn.h> 56#endif 57 58/* 59 * modify outer ECN (TOS) field on ingress operation (tunnel encapsulation). |
66 * call it after you've done the default initialization/copy for the outer. | |
67 */ 68void 69ip_ecn_ingress(mode, outer, inner) 70 int mode; 71 u_int8_t *outer; | 60 */ 61void 62ip_ecn_ingress(mode, outer, inner) 63 int mode; 64 u_int8_t *outer; |
72 u_int8_t *inner; | 65 const u_int8_t *inner; |
73{ 74 if (!outer || !inner) 75 panic("NULL pointer passed to ip_ecn_ingress"); 76 | 66{ 67 if (!outer || !inner) 68 panic("NULL pointer passed to ip_ecn_ingress"); 69 |
70 *outer = *inner; |
|
77 switch (mode) { 78 case ECN_ALLOWED: /* ECN allowed */ 79 *outer &= ~IPTOS_CE; 80 break; 81 case ECN_FORBIDDEN: /* ECN forbidden */ 82 *outer &= ~(IPTOS_ECT | IPTOS_CE); 83 break; 84 case ECN_NOCARE: /* no consideration to ECN */ 85 break; 86 } 87} 88 89/* 90 * modify inner ECN (TOS) field on egress operation (tunnel decapsulation). | 71 switch (mode) { 72 case ECN_ALLOWED: /* ECN allowed */ 73 *outer &= ~IPTOS_CE; 74 break; 75 case ECN_FORBIDDEN: /* ECN forbidden */ 76 *outer &= ~(IPTOS_ECT | IPTOS_CE); 77 break; 78 case ECN_NOCARE: /* no consideration to ECN */ 79 break; 80 } 81} 82 83/* 84 * modify inner ECN (TOS) field on egress operation (tunnel decapsulation). |
91 * call it after you've done the default initialization/copy for the inner. | |
92 */ 93void 94ip_ecn_egress(mode, outer, inner) 95 int mode; | 85 */ 86void 87ip_ecn_egress(mode, outer, inner) 88 int mode; |
96 u_int8_t *outer; | 89 const u_int8_t *outer; |
97 u_int8_t *inner; 98{ 99 if (!outer || !inner) 100 panic("NULL pointer passed to ip_ecn_egress"); 101 102 switch (mode) { 103 case ECN_ALLOWED: 104 if (*outer & IPTOS_CE) --- 5 unchanged lines hidden (view full) --- 110 } 111} 112 113#ifdef INET6 114void 115ip6_ecn_ingress(mode, outer, inner) 116 int mode; 117 u_int32_t *outer; | 90 u_int8_t *inner; 91{ 92 if (!outer || !inner) 93 panic("NULL pointer passed to ip_ecn_egress"); 94 95 switch (mode) { 96 case ECN_ALLOWED: 97 if (*outer & IPTOS_CE) --- 5 unchanged lines hidden (view full) --- 103 } 104} 105 106#ifdef INET6 107void 108ip6_ecn_ingress(mode, outer, inner) 109 int mode; 110 u_int32_t *outer; |
118 u_int32_t *inner; | 111 const u_int32_t *inner; |
119{ 120 u_int8_t outer8, inner8; 121 122 if (!outer || !inner) 123 panic("NULL pointer passed to ip6_ecn_ingress"); 124 | 112{ 113 u_int8_t outer8, inner8; 114 115 if (!outer || !inner) 116 panic("NULL pointer passed to ip6_ecn_ingress"); 117 |
125 outer8 = (ntohl(*outer) >> 20) & 0xff; | |
126 inner8 = (ntohl(*inner) >> 20) & 0xff; 127 ip_ecn_ingress(mode, &outer8, &inner8); 128 *outer &= ~htonl(0xff << 20); 129 *outer |= htonl((u_int32_t)outer8 << 20); 130} 131 132void 133ip6_ecn_egress(mode, outer, inner) 134 int mode; | 118 inner8 = (ntohl(*inner) >> 20) & 0xff; 119 ip_ecn_ingress(mode, &outer8, &inner8); 120 *outer &= ~htonl(0xff << 20); 121 *outer |= htonl((u_int32_t)outer8 << 20); 122} 123 124void 125ip6_ecn_egress(mode, outer, inner) 126 int mode; |
135 u_int32_t *outer; | 127 const u_int32_t *outer; |
136 u_int32_t *inner; 137{ 138 u_int8_t outer8, inner8; 139 140 if (!outer || !inner) 141 panic("NULL pointer passed to ip6_ecn_egress"); 142 143 outer8 = (ntohl(*outer) >> 20) & 0xff; | 128 u_int32_t *inner; 129{ 130 u_int8_t outer8, inner8; 131 132 if (!outer || !inner) 133 panic("NULL pointer passed to ip6_ecn_egress"); 134 135 outer8 = (ntohl(*outer) >> 20) & 0xff; |
144 inner8 = (ntohl(*inner) >> 20) & 0xff; | |
145 ip_ecn_egress(mode, &outer8, &inner8); 146 *inner &= ~htonl(0xff << 20); 147 *inner |= htonl((u_int32_t)inner8 << 20); 148} 149#endif | 136 ip_ecn_egress(mode, &outer8, &inner8); 137 *inner &= ~htonl(0xff << 20); 138 *inner |= htonl((u_int32_t)inner8 << 20); 139} 140#endif |