summaryrefslogtreecommitdiff
path: root/accel-pptpd/ctrl/pppoe/pppoe.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ctrl/pppoe/pppoe.c')
-rw-r--r--accel-pptpd/ctrl/pppoe/pppoe.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/accel-pptpd/ctrl/pppoe/pppoe.c b/accel-pptpd/ctrl/pppoe/pppoe.c
index 57342ba..89525bc 100644
--- a/accel-pptpd/ctrl/pppoe/pppoe.c
+++ b/accel-pptpd/ctrl/pppoe/pppoe.c
@@ -59,16 +59,16 @@ struct delayed_pado_t
int conf_verbose;
char *conf_service_name;
char *conf_ac_name;
-int conf_pado_delay;
int conf_ifname_in_sid;
+char *conf_pado_delay;
static int shutdown_soft;
static mempool_t conn_pool;
static mempool_t pado_pool;
-uint32_t stat_active;
-uint32_t stat_delayed_pado;
+unsigned int stat_active;
+unsigned int stat_delayed_pado;
pthread_rwlock_t serv_lock = PTHREAD_RWLOCK_INITIALIZER;
LIST_HEAD(serv_list);
@@ -83,7 +83,7 @@ static int init_secret(struct pppoe_serv_t *serv);
static void disconnect(struct pppoe_conn_t *conn)
{
if (conn->ppp_started) {
- __sync_sub_and_fetch(&stat_active, 1);
+ dpado_check_prev(__sync_fetch_and_sub(&stat_active, 1));
conn->ppp_started = 0;
ppp_terminate(&conn->ppp, TERM_USER_REQUEST, 1);
}
@@ -132,7 +132,7 @@ static void ppp_finished(struct ppp_t *ppp)
log_ppp_debug("pppoe: ppp finished\n");
if (conn->ppp_started) {
- __sync_sub_and_fetch(&stat_active, 1);
+ dpado_check_prev(__sync_fetch_and_sub(&stat_active, 1));
conn->ppp_started = 0;
triton_context_call(&conn->ctx, (triton_event_func)disconnect, conn);
}
@@ -270,9 +270,10 @@ static void connect_channel(struct pppoe_conn_t *conn)
if (establish_ppp(&conn->ppp))
goto out_err_close;
- __sync_add_and_fetch(&stat_active, 1);
conn->ppp_started = 1;
+ dpado_check_next(__sync_add_and_fetch(&stat_active, 1));
+
return;
out_err_close:
@@ -647,7 +648,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
int n, service_match = 0;
struct delayed_pado_t *pado;
- if (shutdown_soft)
+ if (shutdown_soft || pado_delay == -1)
return;
if (hdr->sid) {
@@ -692,7 +693,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
return;
}
- if (conf_pado_delay) {
+ if (pado_delay) {
list_for_each_entry(pado, &serv->pado_list, entry) {
if (memcmp(pado->addr, ethhdr->h_source, ETH_ALEN))
continue;
@@ -721,7 +722,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
}
pado->timer.expire = pado_timer;
- pado->timer.period = conf_pado_delay;
+ pado->timer.period = pado_delay;
triton_timer_add(&serv->ctx, &pado->timer, 0);
@@ -1202,8 +1203,8 @@ static void __init pppoe_init(void)
if (opt->val && strlen(opt->val))
conf_service_name = _strdup(opt->val);
} else if (!strcmp(opt->name, "pado-delay") || !strcmp(opt->name, "PADO-delay")) {
- if (opt->val && atoi(opt->val) > 0)
- conf_pado_delay = atoi(opt->val);
+ if (dpado_parse(opt->val))
+ _exit(EXIT_FAILURE);
} else if (!strcmp(opt->name, "ifname-in-sid")) {
if (!opt->val)
continue;