shaper.h

来自「OpenVPN -- A Secure tunneling daemon」· C头文件 代码 · 共 182 行

H
182
字号
/* *  OpenVPN -- An application to securely tunnel IP networks *             over a single UDP port, with support for SSL/TLS-based *             session authentication and key exchange, *             packet encryption, packet authentication, and *             packet compression. * *  Copyright (C) 2002-2003 James Yonan <jim@yonan.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program (see the file COPYING included with this *  distribution); if not, write to the Free Software Foundation, Inc., *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef SHAPER_H#define SHAPER_H#ifdef HAVE_GETTIMEOFDAY#include "basic.h"#include "misc.h"#include "error.h"/* * A simple traffic shaper for * the output direction. */#define SHAPER_MIN 100          /* bytes per second */#define SHAPER_MAX 100000000#define SHAPER_MAX_TIMEOUT 10          /* seconds */struct shaper {  int bytes_per_second;  struct timeval wakeup;};void shaper_msg (struct shaper *s);/* * inline functions */static inline voidshaper_reset (struct shaper *s, int bytes_per_second){  s->bytes_per_second = bytes_per_second ? constrain_int (bytes_per_second, SHAPER_MIN, SHAPER_MAX) : 0;}static inline voidshaper_reset_wakeup (struct shaper *s){  CLEAR (s->wakeup);}static inline voidshaper_init (struct shaper *s, int bytes_per_second){  shaper_reset (s, bytes_per_second);  shaper_reset_wakeup (s);}static inline intshaper_current_bandwidth (struct shaper *s){  return s->bytes_per_second;}/* * Returns traffic shaping delay in microseconds relative to current * time, or 0 if no delay. */static inline intshaper_delay (struct shaper* s){  struct timeval tv;  int delay = 0;  if (tv_defined (&s->wakeup))    {      ASSERT (!gettimeofday (&tv, NULL));      delay = tv_subtract (&s->wakeup, &tv, SHAPER_MAX_TIMEOUT);      msg (D_SHAPER_DEBUG, "SHAPER shaper_delay delay=%d", delay);    }  return delay > 0 ? delay : 0;}/* * We want to wake up in delay microseconds.  If timeval is 0 (undefined) or larger * than delay, set timeval to delay. */static inline voidshaper_soonest_event (struct timeval *tv, int delay){  if (!tv->tv_usec && delay < 1000000)    {      tv->tv_usec = delay;      tv->tv_sec = 0;    }  else    {      const int sec = delay / 1000000;      const int usec = delay % 1000000;      if ((!tv->tv_sec && !tv->tv_usec) || (sec < tv->tv_sec))	{	  tv->tv_sec = sec;	  tv->tv_usec = usec;	}      else if (sec == tv->tv_sec)	{	  if (usec < tv->tv_usec)	    {	      tv->tv_usec = usec;	    }	}    }  msg (D_SHAPER_DEBUG, "SHAPER shaper_soonest_event sec=%d usec=%d",       (int)tv->tv_sec, (int)tv->tv_usec);}/* * We are about to send a datagram of nbytes bytes. * * Compute when we can send another datagram, * based on target throughput (s->bytes_per_second). */static inline voidshaper_wrote_bytes (struct shaper* s, int nbytes){  /* delay in microseconds */  const int delay = s->bytes_per_second    ? min_int (((1000000 / s->bytes_per_second) * max_int (nbytes, 200)), (SHAPER_MAX_TIMEOUT*1000000))    : 0;    if (delay)    {      ASSERT (!gettimeofday (&s->wakeup, NULL));      s->wakeup.tv_usec += delay;      while (s->wakeup.tv_usec >= 1000000)	{	  ++s->wakeup.tv_sec;	  s->wakeup.tv_usec -= 1000000;	}      msg (D_SHAPER_DEBUG, "SHAPER shaper_wrote_bytes bytes=%d delay=%d sec=%d usec=%d",	   nbytes, delay, (int)s->wakeup.tv_sec, (int)s->wakeup.tv_usec);    }}/* * Increase/Decrease bandwidth by a percentage. * * Return true if bandwidth changed. */static inline boolshaper_change_pct (struct shaper *s, int pct){  const int orig_bandwidth = s->bytes_per_second;  const int new_bandwidth = orig_bandwidth + (orig_bandwidth * pct / 100);  ASSERT (s->bytes_per_second);  shaper_reset (s, new_bandwidth);  return s->bytes_per_second != orig_bandwidth;}#endif /* HAVE_GETTIMEOFDAY */#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?