#ifndef _PPPIPCP_H
#define _PPPIPCP_H
  
#ifndef _SLHC_H
#include "slhc.h"
#endif
  
                    /* IPCP option types */
#define IPCP_ADDRESS        0x01
#define IPCP_COMPRESS       0x02
#define IPCP_OPTION_LIMIT   0x02    /* highest # we can handle */
  
/* Table for IPCP configuration requests */
struct ipcp_value_s {
    int16 negotiate;        /* negotiation flags */
#define IPCP_N_ADDRESS      (1 << IPCP_ADDRESS)
#define IPCP_N_COMPRESS     (1 << IPCP_COMPRESS)
  
    int32 address;          /* address for this side */
    int32 other;            /* address for other side */
  
    int16 compression;      /* Compression protocol */
    int16 slots;            /* Slots (0-n)*/
    byte_t slot_compress;       /* Slots may be compressed (flag)*/
};
  
#define IPCP_SLOT_DEFAULT   16  /* Default # of slots */
#define IPCP_SLOT_HI        64  /* Maximum # of slots */
#define IPCP_SLOT_LO         1  /* Minimum # of slots */
#define IPCP_SLOT_COMPRESS  0x01    /* May compress slot id */
  
struct ipcp_side_s {
    int16 will_negotiate;
    struct ipcp_value_s want;
    struct ipcp_value_s work;
};
  
/* Store address pool in otherwise unused address locations */
#define peer_min    local.want.other    /* First IP address in pool */
#define peer_max    remote.want.other   /* Last IP address in pool */
  
/* IPCP control block */
struct ipcp_s {
    struct ipcp_side_s local;
    struct ipcp_side_s remote;
  
    struct slcompress *slhcp;   /* pointer to compression block */
};
  
#define IPCP_REQ_TRY    20      /* REQ attempts */
#define IPCP_NAK_TRY    10      /* NAK attempts */
#define IPCP_TERM_TRY   10      /* tries on TERM REQ */
#define IPCP_TIMEOUT    3       /* Seconds to wait for response */
  
  
int doppp_ipcp __ARGS((int argc, char *argv[], void *p));
void ipcp_init __ARGS((struct ppp_s *ppp_p));
  
#endif /* _PPPIPCP_H */
