diff options
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r-- | accel-pptpd/ppp/ppp.c | 9 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.h | 12 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_auth.c | 2 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_ccp.c | 8 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_ipcp.c | 10 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_lcp.c | 16 |
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) |