/* * upap_input - Input UPAP packet. */ static void upap_input(int unit, u_char *inpacket, int l) { upap_state *u = &upap[unit]; u_char *inp; u_char code, id; int len; /* * Parse header (code, id and length). * If packet too short, drop it. */ inp = inpacket; if (l < (int)UPAP_HEADERLEN) { UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short header.\r\n")); return; } GETCHAR(code, inp); GETCHAR(id, inp); GETSHORT(len, inp); if (len < (int)UPAP_HEADERLEN) { UPAPDEBUG(LOG_INFO, ("pap_input: rcvd illegal length.\r\n")); return; } if (len > l) { UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short packet.\r\n")); return; } len -= UPAP_HEADERLEN; /* * Action depends on code. */ switch (code) { case UPAP_AUTHREQ: upap_rauthreq(u, inp, id, len); break; case UPAP_AUTHACK: upap_rauthack(u, inp, id, len); break; case UPAP_AUTHNAK: upap_rauthnak(u, inp, id, len); break; default: /* XXX Need code reject */ UPAPDEBUG(LOG_INFO, ("pap_input: UNHANDLED default: code: %d, id: %d, len: %d.\r\n", code, id, len)); break; } }
static void upap_input (T_NET_BUF *input) { T_PPP_CP_HDR *hdr; NET_COUNT_PPP_PAP(net_count_ppp_upap_in_octets, input->len); NET_COUNT_PPP_PAP(net_count_ppp_upap_in_packets, 1); /* PPP リンク制御 (CP) ヘッダより短ければエラー */ if (input->len < (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR))) { syslog(LOG_WARNING, "[PPP/PAP] short hdr: %d.", input->len); return; } hdr = GET_PPP_CP_HDR(input); /* ヘッダの長さと入力データサイズが一致しなければエラー */ if (hdr->len != input->len - sizeof(T_PPP_HDR)) { syslog(LOG_WARNING, "[PPP/PAP] bad len: %d.", hdr->len); return; } /* * 制御コードにより適当な関数を呼出す */ switch (hdr->code) { #ifdef AUTH_CFG_CLIENT case PAP_AUTHACK: upap_rauthack(); break; case PAP_AUTHNAK: upap_rauthnak(); break; #endif /* of #ifdef AUTH_CFG_CLIENT */ #ifdef AUTH_CFG_SERVER case PAP_AUTHREQ: upap_rauthreq(input); break; #endif /* of #ifdef AUTH_CFG_SERVER */ } }
/* * upap_input - Input UPAP packet. */ static void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) { u_char *inp; u_char code, id; int len; /* * Parse header (code, id and length). * If packet too short, drop it. */ inp = inpacket; if (l < UPAP_HEADERLEN) { UPAPDEBUG(("pap_input: rcvd short header.")); return; } GETCHAR(code, inp); GETCHAR(id, inp); GETSHORT(len, inp); if (len < UPAP_HEADERLEN) { UPAPDEBUG(("pap_input: rcvd illegal length.")); return; } if (len > l) { UPAPDEBUG(("pap_input: rcvd short packet.")); return; } len -= UPAP_HEADERLEN; /* * Action depends on code. */ switch (code) { case UPAP_AUTHREQ: #if PPP_SERVER upap_rauthreq(pcb, inp, id, len); #endif /* PPP_SERVER */ break; case UPAP_AUTHACK: upap_rauthack(pcb, inp, id, len); break; case UPAP_AUTHNAK: upap_rauthnak(pcb, inp, id, len); break; default: /* XXX Need code reject */ break; } }