5 /* set up throttling based on RADIUS reply */
7 char const *cvs_id
= "$Id: autothrottle.c,v 1.10 2004-11-29 02:17:17 bodea Exp $";
9 int plugin_api_version
= PLUGIN_API_VERSION
;
10 struct pluginfuncs
*p
;
12 #define THROTTLE_KEY "lcp:interface-config"
14 int plugin_radius_response(struct param_radius_response
*data
)
20 if (strncmp(data
->key
, THROTTLE_KEY
, strlen(THROTTLE_KEY
)) == 0)
22 char *pt
= strdup(data
->value
);
23 while ((t
= strsep(&pt
, " ")) != NULL
)
25 if (strcmp(t
, "serv") == 0)
27 else if (strcmp(t
, "o") && i
== 1)
29 else if (strcmp(t
, "i") && i
== 1)
31 else if (i
> 1 && (rate
= atoi(t
)) > 0)
36 data
->s
->throttle_out
= rate
;
38 p
->log(3, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
39 " Set output throttle rate %dkb/s\n", rate
);
44 data
->s
->throttle_in
= rate
;
46 p
->log(3, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
47 " Set input throttle rate %dkb/s\n", rate
);
52 p
->log(1, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
53 "Syntax error in rate limit AV pair: %s=%s\n", data
->key
, data
->value
);
62 p
->log(1, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
63 "Syntax error in rate limit AV pair: %s=%s\n",
64 data
->key
, data
->value
);
71 else if (strcmp(data
->key
, "throttle") == 0)
73 if (strcmp(data
->value
, "yes") == 0)
75 unsigned long *rate
= p
->getconfig("throttle_speed", UNSIGNED_LONG
);
79 p
->log(3, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
80 " Throttling user to %dkb/s\n", *rate
);
82 p
->log(3, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
83 " Not throttling user (throttle_speed=0)\n");
85 data
->s
->throttle_in
= data
->s
->throttle_out
= *rate
;
88 p
->log(1, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
89 "Not throttling user (can't get throttle_speed)\n");
91 else if (strcmp(data
->value
, "no") == 0)
93 p
->log(3, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
94 " Not throttling user\n");
96 data
->s
->throttle_in
= data
->s
->throttle_out
= 0;
100 p
->log(4, p
->get_id_by_session(data
->s
), data
->s
->tunnel
,
101 "autothrottle module ignoring AV pair %s=%s\n",
102 data
->key
, data
->value
);
104 return PLUGIN_RET_OK
;
107 int plugin_init(struct pluginfuncs
*funcs
)
109 return ((p
= funcs
)) ? 1 : 0;