File: autothrottle.c

package info (click to toggle)
l2tpns 2.0.14-1sarge1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 688 kB
  • ctags: 1,349
  • sloc: ansic: 13,468; makefile: 160; sh: 142
file content (105 lines) | stat: -rw-r--r-- 2,632 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <string.h>
#include "l2tpns.h"
#include "plugin.h"

/* set up throttling based on RADIUS reply */

char const *cvs_id = "$Id: autothrottle.c,v 1.13 2004/11/30 07:14:45 bodea Exp $";

int plugin_api_version = PLUGIN_API_VERSION;
struct pluginfuncs *p;

#define THROTTLE_KEY "lcp:interface-config"

int plugin_radius_response(struct param_radius_response *data)
{
	if (!strncmp(data->key, THROTTLE_KEY, sizeof(THROTTLE_KEY) - 1))
	{
		char *sp = strchr(data->value, ' ');
		char type;
		int rate;

		if (!sp || sp - data->value < 4 ||
		    strncmp("service-policy", data->value, sp - data->value))
			return PLUGIN_RET_OK;

		while (*sp == ' ') sp++;
		data->value = sp;

		if (!(sp = strchr(data->value, ' ')) ||
		    (strncmp("input", data->value, sp - data->value) &&
		    strncmp("output", data->value, sp - data->value)))
		{
			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
				"         Not throttling user (invalid type %.*s)\n",
				sp - data->value, data->value);

			return PLUGIN_RET_OK;
		}

		type = *data->value;

		while (*sp == ' ') sp++;
		data->value = sp;

		if ((rate = strtol(data->value, &sp, 10)) < 0 || *sp)
		{
			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
				"         Not throttling user (invalid rate %s)\n",
				data->value);

			return PLUGIN_RET_OK;
		}

		if (type == 'i')
		{
			data->s->throttle_in = rate;
			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
				"         Throttling user input to %dkb/s\n",
				rate);
		}
		else
		{
			data->s->throttle_out = rate;
			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
				"         Throttling user output to %dkb/s\n",
				rate);
		}
	}

	if (!strcmp(data->key, "throttle"))
	{
		if (!strcmp(data->value, "yes"))
		{
		    	unsigned long *rate = p->getconfig("throttle_speed", UNSIGNED_LONG);
			if (rate)
			{
				if (*rate)
					p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
						"         Throttling user to %dkb/s\n", *rate);
				else
					p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
						"         Not throttling user (throttle_speed=0)\n");

				data->s->throttle_in = data->s->throttle_out = *rate;
			}
			else
				p->log(1, p->get_id_by_session(data->s), data->s->tunnel,
					"         Not throttling user (can't get throttle_speed)\n");
		}
		else if (!strcmp(data->value, "no"))
		{
			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
				"         Not throttling user\n");

			data->s->throttle_in = data->s->throttle_out = 0;
		}
	}

	return PLUGIN_RET_OK;
}

int plugin_init(struct pluginfuncs *funcs)
{
	return ((p = funcs)) ? 1 : 0;
}