X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/5e01d2924d4eec8915e93a2cae01217ae25ab4dc..bdc2baa573df926eb1b0034d11a53622385a4241:/autothrottle.c?ds=inline

diff --git a/autothrottle.c b/autothrottle.c
index 9973a4f..074fe53 100644
--- a/autothrottle.c
+++ b/autothrottle.c
@@ -4,7 +4,16 @@
 
 /* set up throttling based on RADIUS reply */
 
-char const *cvs_id = "$Id: autothrottle.c,v 1.9 2004-11-17 08:23:34 bodea Exp $";
+/*
+ * lcp:interface-config#1=service-policy input N
+ * lcp:interface-config#2=service-policy output N
+ *
+ * throttle=N
+ * throttle=yes (use throttle_rate from config)
+ * throttle=no
+ */
+
+char const *cvs_id = "$Id: autothrottle.c,v 1.14 2005-05-13 05:28:16 bodea Exp $";
 
 int plugin_api_version = PLUGIN_API_VERSION;
 struct pluginfuncs *p;
@@ -13,79 +22,90 @@ struct pluginfuncs *p;
 
 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;
 		}
-		free(pt);
-	}
-	else if (strcmp(data->key, "throttle") == 0)
-	{
-		if (strcmp(data->value, "yes") == 0)
+
+		type = *data->value;
+
+		while (*sp == ' ') sp++;
+		data->value = sp;
+
+		if ((rate = strtol(data->value, &sp, 10)) < 0 || *sp)
 		{
-		    	unsigned long *rate = p->getconfig("throttle_speed", UNSIGNED_LONG);
-			if (rate)
-			{
-				if (*rate)
-					p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "         Throttling user to %dkb/s\n", *rate);
-				else
-					p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "         Not throttling user (throttle_speed=0)\n");
+			p->log(3, p->get_id_by_session(data->s), data->s->tunnel,
+				"         Not throttling user (invalid rate %s)\n",
+				data->value);
 
-				data->s->throttle_in = data->s->throttle_out = *rate;
-			}
-			else
-				p->log(1, 0, p->get_id_by_session(data->s), data->s->tunnel, "Not throttling user (can't get throttle_speed)\n");
+			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 if (strcmp(data->value, "no") == 0)
+		else
 		{
-			p->log(3, 0, p->get_id_by_session(data->s), data->s->tunnel, "         Not throttling user\n");
-			data->s->throttle_in = data->s->throttle_out = 0;
+			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);
 		}
 	}
 
-	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);
+	if (!strcmp(data->key, "throttle"))
+	{
+		char *e;
+		int rate;
+
+		if ((rate = strtol(data->value, &e, 10)) < 0 || *e)
+		{
+			rate = -1;
+			if (!strcmp(data->value, "yes"))
+			{
+				unsigned long *ts = p->getconfig("throttle_speed", UNSIGNED_LONG);
+				if (ts)
+					rate = *ts;
+			}
+			else if (!strcmp(data->value, "no"))
+				rate = 0;
+		}
+
+		if (rate < 0)
+			return PLUGIN_RET_OK;
+
+		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\n");
+
+		data->s->throttle_in = data->s->throttle_out = rate;
+	}
 
 	return PLUGIN_RET_OK;
 }