static void chap_response(chap *_this, int authok, u_char *pktp, int lpktp) { const char *realm_name; CHAP_ASSERT(_this != NULL); CHAP_ASSERT(pktp != NULL); CHAP_ASSERT(_this->type == PPP_AUTH_CHAP_MD5 || _this->type == PPP_AUTH_CHAP_MS_V2); ppp_output(_this->ppp, PPP_PROTO_CHAP, (authok)? 3 : 4, _this->challid, pktp, lpktp); realm_name = npppd_ppp_get_realm_name(_this->ppp->pppd, _this->ppp); if (!authok) { chap_log(_this, LOG_ALERT, "logtype=Failure username=\"%s\" realm=%s", _this->name, realm_name); chap_stop(_this); /* Stop the PPP if the authentication is failed. */ ppp_set_disconnect_cause(_this->ppp, PPP_DISCON_AUTH_FAILED, PPP_PROTO_CHAP, 1 /* peer */, NULL); ppp_stop(_this->ppp, "Authentication Required"); } else { strlcpy(_this->ppp->username, _this->name, sizeof(_this->ppp->username)); chap_log(_this, LOG_INFO, "logtype=Success username=\"%s\" " "realm=%s", _this->name, realm_name); chap_stop(_this); /* We change our state to prepare to resend requests. */ _this->state = CHAP_STATE_SENT_RESPONSE; ppp_auth_ok(_this->ppp); } }
static void ppp_down_others(npppd_ppp *_this) { fsm_lowerdown(&_this->ccp.fsm); fsm_lowerdown(&_this->ipcp.fsm); npppd_release_ip(_this->pppd, _this); if (AUTH_IS_PAP(_this)) pap_stop(&_this->pap); if (AUTH_IS_CHAP(_this)) chap_stop(&_this->chap); #ifdef USE_NPPPD_EAP_RADIUS if (AUTH_IS_EAP(_this)) eap_stop(&_this->eap); #endif evtimer_del(&_this->idle_event); }
/** * Destroy the npppd_ppp instance. Don't use this function after calling * the ppp_start, please use ppp_stop() instead. */ void ppp_destroy(void *ctx) { npppd_ppp *_this = ctx; if (_this->proxy_authen_resp != NULL) free(_this->proxy_authen_resp); /* * Down/stop the protocols again to make sure they are stopped * even if ppp_stop is done. They might be change their state * by receiving packets from the peer. */ fsm_lowerdown(&_this->ccp.fsm); fsm_lowerdown(&_this->ipcp.fsm); pap_stop(&_this->pap); chap_stop(&_this->chap); if (_this->outpacket_buf != NULL) free(_this->outpacket_buf); free(_this); }