/* stop PPPoE daemon */ void pppoed_stop(pppoed *_this) { pppoed_listener *plistener; hash_link *hl; pppoe_session *session; if (!pppoed_is_running(_this)) return; _this->state = PPPOED_STATE_STOPPED; if (_this->session_hash != NULL) { for (hl = hash_first(_this->session_hash); hl != NULL; hl = hash_next(_this->session_hash)) { session = (pppoe_session *)hl->item; pppoe_session_disconnect(session); pppoe_session_stop(session); } } for (slist_itr_first(&_this->listener); slist_itr_has_next(&_this->listener);) { plistener = slist_itr_next(&_this->listener); pppoed_listener_stop(plistener); free(plistener); slist_itr_remove(&_this->listener); } PPPOED_DBG((_this, LOG_DEBUG, "Stopped")); }
/* process PADT from the peer */ int pppoe_session_recv_PADT(pppoe_session *_this, slist *tag_list) { pppoe_session_log(_this, LOG_INFO, "RecvPADT"); pppoe_session_stop(_this); _this->state = PPPOE_SESSION_STATE_DISPOSING; return 0; }