static void lcp_timeout(void *ctx) { lcp *_this; u_char *cp, buf[32]; _this = ctx; if (_this->echo_failures >= _this->echo_max_retries) { fsm_log(&_this->fsm, LOG_NOTICE, "keepalive failure."); if (_this->fsm.ppp != NULL) { #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(_this->fsm.ppp, RADIUS_TERMNATE_CAUSE_IDLE_TIMEOUT); #endif ppp_stop(_this->fsm.ppp, NULL); } return; } cp = buf; PUTLONG(_this->magic_number, cp); fsm_sdata(&_this->fsm, ECHOREQ, _this->fsm.id++, buf, 4); _this->echo_failures++; lcp_reset_timeout(_this); }
/** timer event handler for idle timer */ static void ppp_idle_timeout(int fd, short evtype, void *context) { npppd_ppp *_this; _this = context; ppp_log(_this, LOG_NOTICE, "Idle timeout(%d sec)", _this->timeout_sec); #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(_this, RADIUS_TERMNATE_CAUSE_IDLE_TIMEOUT); #endif ppp_stop(_this, NULL); }
/** * This function will be called by the physical layer when it is down. * <p> * Use this function only on such conditions that the physical layer cannot * input or output PPP frames. Use {@link ::ppp_stop()} instead if we can * disconnect PPP gently.</p> */ void ppp_phy_downed(npppd_ppp *_this) { PPP_ASSERT(_this != NULL); ppp_down_others(_this); fsm_lowerdown(&_this->lcp.fsm); fsm_close(&_this->lcp.fsm, NULL); #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(_this, RADIUS_TERMNATE_CAUSE_LOST_CARRIER); #endif ppp_stop0(_this); }
/** * Stop the PPP and destroy the npppd_ppp instance * @param reason Reason of stopping the PPP. Specify NULL if there is * no special reason. This reason will be used as a * reason field of LCP Terminate-Request message and * notified to the peer. */ void ppp_stop(npppd_ppp *_this, const char *reason) { PPP_ASSERT(_this != NULL); #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(_this, RADIUS_TERMNATE_CAUSE_ADMIN_RESET); #endif ppp_set_disconnect_cause(_this, PPP_DISCON_NORMAL, 0, 2 /* by local */, NULL); ppp_down_others(_this); fsm_close(&_this->lcp.fsm, reason); }
static void lcp_down(fsm *f) { lcp *_this; if (f->ppp->disconnect_code == PPP_DISCON_NO_INFORMATION) { /* * disconnect code is set when we are closing the lcp, so * 'no info' means the lcp is going down by peer's termreq. */ ppp_set_disconnect_cause(f->ppp, PPP_DISCON_NORMAL, 0, 1 /* peer */, NULL); #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(f->ppp, RADIUS_TERMNATE_CAUSE_USER_REQUEST); #endif } _this = &f->ppp->lcp; UNTIMEOUT(lcp_timeout, _this); }
static void ppp_stop0(npppd_ppp *_this) { char mppe_str[BUFSIZ]; char label[512]; #ifdef USE_NPPPD_RADIUS ppp_set_radius_terminate_cause(_this, RADIUS_TERMNATE_CAUSE_NAS_ERROR); #endif ppp_set_disconnect_cause(_this, PPP_DISCON_NORMAL, 0, 1 /* by local */, NULL); _this->end_monotime = get_monosec(); if (_this->phy_close != NULL) _this->phy_close(_this); _this->phy_close = NULL; /* * NAT/Blackhole detection for PPTP(GRE) */ if (_this->lcp.dialin_proxy != 0 && _this->lcp.dialin_proxy_lcp_renegotiation == 0) { /* No LCP packets on dialin proxy without LCP renegotiation */ } else if (_this->lcp.recv_ress == 0) { /* No responses */ if (_this->lcp.recv_reqs == 0) /* No requests */ ppp_log(_this, LOG_WARNING, "no PPP frames from the " "peer. router/NAT issue? (may have filtered out)"); else ppp_log(_this, LOG_WARNING, "my PPP frames may not " "have arrived at the peer. router/NAT issue? (may " "be the only-first-person problem)"); } #ifdef USE_NPPPD_PIPEX if (npppd_ppp_pipex_disable(_this->pppd, _this) != 0) ppp_log(_this, LOG_ERR, "npppd_ppp_pipex_disable() failed: %m"); #endif ppp_set_tunnel_label(_this, label, sizeof(label)); #ifdef USE_NPPPD_MPPE if (_this->mppe_started) { snprintf(mppe_str, sizeof(mppe_str), "mppe=yes mppe_in=%dbits,%s mppe_out=%dbits,%s", _this->mppe.recv.keybits, (_this->mppe.recv.stateless)? "stateless" : "stateful", _this->mppe.send.keybits, (_this->mppe.send.stateless)? "stateless" : "stateful"); } else #endif snprintf(mppe_str, sizeof(mppe_str), "mppe=no"); ppp_log(_this, LOG_NOTICE, "logtype=TUNNELUSAGE user=\"%s\" duration=%ldsec layer2=%s " "layer2from=%s auth=%s data_in=%llubytes,%upackets " "data_out=%llubytes,%upackets error_in=%u error_out=%u %s " "iface=%s", _this->username[0]? _this->username : "******", (long)(_this->end_monotime - _this->start_monotime), _this->phy_label, label, _this->username[0]? ppp_peer_auth_string(_this) : "none", (unsigned long long)_this->ibytes, _this->ipackets, (unsigned long long)_this->obytes, _this->opackets, _this->ierrors, _this->oerrors, mppe_str, npppd_ppp_get_iface_name(_this->pppd, _this)); #ifdef USE_NPPPD_RADIUS npppd_ppp_radius_acct_stop(_this->pppd, _this); #endif npppd_ppp_unbind_iface(_this->pppd, _this); #ifdef USE_NPPPD_MPPE mppe_fini(&_this->mppe); #endif evtimer_del(&_this->idle_event); npppd_release_ip(_this->pppd, _this); ppp_destroy(_this); }