/*	$OpenBSD: tp_var.h,v 1.3 2002/03/14 03:16:12 millert Exp $	*/
/*	$NetBSD: tp_var.h,v 1.1 1996/02/13 22:12:29 christos Exp $	*/

/*
 * Copyright (c) 1995 Christos Zoulas.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Christos Zoulas.
 * 4. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
 */

#ifdef _KERNEL
struct isopcb;
struct mbuf;
struct sockaddr_iso;
struct tp_pcb;
struct sockaddr_in;
struct iso_addr;
struct tp_conn_param;
struct tp_event;
struct inpcb;
struct route;
struct pklcd;
struct sockaddr;
struct x25_packet;
struct in_addr;


/* tp_cons.c */
int tpcons_pcbconnect(void *, struct mbuf *);
void *tpcons_ctlinput(int, struct sockaddr *, void *);
void tpcons_input(struct mbuf *, ...);
int tpcons_output(struct mbuf *, ...);
int tpcons_output_dg(struct mbuf *, ...);

/* tp_driver.c */
int tp_driver(struct tp_pcb *, struct tp_event *);

/* tp_emit.c */
int tp_emit(int, struct tp_pcb *, SeqNum, u_int, struct mbuf *);
int tp_error_emit(int, u_long, struct sockaddr_iso *,
		  struct sockaddr_iso *, struct mbuf *, int,
		  struct tp_pcb *, caddr_t, 
		  int (*) (struct mbuf *, ...));

/* tp_inet.c */
void in_getsufx(void *, u_short *, caddr_t, int);
void in_putsufx(void *, caddr_t, int, int);
void in_recycle_tsuffix(void *);
void in_putnetaddr(void *, struct sockaddr *, int);
int in_cmpnetaddr(void *, struct sockaddr *, int);
void in_getnetaddr(void *, struct mbuf *, int);
int tpip_mtu(void *);
int tpip_output(struct mbuf *, ...);
int tpip_output_dg(struct mbuf *, ...);
void tpip_input(struct mbuf *, ...);
void tpin_quench(struct inpcb *, int);
void *tpip_ctlinput(int, struct sockaddr *, void *);
void tpin_abort(struct inpcb *, int);
void dump_inaddr(struct sockaddr_in *);

/* tp_input.c */
struct mbuf    *tp_inputprep(struct mbuf *);
void tp_input(struct mbuf *, ...);
int tp_headersize(int, struct tp_pcb *);

/* tp_iso.c */
void iso_getsufx(void *, u_short *, caddr_t, int);
void iso_putsufx(void *, caddr_t, int, int);
void iso_recycle_tsuffix(void *);
void iso_putnetaddr(void *, struct sockaddr *, int);
int iso_cmpnetaddr(void *, struct sockaddr *, int);
void iso_getnetaddr(void *, struct mbuf *, int);
int tpclnp_mtu(void *);
int tpclnp_output(struct mbuf *, ...);
int tpclnp_output_dg(struct mbuf *, ...);
void tpclnp_input(struct mbuf *, ...);
void iso_rtchange(struct isopcb *);
void tpiso_decbit(struct isopcb *);
void tpiso_quench(struct isopcb *);
void *tpclnp_ctlinput(int, struct sockaddr *, void *);
void tpclnp_ctlinput1(int, struct iso_addr *);
void tpiso_abort(struct isopcb *);
void tpiso_reset(struct isopcb *);

/* tp_meas.c */
void Tpmeas(u_int, u_int, struct timeval *, u_int, u_int, u_int);

/* tp_output.c */
int tp_consistency(struct tp_pcb *, u_int, struct tp_conn_param *);
int tp_ctloutput(int, struct socket *, int, int, struct mbuf **);

/* tp_pcb.c */
void tp_init(void);
void tp_soisdisconnecting(struct socket *);
void tp_soisdisconnected(struct tp_pcb *);
void tp_freeref(RefNum);
u_long tp_getref(struct tp_pcb *);
int tp_set_npcb(struct tp_pcb *);
int tp_attach(struct socket *, long);
void tp_detach(struct tp_pcb *);
int tp_tselinuse(int, caddr_t, struct sockaddr_iso *, int);
int tp_pcbbind(void *, struct mbuf *);

/* tp_subr.c */
int tp_goodXack(struct tp_pcb *, SeqNum);
void tp_rtt_rtv(struct tp_pcb *);
int tp_goodack(struct tp_pcb *, u_int, SeqNum, u_int);
int tp_sbdrop(struct tp_pcb *, SeqNum);
void tp_send(struct tp_pcb *);
int tp_packetize(struct tp_pcb *, struct mbuf *, int);
int tp_stash(struct tp_pcb *, struct tp_event *);
void tp_rsyflush(struct tp_pcb *);
void tp_rsyset(struct tp_pcb *);
void tpsbcheck(struct tp_pcb *, int);

/* tp_subr2.c */
void tp_local_credit(struct tp_pcb *);
int tp_protocol_error(struct tp_event *, struct tp_pcb *);
void tp_drain(void);
void tp_indicate(int, struct tp_pcb *, u_short);
void tp_getoptions(struct tp_pcb *);
void tp_recycle_tsuffix(void *);
void tp_quench(struct inpcb *, int);
void tp_netcmd(struct tp_pcb *, int);
int tp_mask_to_num(u_char);
void tp_mss(struct tp_pcb *, int);
int tp_route_to(struct mbuf *, struct tp_pcb *, caddr_t);
void tp0_stash(struct tp_pcb *, struct tp_event *);
void tp0_openflow(struct tp_pcb *);
int tp_setup_perf(struct tp_pcb *);
void dump_addr(struct sockaddr *);
void Dump_buf(caddr_t, int);

/* tp_timer.c */
void tp_timerinit(void);
void tp_etimeout(struct tp_pcb *, int, int);
void tp_euntimeout(struct tp_pcb *, int);
void tp_slowtimo(void);
void tp_data_retrans(struct tp_pcb *);
void tp_fasttimo(void);
void tp_ctimeout(struct tp_pcb *, int, int);
void tp_ctimeout_MIN(struct tp_pcb *, int, int);
void tp_cuntimeout(struct tp_pcb *, int);

/* tp_trace.c */
void tpTrace(struct tp_pcb *, u_int, u_int, u_int, u_int, u_int,
		     u_int);

/* tp_usrreq.c */
void dump_mbuf(struct mbuf *, char *);
int tp_rcvoob(struct tp_pcb *, struct socket *, struct mbuf *,
		     int *, int);
int tp_sendoob(struct tp_pcb *, struct socket *, struct mbuf *, int *);
int tp_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
		     struct mbuf *);
void tp_ltrace(struct socket *, struct uio *);
int tp_confirm(struct tp_pcb *);
int tp_snd_control(struct mbuf *, struct socket *, struct mbuf **);

#ifdef TPCONS
/* if_cons.c */
void nibble_copy(char *, unsigned, char *, unsigned, int);
int nibble_match(char *, unsigned, char *, unsigned, int);
void cons_init(void);
int tp_incoming(struct mbuf *, void *);
int cons_tpinput(struct mbuf *, void *);
int cons_connect(struct isopcb *);
void *cons_ctlinput(int, struct sockaddr *, void *);
int find_error_reason(struct x25_packet *);
#endif

#endif