• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/openvpn/src/openvpn/
1/*
2 *  OpenVPN -- An application to securely tunnel IP networks
3 *             over a single UDP port, with support for SSL/TLS-based
4 *             session authentication and key exchange,
5 *             packet encryption, packet authentication, and
6 *             packet compression.
7 *
8 *  Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net>
9 *
10 *  This program is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 2
12 *  as published by the Free Software Foundation.
13 *
14 *  This program is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this program (see the file COPYING included with this
21 *  distribution); if not, write to the Free Software Foundation, Inc.,
22 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23 */
24
25#ifndef INTEGER_H
26#define INTEGER_H
27
28#include "error.h"
29
30/*
31 * min/max functions
32 */
33
34static inline int
35max_int (int x, int y)
36{
37  if (x > y)
38    return x;
39  else
40    return y;
41}
42
43static inline int
44min_int (int x, int y)
45{
46  if (x < y)
47    return x;
48  else
49    return y;
50}
51
52static inline int
53constrain_int (int x, int min, int max)
54{
55  if (min > max)
56    return min;
57  if (x < min)
58    return min;
59  else if (x > max)
60    return max;
61  else
62    return x;
63}
64
65/*
66 * Functions used for circular buffer index arithmetic.
67 */
68
69/*
70 * Return x - y on a circle of circumference mod by shortest path.
71 *
72 * 0 <= x < mod
73 * 0 <= y < mod
74 */
75static inline int
76modulo_subtract(int x, int y, int mod)
77{
78  const int d1 = x - y;
79  const int d2 = (x > y ? -mod : mod) + d1;
80  ASSERT (0 <= x && x < mod && 0 <= y && y < mod);
81  return abs(d1) > abs(d2) ? d2 : d1;
82}
83
84/*
85 * Return x + y on a circle of circumference mod.
86 *
87 * 0 <= x < mod
88 * -mod <= y <= mod
89 */
90static inline int
91modulo_add(int x, int y, int mod)
92{
93  int sum = x + y;
94  ASSERT (0 <= x && x < mod && -mod <= y && y <= mod);
95  if (sum >= mod)
96    sum -= mod;
97  if (sum < 0)
98    sum += mod;
99  return sum;
100}
101
102static inline int
103index_verify (int index, int size, const char *file, int line)
104{
105  if (index < 0 || index >= size)
106    msg (M_FATAL, "Assertion Failed: Array index=%d out of bounds for array size=%d in %s:%d",
107	 index,
108	 size,
109	 file,
110	 line);
111  return index;
112}
113
114#endif
115