#ifndef _PPP_H
#define _PPP_H
/*
 *	PPP.H
 *
 *	12-89	-- Katie Stevens (dkstevens@ucdavis.edu)
 *		   UC Davis, Computing Services
 *	PPP.07	04-90	[ks] start with same peer addr during IPCP
 *	PPP.08	05-90	[ks] improve statistic and trace reporting
 *	PPP.09	05-90	[ks] add UPAP processing
 *	PPP.10	06-90	[ks] improve keybd input of UPAP password
 *			     make ppp open/close/reset work properly
 *			     add peerID-to-IPaddr lookup table
 *			     add peer IP lookup pool
 *	PPP.13	08-90	[ks] add timestamp for PPP open
 *	PPP.14	08-90	[ks] change UPAP to PAP for consistency with RFC1172
 *			     add RLSD link up/down signal handling
 *			     add autobaud link speed message handling
 *			     make LCP/IPCP timeouts configurable
 *	PPP.15	09-90	[ks] update to KA9Q NOS v900828
 */

#ifndef	_GLOBAL_H
#include "global.h"
#endif

#ifndef	_MBUF_H
#include "mbuf.h"
#endif

#ifndef	_IFACE_H
#include "iface.h"
#endif

#ifndef _IP_H
#include "ip.h"
#endif

#ifndef _SLIP_H
#include "slip.h"
#endif

#ifndef _TIMER_H
#include "timer.h"
#endif

/* PPP definitions */
#define	PPP_ALLOC	100	/* Receiver allocation increment */

/* Bit masks for escaped element of Slip[] control block */
#define PPP_BIT_BUCKET	0x01		/* Discard bytes until next frame */
#define PPP_ESCAPED	0x02		/* Un-complement next rcv char */
#define PPP_RCV_ACCOMP	0x04		/* Compress HDLC addr/ctl fields */
#define PPP_RCV_PRCOMP	0x08		/* Compress PPP protocol field */
#define PPP_XMT_ACCOMP	0x10		/* Compress HDLC addr/ctl fields */
#define PPP_XMT_PRCOMP	0x20		/* Compress PPP protocol field */
#define PPP_RCV_VJCOMPR	0x40		/* Van Jacobson TCP header compress */
#define PPP_XMT_VJCOMPR	0x80		/* VJ TCP header compression on send */

/* Table for LCP configuration requests */
struct lcpparm {
    unsigned char neg_mru;		/* Attempt/accept MRU negotiation */
    int16 mru;				/* Maximum Receive Unit value */
    unsigned char neg_ctl_map;		/* Attempt/accept ctl map neg */
    int32 ctl_map;			/* Async Control Map value */
    unsigned char neg_auth_type;	/* Attempt/accept auth type neg */
    int16 auth_type;			/* Authentication Type */
    unsigned char neg_encr_type;	/* Attempt/accept encrpytion neg */
    int16 encr_type;			/* Encryption Type */
    unsigned char neg_magic_num;	/* Attempt/accept magic number neg */
    int32 magic_num;			/* Magic number value */
    unsigned char neg_keepalive;	/* Attempt/accept keepalive neg */
    unsigned char keepalive;		/* Keepalive value */
    unsigned char neg_prot_compress;	/* Attempt/accept protocol compr neg */
    int prot_compress;			/* Protocol Compression boolean */
    unsigned char neg_ac_compress;	/* Attmept/accept addr/ctl compr neg */
    int ac_compress;			/* Addr/Ctl Compression boolean */
};
/* Default configuration option values */
#define DEF_MRU		1500		/* Max Receive Unit = 1500 bytes */
#define DEF_CTL_MAP	0xffffffff	/* Async Ctl Map = esc all controls */
#define DEF_AUTH_TYPE	0x0000		/* No Authentication protocol */
#define DEF_ENCR_TYPE	0x0000		/* No Encryption protocol */
#define DEF_MAGIC_NUM	0x00000000	/* No Magic Number */
#define DEF_LINK_QUAL	0x00		/* No Link Quality Monitoring */
#define DEF_PROT_COMPR	0x00		/* No Protocol Compression */
#define DEF_AC_COMPR	0x00		/* No Addr/Ctl Compression */
/* Other configuration option values */
#define MIN_MRU		128		/* Set a lower limit */
#define PAP_AUTH_TYPE	0xc023		/* Password Auth Protocol */


/* LCP control block */
struct lcpctl {
    char active;			/* 0=passive open; non-0=active open */
    char lcp_state;			/* State of Link Control exchange */
#define LCP_CLOSED	0x00
#define LCP_LISTEN	0x01
#define LCP_REQ_SENT	0x02
#define LCP_ACK_RCVD	0x03
#define LCP_ACK_SENT	0x04
#define LCP_OPEN	0x05
#define LCP_TERMINATE	0x06
    unsigned char lastid;		/* ID of last REQ we sent */
    struct timer lcp_tm;		/* Timer against response to our REQ */
    unsigned char ack_retry;		/* Retry counter for timeouts */

    struct lcpparm initparm;		/* First request of local parameters */
    struct lcpparm lclparm;		/* Negotiated local parameters */
    struct lcpparm remparm;		/* Negotiated remote parameters */

    char pap_state;			/* Current state of PAP */
#define PAP_CLOSED	0x00
#define PAP_LISTEN	0x01
#define PAP_REQ_SENT	0x02
#define PAP_REQ_RCVD	0x03
#define PAP_OPEN	0x04
    char *pap_user;			/* Peer ID for PAP AUTH_REQ */
    char *pap_pass;			/* Password for PAP AUTH_REQ */
};
#define LCP_TIMEOUT	 3		/* 3 sec timeout wait for response */
#define LCP_RETRY_MAX	10		/* Retry on timeout at most 10 times */
#define LCP_TERM_RETRY	 2		/* Minimal retry on TERM REQ */
#define PAP_RETRY_MAX	20		/* Retry on timeout at most 20 times */
#define PAP_FAIL_MAX	 4		/* At most 5 attempts at peer auth */
/* Permissions bit for use with userlogin() in FTPSERV.C */
/* Other bit values in FTPSERV.H, AX_MBX.H               */
#define PPP_ACCESS_PRIV	0x0100		/* Priv bit for PPP connection */
#define PPP_PWD_LOOKUP	0x0200		/* Priv bit for peerID/pass lookup */

/* IPCP pool of addresses when remote peer requests address assignment */
struct ipcppool {
	int32 peer_min;			/* First IP address in pool */
	int32 peer_max;			/* Last IP address in pool */
	int32 peer_next;		/* Next address to assign */
};
#define NULLPOOL (struct ipcppool *)0

/* IPCP control block */
struct ipcpctl {
    char active;			/* 0=passive open; non-0=active open */
    char ipcp_state;			/* State of Link Control exchange */
#define IPCP_CLOSED	0x00
#define IPCP_LISTEN	0x01
#define IPCP_REQ_SENT	0x02
#define IPCP_ACK_RCVD	0x03
#define IPCP_ACK_SENT	0x04
#define IPCP_OPEN	0x05
#define IPCP_TERMINATE	0x06
    unsigned char lastid;		/* ID of last REQ we sent */
    struct timer ipcp_tm;		/* Timer against response to our REQ */
    unsigned char ack_retry;		/* Retry counter for timeouts */

    int32 peer_addr;			/* IP address of remote peer */
    struct ipcppool *peer_pool;		/* Pool of IP addresses for peer */
    unsigned char attempt_addrs;	/* 1=send a ConfigReq with our addrs */
    int32 attempt_src;			/* Addr to send with config request */
    int32 attempt_dest;			/* Addr to send with config request */
    unsigned char accept_addrs;		/* 1=accept addrs from remote host */
    int32 accept_src;			/* Src addr given by remote host */
    int32 accept_dest;			/* Dest addr given by remote host */
    unsigned char neg_ip_compr;		/* 1=negotiate IP packet compression */
    int16 ip_compr_type;		/* Type of IP packet compression */
    unsigned char attempt_ip_compr;	/* 1=we will request IP compression */
    int16 lcl_ip_compr;			/* Type of IP compression we want */
    unsigned char accept_ip_compr;	/* 1=we will accept IP compr request */
    int16 rem_ip_compr;			/* Type of IP compression requested */
};
#define IPCP_TIMEOUT	  3		/* 3 sec timeout wait for response */
#define IPCP_RETRY_MAX	254		/* Retry for a long time */
#define IPCP_TERM_RETRY	  2		/* Minimal retry on TERM REQ */
#define IPCP_VJCOMPR	0x0037		/* Van Jacobson TCP header compr */
#define DEF_IP_COMPR	0x00		/* No IP compression */

/* PPP control block */
struct pppctl {
    int16 calc_fcs;			/* Cummulative FCS value (rcv pkts) */
    int32 ctlmap;			/* Async control map (xmt pkts) */

    char state;				/* Overall PPP link state */
#define PPP_PL_DOWN	0x00			/* Physical Layer Down */
#define PPP_AUTOBAUD	0x01			/* Waiting for autobaud msg */
#define PPP_CLOSED	0x02			/* Idle State */
#define PPP_LCP		0x03			/* Negotiating LCP options */
#define PPP_PAP		0x04			/* Password authentication */
#define PPP_IPCP	0x05			/* Negotiating IP options */
#define PPP_OPEN	0x06			/* Link open for all traffic */
    struct lcpctl lcpio;		/* Control block for LCP negotiation */
    struct ipcpctl ipcpio;		/* Ctl block for IPCP negotiation */

#ifndef PPP_NO_STATS
    int32 upsince;			/* Timestamp when state is PPP_OPEN */
    int32 sndpkt;			/* # packets sent on PPP interface */
    int16 snderr;			/* # pkts with PPP error on send */
    int32 rcvpkt;			/* # packets rcvd on PPP interface */
    int16 rcverr;			/* # pkts with error */
    int16 csumerr;			/* # rcv pkts with bad PPP checksum */

    int16 sndlcp;			/* # LCP packets sent */
    int16 sndpap;			/* # PAP packets sent */
    int16 sndipcp;			/* # IPCP packets sent */
    int32 sndip;			/* # IP packets sent */
    int16 rcvlcp;			/* # LCP packets received */
    int16 rcvpap;			/* # PAP packets received */
    int16 rcvipcp;			/* # IPCP packets received */
    int32 rcvip;			/* # IP packets received */
    int16 rcvunk;			/* # unknown packets received */
#endif
};
#define NULLPPPCTL	(struct pppctl *)0

struct ppphdr {
    unsigned char addr;		/* Address field (always 0xff) */
    char control;		/* Control field (always 0x03) */
    int16 type;			/* Protocol field (IP, IPCP, LCP, PAP) */
#define PPP_IP_TYPE	0x0021	/* DOD Internet Protocol */
#define PPP_COMPR_TYPE	0x002d	/* Van Jacobson Compressed TCP/IP */
#define PPP_UNCOMP_TYPE	0x002f	/* Van Jacobson Uncompressed TCP/IP */

#define PPP_IPCP_TYPE	0x8021	/* DOD Internet Protocol Control Protocol */

#define PPP_LCP_TYPE	0xc021	/* Link Control Protocol */
#define PPP_PAP_TYPE	0xc023	/* Password Authentication Protocol */
};
#define PPP_HDRLEN	4	/* Max bytes for PPP/HDLC envelope header */

/* HDLC envelope constants */
#define HDLC_ENVLEN	0x06	/* Max bytes for HDLC envelope (outgoing) */

#define HDLC_FLAG	0x7e	/* HDLC async start/stop flag */
#define HDLC_ALL_ADDR	0x00ff	/* HDLC all-station address flag */
#define HDLC_UI		0x03	/* HDLC Unnumbered Info control flag */
#define HDLC_ESC_ASYNC	0x7d	/* HDLC transparency escape flag for async */
#define HDLC_ESC_COMPL	0x20	/* HDLC transparency bit complement mask */

#define HDLC_FCS_START	0xffff	/* Starting bit string for FCS calculation */
#define HDLC_FCS_FINAL	0xf0b8	/* FCS when summed over frame and sender FCS */

/* LCP/IPCP config packet header */
struct cnfhdr {
	char code;
/* LCP/IPCP config packet codes */
#define CONFIG_REQ	0x01
#define CONFIG_ACK	0x02
#define CONFIG_NAK	0x03
#define CONFIG_REJ	0x04
#define TERMINATE_REQ	0x05
#define TERMINATE_ACK	0x06
#define CODE_REJ	0x07
#define PROT_REJ	0x08
#define ECHO_REQ	0x09
#define ECHO_REPLY	0x0a
#define DISCARD_REQ	0x0b
/* PAP config packet codes */
#define AUTH_REQ	0x01
#define AUTH_ACK	0x02
#define AUTH_NAK	0x03
	unsigned char id;
	int16 len;
};
#define CNF_HDRLEN	4	/* Length of LCP/IPCP config packet header */

/* LCP/IPCP config option header */
struct opthdr {
	char type;
/* LCP option types */
#define MAX_RCV_UNIT	0x01
#define ASYNC_CTL_MAP	0x02
#define AUTH_TYPE	0x03
#define ENCR_TYPE	0x04
#define MAGIC_NUMBER	0x05
#define LINK_QUALITY	0x06
#define PROT_COMPRESS	0x07
#define AC_COMPRESS	0x08
/* IPCP option types */
#define IP_ADDRS	0x01
#define IP_COMPR_TYPE	0x02
	unsigned char len;
};
#define OPT_HDRLEN	2	/* Length of LCP/IPCP config option header */
#define NULLOPTHDR	(struct opthdr *)0

/* In ppp.c: */
int ntohppp __ARGS((struct ppphdr *ppp, struct mbuf **bpp));
int ppp_send __ARGS((struct mbuf *data,struct iface *iface,int32 gateway,int prec,
	int del,int tput,int rel));
int ppp_output __ARGS((struct iface *iface, char dest[], char source[],
	int16 type, struct mbuf *data));
int ppp_raw __ARGS((struct iface *iface,struct mbuf *data));
void ppp_recv __ARGS((int dev,void *p1,void *p2));
void ppp_autobaud __ARGS((int dev,void *p1,void *p2));
void ppp_rlsd __ARGS((int dev,void *p1,void *p2));
int ppp_init __ARGS((int dev, char rlsd, long autospeed));
int ppp_close __ARGS((struct slip *sp, int pl_too));
void pproc __ARGS((struct iface *iface,struct mbuf *bp));

/* In ppplcp.c: */
struct mbuf *htoncnf __ARGS((struct cnfhdr *cnf, struct mbuf *data));
int ntohcnf __ARGS((struct cnfhdr *cnf, struct mbuf **bpp));
struct mbuf *htonopt __ARGS((struct opthdr *opt));
int ntohopt __ARGS((struct opthdr *opt, struct mbuf **bpp));

void lcp_init __ARGS((struct slip *sp));
int lcp_reset __ARGS((struct pppctl *pppiop));
int lcp_close __ARGS((struct slip *sp));
int lcp_start __ARGS((struct slip *sp));
void lcp_shutdown __ARGS((struct slip *sp));
void lcpproc __ARGS((struct iface *iface, struct mbuf *bp));

/* In pppipcp.c: */
void ipcp_init __ARGS((struct slip *sp));
int ipcp_reset __ARGS((struct slip *sp));
int ipcp_close __ARGS((struct slip *sp));
int ipcp_start __ARGS((struct slip *sp));
void ipcpproc __ARGS((struct iface *iface, struct mbuf *bp));

/* In ppppap.c: */
void pap_init __ARGS((struct slip *sp));
int pap_reset __ARGS((struct pppctl *pppiop));
int pap_start __ARGS((struct slip *sp));
int pap_getpass __ARGS((struct slip *sp,int mustask));
void papproc __ARGS((struct iface *iface, struct mbuf *bp));

#endif	/* _PPP_H */
