summaryrefslogtreecommitdiff
path: root/accel-pptpd/radius/dm_coa.c
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/radius/dm_coa.c')
-rw-r--r--accel-pptpd/radius/dm_coa.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/accel-pptpd/radius/dm_coa.c b/accel-pptpd/radius/dm_coa.c
index 4b89449..5edbdd9 100644
--- a/accel-pptpd/radius/dm_coa.c
+++ b/accel-pptpd/radius/dm_coa.c
@@ -134,7 +134,10 @@ static void disconnect_request(struct radius_pd_t *rpd)
dm_coa_send_ack(serv.hnd.fd, rpd->dm_coa_req, &rpd->dm_coa_addr);
rad_packet_free(rpd->dm_coa_req);
+
+ pthread_mutex_lock(&rpd->lock);
rpd->dm_coa_req = NULL;
+ pthread_mutex_unlock(&rpd->lock);
ppp_terminate(rpd->ppp, TERM_ADMIN_RESET, 0);
}
@@ -165,6 +168,13 @@ static void coa_request(struct radius_pd_t *rpd)
pthread_mutex_unlock(&rpd->lock);
}
+void dm_coa_cancel(struct radius_pd_t *rpd)
+{
+ triton_cancel_call(rpd->ppp->ctrl->ctx, (triton_event_func)disconnect_request);
+ triton_cancel_call(rpd->ppp->ctrl->ctx, (triton_event_func)coa_request);
+ rad_packet_free(rpd->dm_coa_req);
+}
+
static int dm_coa_read(struct triton_md_handler_t *h)
{
struct rad_packet_t *pack;
@@ -216,9 +226,9 @@ static int dm_coa_read(struct triton_md_handler_t *h)
memcpy(&rpd->dm_coa_addr, &addr, sizeof(addr));
if (pack->code == CODE_DISCONNECT_REQUEST)
- triton_context_call(rpd->ppp->ctrl->ctx, (void (*)(void *))disconnect_request, rpd);
+ triton_context_call(rpd->ppp->ctrl->ctx, (triton_event_func)disconnect_request, rpd);
else
- triton_context_call(rpd->ppp->ctrl->ctx, (void (*)(void *))coa_request, rpd);
+ triton_context_call(rpd->ppp->ctrl->ctx, (triton_event_func)coa_request, rpd);
pthread_mutex_unlock(&rpd->lock);