summaryrefslogtreecommitdiff
path: root/accel-pptpd/extra/chap-secrets.c
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2010-11-07 00:43:36 +0300
committerDmitry Kozlov <xeb@mail.ru>2010-11-07 00:43:36 +0300
commit91df4499ccb1642c449c632ebc5a74ba7d5c7fd2 (patch)
treec066ec2ae80b7e550103f96407c5a6d5fb0d99e9 /accel-pptpd/extra/chap-secrets.c
parentab309f4568da0b6b64952e082a0f7d4cb1b028f8 (diff)
downloadaccel-ppp-91df4499ccb1642c449c632ebc5a74ba7d5c7fd2.tar.gz
accel-ppp-91df4499ccb1642c449c632ebc5a74ba7d5c7fd2.zip
chap-secrets: support the rate limit of session (in kilobits) at fifth column
Diffstat (limited to 'accel-pptpd/extra/chap-secrets.c')
-rw-r--r--accel-pptpd/extra/chap-secrets.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/accel-pptpd/extra/chap-secrets.c b/accel-pptpd/extra/chap-secrets.c
index d60ceb79..410b4e86 100644
--- a/accel-pptpd/extra/chap-secrets.c
+++ b/accel-pptpd/extra/chap-secrets.c
@@ -24,6 +24,7 @@ struct cs_pd_t
struct ppp_pd_t pd;
struct ipdb_item_t ip;
char *passwd;
+ char *rate;
};
static char *skip_word(char *ptr)
@@ -44,7 +45,7 @@ static int split(char *buf, char **ptr)
{
int i;
- for (i = 0; i < 3; i++) {
+ for (i = 0; i < 4; i++) {
buf = skip_word(buf);
if (!*buf)
return i;
@@ -72,7 +73,7 @@ static struct cs_pd_t *create_pd(struct ppp_t *ppp, const char *username)
{
FILE *f;
char *buf;
- char *ptr[4];
+ char *ptr[5];
int n;
struct cs_pd_t *pd;
@@ -122,10 +123,13 @@ found:
}
pd->ip.addr = conf_gw_ip_address;
- if (n == 3)
+ if (n >= 3)
pd->ip.peer_addr = inet_addr(ptr[2]);
pd->ip.owner = &ipdb;
-
+
+ if (n == 4)
+ pd->rate = _strdup(ptr[3]);
+
list_add_tail(&pd->pd.entry, &ppp->pd_list);
fclose(f);
@@ -156,9 +160,27 @@ static void ev_ppp_finished(struct ppp_t *ppp)
list_del(&pd->pd.entry);
_free(pd->passwd);
+ if (pd->rate)
+ _free(pd->rate);
_free(pd);
}
+static void ev_ppp_pre_up(struct ppp_t *ppp)
+{
+ struct cs_pd_t *pd = find_pd(ppp);
+ struct ev_shaper_t ev = {
+ .ppp = ppp,
+ };
+
+ if (!pd)
+ return;
+
+ if (pd->rate) {
+ ev.val = pd->rate;
+ triton_event_fire(EV_SHAPER, &ev);
+ }
+}
+
static struct ipdb_item_t *get_ip(struct ppp_t *ppp)
{
struct cs_pd_t *pd;
@@ -214,4 +236,5 @@ static void __init init(void)
ipdb_register(&ipdb);
triton_event_register_handler(EV_PPP_FINISHED, (triton_event_func)ev_ppp_finished);
+ triton_event_register_handler(EV_PPP_PRE_UP, (triton_event_func)ev_ppp_pre_up);
}