static void parse_input(T_NET_BUF *input) { T_PPP_PROTENT *entry; int_t ix; uint16_t proto; NET_COUNT_PPP(net_count_ppp.in_octets, input->len); NET_COUNT_PPP(net_count_ppp.in_packets, 1); /* フレーム長をチェックする */ if (input->len < sizeof(T_PPP_HDR)) { /* FreeBSD では PPP_HDRLEN は 4 */ syslog(LOG_NOTICE, "[PPP] recv short frame."); goto buf_rel; } proto = ntohs(*GET_PPP_HDR(input)); /* プロトコルが LCP 以外で、LCP がオープンされていなければエラー */ if (proto != PPP_LCP && lcp_fsm.state != PPP_FSM_OPENED) { syslog(LOG_NOTICE, "[PPP] LCP not open."); goto buf_rel; } /* リンクが認証状態以前は、LCP、LQR、PAP、CHAP のみ受け付ける */ if (ppp_phase <= PPP_PHASE_AUTHENTICATE && !(proto == PPP_LCP || proto == PPP_LQR || proto == PPP_PAP || proto == PPP_CHAP)) { syslog(LOG_NOTICE, "[PPP] disc proto: 0x%04x, phase: %d.", proto, ppp_phase); goto buf_rel; } /* 上位プロトコルの入力関数を呼出す */ for (ix = 0; (entry = protocols[ix]) != NULL; ix ++) { if (entry->proto == proto && entry->input != NULL) { (*entry->input)(input); syscall(rel_net_buf(input)); return; } if ((entry->proto & ~0x8000) == proto && entry->datainput != NULL) { (*entry->datainput)(input); return; } } syslog(LOG_INFO, "[PPP] unexp proto: 0x%04x.", proto); lcp_sprotrej(input); buf_rel: NET_COUNT_PPP(net_count_ppp.in_err_packets, 1); syscall(rel_net_buf(input)); }
/* * get_input - called when incoming data is available. */ static void get_input(void) { int len, i; u_char *p; u_short protocol; struct protent *protp; p = inpacket_buf; /* point to beginning of packet buffer */ len = read_packet(inpacket_buf); if (len < 0) return; if (len == 0) { etime = time(NULL); minutes = (etime-stime)/60; syslog(LOG_NOTICE, "Modem hangup, connected for %d minutes", (minutes >1) ? minutes : 1); hungup = 1; lcp_lowerdown(0); /* serial link is no longer available */ link_terminated(0); return; } if (debug /*&& (debugflags & DBG_INPACKET)*/) log_packet(p, len, "rcvd ", LOG_DEBUG); if (len < PPP_HDRLEN) { MAINDEBUG((LOG_INFO, "io(): Received short packet.")); return; } p += 2; /* Skip address and control */ GETSHORT(protocol, p); len -= PPP_HDRLEN; /* * Toss all non-LCP packets unless LCP is OPEN. */ if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) { MAINDEBUG((LOG_INFO, "get_input: Received non-LCP packet when LCP not open.")); return; } /* * Until we get past the authentication phase, toss all packets * except LCP, LQR and authentication packets. */ if (phase <= PHASE_AUTHENTICATE && !(protocol == PPP_LCP || protocol == PPP_LQR || protocol == PPP_PAP || protocol == PPP_CHAP)) { MAINDEBUG((LOG_INFO, "get_input: discarding proto 0x%x in phase %d", protocol, phase)); return; } /* * Upcall the proper protocol input routine. */ for (i = 0; (protp = protocols[i]) != NULL; ++i) { if (protp->protocol == protocol && protp->enabled_flag) { (*protp->input)(0, p, len); return; } if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag && protp->datainput != NULL) { (*protp->datainput)(0, p, len); return; } } if (debug) syslog(LOG_WARNING, "Unsupported protocol (0x%x) received", protocol); lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); }
/* * get_input - called when incoming data is available. */ static void get_input(void) { int len, i; u_char *p; u_short protocol; struct protent *protp; p = inpacket_buf; /* point to beginning of packet buffer */ len = read_packet(inpacket_buf); if (len < 0) return; if (len == 0) { notice("Modem hangup"); hungup = 1; pppd_status = EXIT_HANGUP; lcp_lowerdown(0); /* serial link is no longer available */ link_terminated(0); return; } if (debug /*&& (debugflags & DBG_INPACKET)*/) dbglog("rcvd %P", p, len); if (len < PPP_HDRLEN) { MAINDEBUG(("io(): Received short packet.")); return; } p += 2; /* Skip address and control */ GETSHORT(protocol, p); len -= PPP_HDRLEN; /* * Toss all non-LCP packets unless LCP is OPEN. */ if (protocol != PPP_LCP && lcp_fsm[0].state != OPENED) { MAINDEBUG(("get_input: Received non-LCP packet when LCP not open.")); return; } /* * Until we get past the authentication phase, toss all packets * except LCP, LQR and authentication packets. */ if (pppd_phase <= PHASE_AUTHENTICATE && !(protocol == PPP_LCP || protocol == PPP_LQR || protocol == PPP_PAP || protocol == PPP_CHAP)) { MAINDEBUG(("get_input: discarding proto 0x%x in phase %d", protocol, pppd_phase)); return; } /* * Upcall the proper protocol input routine. */ for (i = 0; (protp = protocols[i]) != NULL; ++i) { if (protp->protocol == protocol && protp->enabled_flag) { (*protp->input)(0, p, len); return; } if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag && protp->datainput != NULL) { (*protp->datainput)(0, p, len); return; } } if (debug) { const char *pname = protocol_name(protocol); if (pname != NULL) warn("Unsupported protocol '%s' (0x%x) received", pname, protocol); else warn("Unsupported protocol 0x%x received", protocol); } lcp_sprotrej(0, p - PPP_HDRLEN, len + PPP_HDRLEN); return; }