#ifndef _PPPLCP_H
#define _PPPLCP_H
  
                    /* LCP option types */
#define LCP_MRU         0x01
#define LCP_ACCM        0x02
#define LCP_AUTHENT     0x03
#define LCP_ENCRYPT     0x04
#define LCP_MAGIC       0x05
#define LCP_QUALITY     0x06
#define LCP_PFC         0x07
#define LCP_ACFC        0x08
#define LCP_OPTION_LIMIT    0x08    /* highest # we can handle */
  
/* Table for LCP configuration requests */
struct lcp_value_s {
    int16 negotiate;        /* negotiation flags */
#define LCP_N_MRU       (1 << LCP_MRU)
#define LCP_N_ACCM      (1 << LCP_ACCM)
#define LCP_N_AUTHENT       (1 << LCP_AUTHENT)
#define LCP_N_ENCRYPT       (1 << LCP_ENCRYPT)
#define LCP_N_MAGIC     (1 << LCP_MAGIC)
#define LCP_N_QUALITY       (1 << LCP_QUALITY)
#define LCP_N_PFC       (1 << LCP_PFC)
#define LCP_N_ACFC      (1 << LCP_ACFC)
  
    int16 mru;          /* Maximum Receive Unit */
    int32 accm;         /* Async Control Char Map */
    int16 authentication;       /* Authentication protocol */
    int16 encryption;       /* Encryption protocol */
    int32 magic_number;     /* Magic number value */
    int32 reporting_period;     /* Link Quality reporting period */
};
  
/* Other configuration option values */
#define LCP_ACCM_DEFAULT    0xffffffffL
#define LCP_MRU_DEFAULT 1500
#define LCP_MRU_HI  4096        /* High MRU limit */
#define LCP_MRU_LO  128     /* Lower MRU limit */
  
/*
 *  local.want: Options to request.
 *          Contains desired value.
 *          Only non-default options need to be negotiated.
 *          Initially, all are default.
 *  local.will: Options to accept in a NAK from remote.
 *  local.work: Options currently being negotiated.
 *          Value is valid only when negotiate bit is set.
 *
 *  remote.want:    Options to suggest by NAK if not present in REQ.
 *          Contains desired value.
 *  remote.will:    Options to accept in a REQ from remote.
 *  remote.work:    Options currently being negotiated.
 *          Value is valid only when negotiate bit is set.
 */
  
struct lcp_side_s {
    int16   will_negotiate;
    struct lcp_value_s want;
    struct lcp_value_s work;
};
  
/* LCP control block */
struct lcp_s {
    struct lcp_side_s local;
    struct lcp_side_s remote;
};
  
#define LCP_REQ_TRY 20      /* REQ attempts */
#define LCP_NAK_TRY 10      /* NAK attempts */
#define LCP_TERM_TRY    10      /* tries on TERM REQ */
#define LCP_TIMEOUT 3       /* Seconds to wait for response */
  
  
int doppp_lcp   __ARGS((int argc, char *argv[], void *p));
  
void ppp_ready  __ARGS((struct ppp_s *ppp_p));
  
void lcp_init   __ARGS((struct ppp_s *ppp_p));
  
#endif /* _PPPLCP_H */
