/*****************************************************************************
* lcp.h - Network Link Control Protocol header file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* portions Copyright (c) 1997 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-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.
*   Original derived from BSD codes.
*****************************************************************************/
/*
 * lcp.h - Link Control Protocol definitions.
 *
 * 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.
 *
 * $Id: lcp.h,v 1.3 2007/12/19 20:47:23 fbernon Exp $
 */

#ifndef LCP_H
#define LCP_H

/*************************
*** PUBLIC DEFINITIONS ***
*************************/
/*
 * Options.
 */
#define CI_MRU           1  /* Maximum Receive Unit */
#define CI_ASYNCMAP      2  /* Async Control Character Map */
#define CI_AUTHTYPE      3  /* Authentication Type */
#define CI_QUALITY       4  /* Quality Protocol */
#define CI_MAGICNUMBER   5  /* Magic Number */
#define CI_PCOMPRESSION  7  /* Protocol Field Compression */
#define CI_ACCOMPRESSION 8  /* Address/Control Field Compression */
#define CI_CALLBACK      13 /* callback */
#define CI_MRRU          17 /* max reconstructed receive unit; multilink */
#define CI_SSNHF         18 /* short sequence numbers for multilink */
#define CI_EPDISC        19 /* endpoint discriminator */

/*
 * LCP-specific packet types.
 */
#define PROTREJ          8  /* Protocol Reject */
#define ECHOREQ          9  /* Echo Request */
#define ECHOREP          10 /* Echo Reply */
#define DISCREQ          11 /* Discard Request */
#define CBCP_OPT         6  /* Use callback control protocol */


/************************
*** PUBLIC DATA TYPES ***
************************/

/*
 * The state of options is described by an lcp_options structure.
 */
typedef struct lcp_options {
    u_int passive           : 1; /* Don't die if we don't get a response */
    u_int silent            : 1; /* Wait for the other end to start first */
    u_int restart           : 1; /* Restart vs. exit after close */
    u_int neg_mru           : 1; /* Negotiate the MRU? */
    u_int neg_asyncmap      : 1; /* Negotiate the async map? */
    u_int neg_upap          : 1; /* Ask for UPAP authentication? */
    u_int neg_chap          : 1; /* Ask for CHAP authentication? */
    u_int neg_magicnumber   : 1; /* Ask for magic number? */
    u_int neg_pcompression  : 1; /* HDLC Protocol Field Compression? */
    u_int neg_accompression : 1; /* HDLC Address/Control Field Compression? */
    u_int neg_lqr           : 1; /* Negotiate use of Link Quality Reports */
    u_int neg_cbcp          : 1; /* Negotiate use of CBCP */
#ifdef PPP_MULTILINK
    u_int neg_mrru          : 1; /* Negotiate multilink MRRU */
    u_int neg_ssnhf         : 1; /* Negotiate short sequence numbers */
    u_int neg_endpoint      : 1; /* Negotiate endpoint discriminator */
#endif
    u_short mru;                 /* Value of MRU */
#ifdef PPP_MULTILINK
    u_short mrru;                /* Value of MRRU, and multilink enable */
#endif
    u_char chap_mdtype;          /* which MD type (hashing algorithm) */
    u32_t asyncmap;              /* Value of async map */
    u32_t magicnumber;
    int numloops;                /* Number of loops during magic number neg. */
    u32_t lqr_period;            /* Reporting period for LQR 1/100ths second */
#ifdef PPP_MULTILINK
    struct epdisc endpoint;      /* endpoint discriminator */
#endif
} lcp_options;

/*
 * Values for phase from BSD pppd.h based on RFC 1661.
 */
typedef enum {
  PHASE_DEAD = 0,
  PHASE_INITIALIZE,
  PHASE_ESTABLISH,
  PHASE_AUTHENTICATE,
  PHASE_CALLBACK,
  PHASE_NETWORK,
  PHASE_TERMINATE
} LinkPhase;


/*****************************
*** PUBLIC DATA STRUCTURES ***
*****************************/

extern LinkPhase lcp_phase[NUM_PPP]; /* Phase of link session (RFC 1661) */
extern lcp_options lcp_wantoptions[];
extern lcp_options lcp_gotoptions[];
extern lcp_options lcp_allowoptions[];
extern lcp_options lcp_hisoptions[];
extern ext_accm xmit_accm[];


/***********************
*** PUBLIC FUNCTIONS ***
***********************/

void lcp_init     (int);
void lcp_open     (int);
void lcp_close    (int, char *);
void lcp_lowerup  (int);
void lcp_lowerdown(int);
void lcp_sprotrej (int, u_char *, int); /* send protocol reject */

extern struct protent lcp_protent;

/* Default number of times we receive our magic number from the peer
   before deciding the link is looped-back. */
#define DEFLOOPBACKFAIL 10

#endif /* LCP_H */
