/*****************************************************************************
* lcp.c - Network Link Control Protocol program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* portions Copyright (c) 1997 by Global Election Systems Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY
*
* 03-01-01 Marc Boucher <marc@mbsi.ca>
*   Ported to lwIP.
* 97-12-01 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*	Original.
*****************************************************************************/

/*
 * lcp.c - PPP Link Control Protocol.
 *
 * Copyright (c) 1989 Carnegie Mellon University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by Carnegie Mellon University.  The name of the
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 
#include <string.h>
 
#include "ppp.h"
#if PPP_SUPPORT > 0
#include "fsm.h"
#include "chap.h"
#include "magic.h"
#include "auth.h"
#include "lcp.h"
#include "pppdebug.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/
/*
 * Length of each type of configuration option (in octets)
 */
#define CILEN_VOID	2
#define CILEN_CHAR	3
#define CILEN_SHORT	4	/* CILEN_VOID + sizeof(short) */
#define CILEN_CHAP	5	/* CILEN_VOID + sizeof(short) + 1 */
#define CILEN_LONG	6	/* CILEN_VOID + sizeof(long) */
#define CILEN_LQR	8	/* CILEN_VOID + sizeof(short) + sizeof(long) */
#define CILEN_CBCP	3


/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/
/*
 * Callbacks for fsm code.  (CI = Configuration Information)
 */
static void lcp_resetci (fsm*);	        /* Reset our CI */
static int  lcp_cilen (fsm*);		        /* Return length of our CI */
static void lcp_addci (fsm*, u_char*, int*);       /* Add our CI to pkt */
static int  lcp_ackci (fsm*, u_char*, int);/* Peer ack'd our CI */
static int  lcp_nakci (fsm*, u_char*, int);/* Peer nak'd our CI */
static int  lcp_rejci (fsm*, u_char*, int);/* Peer rej'd our CI */
static int  lcp_reqci (fsm*, u_char*, int*, int);  /* Rcv peer CI */
static void lcp_up (fsm*);		            /* We're UP */
static void lcp_down (fsm*);	    	    /* We're DOWN */
static void lcp_starting (fsm*);   	    /* We need lower layer up */
static void lcp_finished (fsm*);	        /* We need lower layer down */
static int  lcp_extcode (fsm*, int, u_char, u_char*, int);

static void lcp_rprotrej (fsm*, u_char*, int);

/*
 * routines to send LCP echos to peer
 */
static void lcp_echo_lowerup (int);
static void lcp_echo_lowerdown (int);
static void LcpEchoTimeout (void*);
static void lcp_received_echo_reply (fsm*, int, u_char*, int);
static void LcpSendEchoRequest (fsm*);
static void LcpLinkFailure (fsm*);
static void LcpEchoCheck (fsm*);

/*
 * Protocol entry points.
 * Some of these are called directly.
 */
static void lcp_input (int, u_char *, int);
static void lcp_protrej (int);

#define CODENAME(x)	((x) == CONFACK ? "ACK" : \
			 (x) == CONFNAK ? "NAK" : "REJ")


/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/
/* global vars */
LinkPhase lcp_phase[NUM_PPP];			/* Phase of link session (RFC 1661) */
lcp_options lcp_wantoptions[NUM_PPP];	/* Options that we want to request */
lcp_options lcp_gotoptions[NUM_PPP];	/* Options that peer ack'd */
lcp_options lcp_allowoptions[NUM_PPP];	/* Options we allow peer to request */
lcp_options lcp_hisoptions[NUM_PPP];	/* Options that we ack'd */
ext_accm xmit_accm[NUM_PPP];			/* extended transmit ACCM */



/*****************************/
/*** LOCAL DATA STRUCTURES ***/
/*****************************/
static fsm lcp_fsm[NUM_PPP];			/* LCP fsm structure (global)*/
static u_int	 lcp_echo_interval = LCP_ECHOINTERVAL; /* Interval between LCP echo-requests */
static u_int	 lcp_echo_fails = LCP_MAXECHOFAILS; /* Tolerance to unanswered echo-requests */
static u32_t lcp_echos_pending = 0;	/* Number of outstanding echo msgs */
static u32_t lcp_echo_number   = 0;	/* ID number of next echo frame */
static u32_t lcp_echo_timer_running = 0;  /* TRUE if a timer is running */

static u_char nak_buffer[PPP_MRU];	/* where we construct a nak packet */

static fsm_callbacks lcp_callbacks = {	/* LCP callback routines */
    lcp_resetci,		/* Reset our Configuration Information */
    lcp_cilen,			/* Length of our Configuration Information */
    lcp_addci,			/* Add our Configuration Information */
    lcp_ackci,			/* ACK our Configuration Information */
    lcp_nakci,			/* NAK our Configuration Information */
    lcp_rejci,			/* Reject our Configuration Information */
    lcp_reqci,			/* Request peer's Configuration Information */
    lcp_up,				/* Called when fsm reaches OPENED state */
    lcp_down,			/* Called when fsm leaves OPENED state */
    lcp_starting,		/* Called when we want the lower layer up */
    lcp_finished,		/* Called when we want the lower layer down */
    NULL,				/* Called when Protocol-Reject received */
    NULL,				/* Retransmission is necessary */
    lcp_extcode,		/* Called to handle LCP-specific codes */
    "LCP"				/* String name of protocol */
};

struct protent lcp_protent = {
    PPP_LCP,
    lcp_init,
    lcp_input,
    lcp_protrej,
    lcp_lowerup,
    lcp_lowerdown,
    lcp_open,
    lcp_close,
#if 0
    lcp_printpkt,
    NULL,
#endif
    1,
    "LCP",
#if 0
    NULL,
    NULL,
    NULL
#endif
};

int lcp_loopbackfail = DEFLOOPBACKFAIL;



/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
/***********************************/
/*
 * lcp_init - Initialize LCP.
 */
void lcp_init(int unit)
{
	fsm *f = &lcp_fsm[unit];
	lcp_options *wo = &lcp_wantoptions[unit];
	lcp_options *ao = &lcp_allowoptions[unit];
	
	f->unit = unit;
	f->protocol = PPP_LCP;
	f->callbacks = &lcp_callbacks;
	
	fsm_init(f);
	
	wo->passive = 0;
	wo->silent = 0;
	wo->restart = 0;			/* Set to 1 in kernels or multi-line
								 * implementations */
	wo->neg_mru = 1;
	wo->mru = PPP_DEFMRU;
	wo->neg_asyncmap = 1;
	wo->asyncmap = 0x00000000l;	/* Assume don't need to escape any ctl chars. */
	wo->neg_chap = 0;			/* Set to 1 on server */
	wo->neg_upap = 0;			/* Set to 1 on server */
	wo->chap_mdtype = CHAP_DIGEST_MD5;
	wo->neg_magicnumber = 1;
	wo->neg_pcompression = 1;
	wo->neg_accompression = 1;
	wo->neg_lqr = 0;			/* no LQR implementation yet */
	wo->neg_cbcp = 0;
	
	ao->neg_mru = 1;
	ao->mru = PPP_MAXMRU;
	ao->neg_asyncmap = 1;
	ao->asyncmap = 0x00000000l;	/* Assume don't need to escape any ctl chars. */
	ao->neg_chap = (CHAP_SUPPORT != 0);
	ao->chap_mdtype = CHAP_DIGEST_MD5;
	ao->neg_upap = (PAP_SUPPORT != 0);
	ao->neg_magicnumber = 1;
	ao->neg_pcompression = 1;
	ao->neg_accompression = 1;
	ao->neg_lqr = 0;			/* no LQR implementation yet */
	ao->neg_cbcp = (CBCP_SUPPORT != 0);

	/* 
	 * Set transmit escape for the flag and escape characters plus anything
	 * set for the allowable options.
	 */
	memset(xmit_accm[unit], 0, sizeof(xmit_accm[0]));
	xmit_accm[unit][15] = 0x60;
	xmit_accm[unit][0] = (u_char)(ao->asyncmap & 0xFF);
	xmit_accm[unit][1] = (u_char)((ao->asyncmap >> 8) & 0xFF);
	xmit_accm[unit][2] = (u_char)((ao->asyncmap >> 16) & 0xFF);
	xmit_accm[unit][3] = (u_char)((ao->asyncmap >> 24) & 0xFF);
	LCPDEBUG((LOG_INFO, "lcp_init: xmit_accm=%X %X %X %X\n",
				xmit_accm[unit][0],
				xmit_accm[unit][1],
				xmit_accm[unit][2],
				xmit_accm[unit][3]));
	
	lcp_phase[unit] = PHASE_INITIALIZE;
}


/*
 * lcp_open - LCP is allowed to come up.
 */
void lcp_open(int unit)
{
	fsm *f = &lcp_fsm[unit];
	lcp_options *wo = &lcp_wantoptions[unit];
	
	f->flags = 0;
	if (wo->passive)
		f->flags |= OPT_PASSIVE;
	if (wo->silent)
		f->flags |= OPT_SILENT;
	fsm_open(f);
	
	lcp_phase[unit] = PHASE_ESTABLISH; 
}


/*
 * lcp_close - Take LCP down.
 */
void lcp_close(int unit, char *reason)
{
	fsm *f = &lcp_fsm[unit];
	
	if (lcp_phase[unit] != PHASE_DEAD)
		lcp_phase[unit] = PHASE_TERMINATE;
	if (f->state == STOPPED && f->flags & (OPT_PASSIVE|OPT_SILENT)) {
		/*
		 * This action is not strictly according to the FSM in RFC1548,
		 * but it does mean that the program terminates if you do an
		 * lcp_close() in passive/silent mode when a connection hasn't
		 * been established.
		 */
		f->state = CLOSED;
		lcp_finished(f);
	}
	else
		fsm_close(&lcp_fsm[unit], reason);
}


/*
 * lcp_lowerup - The lower layer is up.
 */
void lcp_lowerup(int unit)
{
	lcp_options *wo = &lcp_wantoptions[unit];
	
	/*
	* Don't use A/C or protocol compression on transmission,
	* but accept A/C and protocol compressed packets
	* if we are going to ask for A/C and protocol compression.
	*/
	ppp_set_xaccm(unit, &xmit_accm[unit]);
	ppp_send_config(unit, PPP_MRU, 0xffffffffl, 0, 0);
	ppp_recv_config(unit, PPP_MRU, 0x00000000l,
					wo->neg_pcompression, wo->neg_accompression);
	peer_mru[unit] = PPP_MRU;
	lcp_allowoptions[unit].asyncmap 
		= (u_long)xmit_accm[unit][0]
			| ((u_long)xmit_accm[unit][1] << 8)
			| ((u_long)xmit_accm[unit][2] << 16)
			| ((u_long)xmit_accm[unit][3] << 24);
	LCPDEBUG((LOG_INFO, "lcp_lowerup: asyncmap=%X %X %X %X\n",
				xmit_accm[unit][3],
				xmit_accm[unit][2],
				xmit_accm[unit][1],
				xmit_accm[unit][0]));
	
	fsm_lowerup(&lcp_fsm[unit]);
}


/*
 * lcp_lowerdown - The lower layer is down.
 */
void lcp_lowerdown(int unit)
{
	fsm_lowerdown(&lcp_fsm[unit]);
}

/*
 * lcp_sprotrej - Send a Protocol-Reject for some protocol.
 */
void lcp_sprotrej(int unit, u_char *p, int len)
{
	/*
	* Send back the protocol and the information field of the
	* rejected packet.  We only get here if LCP is in the OPENED state.
	*/

	fsm_sdata(&lcp_fsm[unit], PROTREJ, ++lcp_fsm[unit].id,
				p, len);
}



/**********************************/
/*** LOCAL FUNCTION DEFINITIONS ***/
/**********************************/
/*
 * lcp_input - Input LCP packet.
 */
static void lcp_input(int unit, u_char *p, int len)
{
	fsm *f = &lcp_fsm[unit];
	
	fsm_input(f, p, len);
}


/*
 * lcp_extcode - Handle a LCP-specific code.
 */
static int lcp_extcode(fsm *f, int code, u_char id, u_char *inp, int len)
{
	u_char *magp;
	
	switch( code ){
	case PROTREJ:
		lcp_rprotrej(f, inp, len);
		break;
	
	case ECHOREQ:
		if (f->state != OPENED)
			break;
		LCPDEBUG((LOG_INFO, "lcp: Echo-Request, Rcvd id %d\n", id));
		magp = inp;
		PUTLONG(lcp_gotoptions[f->unit].magicnumber, magp);
		fsm_sdata(f, ECHOREP, id, inp, len);
		break;
	
	case ECHOREP:
		lcp_received_echo_reply(f, id, inp, len);
		break;
	
	case DISCREQ:
		break;
	
	default:
		return 0;
	}
	return 1;
}

    
/*
 * lcp_rprotrej - Receive an Protocol-Reject.
 *
 * Figure out which protocol is rejected and inform it.
 */
static void lcp_rprotrej(fsm *f, u_char *inp, int len)
{
	int i;
	struct protent *protp;
	u_short prot;
	
	if (len < sizeof (u_short)) {
		LCPDEBUG((LOG_INFO,
				"lcp_rprotrej: Rcvd short Protocol-Reject packet!\n"));
		return;
	}
	
	GETSHORT(prot, inp);
	
	LCPDEBUG((LOG_INFO,
			"lcp_rprotrej: Rcvd Protocol-Reject packet for %x!\n",
			prot));
	
	/*
	* Protocol-Reject packets received in any state other than the LCP
	* OPENED state SHOULD be silently discarded.
	*/
	if( f->state != OPENED ){
		LCPDEBUG((LOG_INFO, "Protocol-Reject discarded: LCP in state %d\n",
				f->state));
		return;
	}
	
	/*
	* Upcall the proper Protocol-Reject routine.
	*/
	for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
		if (protp->protocol == prot && protp->enabled_flag) {
			(*protp->protrej)(f->unit);
			return;
		}
	
	LCPDEBUG((LOG_WARNING, "Protocol-Reject for unsupported protocol 0x%x\n",
			prot));
}


/*
 * lcp_protrej - A Protocol-Reject was received.
 */
static void lcp_protrej(int unit)
{
	(void)unit;
	/*
	* Can't reject LCP!
	*/
	LCPDEBUG((LOG_WARNING,
			"lcp_protrej: Received Protocol-Reject for LCP!\n"));
	fsm_protreject(&lcp_fsm[unit]);
}


/*
 * lcp_resetci - Reset our CI.
 */
static void lcp_resetci(fsm *f)
{
	lcp_wantoptions[f->unit].magicnumber = magic();
	lcp_wantoptions[f->unit].numloops = 0;
	lcp_gotoptions[f->unit] = lcp_wantoptions[f->unit];
	peer_mru[f->unit] = PPP_MRU;
	auth_reset(f->unit);
}


/*
 * lcp_cilen - Return length of our CI.
 */
static int lcp_cilen(fsm *f)
{
	lcp_options *go = &lcp_gotoptions[f->unit];

#define LENCIVOID(neg)	((neg) ? CILEN_VOID : 0)
#define LENCICHAP(neg)	((neg) ? CILEN_CHAP : 0)
#define LENCISHORT(neg)	((neg) ? CILEN_SHORT : 0)
#define LENCILONG(neg)	((neg) ? CILEN_LONG : 0)
#define LENCILQR(neg)	((neg) ? CILEN_LQR: 0)
#define LENCICBCP(neg)	((neg) ? CILEN_CBCP: 0)
	/*
	* NB: we only ask for one of CHAP and UPAP, even if we will
	* accept either.
	*/
	return (LENCISHORT(go->neg_mru && go->mru != PPP_DEFMRU) +
		LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) +
		LENCICHAP(go->neg_chap) +
		LENCISHORT(!go->neg_chap && go->neg_upap) +
		LENCILQR(go->neg_lqr) +
		LENCICBCP(go->neg_cbcp) +
		LENCILONG(go->neg_magicnumber) +
		LENCIVOID(go->neg_pcompression) +
		LENCIVOID(go->neg_accompression));
}


/*
 * lcp_addci - Add our desired CIs to a packet.
 */
static void lcp_addci(fsm *f, u_char *ucp, int *lenp)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	u_char *start_ucp = ucp;
	
#define ADDCIVOID(opt, neg) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: opt=%d\n", opt)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_VOID, ucp); \
	}
#define ADDCISHORT(opt, neg, val) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: INT opt=%d %X\n", opt, val)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_SHORT, ucp); \
		PUTSHORT(val, ucp); \
	}
#define ADDCICHAP(opt, neg, val, digest) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: CHAP opt=%d %X\n", opt, val)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_CHAP, ucp); \
		PUTSHORT(val, ucp); \
		PUTCHAR(digest, ucp); \
	}
#define ADDCILONG(opt, neg, val) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: L opt=%d %lX\n", opt, val)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_LONG, ucp); \
		PUTLONG(val, ucp); \
	}
#define ADDCILQR(opt, neg, val) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: LQR opt=%d %lX\n", opt, val)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_LQR, ucp); \
		PUTSHORT(PPP_LQR, ucp); \
		PUTLONG(val, ucp); \
	}
#define ADDCICHAR(opt, neg, val) \
	if (neg) { \
	    LCPDEBUG((LOG_INFO, "lcp_addci: CHAR opt=%d %X '%z'\n", opt, val, val)); \
		PUTCHAR(opt, ucp); \
		PUTCHAR(CILEN_CHAR, ucp); \
		PUTCHAR(val, ucp); \
	}
	
	ADDCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
	ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl,
			go->asyncmap);
	ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
	ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
	ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
	ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
	ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
	ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
	ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
	
	if (ucp - start_ucp != *lenp) {
		/* this should never happen, because peer_mtu should be 1500 */
		LCPDEBUG((LOG_ERR, "Bug in lcp_addci: wrong length\n"));
	}
}


/*
 * lcp_ackci - Ack our CIs.
 * This should not modify any state if the Ack is bad.
 *
 * Returns:
 *	0 - Ack was bad.
 *	1 - Ack was good.
 */
static int lcp_ackci(fsm *f, u_char *p, int len)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	u_char cilen, citype, cichar;
	u_short cishort;
	u32_t cilong;
	
	/*
	* CIs must be in exactly the same order that we sent.
	* Check packet length and CI length at each step.
	* If we find any deviations, then this packet is bad.
	*/
#define ACKCIVOID(opt, neg) \
	if (neg) { \
		if ((len -= CILEN_VOID) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_VOID || \
				citype != opt) \
			goto bad; \
	}
#define ACKCISHORT(opt, neg, val) \
	if (neg) { \
		if ((len -= CILEN_SHORT) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_SHORT || \
				citype != opt) \
			goto bad; \
		GETSHORT(cishort, p); \
		if (cishort != val) \
			goto bad; \
	}
#define ACKCICHAR(opt, neg, val) \
	if (neg) { \
		if ((len -= CILEN_CHAR) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_CHAR || \
				citype != opt) \
			goto bad; \
		GETCHAR(cichar, p); \
		if (cichar != val) \
			goto bad; \
	}
#define ACKCICHAP(opt, neg, val, digest) \
	if (neg) { \
		if ((len -= CILEN_CHAP) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_CHAP || \
				citype != opt) \
			goto bad; \
		GETSHORT(cishort, p); \
		if (cishort != val) \
			goto bad; \
		GETCHAR(cichar, p); \
		if (cichar != digest) \
			goto bad; \
	}
#define ACKCILONG(opt, neg, val) \
	if (neg) { \
		if ((len -= CILEN_LONG) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_LONG || \
				citype != opt) \
			goto bad; \
		GETLONG(cilong, p); \
		if (cilong != val) \
			goto bad; \
	}
#define ACKCILQR(opt, neg, val) \
	if (neg) { \
		if ((len -= CILEN_LQR) < 0) \
			goto bad; \
		GETCHAR(citype, p); \
		GETCHAR(cilen, p); \
		if (cilen != CILEN_LQR || \
				citype != opt) \
			goto bad; \
		GETSHORT(cishort, p); \
		if (cishort != PPP_LQR) \
			goto bad; \
		GETLONG(cilong, p); \
		if (cilong != val) \
			goto bad; \
	}
	
	ACKCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
	ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl,
			go->asyncmap);
	ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
	ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
	ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
	ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
	ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
	ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
	ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
	
	/*
	 * If there are any remaining CIs, then this packet is bad.
	 */
	if (len != 0)
		goto bad;
	LCPDEBUG((LOG_INFO, "lcp_acki: Ack\n"));
	return (1);
bad:
	LCPDEBUG((LOG_WARNING, "lcp_acki: received bad Ack!\n"));
	return (0);
}


/*
 * lcp_nakci - Peer has sent a NAK for some of our CIs.
 * This should not modify any state if the Nak is bad
 * or if LCP is in the OPENED state.
 *
 * Returns:
 *	0 - Nak was bad.
 *	1 - Nak was good.
 */
static int lcp_nakci(fsm *f, u_char *p, int len)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	lcp_options *wo = &lcp_wantoptions[f->unit];
	u_char citype, cichar, *next;
	u_short cishort;
	u32_t cilong;
	lcp_options no;		/* options we've seen Naks for */
	lcp_options try;		/* options to request next time */
	int looped_back = 0;
	int cilen;
	
	BZERO(&no, sizeof(no));
	try = *go;
	
	/*
	* Any Nak'd CIs must be in exactly the same order that we sent.
	* Check packet length and CI length at each step.
	* If we find any deviations, then this packet is bad.
	*/
#define NAKCIVOID(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_VOID && \
			p[1] == CILEN_VOID && \
			p[0] == opt) { \
		len -= CILEN_VOID; \
		INCPTR(CILEN_VOID, p); \
		no.neg = 1; \
		code \
	}
#define NAKCICHAP(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_CHAP && \
			p[1] == CILEN_CHAP && \
			p[0] == opt) { \
		len -= CILEN_CHAP; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		GETCHAR(cichar, p); \
		no.neg = 1; \
		code \
	}
#define NAKCICHAR(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_CHAR && \
			p[1] == CILEN_CHAR && \
			p[0] == opt) { \
		len -= CILEN_CHAR; \
		INCPTR(2, p); \
		GETCHAR(cichar, p); \
		no.neg = 1; \
		code \
	}
#define NAKCISHORT(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_SHORT && \
			p[1] == CILEN_SHORT && \
			p[0] == opt) { \
		len -= CILEN_SHORT; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		no.neg = 1; \
		code \
	}
#define NAKCILONG(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_LONG && \
			p[1] == CILEN_LONG && \
			p[0] == opt) { \
		len -= CILEN_LONG; \
		INCPTR(2, p); \
		GETLONG(cilong, p); \
		no.neg = 1; \
		code \
	}
#define NAKCILQR(opt, neg, code) \
	if (go->neg && \
			len >= CILEN_LQR && \
			p[1] == CILEN_LQR && \
			p[0] == opt) { \
		len -= CILEN_LQR; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		GETLONG(cilong, p); \
		no.neg = 1; \
		code \
	}
	
	/*
	* We don't care if they want to send us smaller packets than
	* we want.  Therefore, accept any MRU less than what we asked for,
	* but then ignore the new value when setting the MRU in the kernel.
	* If they send us a bigger MRU than what we asked, accept it, up to
	* the limit of the default MRU we'd get if we didn't negotiate.
	*/
	if (go->neg_mru && go->mru != PPP_DEFMRU) {
		NAKCISHORT(CI_MRU, neg_mru,
			if (cishort <= wo->mru || cishort < PPP_DEFMRU)
				try.mru = cishort;
		);
	}
	
	/*
	* Add any characters they want to our (receive-side) asyncmap.
	*/
	if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) {
		NAKCILONG(CI_ASYNCMAP, neg_asyncmap,
			try.asyncmap = go->asyncmap | cilong;
		);
	}
	
	/*
	* If they've nak'd our authentication-protocol, check whether
	* they are proposing a different protocol, or a different
	* hash algorithm for CHAP.
	*/
	if ((go->neg_chap || go->neg_upap)
			&& len >= CILEN_SHORT
			&& p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) {
		cilen = p[1];
	len -= cilen;
	no.neg_chap = go->neg_chap;
	no.neg_upap = go->neg_upap;
	INCPTR(2, p);
	GETSHORT(cishort, p);
	if (cishort == PPP_PAP && cilen == CILEN_SHORT) {
		/*
		 * If we were asking for CHAP, they obviously don't want to do it.
		 * If we weren't asking for CHAP, then we were asking for PAP,
		 * in which case this Nak is bad.
		 */
		if (!go->neg_chap)
			goto bad;
		try.neg_chap = 0;
	
	} else if (cishort == PPP_CHAP && cilen == CILEN_CHAP) {
		GETCHAR(cichar, p);
		if (go->neg_chap) {
			/*
			 * We were asking for CHAP/MD5; they must want a different
			 * algorithm.  If they can't do MD5, we'll have to stop
			 * asking for CHAP.
			 */
			if (cichar != go->chap_mdtype)
				try.neg_chap = 0;
		} else {
			/*
			 * Stop asking for PAP if we were asking for it.
			 */
			try.neg_upap = 0;
		}
	
	} else {
		/*
		 * We don't recognize what they're suggesting.
		 * Stop asking for what we were asking for.
		 */
		if (go->neg_chap)
			try.neg_chap = 0;
		else
			try.neg_upap = 0;
		p += cilen - CILEN_SHORT;
	}
	}
	
	/*
	* If they can't cope with our link quality protocol, we'll have
	* to stop asking for LQR.  We haven't got any other protocol.
	* If they Nak the reporting period, take their value XXX ?
	*/
	NAKCILQR(CI_QUALITY, neg_lqr,
		if (cishort != PPP_LQR)
			try.neg_lqr = 0;
		else
			try.lqr_period = cilong;
	);
	
	/*
	* Only implementing CBCP...not the rest of the callback options
	*/
	NAKCICHAR(CI_CALLBACK, neg_cbcp,
		try.neg_cbcp = 0;
	);
	
	/*
	* Check for a looped-back line.
	*/
	NAKCILONG(CI_MAGICNUMBER, neg_magicnumber,
		try.magicnumber = magic();
		looped_back = 1;
	);
	
	/*
	* Peer shouldn't send Nak for protocol compression or
	* address/control compression requests; they should send
	* a Reject instead.  If they send a Nak, treat it as a Reject.
	*/
	NAKCIVOID(CI_PCOMPRESSION, neg_pcompression,
		try.neg_pcompression = 0;
	);
	NAKCIVOID(CI_ACCOMPRESSION, neg_accompression,
		try.neg_accompression = 0;
	);
	
	/*
	* There may be remaining CIs, if the peer is requesting negotiation
	* on an option that we didn't include in our request packet.
	* If we see an option that we requested, or one we've already seen
	* in this packet, then this packet is bad.
	* If we wanted to respond by starting to negotiate on the requested
	* option(s), we could, but we don't, because except for the
	* authentication type and quality protocol, if we are not negotiating
	* an option, it is because we were told not to.
	* For the authentication type, the Nak from the peer means
	* `let me authenticate myself with you' which is a bit pointless.
	* For the quality protocol, the Nak means `ask me to send you quality
	* reports', but if we didn't ask for them, we don't want them.
	* An option we don't recognize represents the peer asking to
	* negotiate some option we don't support, so ignore it.
	*/
	while (len > CILEN_VOID) {
		GETCHAR(citype, p);
		GETCHAR(cilen, p);
		if (cilen < CILEN_VOID || (len -= cilen) < 0)
			goto bad;
		next = p + cilen - 2;
		
		switch (citype) {
		case CI_MRU:
			if ((go->neg_mru && go->mru != PPP_DEFMRU)
					|| no.neg_mru || cilen != CILEN_SHORT)
				goto bad;
			GETSHORT(cishort, p);
			if (cishort < PPP_DEFMRU)
				try.mru = cishort;
			break;
		case CI_ASYNCMAP:
			if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl)
					|| no.neg_asyncmap || cilen != CILEN_LONG)
				goto bad;
			break;
		case CI_AUTHTYPE:
			if (go->neg_chap || no.neg_chap || go->neg_upap || no.neg_upap)
				goto bad;
			break;
		case CI_MAGICNUMBER:
			if (go->neg_magicnumber || no.neg_magicnumber ||
					cilen != CILEN_LONG)
				goto bad;
			break;
		case CI_PCOMPRESSION:
			if (go->neg_pcompression || no.neg_pcompression
					|| cilen != CILEN_VOID)
				goto bad;
			break;
		case CI_ACCOMPRESSION:
			if (go->neg_accompression || no.neg_accompression
					|| cilen != CILEN_VOID)
				goto bad;
			break;
		case CI_QUALITY:
			if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR)
				goto bad;
			break;
		}
		p = next;
	}
	
	/* If there is still anything left, this packet is bad. */
	if (len != 0)
		goto bad;
	
	/*
	* OK, the Nak is good.  Now we can update state.
	*/
	if (f->state != OPENED) {
		if (looped_back) {
			if (++try.numloops >= lcp_loopbackfail) {
				LCPDEBUG((LOG_NOTICE, "Serial line is looped back.\n"));
				lcp_close(f->unit, "Loopback detected");
			}
		} 
		else
			try.numloops = 0;
		*go = try;
	}
	
	return 1;
	
bad:
	LCPDEBUG((LOG_WARNING, "lcp_nakci: received bad Nak!\n"));
	return 0;
}


/*
 * lcp_rejci - Peer has Rejected some of our CIs.
 * This should not modify any state if the Reject is bad
 * or if LCP is in the OPENED state.
 *
 * Returns:
 *	0 - Reject was bad.
 *	1 - Reject was good.
 */
static int lcp_rejci(fsm *f, u_char *p, int len)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	u_char cichar;
	u_short cishort;
	u32_t cilong;
	lcp_options try;		/* options to request next time */
	
	try = *go;
	
	/*
	* Any Rejected CIs must be in exactly the same order that we sent.
	* Check packet length and CI length at each step.
	* If we find any deviations, then this packet is bad.
	*/
#define REJCIVOID(opt, neg) \
	if (go->neg && \
			len >= CILEN_VOID && \
			p[1] == CILEN_VOID && \
			p[0] == opt) { \
		len -= CILEN_VOID; \
		INCPTR(CILEN_VOID, p); \
		try.neg = 0; \
		LCPDEBUG((LOG_INFO, "lcp_rejci: void opt %d rejected\n", opt)); \
	}
#define REJCISHORT(opt, neg, val) \
	if (go->neg && \
			len >= CILEN_SHORT && \
			p[1] == CILEN_SHORT && \
			p[0] == opt) { \
		len -= CILEN_SHORT; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		/* Check rejected value. */ \
		if (cishort != val) \
			goto bad; \
		try.neg = 0; \
		LCPDEBUG((LOG_INFO,"lcp_rejci: short opt %d rejected\n", opt)); \
	}
#define REJCICHAP(opt, neg, val, digest) \
	if (go->neg && \
			len >= CILEN_CHAP && \
			p[1] == CILEN_CHAP && \
			p[0] == opt) { \
		len -= CILEN_CHAP; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		GETCHAR(cichar, p); \
		/* Check rejected value. */ \
		if (cishort != val || cichar != digest) \
			goto bad; \
		try.neg = 0; \
		try.neg_upap = 0; \
		LCPDEBUG((LOG_INFO,"lcp_rejci: chap opt %d rejected\n", opt)); \
	}
#define REJCILONG(opt, neg, val) \
	if (go->neg && \
			len >= CILEN_LONG && \
			p[1] == CILEN_LONG && \
			p[0] == opt) { \
		len -= CILEN_LONG; \
		INCPTR(2, p); \
		GETLONG(cilong, p); \
		/* Check rejected value. */ \
		if (cilong != val) \
			goto bad; \
		try.neg = 0; \
		LCPDEBUG((LOG_INFO,"lcp_rejci: long opt %d rejected\n", opt)); \
	}
#define REJCILQR(opt, neg, val) \
	if (go->neg && \
			len >= CILEN_LQR && \
			p[1] == CILEN_LQR && \
			p[0] == opt) { \
		len -= CILEN_LQR; \
		INCPTR(2, p); \
		GETSHORT(cishort, p); \
		GETLONG(cilong, p); \
		/* Check rejected value. */ \
		if (cishort != PPP_LQR || cilong != val) \
			goto bad; \
		try.neg = 0; \
		LCPDEBUG((LOG_INFO,"lcp_rejci: LQR opt %d rejected\n", opt)); \
	}
#define REJCICBCP(opt, neg, val) \
	if (go->neg && \
			len >= CILEN_CBCP && \
			p[1] == CILEN_CBCP && \
			p[0] == opt) { \
		len -= CILEN_CBCP; \
		INCPTR(2, p); \
		GETCHAR(cichar, p); \
		/* Check rejected value. */ \
		if (cichar != val) \
			goto bad; \
		try.neg = 0; \
		LCPDEBUG((LOG_INFO,"lcp_rejci: Callback opt %d rejected\n", opt)); \
	}
	
	REJCISHORT(CI_MRU, neg_mru, go->mru);
	REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);
	REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, go->chap_mdtype);
	if (!go->neg_chap) {
		REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);
	}
	REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period);
	REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT);
	REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber);
	REJCIVOID(CI_PCOMPRESSION, neg_pcompression);
	REJCIVOID(CI_ACCOMPRESSION, neg_accompression);
	
	/*
	* If there are any remaining CIs, then this packet is bad.
	*/
	if (len != 0)
		goto bad;
	/*
	* Now we can update state.
	*/
	if (f->state != OPENED)
		*go = try;
	return 1;
	
bad:
	LCPDEBUG((LOG_WARNING, "lcp_rejci: received bad Reject!\n"));
	return 0;
}


/*
 * lcp_reqci - Check the peer's requested CIs and send appropriate response.
 *
 * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
 * appropriately.  If reject_if_disagree is non-zero, doesn't return
 * CONFNAK; returns CONFREJ if it can't return CONFACK.
 */
static int lcp_reqci(fsm *f, 
						u_char *inp,		/* Requested CIs */
						int *lenp,			/* Length of requested CIs */
						int reject_if_disagree)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	lcp_options *ho = &lcp_hisoptions[f->unit];
	lcp_options *ao = &lcp_allowoptions[f->unit];
	u_char *cip, *next;			/* Pointer to current and next CIs */
	int cilen, citype, cichar;	/* Parsed len, type, char value */
	u_short cishort;			/* Parsed short value */
	u32_t cilong;			/* Parse long value */
	int rc = CONFACK;			/* Final packet return code */
	int orc;					/* Individual option return code */
	u_char *p;					/* Pointer to next char to parse */
	u_char *rejp;				/* Pointer to next char in reject frame */
	u_char *nakp;				/* Pointer to next char in Nak frame */
	int l = *lenp;				/* Length left */
#if TRACELCP > 0
	char traceBuf[80];
	int traceNdx = 0;
#endif
	
	/*
	 * Reset all his options.
	 */
	BZERO(ho, sizeof(*ho));
	
	/*
	 * Process all his options.
	 */
	next = inp;
	nakp = nak_buffer;
	rejp = inp;
	while (l) {
		orc = CONFACK;			/* Assume success */
		cip = p = next;			/* Remember begining of CI */
		if (l < 2 ||			/* Not enough data for CI header or */
				p[1] < 2 ||			/*  CI length too small or */
				p[1] > l) {			/*  CI length too big? */
			LCPDEBUG((LOG_WARNING, "lcp_reqci: bad CI length!\n"));
			orc = CONFREJ;		/* Reject bad CI */
			cilen = l;			/* Reject till end of packet */
			l = 0;			/* Don't loop again */
			citype = 0;
			goto endswitch;
		}
		GETCHAR(citype, p);		/* Parse CI type */
		GETCHAR(cilen, p);		/* Parse CI length */
		l -= cilen;			/* Adjust remaining length */
		next += cilen;			/* Step to next CI */
		
		switch (citype) {		/* Check CI type */
		case CI_MRU:
			if (!ao->neg_mru) {		/* Allow option? */
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject MRU - not allowed\n"));
				orc = CONFREJ;		/* Reject CI */
				break;
			} else if (cilen != CILEN_SHORT) {	/* Check CI length */
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject MRU - bad length\n"));
				orc = CONFREJ;		/* Reject CI */
				break;
			}
			GETSHORT(cishort, p);	/* Parse MRU */
			
			/*
			 * He must be able to receive at least our minimum.
			 * No need to check a maximum.  If he sends a large number,
			 * we'll just ignore it.
			 */
			if (cishort < PPP_MINMRU) {
				LCPDEBUG((LOG_INFO, "lcp_reqci: Nak - MRU too small\n"));
				orc = CONFNAK;		/* Nak CI */
				PUTCHAR(CI_MRU, nakp);
				PUTCHAR(CILEN_SHORT, nakp);
				PUTSHORT(PPP_MINMRU, nakp);	/* Give him a hint */
				break;
			}
			ho->neg_mru = 1;		/* Remember he sent MRU */
			ho->mru = cishort;		/* And remember value */
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MRU %d", cishort);
			traceNdx = strlen(traceBuf);
#endif
			break;
		
		case CI_ASYNCMAP:
			if (!ao->neg_asyncmap) {
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject ASYNCMAP not allowed\n"));
				orc = CONFREJ;
				break;
			} else if (cilen != CILEN_LONG) {
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject ASYNCMAP bad length\n"));
				orc = CONFREJ;
				break;
			}
			GETLONG(cilong, p);
			
			/*
			 * Asyncmap must have set at least the bits
			 * which are set in lcp_allowoptions[unit].asyncmap.
			 */
			if ((ao->asyncmap & ~cilong) != 0) {
				LCPDEBUG((LOG_INFO, "lcp_reqci: Nak ASYNCMAP %lX missing %lX\n", 
							cilong, ao->asyncmap));
				orc = CONFNAK;
				PUTCHAR(CI_ASYNCMAP, nakp);
				PUTCHAR(CILEN_LONG, nakp);
				PUTLONG(ao->asyncmap | cilong, nakp);
				break;
			}
			ho->neg_asyncmap = 1;
			ho->asyncmap = cilong;
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ASYNCMAP=%lX", cilong);
			traceNdx = strlen(traceBuf);
#endif
			break;
		
		case CI_AUTHTYPE:
			if (cilen < CILEN_SHORT) {
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject AUTHTYPE missing arg\n"));
				orc = CONFREJ;
				break;
			} else if (!(ao->neg_upap || ao->neg_chap)) {
				/*
				 * Reject the option if we're not willing to authenticate.
				 */
				LCPDEBUG((LOG_INFO, "lcp_reqci: Reject AUTHTYPE not allowed\n"));
				orc = CONFREJ;
				break;
			}
			GETSHORT(cishort, p);
			
			/*
			 * Authtype must be UPAP or CHAP.
			 *
			 * Note: if both ao->neg_upap and ao->neg_chap are set,
			 * and the peer sends a Configure-Request with two
			 * authenticate-protocol requests, one for CHAP and one
			 * for UPAP, then we will reject the second request.
			 * Whether we end up doing CHAP or UPAP depends then on
			 * the ordering of the CIs in the peer's Configure-Request.
			 */
			
			if (cishort == PPP_PAP) {
				if (ho->neg_chap) {	/* we've already accepted CHAP */
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE PAP already accepted\n"));
					orc = CONFREJ;
					break;
				} else if (cilen != CILEN_SHORT) {
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE PAP bad len\n"));
					orc = CONFREJ;
					break;
				}
				if (!ao->neg_upap) {	/* we don't want to do PAP */
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE PAP not allowed\n"));
					orc = CONFNAK;	/* NAK it and suggest CHAP */
					PUTCHAR(CI_AUTHTYPE, nakp);
					PUTCHAR(CILEN_CHAP, nakp);
					PUTSHORT(PPP_CHAP, nakp);
					PUTCHAR(ao->chap_mdtype, nakp);
					break;
				}
				ho->neg_upap = 1;
#if TRACELCP > 0
				snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PAP (%X)", cishort);
				traceNdx = strlen(traceBuf);
#endif
				break;
			}
			if (cishort == PPP_CHAP) {
				if (ho->neg_upap) {	/* we've already accepted PAP */
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE CHAP accepted PAP\n"));
					orc = CONFREJ;
					break;
				} else if (cilen != CILEN_CHAP) {
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE CHAP bad len\n"));
					orc = CONFREJ;
					break;
				}
				if (!ao->neg_chap) {	/* we don't want to do CHAP */
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE CHAP not allowed\n"));
					orc = CONFNAK;	/* NAK it and suggest PAP */
					PUTCHAR(CI_AUTHTYPE, nakp);
					PUTCHAR(CILEN_SHORT, nakp);
					PUTSHORT(PPP_PAP, nakp);
					break;
				}
				GETCHAR(cichar, p);	/* get digest type*/
				if (cichar != CHAP_DIGEST_MD5
#ifdef CHAPMS
						&& cichar != CHAP_MICROSOFT
#endif
				) {
					LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE CHAP digest=%d\n", cichar));
					orc = CONFNAK;
					PUTCHAR(CI_AUTHTYPE, nakp);
					PUTCHAR(CILEN_CHAP, nakp);
					PUTSHORT(PPP_CHAP, nakp);
					PUTCHAR(ao->chap_mdtype, nakp);
					break;
				}
#if TRACELCP > 0
				snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CHAP %X,%d", cishort, cichar);
				traceNdx = strlen(traceBuf);
#endif
				ho->chap_mdtype = cichar; /* save md type */
				ho->neg_chap = 1;
				break;
			}
			
			/*
			 * We don't recognize the protocol they're asking for.
			 * Nak it with something we're willing to do.
			 * (At this point we know ao->neg_upap || ao->neg_chap.)
			 */
			orc = CONFNAK;
			PUTCHAR(CI_AUTHTYPE, nakp);
			if (ao->neg_chap) {
				LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE %d req CHAP\n", cishort));
				PUTCHAR(CILEN_CHAP, nakp);
				PUTSHORT(PPP_CHAP, nakp);
				PUTCHAR(ao->chap_mdtype, nakp);
			} 
			else {
				LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE %d req PAP\n", cishort));
				PUTCHAR(CILEN_SHORT, nakp);
				PUTSHORT(PPP_PAP, nakp);
			}
			break;
		
		case CI_QUALITY:
			GETSHORT(cishort, p);
			GETLONG(cilong, p);
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " QUALITY (%x %x)", cishort, (unsigned int) cilong);
			traceNdx = strlen(traceBuf);
#endif

			if (!ao->neg_lqr ||
					cilen != CILEN_LQR) {
				orc = CONFREJ;
				break;
			}
			
			/*
			 * Check the protocol and the reporting period.
			 * XXX When should we Nak this, and what with?
			 */
			if (cishort != PPP_LQR) {
				orc = CONFNAK;
				PUTCHAR(CI_QUALITY, nakp);
				PUTCHAR(CILEN_LQR, nakp);
				PUTSHORT(PPP_LQR, nakp);
				PUTLONG(ao->lqr_period, nakp);
				break;
			}
			break;
		
		case CI_MAGICNUMBER:
			if (!(ao->neg_magicnumber || go->neg_magicnumber) ||
					cilen != CILEN_LONG) {
				orc = CONFREJ;
				break;
			}
			GETLONG(cilong, p);
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MAGICNUMBER (%lX)", cilong);
			traceNdx = strlen(traceBuf);
#endif

			/*
			 * He must have a different magic number.
			 */
			if (go->neg_magicnumber &&
					cilong == go->magicnumber) {
				cilong = magic();	/* Don't put magic() inside macro! */
				orc = CONFNAK;
				PUTCHAR(CI_MAGICNUMBER, nakp);
				PUTCHAR(CILEN_LONG, nakp);
				PUTLONG(cilong, nakp);
				break;
			}
			ho->neg_magicnumber = 1;
			ho->magicnumber = cilong;
			break;
		
		
		case CI_PCOMPRESSION:
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PCOMPRESSION");
			traceNdx = strlen(traceBuf);
#endif
			if (!ao->neg_pcompression ||
					cilen != CILEN_VOID) {
				orc = CONFREJ;
				break;
			}
			ho->neg_pcompression = 1;
			break;
		
		case CI_ACCOMPRESSION:
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ACCOMPRESSION");
			traceNdx = strlen(traceBuf);
#endif
			if (!ao->neg_accompression ||
					cilen != CILEN_VOID) {
				orc = CONFREJ;
				break;
			}
			ho->neg_accompression = 1;
			break;
		
		case CI_MRRU:
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_MRRU");
			traceNdx = strlen(traceBuf);
#endif
			orc = CONFREJ;
			break;
		
		case CI_SSNHF:
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_SSNHF");
			traceNdx = strlen(traceBuf);
#endif
			orc = CONFREJ;
			break;
		
		case CI_EPDISC:
#if TRACELCP > 0
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_EPDISC");
			traceNdx = strlen(traceBuf);
#endif
			orc = CONFREJ;
			break;
		
		default:
#if TRACELCP
			snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " unknown %d", citype);
			traceNdx = strlen(traceBuf);
#endif
			orc = CONFREJ;
			break;
		}
		
	endswitch:
#if TRACELCP
		if (traceNdx >= 80 - 32) {
			LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd%s\n", traceBuf));
			traceNdx = 0;
		}
#endif
		if (orc == CONFACK &&		/* Good CI */
				rc != CONFACK)		/*  but prior CI wasnt? */
			continue;			/* Don't send this one */
		
		if (orc == CONFNAK) {		/* Nak this CI? */
			if (reject_if_disagree	/* Getting fed up with sending NAKs? */
					&& citype != CI_MAGICNUMBER) {
				orc = CONFREJ;		/* Get tough if so */
			} 
			else {
				if (rc == CONFREJ)	/* Rejecting prior CI? */
					continue;		/* Don't send this one */
				rc = CONFNAK;
			}
		}
		if (orc == CONFREJ) {		/* Reject this CI */
			rc = CONFREJ;
			if (cip != rejp)		/* Need to move rejected CI? */
				BCOPY(cip, rejp, cilen); /* Move it */
			INCPTR(cilen, rejp);	/* Update output pointer */
		}
	}
	
	/*
	 * If we wanted to send additional NAKs (for unsent CIs), the
	 * code would go here.  The extra NAKs would go at *nakp.
	 * At present there are no cases where we want to ask the
	 * peer to negotiate an option.
	 */
	
	switch (rc) {
	case CONFACK:
		*lenp = (int)(next - inp);
		break;
	case CONFNAK:
		/*
		 * Copy the Nak'd options from the nak_buffer to the caller's buffer.
		 */
		*lenp = (int)(nakp - nak_buffer);
		BCOPY(nak_buffer, inp, *lenp);
		break;
	case CONFREJ:
		*lenp = (int)(rejp - inp);
		break;
	}
	
#if TRACELCP > 0
	if (traceNdx > 0) {
		LCPDEBUG((LOG_INFO, "lcp_reqci: %s\n", traceBuf));
	}
#endif
	LCPDEBUG((LOG_INFO, "lcp_reqci: returning CONF%s.\n", CODENAME(rc)));
	return (rc);			/* Return final code */
}


/*
 * lcp_up - LCP has come UP.
 */
static void lcp_up(fsm *f)
{
	lcp_options *wo = &lcp_wantoptions[f->unit];
	lcp_options *ho = &lcp_hisoptions[f->unit];
	lcp_options *go = &lcp_gotoptions[f->unit];
	lcp_options *ao = &lcp_allowoptions[f->unit];
	
	if (!go->neg_magicnumber)
		go->magicnumber = 0;
	if (!ho->neg_magicnumber)
		ho->magicnumber = 0;
	
	/*
	* Set our MTU to the smaller of the MTU we wanted and
	* the MRU our peer wanted.  If we negotiated an MRU,
	* set our MRU to the larger of value we wanted and
	* the value we got in the negotiation.
	*/
	ppp_send_config(f->unit, LWIP_MIN(ao->mru, (ho->neg_mru? ho->mru: PPP_MRU)),
				(ho->neg_asyncmap? ho->asyncmap: 0xffffffffl),
				ho->neg_pcompression, ho->neg_accompression);
	/*
	* If the asyncmap hasn't been negotiated, we really should
	* set the receive asyncmap to ffffffff, but we set it to 0
	* for backwards contemptibility.
	*/
	ppp_recv_config(f->unit, (go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU),
				(go->neg_asyncmap? go->asyncmap: 0x00000000),
				go->neg_pcompression, go->neg_accompression);
	
	if (ho->neg_mru)
		peer_mru[f->unit] = ho->mru;
	
	lcp_echo_lowerup(f->unit);  /* Enable echo messages */
	
	link_established(f->unit);
}


/*
 * lcp_down - LCP has gone DOWN.
 *
 * Alert other protocols.
 */
static void lcp_down(fsm *f)
{
	lcp_options *go = &lcp_gotoptions[f->unit];
	
	lcp_echo_lowerdown(f->unit);
	
	link_down(f->unit);
	
	ppp_send_config(f->unit, PPP_MRU, 0xffffffffl, 0, 0);
	ppp_recv_config(f->unit, PPP_MRU,
				(go->neg_asyncmap? go->asyncmap: 0x00000000),
				go->neg_pcompression, go->neg_accompression);
	peer_mru[f->unit] = PPP_MRU;
}


/*
 * lcp_starting - LCP needs the lower layer up.
 */
static void lcp_starting(fsm *f)
{
	link_required(f->unit);
}


/*
 * lcp_finished - LCP has finished with the lower layer.
 */
static void lcp_finished(fsm *f)
{
	link_terminated(f->unit);
}


#if 0
/*
 * print_string - print a readable representation of a string using
 * printer.
 */
static void print_string(
    char *p,
    int len,
    void (*printer) (void *, char *, ...),
    void *arg
)
{
    int c;
    
    printer(arg, "\"");
    for (; len > 0; --len) {
        c = *p++;
        if (' ' <= c && c <= '~') {
            if (c == '\\' || c == '"')
                printer(arg, "\\");
            printer(arg, "%c", c);
        } else {
            switch (c) {
            case '\n':
                printer(arg, "\\n");
                break;
            case '\r':
                printer(arg, "\\r");
                break;
            case '\t':
                printer(arg, "\\t");
                break;
            default:
                printer(arg, "\\%.3o", c);
            }
        }
    }
    printer(arg, "\"");
}


/*
 * lcp_printpkt - print the contents of an LCP packet.
 */
static char *lcp_codenames[] = {
	"ConfReq", "ConfAck", "ConfNak", "ConfRej",
	"TermReq", "TermAck", "CodeRej", "ProtRej",
	"EchoReq", "EchoRep", "DiscReq"
};

static int lcp_printpkt(
	u_char *p,
	int plen,
	void (*printer) (void *, char *, ...),
	void *arg
)
{
	int code, id, len, olen;
	u_char *pstart, *optend;
	u_short cishort;
	u32_t cilong;
	
	if (plen < HEADERLEN)
		return 0;
	pstart = p;
	GETCHAR(code, p);
	GETCHAR(id, p);
	GETSHORT(len, p);
	if (len < HEADERLEN || len > plen)
		return 0;
	
	if (code >= 1 && code <= sizeof(lcp_codenames) / sizeof(char *))
		printer(arg, " %s", lcp_codenames[code-1]);
	else
		printer(arg, " code=0x%x", code);
	printer(arg, " id=0x%x", id);
	len -= HEADERLEN;
	switch (code) {
	case CONFREQ:
	case CONFACK:
	case CONFNAK:
	case CONFREJ:
		/* print option list */
		while (len >= 2) {
			GETCHAR(code, p);
			GETCHAR(olen, p);
			p -= 2;
			if (olen < 2 || olen > len) {
				break;
			}
			printer(arg, " <");
			len -= olen;
			optend = p + olen;
			switch (code) {
			case CI_MRU:
				if (olen == CILEN_SHORT) {
					p += 2;
					GETSHORT(cishort, p);
					printer(arg, "mru %d", cishort);
				}
				break;
			case CI_ASYNCMAP:
				if (olen == CILEN_LONG) {
					p += 2;
					GETLONG(cilong, p);
					printer(arg, "asyncmap 0x%lx", cilong);
				}
				break;
			case CI_AUTHTYPE:
				if (olen >= CILEN_SHORT) {
					p += 2;
					printer(arg, "auth ");
					GETSHORT(cishort, p);
					switch (cishort) {
					case PPP_PAP:
						printer(arg, "pap");
						break;
					case PPP_CHAP:
						printer(arg, "chap");
						break;
					default:
						printer(arg, "0x%x", cishort);
					}
				}
				break;
			case CI_QUALITY:
				if (olen >= CILEN_SHORT) {
					p += 2;
					printer(arg, "quality ");
					GETSHORT(cishort, p);
					switch (cishort) {
					case PPP_LQR:
						printer(arg, "lqr");
						break;
					default:
						printer(arg, "0x%x", cishort);
					}
				}
				break;
			case CI_CALLBACK:
				if (olen >= CILEN_CHAR) {
					p += 2;
					printer(arg, "callback ");
					GETSHORT(cishort, p);
					switch (cishort) {
					case CBCP_OPT:
						printer(arg, "CBCP");
						break;
					default:
						printer(arg, "0x%x", cishort);
					}
				}
				break;
			case CI_MAGICNUMBER:
				if (olen == CILEN_LONG) {
					p += 2;
					GETLONG(cilong, p);
					printer(arg, "magic 0x%x", cilong);
				}
				break;
			case CI_PCOMPRESSION:
				if (olen == CILEN_VOID) {
					p += 2;
					printer(arg, "pcomp");
				}
				break;
			case CI_ACCOMPRESSION:
				if (olen == CILEN_VOID) {
					p += 2;
					printer(arg, "accomp");
				}
				break;
			}
			while (p < optend) {
				GETCHAR(code, p);
				printer(arg, " %.2x", code);
			}
			printer(arg, ">");
		}
		break;
	
	case TERMACK:
	case TERMREQ:
		if (len > 0 && *p >= ' ' && *p < 0x7f) {
			printer(arg, " ");
			print_string((char*)p, len, printer, arg);
			p += len;
			len = 0;
		}
		break;
	
	case ECHOREQ:
	case ECHOREP:
	case DISCREQ:
		if (len >= 4) {
			GETLONG(cilong, p);
			printer(arg, " magic=0x%x", cilong);
			p += 4;
			len -= 4;
		}
		break;
	}
	
	/* print the rest of the bytes in the packet */
	for (; len > 0; --len) {
		GETCHAR(code, p);
		printer(arg, " %.2x", code);
	}
	
	return (int)(p - pstart);
}
#endif

/*
 * Time to shut down the link because there is nothing out there.
 */

static void LcpLinkFailure (fsm *f)
{
	if (f->state == OPENED) {
		LCPDEBUG((LOG_INFO, "No response to %d echo-requests\n", lcp_echos_pending));
		LCPDEBUG((LOG_NOTICE, "Serial link appears to be disconnected.\n"));
		lcp_close(f->unit, "Peer not responding");
	}
}

/*
 * Timer expired for the LCP echo requests from this process.
 */

static void LcpEchoCheck (fsm *f)
{
	LcpSendEchoRequest (f);
	
	/*
	 * Start the timer for the next interval.
	 */
	LWIP_ASSERT("lcp_echo_timer_running == 0", lcp_echo_timer_running == 0);

	TIMEOUT (LcpEchoTimeout, f, lcp_echo_interval);
	lcp_echo_timer_running = 1;
}

/*
 * LcpEchoTimeout - Timer expired on the LCP echo
 */

static void LcpEchoTimeout (void *arg)
{
	if (lcp_echo_timer_running != 0) {
		lcp_echo_timer_running = 0;
		LcpEchoCheck ((fsm *) arg);
	}
}

/*
 * LcpEchoReply - LCP has received a reply to the echo
 */
static void lcp_received_echo_reply (fsm *f, int id, u_char *inp, int len)
{
	u32_t magic;
	
	(void)id;

	/* Check the magic number - don't count replies from ourselves. */
	if (len < 4) {
		LCPDEBUG((LOG_WARNING, "lcp: received short Echo-Reply, length %d\n", len));
		return;
	}
	GETLONG(magic, inp);
	if (lcp_gotoptions[f->unit].neg_magicnumber
			&& magic == lcp_gotoptions[f->unit].magicnumber) {
		LCPDEBUG((LOG_WARNING, "appear to have received our own echo-reply!\n"));
		return;
	}
	
	/* Reset the number of outstanding echo frames */
	lcp_echos_pending = 0;
}

/*
 * LcpSendEchoRequest - Send an echo request frame to the peer
 */

static void LcpSendEchoRequest (fsm *f)
{
	u32_t lcp_magic;
	u_char pkt[4], *pktp;
	
	/*
	* Detect the failure of the peer at this point.
	*/
	if (lcp_echo_fails != 0) {
		if (lcp_echos_pending++ >= lcp_echo_fails) {
			LcpLinkFailure(f);
			lcp_echos_pending = 0;
		}
	}
	
	/*
	* Make and send the echo request frame.
	*/
	if (f->state == OPENED) {
		lcp_magic = lcp_gotoptions[f->unit].magicnumber;
		pktp = pkt;
		PUTLONG(lcp_magic, pktp);
		fsm_sdata(f, ECHOREQ, (u_char)(lcp_echo_number++ & 0xFF), pkt, (int)(pktp - pkt));
	}
}

/*
 * lcp_echo_lowerup - Start the timer for the LCP frame
 */

static void lcp_echo_lowerup (int unit)
{
	fsm *f = &lcp_fsm[unit];
	
	/* Clear the parameters for generating echo frames */
	lcp_echos_pending      = 0;
	lcp_echo_number        = 0;
	lcp_echo_timer_running = 0;
	
	/* If a timeout interval is specified then start the timer */
	if (lcp_echo_interval != 0)
		LcpEchoCheck (f);
}

/*
 * lcp_echo_lowerdown - Stop the timer for the LCP frame
 */

static void lcp_echo_lowerdown (int unit)
{
	fsm *f = &lcp_fsm[unit];
	
	if (lcp_echo_timer_running != 0) {
		UNTIMEOUT (LcpEchoTimeout, f);
		lcp_echo_timer_running = 0;
	}
}

#endif /* PPP_SUPPORT */
