/* * fsm_rtermreq - Receive Terminate-Req. */ static void fsm_rtermreq(fsm *f, int id, u_char *p, int len) { ppp_pcb *pcb = f->pcb; switch (f->state) { case PPP_FSM_ACKRCVD: case PPP_FSM_ACKSENT: f->state = PPP_FSM_REQSENT; /* Start over but keep trying */ break; case PPP_FSM_OPENED: if (len > 0) { ppp_info("%s terminated by peer (%0.*v)", PROTO_NAME(f), len, p); } else ppp_info("%s terminated by peer", PROTO_NAME(f)); f->retransmits = 0; f->state = PPP_FSM_STOPPING; if (f->callbacks->down) (*f->callbacks->down)(f); /* Inform upper layers */ TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time); break; default: break; } fsm_sdata(f, TERMACK, id, NULL, 0); }
static void ppp_receive(const unsigned char *buf, gsize len, void *data) { GAtPPP *ppp = data; guint16 protocol = ppp_proto(buf); const guint8 *packet = ppp_info(buf); if (ppp_drop_packet(ppp, protocol)) return; switch (protocol) { case PPP_IP_PROTO: ppp_net_process_packet(ppp->net, packet); break; case LCP_PROTOCOL: pppcp_process_packet(ppp->lcp, packet); break; case IPCP_PROTO: pppcp_process_packet(ppp->ipcp, packet); break; case CHAP_PROTOCOL: if (ppp->chap) { ppp_chap_process_packet(ppp->chap, packet); break; } /* fall through */ default: pppcp_send_protocol_reject(ppp->lcp, buf, len); break; }; }
static void chap_handle_status(ppp_pcb *pcb, int code, int id, unsigned char *pkt, int len) { const char *msg = NULL; LWIP_UNUSED_ARG(id); if ((pcb->chap_client.flags & (AUTH_DONE|AUTH_STARTED|LOWERUP)) != (AUTH_STARTED|LOWERUP)) return; pcb->chap_client.flags |= AUTH_DONE; if (code == CHAP_SUCCESS) { /* used for MS-CHAP v2 mutual auth, yuck */ if (pcb->chap_client.digest->check_success != NULL) { if (!(*pcb->chap_client.digest->check_success)(pcb, pkt, len, pcb->chap_client.priv)) code = CHAP_FAILURE; } else msg = "CHAP authentication succeeded"; } else { if (pcb->chap_client.digest->handle_failure != NULL) (*pcb->chap_client.digest->handle_failure)(pcb, pkt, len); else msg = "CHAP authentication failed"; } if (msg) { if (len > 0) ppp_info("%s: %.*v", msg, len, pkt); else ppp_info("%s", msg); } if (code == CHAP_SUCCESS) auth_withpeer_success(pcb, PPP_CHAP, pcb->chap_client.digest->code); else { pcb->chap_client.flags |= AUTH_FAILED; ppp_error("CHAP authentication failed"); auth_withpeer_fail(pcb, PPP_CHAP); } }