⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netpap.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 2 页
字号:

	if (u->us_clientstate == UPAPCS_AUTHREQ) {

		trace(LOG_ERR, "PAP authentication failed due to protocol-reject");

		auth_withpeer_fail(unit, PPP_PAP);

	}

	if (u->us_serverstate == UPAPSS_LISTEN) {

		trace(LOG_ERR, "PAP authentication of peer failed (protocol-reject)");

		auth_peer_fail(unit, PPP_PAP);

	}

	upap_lowerdown(unit);

}





/*

 * 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 < UPAP_HEADERLEN) {

		UPAPDEBUG((LOG_INFO, "pap_input: rcvd short header."));

		return;

	}

	GETCHAR(code, inp);

	GETCHAR(id, inp);

	GETSHORT(len, inp);

	if (len < UPAP_HEADERLEN) {

		UPAPDEBUG((LOG_INFO, "pap_input: rcvd illegal length."));

		return;

	}

	if (len > l) {

		UPAPDEBUG((LOG_INFO, "pap_input: rcvd short packet."));

		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 */

		break;

	}

}





/*

 * upap_rauth - Receive Authenticate.

 */

static void upap_rauthreq(

	upap_state *u, 

	u_char *inp, 

	int id,

	int len

)

{

	u_char ruserlen, rpasswdlen;

	char *ruser, *rpasswd;

	int retcode;

	char *msg;

	int msglen;

	

	UPAPDEBUG((LOG_INFO, "pap_rauth: Rcvd id %d.", id));

	

	if (u->us_serverstate < UPAPSS_LISTEN)

		return;

	

	/*

	 * If we receive a duplicate authenticate-request, we are

	 * supposed to return the same status as for the first request.

	 */

	if (u->us_serverstate == UPAPSS_OPEN) {

		upap_sresp(u, UPAP_AUTHACK, (unsigned char)id, "", 0);	/* return auth-ack */

		return;

	}

	if (u->us_serverstate == UPAPSS_BADAUTH) {

		upap_sresp(u, UPAP_AUTHNAK, (unsigned char)id, "", 0);	/* return auth-nak */

		return;

	}

	

	/*

	 * Parse user/passwd.

	 */

	if (len < sizeof (u_char)) {

		UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet."));

		return;

	}

	GETCHAR(ruserlen, inp);

	len -= sizeof (u_char) + ruserlen + sizeof (u_char);

	if (len < 0) {

		UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet."));

		return;

	}

	ruser = (char *) inp;

	INCPTR(ruserlen, inp);

	GETCHAR(rpasswdlen, inp);

	if (len < rpasswdlen) {

		UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet."));

		return;

	}

	rpasswd = (char *) inp;

	

	/*

	 * Check the username and password given.

	 */

	retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd,

			   rpasswdlen, &msg, &msglen);

	BZERO(rpasswd, rpasswdlen);

	

	upap_sresp(u, (unsigned char)retcode, (unsigned char)id, msg, msglen);

	

	if (retcode == UPAP_AUTHACK) {

		u->us_serverstate = UPAPSS_OPEN;

		auth_peer_success(u->us_unit, PPP_PAP, ruser, ruserlen);

	} else {

		u->us_serverstate = UPAPSS_BADAUTH;

		auth_peer_fail(u->us_unit, PPP_PAP);

	}

	

	if (u->us_reqtimeout > 0)

		UNTIMEOUT(upap_reqtimeout, u);

}





/*

 * upap_rauthack - Receive Authenticate-Ack.

 */

//#pragma argsused

static void upap_rauthack(
	upap_state *u,
	u_char *inp,
	int id,
	int len
)
{
	u_char msglen;
	char *msg;

	UPAPDEBUG((LOG_INFO, "pap_rauthack: Rcvd id %d s=%d", id, u->us_clientstate));

	if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */
		return;

	

	/*

	 * Parse message.

	 */

	if (len < sizeof (u_char)) {

		UPAPDEBUG((LOG_INFO, "pap_rauthack: rcvd short packet."));

		return;

	}

	GETCHAR(msglen, inp);

	len -= sizeof (u_char);

	if (len < msglen) {

		UPAPDEBUG((LOG_INFO, "pap_rauthack: rcvd short packet."));

		return;

	}

	msg = (char *) inp;

	PRINTMSG(msg, msglen);

	

	u->us_clientstate = UPAPCS_OPEN;

	

	auth_withpeer_success(u->us_unit, PPP_PAP);

}





/*

 * upap_rauthnak - Receive Authenticate-Nakk.

 */

//#pragma argsused

static void upap_rauthnak(

	upap_state *u,

	u_char *inp,

	int id,

	int len

)

{

	u_char msglen;

	char *msg;

	

	UPAPDEBUG((LOG_INFO, "pap_rauthnak: Rcvd id %d s=%d", id, u->us_clientstate));

	

	if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */

		return;

	

	/*

	 * Parse message.

	 */

	if (len < sizeof (u_char)) {

		UPAPDEBUG((LOG_INFO, "pap_rauthnak: rcvd short packet."));

		return;

	}

	GETCHAR(msglen, inp);

	len -= sizeof (u_char);

	if (len < msglen) {

		UPAPDEBUG((LOG_INFO, "pap_rauthnak: rcvd short packet."));

		return;

	}

	msg = (char *) inp;

	PRINTMSG(msg, msglen);

	

	u->us_clientstate = UPAPCS_BADAUTH;

	

	trace(LOG_ERR, "PAP authentication failed");

	auth_withpeer_fail(u->us_unit, PPP_PAP);

}





/*

 * upap_sauthreq - Send an Authenticate-Request.

 */

static void upap_sauthreq(upap_state *u)

{

	u_char *outp;

	int outlen;

	

	outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) 

			+ u->us_userlen + u->us_passwdlen;

	outp = outpacket_buf[u->us_unit];

	

	MAKEHEADER(outp, PPP_PAP);

	

	PUTCHAR(UPAP_AUTHREQ, outp);

	PUTCHAR(++u->us_id, outp);

	PUTSHORT(outlen, outp);

	PUTCHAR(u->us_userlen, outp);

	BCOPY(u->us_user, outp, u->us_userlen);

	INCPTR(u->us_userlen, outp);

	PUTCHAR(u->us_passwdlen, outp);

	BCOPY(u->us_passwd, outp, u->us_passwdlen);

	

	pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);

	

	UPAPDEBUG((LOG_INFO, "pap_sauth: Sent id %d", u->us_id));

	

	TIMEOUT(upap_timeout, u, u->us_timeouttime);

	++u->us_transmits;

	u->us_clientstate = UPAPCS_AUTHREQ;

}





/*

 * upap_sresp - Send a response (ack or nak).

 */

static void upap_sresp(

	upap_state *u,

	u_char code, 

	u_char id,

	char *msg,

	int msglen

)

{

	u_char *outp;

	int outlen;

	

	outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;

	outp = outpacket_buf[u->us_unit];

	MAKEHEADER(outp, PPP_PAP);

	

	PUTCHAR(code, outp);

	PUTCHAR(id, outp);

	PUTSHORT(outlen, outp);

	PUTCHAR(msglen, outp);

	BCOPY(msg, outp, msglen);

	pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);

	

	UPAPDEBUG((LOG_INFO, "pap_sresp: Sent code %d, id %d s=%d", 

				code, id, u->us_clientstate));

}



/*

 * upap_printpkt - print the contents of a PAP packet.

 */

//#pragma argsused

static int upap_printpkt(

	u_char *p,

	int plen,

	void (*printer) __P((void *, char *, ...)),

	void *arg

)

{

	return 0;

}



#endif



//#pragma warning (pop)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -