diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2010-11-07 00:43:36 +0300 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2010-11-07 00:43:36 +0300 |
commit | 91df4499ccb1642c449c632ebc5a74ba7d5c7fd2 (patch) | |
tree | c066ec2ae80b7e550103f96407c5a6d5fb0d99e9 /accel-pptpd/extra/chap-secrets.c | |
parent | ab309f4568da0b6b64952e082a0f7d4cb1b028f8 (diff) | |
download | accel-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.c | 31 |
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); } |