示例#1
0
/*
 * 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;
  }
}
示例#2
0
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 */

		}
	}
示例#3
0
文件: upap.c 项目: crvv/lwip
/*
 * 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;
    }
}