X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/c34bfa1cfc1b1e10c21defcb045e8dd7cd47d30f..469f01fe4970ad5d809f4db51b99be5e95345b24:/autothrottle.c?ds=inline

diff --git a/autothrottle.c b/autothrottle.c
index 65f3ff7..3d4e6d0 100644
--- a/autothrottle.c
+++ b/autothrottle.c
@@ -1,83 +1,101 @@
 #include <string.h>
-#include <malloc.h>
-#include <stdlib.h>
-#include <sys/wait.h>
-#include <sys/types.h>
 #include "l2tpns.h"
 #include "plugin.h"
-#include "control.h"
 
-int __plugin_api_version = 1;
+/* 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)
 {
-	char *t;
-	int i = 0;
-	int rate;
-
-	if (strncmp(data->key, THROTTLE_KEY, strlen(THROTTLE_KEY)) == 0)
+	if (!strncmp(data->key, THROTTLE_KEY, sizeof(THROTTLE_KEY) - 1))
 	{
-		char *pt = strdup(data->value);
-		while ((t = strsep(&pt, " ")) != NULL)
+		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)))
 		{
-			if (strcmp(t, "serv") == 0)
-				i = 1;
-			else if (strcmp(t, "o") && i == 1)
-				i = 2;
-			else if (strcmp(t, "i") && i == 1)
-				i = 3;
-			else if (i > 1 && (rate = atoi(t)) > 0)
-			{
-				switch (i)
-				{
-					case 2: // output
-						data->s->throttle_out = rate;
-						free(pt);
-						p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "      Set output throttle rate %dkb/s\n", rate);
-						return PLUGIN_RET_OK;
-
-					case 3: //input
-						data->s->throttle_in = rate;
-						free(pt);
-						p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "      Set input throttle rate %dkb/s\n", rate);
-						return PLUGIN_RET_OK;
-
-					default:
-						p->log(1, 0, p->get_id_by_session(data->s), data->s->tunnel, "Syntax error in rate limit AV pair: %s=%s\n", data->key, data->value);
-						free(pt);
-						return PLUGIN_RET_OK;
-				}
-			}
-			else
-			{
-				free(pt);
-				p->log(1, 0, p->get_id_by_session(data->s), data->s->tunnel, "Syntax error in rate limit AV pair: %s=%s\n",
-					data->key, data->value);
-				return PLUGIN_RET_OK;
-			}
+			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);
 		}
-		free(pt);
 	}
-	else if (strcmp(data->key, "throttle") == 0)
+
+	if (!strcmp(data->key, "throttle"))
 	{
-		if (strcmp(data->value, "yes") == 0)
+		if (!strcmp(data->value, "yes"))
 		{
-			p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "         Throttling user\n");
-			data->s->throttle_in = data->s->throttle_out = config->rl_rate;
+		    	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") == 0)
+		else if (!strcmp(data->value, "no"))
 		{
-			p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "         Not throttling user\n");
+			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;
 		}
 	}
 
-	p->log(4, 0, p->get_id_by_session(data->s), data->s->tunnel, "autothrottle module ignoring AV pair %s=%s\n",
-		data->key, data->value);
-
 	return PLUGIN_RET_OK;
 }
 
@@ -85,8 +103,3 @@ int plugin_init(struct pluginfuncs *funcs)
 {
 	return ((p = funcs)) ? 1 : 0;
 }
-
-void plugin_done()
-{
-}
-