/*
 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 * 
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */

#ifndef _PPP_IF_H_
#define _PPP_IF_H_

/*
 * Network protocols we support.
 */
#define NP_IP	0		/* Internet Protocol V4 */
#define NP_IPV6	1		/* Internet Protocol V6 */
//#define NP_IPX	2		/* IPX protocol */
//#define NP_AT	3		/* Appletalk protocol */
#define NUM_NP	2		/* Number of NPs. */

/*
 * State of the interface.
 */
#define PPP_IF_STATE_DETACHING	1

struct ppp_if {
    /* first, the ifnet structure... */
    ifnet_t				net;		/* network-visible interface */

    /* administrative info */
    TAILQ_ENTRY(ppp_if) next;
    void				*host;		/* first client structure */
    u_int8_t			nbclients;	/* nb clients attached */
	u_int8_t			state;		/* state of the interface */
	lck_mtx_t			*mtx;		/* interface mutex */
	
    /* ppp data */
    u_int16_t			mru;		/* max receive unit */
    TAILQ_HEAD(, ppp_link)  link_head; 	/* list of links attached to this interface */
    u_int8_t			nblinks;	/* # links currently attached */
    mbuf_t				outm;		/* mbuf currently being output */
    time_t				last_xmit; 	/* last proto packet sent on this interface */
    time_t				last_recv; 	/* last proto packet received on this interface */
    u_int32_t			sc_flags;	/* ppp private flags */
    struct slcompress	*vjcomp; 	/* vjc control buffer */
    enum NPmode			npmode[NUM_NP];	/* what to do with each net proto */
    enum NPAFmode		npafmode[NUM_NP];/* address filtering for each net proto */
	struct pppqueue		sndq;		/* send queue */
	bpf_packet_func		bpf_input;	/* bpf input function */
	bpf_packet_func		bpf_output;	/* bpf output function */
	
    /* data compression */
    void				*xc_state;	/* send compressor state */
    struct ppp_comp		*xcomp;		/* send compressor structure */
    void				*rc_state;	/* send compressor state */
    struct ppp_comp		*rcomp;		/* send compressor structure */

	/* network protocols data */
    int					ip_attached;
    struct in_addr		ip_src;
    struct in_addr		ip_dst;
    int					ipv6_attached;
    ifnet_t				lo_ifp;		/* loopback interface */
};


/*
 * Bits in sc_flags: SC_NO_TCP_CCID, SC_CCP_OPEN, SC_CCP_UP, SC_LOOP_TRAFFIC,
 * SC_MULTILINK, SC_MP_SHORTSEQ, SC_MP_XSHORTSEQ, SC_COMP_TCP, SC_REJ_COMP_TCP.
 */
#define SC_FLAG_BITS	(SC_NO_TCP_CCID|SC_CCP_OPEN|SC_CCP_UP|SC_LOOP_TRAFFIC \
			 |SC_MULTILINK|SC_MP_SHORTSEQ|SC_MP_XSHORTSEQ \
			 |SC_COMP_TCP|SC_REJ_COMP_TCP)


int ppp_if_init();
int ppp_if_dispose();
int ppp_if_attach(u_short *unit);
int ppp_if_attachclient(u_short unit, void *host, ifnet_t *ifp);
void ppp_if_detachclient(ifnet_t ifp, void *host);

int ppp_if_input(ifnet_t ifp, mbuf_t m, u_int16_t proto, u_int16_t hdrlen);
int ppp_if_control(ifnet_t ifp, u_long cmd, void *data);
int ppp_if_attachlink(struct ppp_link *link, int unit);
int ppp_if_detachlink(struct ppp_link *link);
int ppp_if_send(ifnet_t ifp, mbuf_t m);
void ppp_if_error(ifnet_t ifp);
int ppp_if_xmit(ifnet_t ifp, mbuf_t m);



#define APPLE_PPP_NAME	"ppp"



#endif /* _PPP_IF_H_ */
