summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r--accel-pptpd/ppp/ppp.c9
-rw-r--r--accel-pptpd/ppp/ppp.h12
-rw-r--r--accel-pptpd/ppp/ppp_auth.c2
-rw-r--r--accel-pptpd/ppp/ppp_ccp.c8
-rw-r--r--accel-pptpd/ppp/ppp_ipcp.c10
-rw-r--r--accel-pptpd/ppp/ppp_lcp.c16
6 files changed, 34 insertions, 23 deletions
diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c
index bf3635e..d88bbd3 100644
--- a/accel-pptpd/ppp/ppp.c
+++ b/accel-pptpd/ppp/ppp.c
@@ -352,7 +352,7 @@ void __export ppp_layer_started(struct ppp_t *ppp, struct ppp_layer_data_t *d)
list_for_each_entry(d, &n->items, entry) {
d->starting = 1;
if (d->layer->start(d)) {
- ppp_terminate(ppp, 0);
+ ppp_terminate(ppp, TERM_NAS_ERROR, 0);
return;
}
}
@@ -376,12 +376,15 @@ void __export ppp_layer_finished(struct ppp_t *ppp, struct ppp_layer_data_t *d)
destablish_ppp(ppp);
}
-void __export ppp_terminate(struct ppp_t *ppp, int hard)
+void __export ppp_terminate(struct ppp_t *ppp, int cause, int hard)
{
struct layer_node_t *n;
struct ppp_layer_data_t *d;
int s = 0;
+ if (!ppp->terminate_cause)
+ ppp->terminate_cause = cause;
+
if (ppp->terminating) {
if (hard)
destablish_ppp(ppp);
@@ -520,7 +523,7 @@ static void start_first_layer(struct ppp_t *ppp)
list_for_each_entry(d, &n->items, entry) {
d->starting = 1;
if (d->layer->start(d)) {
- ppp_terminate(ppp, 0);
+ ppp_terminate(ppp, TERM_NAS_ERROR, 0);
return;
}
}
diff --git a/accel-pptpd/ppp/ppp.h b/accel-pptpd/ppp/ppp.h
index 372520d..dda5244 100644
--- a/accel-pptpd/ppp/ppp.h
+++ b/accel-pptpd/ppp/ppp.h
@@ -46,6 +46,14 @@
#define PPP_SESSIONID_LEN 32
#define PPP_IFNAME_LEN 10
+#define TERM_USER_REQUEST 1
+#define TERM_SESSION_TIMEOUT 2
+#define TERM_ADMIN_RESET 3
+#define TERM_USER_ERROR 4
+#define TERM_NAS_ERROR 5
+#define TERM_AUTH_ERROR 6
+
+
struct ppp_t;
struct ppp_ctrl_t
@@ -86,8 +94,8 @@ struct ppp_t
struct ppp_ctrl_t *ctrl;
- int log:1;
int terminating:1;
+ int terminate_cause;
void *chan_buf;
int chan_buf_size;
@@ -144,7 +152,7 @@ void ppp_recv_proto_rej(struct ppp_t *ppp, uint16_t proto);
struct ppp_fsm_t* ppp_lcp_init(struct ppp_t *ppp);
void ppp_layer_started(struct ppp_t *ppp,struct ppp_layer_data_t*);
void ppp_layer_finished(struct ppp_t *ppp,struct ppp_layer_data_t*);
-void ppp_terminate(struct ppp_t *ppp, int hard);
+void ppp_terminate(struct ppp_t *ppp, int hard, int cause);
void ppp_register_chan_handler(struct ppp_t *, struct ppp_handler_t *);
void ppp_register_unit_handler(struct ppp_t * ,struct ppp_handler_t *);
diff --git a/accel-pptpd/ppp/ppp_auth.c b/accel-pptpd/ppp/ppp_auth.c
index 65ca223..959dc2f 100644
--- a/accel-pptpd/ppp/ppp_auth.c
+++ b/accel-pptpd/ppp/ppp_auth.c
@@ -309,7 +309,7 @@ void __export auth_successed(struct ppp_t *ppp, char *username)
void __export auth_failed(struct ppp_t *ppp)
{
- ppp_terminate(ppp, 0);
+ ppp_terminate(ppp, TERM_AUTH_ERROR, 0);
}
int __export ppp_auth_register_handler(struct ppp_auth_handler_t *h)
diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c
index af776e4..dd63c71 100644
--- a/accel-pptpd/ppp/ppp_ccp.c
+++ b/accel-pptpd/ppp/ppp_ccp.c
@@ -182,7 +182,7 @@ static void ccp_layer_up(struct ppp_fsm_t *fsm)
if (!ccp->started) {
ccp->started = 1;
if (ccp_set_flags(ccp->ppp->unit_fd, 1, 1)) {
- ppp_terminate(ccp->ppp, 0);
+ ppp_terminate(ccp->ppp, TERM_NAS_ERROR, 0);
return;
}
ppp_layer_started(ccp->ppp, &ccp->ld);
@@ -649,11 +649,11 @@ static void ccp_recv(struct ppp_handler_t*h)
send_conf_req(&ccp->fsm);
}
if (r == CCP_OPT_FAIL)
- ppp_terminate(ccp->ppp, 0);
+ ppp_terminate(ccp->ppp, TERM_USER_ERROR, 0);
break;
case CONFACK:
if (ccp_recv_conf_ack(ccp, (uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(ccp->ppp, 0);
+ ppp_terminate(ccp->ppp, TERM_USER_ERROR, 0);
else {
ppp_fsm_recv_conf_ack(&ccp->fsm);
if (ccp->need_req)
@@ -666,7 +666,7 @@ static void ccp_recv(struct ppp_handler_t*h)
break;
case CONFREJ:
if (ccp_recv_conf_rej(ccp, (uint8_t*)(hdr + 1),ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(ccp->ppp, 0);
+ ppp_terminate(ccp->ppp, TERM_USER_ERROR, 0);
else
ppp_fsm_recv_conf_rej(&ccp->fsm);
break;
diff --git a/accel-pptpd/ppp/ppp_ipcp.c b/accel-pptpd/ppp/ppp_ipcp.c
index c834873..fe5b39d 100644
--- a/accel-pptpd/ppp/ppp_ipcp.c
+++ b/accel-pptpd/ppp/ppp_ipcp.c
@@ -156,7 +156,7 @@ static void ipcp_layer_down(struct ppp_fsm_t *fsm)
ipcp->started = 0;
ppp_layer_finished(ipcp->ppp, &ipcp->ld);
} else
- ppp_terminate(ipcp->ppp, 1);
+ ppp_terminate(ipcp->ppp, TERM_NAS_ERROR, 1);
}
static void print_ropt(struct recv_opt_t *ropt)
@@ -584,11 +584,11 @@ static void ipcp_recv(struct ppp_handler_t*h)
}
ipcp_free_conf_req(ipcp);
if (r == IPCP_OPT_FAIL)
- ppp_terminate(ipcp->ppp, 0);
+ ppp_terminate(ipcp->ppp, TERM_USER_ERROR, 0);
break;
case CONFACK:
if (ipcp_recv_conf_ack(ipcp,(uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(ipcp->ppp, 0);
+ ppp_terminate(ipcp->ppp, TERM_USER_ERROR, 0);
else
ppp_fsm_recv_conf_ack(&ipcp->fsm);
break;
@@ -598,7 +598,7 @@ static void ipcp_recv(struct ppp_handler_t*h)
break;
case CONFREJ:
if (ipcp_recv_conf_rej(ipcp, (uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(ipcp->ppp, 0);
+ ppp_terminate(ipcp->ppp, TERM_USER_ERROR, 0);
else
ppp_fsm_recv_conf_rej(&ipcp->fsm);
break;
@@ -606,7 +606,7 @@ static void ipcp_recv(struct ppp_handler_t*h)
if (conf_ppp_verbose)
log_ppp_info("recv [IPCP TermReq id=%x]\n", hdr->id);
ppp_fsm_recv_term_req(&ipcp->fsm);
- ppp_terminate(ipcp->ppp, 0);
+ ppp_terminate(ipcp->ppp, TERM_USER_REQUEST, 0);
break;
case TERMACK:
if (conf_ppp_verbose)
diff --git a/accel-pptpd/ppp/ppp_lcp.c b/accel-pptpd/ppp/ppp_lcp.c
index 7a87766..bd04f54 100644
--- a/accel-pptpd/ppp/ppp_lcp.c
+++ b/accel-pptpd/ppp/ppp_lcp.c
@@ -178,7 +178,7 @@ static void lcp_layer_finished(struct ppp_fsm_t *fsm)
lcp->started = 0;
ppp_layer_finished(lcp->ppp, &lcp->ld);
} else
- ppp_terminate(lcp->ppp, 1);
+ ppp_terminate(lcp->ppp, TERM_NAS_ERROR, 1);
}
static void print_ropt(struct recv_opt_t *ropt)
@@ -559,7 +559,7 @@ static void lcp_recv_echo_repl(struct ppp_lcp_t *lcp, uint8_t *data, int size)
if (size != 4) {
log_ppp_error("lcp:echo: magic number size mismatch\n");
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_ERROR, 0);
}
if (conf_ppp_verbose)
@@ -567,7 +567,7 @@ static void lcp_recv_echo_repl(struct ppp_lcp_t *lcp, uint8_t *data, int size)
if (magic == lcp->magic) {
log_ppp_error("lcp: echo: loop-back detected\n");
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_NAS_ERROR, 0);
}
lcp->echo_sent = 0;
@@ -604,7 +604,7 @@ static void send_echo_request(struct triton_timer_t *t)
if (++lcp->echo_sent > lcp->echo_failure) {
log_ppp_warn("lcp: no echo reply\n");
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_ERROR, 0);
} else {
if (conf_ppp_verbose)
log_ppp_info("send [LCP EchoReq id=%x <magic %x>]\n", msg.hdr.id, msg.magic);
@@ -723,11 +723,11 @@ static void lcp_recv(struct ppp_handler_t*h)
}
lcp_free_conf_req(lcp);
if (r == LCP_OPT_FAIL)
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_ERROR, 0);
break;
case CONFACK:
if (lcp_recv_conf_ack(lcp,(uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_ERROR, 0);
else
if (lcp->fsm.recv_id != lcp->fsm.id)
break;
@@ -741,7 +741,7 @@ static void lcp_recv(struct ppp_handler_t*h)
break;
case CONFREJ:
if (lcp_recv_conf_rej(lcp,(uint8_t*)(hdr + 1), ntohs(hdr->len) - PPP_HDRLEN))
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_ERROR, 0);
else
if (lcp->fsm.recv_id != lcp->fsm.id)
break;
@@ -751,7 +751,7 @@ static void lcp_recv(struct ppp_handler_t*h)
if (conf_ppp_verbose)
log_ppp_info("recv [LCP TermReq id=%x]\n", hdr->id);
ppp_fsm_recv_term_req(&lcp->fsm);
- ppp_terminate(lcp->ppp, 0);
+ ppp_terminate(lcp->ppp, TERM_USER_REQUEST, 0);
break;
case TERMACK:
if (conf_ppp_verbose)