void pppd_processcheck() { int unit = 0; char prefix[] = "wanXXXXXXXXXX_"; char *wan_proto = nvram_safe_get("wan_proto"); if (strcmp(wan_proto, "pppoe") && strcmp(wan_proto, "pptp") && strcmp(wan_proto, "l2tp")) return; pppd_timer = (pppd_timer + 1) % 15; if (pppd_timer) return; if (!pids("pppd")) { snprintf(prefix, sizeof(prefix), "wan%d_", unit); start_pppd(prefix); if (pids("pppd")) logmessage("watchdog", "restart pppd"); } }
static int pptp_process() { int result = recv_packet(); if (result <= 0) { return result; } if (incoming.length < MIN_MESSAGE_SIZE) { log_print(DEBUG, "Control message too short"); return 0; } incoming.message = ntohs(incoming.message); if (incoming.message > MESSAGE_MAX || !messages[incoming.message]) { log_print(DEBUG, "Received UNKNOWN %d", incoming.message); return 0; } if (incoming.length < lengths[incoming.message]) { log_print(DEBUG, "Received %s with invalid length (length = %d)", messages[incoming.message], incoming.length); return 0; } switch(incoming.message) { case SCCRP: if (state == SCCRQ) { if (incoming.sccrp.protocol_version == PROTOCOL_VERSION && ESTABLISHED(incoming.sccrp.result)) { while (!local) { local = random(); } log_print(DEBUG, "Received SCCRP -> Sending OCRQ " "(local = %d)", local); log_print(INFO, "Tunnel established"); state = OCRQ; set_message(OCRQ); outgoing.ocrq.call = local; outgoing.ocrq.serial = random(); outgoing.ocrq.minimum_speed = htonl(1000); outgoing.ocrq.maximum_speed = htonl(100000000); outgoing.ocrq.bearer = htonl(3); outgoing.ocrq.framing = htonl(3); outgoing.ocrq.window_size = htons(8192); send_packet(); return 0; } log_print(DEBUG, "Received SCCRP (result = %d)", incoming.sccrq.result); log_print(INFO, "Remote server hung up"); return -REMOTE_REQUESTED; } break; case OCRP: if (state == OCRQ && incoming.ocrp.peer == local) { if (ESTABLISHED(incoming.ocrp.result)) { remote = incoming.ocrp.call; log_print(DEBUG, "Received OCRQ (remote = %d)", remote); log_print(INFO, "Session established"); state = OCRP; start_pppd(create_pppox()); return 0; } log_print(DEBUG, "Received OCRP (result = %d)", incoming.ocrp.result); log_print(INFO, "Remote server hung up"); return -REMOTE_REQUESTED; } break; case STOPCCRQ: log_print(DEBUG, "Received STOPCCRQ"); log_print(INFO, "Remote server hung up"); state = STOPCCRQ; return -REMOTE_REQUESTED; case CCRQ: /* According to RFC 2637 page 45, we should never receive CCRQ for * outgoing calls. However, some implementation only acts as PNS and * always uses CCRQ to clear a call, so here we still handle it. */ if (state == OCRP && incoming.ccrq.call == remote) { log_print(DEBUG, "Received CCRQ (remote = %d)", remote); log_print(INFO, "Remote server hung up"); return -REMOTE_REQUESTED; } break; case CDN: if (state == OCRP && incoming.cdn.call == remote) { log_print(DEBUG, "Received CDN (remote = %d)", remote); log_print(INFO, "Remote server hung up"); return -REMOTE_REQUESTED; } break; case ECHORQ: log_print(DEBUG, "Received ECHORQ -> Sending ECHORP"); set_message(ECHORP); outgoing.echorp.identifier = incoming.echorq.identifier; outgoing.echorp.result = RESULT_OK; send_packet(); return 0; case WEN: case SLI: log_print(DEBUG, "Recevied %s", messages[incoming.message]); return 0; case ICRQ: log_print(DEBUG, "Received ICRQ (remote = %d) -> Sending ICRP " "with error", incoming.icrq.call); set_message(ICRP); outgoing.icrp.peer = incoming.icrq.call; outgoing.icrp.result = RESULT_ERROR; send_packet(); return 0; case OCRQ: log_print(DEBUG, "Received OCRQ (remote = %d) -> Sending OCRP " "with error", incoming.ocrq.call); set_message(OCRP); outgoing.ocrp.peer = incoming.ocrq.call; outgoing.ocrp.result = RESULT_ERROR; send_packet(); return 0; } /* We reach here if we got an unexpected message. Just log it. */ log_print(DEBUG, "Received UNEXPECTED %s", messages[incoming.message]); return 0; }