Initial revision
diff --git a/isisd/include-netbsd/clnp.h b/isisd/include-netbsd/clnp.h
new file mode 100644
index 0000000..6bc3d25
--- /dev/null
+++ b/isisd/include-netbsd/clnp.h
@@ -0,0 +1,547 @@
+/*	$NetBSD: clnp.h,v 1.13 2001/08/20 12:00:54 wiz Exp $	*/

+

+/*-

+ * Copyright (c) 1991, 1993, 1994

+ *	The Regents of the University of California.  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 the University of

+ *	California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.

+ *

+ *	@(#)clnp.h	8.2 (Berkeley) 4/16/94

+ */

+

+/***********************************************************

+		Copyright IBM Corporation 1987

+

+                      All Rights Reserved

+

+Permission to use, copy, modify, and distribute this software and its

+documentation for any purpose and without fee is hereby granted,

+provided that the above copyright notice appear in all copies and that

+both that copyright notice and this permission notice appear in

+supporting documentation, and that the name of IBM not be

+used in advertising or publicity pertaining to distribution of the

+software without specific, written prior permission.

+

+IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING

+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL

+IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR

+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,

+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,

+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS

+SOFTWARE.

+

+******************************************************************/

+

+/*

+ * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison

+ */

+

+/* should be config option but cpp breaks with too many #defines */

+#define	DECBIT

+

+/*

+ *	Return true if the mbuf is a cluster mbuf

+ */

+#define	IS_CLUSTER(m)	((m)->m_flags & M_EXT)

+

+/*

+ *	Move the halfword into the two characters

+ */

+#define	HTOC(msb, lsb, hword)\

+	(msb) = (u_char)((hword) >> 8);\

+	(lsb) = (u_char)((hword) & 0xff)

+/*

+ *	Move the two charcters into the halfword

+ */

+#define	CTOH(msb, lsb, hword)\

+	(hword) = ((msb) << 8) | (lsb)

+

+/*

+ *	Return true if the checksum has been set - ie. the checksum is

+ *	not zero

+ */

+#define	CKSUM_REQUIRED(clnp)\

+	(((clnp)->cnf_cksum_msb != 0) || ((clnp)->cnf_cksum_lsb != 0))

+

+/*

+ *	Fixed part of clnp header

+ */

+struct clnp_fixed {

+	u_char          cnf_proto_id;	/* network layer protocol identifier */

+	u_char          cnf_hdr_len;	/* length indicator (octets) */

+	u_char          cnf_vers;	/* version/protocol identifier

+					 * extension */

+	u_char          cnf_ttl;/* lifetime (500 milliseconds) */

+	u_char          cnf_type;	/* type code */

+	/* Includes err_ok, more_segs, and seg_ok */

+	u_char          cnf_seglen_msb;	/* pdu segment length (octets) high

+					 * byte */

+	u_char          cnf_seglen_lsb;	/* pdu segment length (octets) low

+					 * byte */

+	u_char          cnf_cksum_msb;	/* checksum high byte */

+	u_char          cnf_cksum_lsb;	/* checksum low byte */

+} __attribute__((packed));

+#define CNF_TYPE	0x1f

+#define CNF_ERR_OK	0x20

+#define CNF_MORE_SEGS	0x40

+#define CNF_SEG_OK	0x80

+

+#define CLNP_CKSUM_OFF	0x07	/* offset of checksum */

+

+#define	clnl_fixed	clnp_fixed

+

+/*

+ *	Segmentation part of clnp header

+ */

+struct clnp_segment {

+	u_short         cng_id;	/* data unit identifier */

+	u_short         cng_off;/* segment offset */

+	u_short         cng_tot_len;	/* total length */

+};

+

+/*

+ *	Clnp fragment reassembly structures:

+ *

+ *	All packets undergoing reassembly are linked together in

+ *	clnp_fragl structures. Each clnp_fragl structure contains a

+ *	pointer to the original clnp packet header, as well as a

+ *	list of packet fragments. Each packet fragment

+ *	is headed by a clnp_frag structure. This structure contains the

+ *	offset of the first and last byte of the fragment, as well as

+ *	a pointer to the data (an mbuf chain) of the fragment.

+ */

+

+/*

+ *	NOTE:

+ *		The clnp_frag structure is stored in an mbuf immedately

+ *		preceding the fragment data. Since there are words in

+ *		this struct, it must be word aligned.

+ *

+ *	NOTE:

+ *		All the fragment code assumes that the entire clnp header is

+ *		contained in the first mbuf.

+ */

+struct clnp_frag {

+	u_int           cfr_first;	/* offset of first byte of this frag */

+	u_int           cfr_last;	/* offset of last byte of this frag */

+	u_int           cfr_bytes;	/* bytes to shave to get to data */

+	struct mbuf    *cfr_data;	/* ptr to data for this frag */

+	struct clnp_frag *cfr_next;	/* next fragment in list */

+};

+

+struct clnp_fragl {

+	struct iso_addr cfl_src;/* source of the pkt */

+	struct iso_addr cfl_dst;/* destination of the pkt */

+	u_short         cfl_id;	/* id of the pkt */

+	u_char          cfl_ttl;/* current ttl of pkt */

+	u_short         cfl_last;	/* offset of last byte of packet */

+	struct mbuf    *cfl_orighdr;	/* ptr to original header */

+	struct clnp_frag *cfl_frags;	/* linked list of fragments for pkt */

+	struct clnp_fragl *cfl_next;	/* next pkt being reassembled */

+};

+

+/*

+ *	The following structure is used to index into an options section

+ *	of a clnp datagram. These values can be used without worry that

+ *	offset or length fields are invalid or too big, etc. That is,

+ *	the consistancy of the options will be guaranteed before this

+ *	structure is filled in. Any pointer (field ending in p) is

+ *	actually the offset from the beginning of the mbuf the option

+ *	is contained in.  A value of NULL for any pointer

+ *	means that the option is not present. The length any option

+ *	does not include the option code or option length fields.

+ */

+struct clnp_optidx {

+	u_short         cni_securep;	/* ptr to start of security option */

+	char            cni_secure_len;	/* length of entire security option */

+

+	u_short         cni_srcrt_s;	/* offset of start of src rt option */

+	u_short         cni_srcrt_len;	/* length of entire src rt option */

+

+	u_short         cni_recrtp;	/* ptr to beginning of recrt option */

+	char            cni_recrt_len;	/* length of entire recrt option */

+

+	char            cni_priorp;	/* ptr to priority option */

+

+	u_short         cni_qos_formatp;	/* ptr to format of qos

+						 * option */

+	char            cni_qos_len;	/* length of entire qos option */

+

+	u_char          cni_er_reason;	/* reason from ER pdu option */

+

+	/* ESIS options */

+

+	u_short         cni_esct;	/* value from ISH ESCT option */

+

+	u_short         cni_netmaskp;	/* ptr to beginning of netmask option */

+	char            cni_netmask_len;	/* length of entire netmask

+						 * option */

+

+	u_short         cni_snpamaskp;	/* ptr to start of snpamask option */

+	char            cni_snpamask_len;	/* length of entire snpamask

+						 * option */

+

+};

+

+#define	ER_INVALREAS	0xff	/* code for invalid ER pdu discard reason */

+

+/* given an mbuf and addr of option, return offset from data of mbuf */

+#define CLNP_OPTTOOFF(m, opt) ((u_short) (opt - mtod(m, caddr_t)))

+

+/* given an mbuf and offset of option, return address of option */

+#define CLNP_OFFTOOPT(m, off) ((caddr_t) (mtod(m, caddr_t) + off))

+

+/* return true iff src route is valid */

+#define	CLNPSRCRT_VALID(oidx) ((oidx) && (oidx->cni_srcrt_s))

+

+/* return the offset field of the src rt */

+#define CLNPSRCRT_OFF(oidx, options)\

+	(*((u_char *)(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + 1)))

+

+/* return the type field of the src rt */

+#define CLNPSRCRT_TYPE(oidx, options)\

+	((u_char)(*(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s))))

+

+/* return the length of the current address */

+#define CLNPSRCRT_CLEN(oidx, options)\

+	((u_char)(*(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + CLNPSRCRT_OFF(oidx, options) - 1)))

+

+/* return the address of the current address */

+#define CLNPSRCRT_CADDR(oidx, options)\

+	((caddr_t)(CLNP_OFFTOOPT(options, oidx->cni_srcrt_s) + CLNPSRCRT_OFF(oidx, options)))

+

+/*

+ * return true if the src route has run out of routes this is true if the

+ * offset of next route is greater than the end of the rt

+ */

+#define	CLNPSRCRT_TERM(oidx, options)\

+	(CLNPSRCRT_OFF(oidx, options) > oidx->cni_srcrt_len)

+

+/*

+ *	Options a user can set/get

+ */

+#define	CLNPOPT_FLAGS	0x01	/* flags: seg permitted, no er xmit, etc  */

+#define	CLNPOPT_OPTS	0x02	/* datagram options */

+

+/*

+ *	Values for particular datagram options

+ */

+#define	CLNPOVAL_PAD		0xcc	/* padding */

+#define	CLNPOVAL_SECURE		0xc5	/* security */

+#define	CLNPOVAL_SRCRT		0xc8	/* source routing */

+#define	CLNPOVAL_RECRT		0xcb	/* record route */

+#define	CLNPOVAL_QOS		0xc3	/* quality of service */

+#define	CLNPOVAL_PRIOR		0xcd	/* priority */

+#define CLNPOVAL_ERREAS		0xc1	/* ER PDU ONLY: reason for discard */

+

+#define	CLNPOVAL_SRCSPEC	0x40	/* source address specific */

+#define	CLNPOVAL_DSTSPEC	0x80	/* destination address specific */

+#define	CLNPOVAL_GLOBAL		0xc0	/* globally unique */

+

+/* Globally Unique QOS */

+#define	CLNPOVAL_SEQUENCING	0x10	/* sequencing preferred */

+#define CLNPOVAL_CONGESTED	0x08	/* congestion experienced */

+#define CLNPOVAL_LOWDELAY	0x04	/* low transit delay */

+

+#define	CLNPOVAL_PARTRT		0x00	/* partial source routing */

+#define CLNPOVAL_COMPRT		0x01	/* complete source routing */

+

+/*

+ *	Clnp flags used in a control block flags field.

+ *	NOTE: these must be out of the range of bits defined in ../net/raw_cb.h

+ */

+#define	CLNP_NO_SEG		0x010	/* segmentation not permitted */

+#define	CLNP_NO_ER		0x020	/* do not generate ERs */

+#define CLNP_SEND_RAW		0x080	/* send pkt as RAW DT not TP DT */

+#define	CLNP_NO_CKSUM		0x100	/* don't use clnp checksum */

+#define CLNP_ECHO		0x200	/* send echo request */

+#define	CLNP_NOCACHE		0x400	/* don't store cache information */

+#define CLNP_ECHOR		0x800	/* send echo reply */

+

+/* valid clnp flags */

+#define CLNP_VFLAGS \

+	(CLNP_SEND_RAW|CLNP_NO_SEG|CLNP_NO_ER|CLNP_NO_CKSUM|\

+	 CLNP_ECHO|CLNP_NOCACHE|CLNP_ECHOR)

+

+/*

+ * Constants used by clnp

+ */

+#define	CLNP_HDR_MIN	(sizeof (struct clnp_fixed))

+#define	CLNP_HDR_MAX	(254)

+#define	CLNP_TTL_UNITS	2	/* 500 milliseconds */

+#define CLNP_TTL	15*CLNP_TTL_UNITS	/* time to live (seconds) */

+#define	ISO8473_V1	0x01

+

+/*

+ *	Clnp packet types

+ *	In order to test raw clnp and tp/clnp simultaneously, a third type of

+ *	packet has been defined: CLNP_RAW. This is done so that the input

+ *	routine can switch to the correct input routine (rclnp_input or

+ *	tpclnp_input) based on the type field. If clnp had a higher level

+ *	protocol field, this would not be necessary.

+ */

+#define	CLNP_DT			0x1C	/* normal data */

+#define	CLNP_ER			0x01	/* error report */

+#define	CLNP_RAW		0x1D	/* debug only */

+#define CLNP_EC			0x1E	/* echo packet */

+#define CLNP_ECR		0x1F	/* echo reply */

+

+/*

+ *	ER pdu error codes

+ */

+#define GEN_NOREAS		0x00	/* reason not specified */

+#define GEN_PROTOERR		0x01	/* protocol procedure error */

+#define GEN_BADCSUM		0x02	/* incorrect checksum */

+#define GEN_CONGEST		0x03	/* pdu discarded due to congestion */

+#define GEN_HDRSYNTAX		0x04	/* header syntax error */

+#define GEN_SEGNEEDED		0x05	/* need segmentation but not allowed */

+#define GEN_INCOMPLETE		0x06	/* incomplete pdu received */

+#define GEN_DUPOPT		0x07	/* duplicate option */

+

+/* address errors */

+#define ADDR_DESTUNREACH	0x80	/* destination address unreachable */

+#define ADDR_DESTUNKNOWN	0x81	/* destination address unknown */

+

+/* source routing */

+#define SRCRT_UNSPECERR		0x90	/* unspecified src rt error */

+#define SRCRT_SYNTAX		0x91	/* syntax error in src rt field */

+#define SRCRT_UNKNOWNADDR	0x92	/* unknown addr in src rt field */

+#define SRCRT_BADPATH		0x93	/* path not acceptable */

+

+/* lifetime */

+#define TTL_EXPTRANSIT		0xa0	/* lifetime expired during transit */

+#define TTL_EXPREASS		0xa1	/* lifetime expired during reassembly */

+

+/* pdu discarded */

+#define DISC_UNSUPPOPT		0xb0	/* unsupported option not specified? */

+#define DISC_UNSUPPVERS		0xb1	/* unsupported protocol version */

+#define DISC_UNSUPPSECURE	0xb2	/* unsupported security option */

+#define DISC_UNSUPPSRCRT	0xb3	/* unsupported src rt option */

+#define DISC_UNSUPPRECRT	0xb4	/* unsupported rec rt option */

+

+/* reassembly */

+#define REASS_INTERFERE		0xc0	/* reassembly interference */

+#define CLNP_ERRORS		22

+

+

+#ifdef CLNP_ER_CODES

+u_char          clnp_er_codes[CLNP_ERRORS] = {

+	GEN_NOREAS, GEN_PROTOERR, GEN_BADCSUM, GEN_CONGEST,

+	GEN_HDRSYNTAX, GEN_SEGNEEDED, GEN_INCOMPLETE, GEN_DUPOPT,

+	ADDR_DESTUNREACH, ADDR_DESTUNKNOWN,

+	SRCRT_UNSPECERR, SRCRT_SYNTAX, SRCRT_UNKNOWNADDR, SRCRT_BADPATH,

+	TTL_EXPTRANSIT, TTL_EXPREASS,

+	DISC_UNSUPPOPT, DISC_UNSUPPVERS, DISC_UNSUPPSECURE,

+	DISC_UNSUPPSRCRT, DISC_UNSUPPRECRT, REASS_INTERFERE

+};

+#endif

+

+#ifdef	TROLL

+

+#define	TR_DUPEND		0x01	/* duplicate end of fragment */

+#define TR_DUPPKT		0x02	/* duplicate entire packet */

+#define	TR_DROPPKT		0x04	/* drop packet on output */

+#define TR_TRIM			0x08	/* trim bytes from packet */

+#define TR_CHANGE		0x10	/* change bytes in packet */

+#define TR_MTU			0x20	/* delta to change device mtu */

+#define	TR_CHUCK		0x40	/* drop packet in rclnp_input */

+#define	TR_BLAST		0x80	/* force rclnp_output to blast many

+					 * packet */

+#define	TR_RAWLOOP		0x100	/* make if_loop call clnpintr

+					 * directly */

+struct troll {

+	int             tr_ops;	/* operations to perform */

+	float           tr_dup_size;	/* % to duplicate */

+	float           tr_dup_freq;	/* frequency to duplicate packets */

+	float           tr_drop_freq;	/* frequence to drop packets */

+	int             tr_mtu_adj;	/* delta to adjust if mtu */

+	int             tr_blast_cnt;	/* # of pkts to blast out */

+};

+

+#define	SN_OUTPUT(clcp, m)\

+	troll_output(clcp->clc_ifp, m, clcp->clc_firsthop, clcp->clc_rt)

+

+#define	SN_MTU(ifp, rt) (((rt && rt->rt_rmx.rmx_mtu) ?\

+	rt->rt_rmx.rmx_mtu : clnp_badmtu(ifp, rt, __LINE__, __FILE__))\

+		- trollctl.tr_mtu_adj)

+

+#ifdef _KERNEL

+extern float    troll_random;

+#endif

+

+#else				/* NO TROLL */

+

+#define	SN_OUTPUT(clcp, m)\

+	(*clcp->clc_ifp->if_output)(clcp->clc_ifp, m, clcp->clc_firsthop, \

+				    clcp->clc_rt)

+

+#define	SN_MTU(ifp, rt) (((rt && rt->rt_rmx.rmx_mtu) ?\

+	rt->rt_rmx.rmx_mtu : clnp_badmtu(ifp, rt, __LINE__, __FILE__)))

+

+#endif				/* TROLL */

+

+/*

+ *	Macro to remove an address from a clnp header

+ */

+#define CLNP_EXTRACT_ADDR(isoa, hoff, hend)\

+	{\

+		isoa.isoa_len = (u_char)*hoff;\

+		if ((((++hoff) + isoa.isoa_len) > hend) ||\

+			(isoa.isoa_len > 20) || (isoa.isoa_len == 0)) {\

+			hoff = (caddr_t)0;\

+		} else {\

+			(void) bcopy(hoff, (caddr_t)isoa.isoa_genaddr, \

+				     isoa.isoa_len);\

+			hoff += isoa.isoa_len;\

+		}\

+	}

+

+/*

+ *	Macro to insert an address into a clnp header

+ */

+#define CLNP_INSERT_ADDR(hoff, isoa)\

+	*hoff++ = (isoa).isoa_len;\

+	(void) bcopy((caddr_t)((isoa).isoa_genaddr), hoff, (isoa).isoa_len);\

+	hoff += (isoa).isoa_len;

+

+/*

+ *	Clnp hdr cache.	Whenever a clnp packet is sent, a copy of the

+ *	header is made and kept in this cache. In addition to a copy of

+ *	the cached clnp hdr, the cache contains

+ *	information necessary to determine whether the new packet

+ *	to send requires a new header to be built.

+ */

+struct clnp_cache {

+	/* these fields are used to check the validity of the cache */

+	struct iso_addr clc_dst;/* destination of packet */

+	struct mbuf    *clc_options;	/* ptr to options mbuf */

+	int             clc_flags;	/* flags passed to clnp_output */

+

+	/* these fields are state that clnp_output requires to finish the pkt */

+	int             clc_segoff;	/* offset of seg part of header */

+	struct rtentry *clc_rt;	/* ptr to rtentry (points into the route

+				 * structure) */

+	struct sockaddr *clc_firsthop;	/* first hop of packet */

+	struct ifnet   *clc_ifp;/* ptr to interface structure */

+	struct iso_ifaddr

+	               *clc_ifa;/* ptr to interface address */

+	struct mbuf    *clc_hdr;/* cached pkt hdr (finally)! */

+};

+

+#ifdef	_KERNEL

+struct iso_addr;

+struct sockaddr_iso;

+struct mbuf;

+struct clnp_segment;

+struct sockaddr;

+struct rt_entry;

+struct clnp_fragl;

+struct clnp_optidx;

+struct isopcb;

+struct snpa_hdr;

+struct iso_ifaddr;

+struct route_iso;

+

+/* clnp_debug.c */

+char *clnp_hexp __P((char *, int, char *));

+char *clnp_iso_addrp __P((struct iso_addr *));

+char *clnp_saddr_isop __P((struct sockaddr_iso *));

+

+/* clnp_er.c */

+void clnp_er_input __P((struct mbuf *, struct iso_addr *, u_int));

+void clnp_discard __P((struct mbuf *, u_int));

+void clnp_emit_er __P((struct mbuf *, u_int));

+int clnp_er_index __P((u_int));

+

+int clnp_fragment __P((struct ifnet *, struct mbuf *, struct sockaddr *,

+		       int, int, int, struct rtentry *));

+struct mbuf *clnp_reass __P((struct mbuf *, struct iso_addr *,

+			     struct iso_addr *, struct clnp_segment *));

+int clnp_newpkt __P((struct mbuf *, struct iso_addr *, struct iso_addr *,

+		     struct clnp_segment *));

+void clnp_insert_frag __P((struct clnp_fragl *, struct mbuf *,

+			   struct clnp_segment *));

+struct mbuf    *clnp_comp_pdu __P((struct clnp_fragl *));

+#ifdef TROLL

+float troll_random __P((void));

+int troll_output __P((struct ifnet *, struct mbuf *, struct sockaddr *,

+		      struct rtentry *));

+#endif

+

+/* clnp_input.c */

+void clnp_init  __P((void));

+void clnlintr    __P((void));

+void clnp_input __P((struct mbuf *, ...));

+

+/* clnp_options.c */

+void clnp_update_srcrt __P((struct mbuf *, struct clnp_optidx *));

+void clnp_dooptions __P((struct mbuf *, struct clnp_optidx *, struct ifnet *,

+			 struct iso_addr *));

+int clnp_set_opts __P((struct mbuf **, struct mbuf **));

+int clnp_opt_sanity __P((struct mbuf *, caddr_t, int, struct clnp_optidx *));

+

+/* clnp_output.c */

+int clnp_output __P((struct mbuf *, ...));

+void clnp_ctloutput __P((void));

+

+/* clnp_raw.c */

+void rclnp_input __P((struct mbuf *, ...));

+int rclnp_output __P((struct mbuf *, ...));

+int rclnp_ctloutput __P((int, struct socket *, int, int, struct mbuf **));

+int clnp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,

+		     struct mbuf *, struct proc *));

+

+/* clnp_subr.c */

+struct mbuf    *clnp_data_ck __P((struct mbuf *, int));

+caddr_t clnp_extract_addr __P((caddr_t, int, struct iso_addr *,

+			       struct iso_addr *));

+int clnp_ours   __P((struct iso_addr *));

+void clnp_forward __P((struct mbuf *, int, struct iso_addr *,

+		       struct clnp_optidx *, int, struct snpa_hdr *));

+caddr_t clnp_insert_addr __P((caddr_t, struct iso_addr *, struct iso_addr *));

+int clnp_route  __P((struct iso_addr *, struct route_iso *, int,

+		     struct sockaddr **, struct iso_ifaddr **));

+int clnp_srcroute __P((struct mbuf *, struct clnp_optidx *, struct route_iso *,

+		       struct sockaddr **, struct iso_ifaddr **,

+		       struct iso_addr *));

+int clnp_echoreply __P((struct mbuf *, int, struct sockaddr_iso *,

+		        struct sockaddr_iso *, struct clnp_optidx *));

+int clnp_badmtu __P((struct ifnet *, struct rtentry *, int, char *));

+void clnp_ypocb  __P((caddr_t, caddr_t, u_int));

+

+/* clnp_timer.c */

+struct clnp_fragl *clnp_freefrags __P((struct clnp_fragl *));

+void clnp_slowtimo __P((void));

+void clnp_drain __P((void));

+

+#ifdef	TROLL

+struct troll    trollctl;

+#endif /* TROLL */

+

+#endif /* _KERNEL */

diff --git a/isisd/include-netbsd/esis.h b/isisd/include-netbsd/esis.h
new file mode 100644
index 0000000..ded864e
--- /dev/null
+++ b/isisd/include-netbsd/esis.h
@@ -0,0 +1,146 @@
+/*	$NetBSD: esis.h,v 1.11 1997/11/03 15:01:19 is Exp $	*/

+

+/*-

+ * Copyright (c) 1991, 1993

+ *	The Regents of the University of California.  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 the University of

+ *	California, Berkeley and its contributors.

+ * 4. Neither the name of the University nor the names of its contributors

+ *    may be used to endorse or promote products derived from this software

+ *    without specific prior written permission.

+ *

+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.

+ *

+ *	@(#)esis.h	8.1 (Berkeley) 6/10/93

+ */

+

+/***********************************************************

+		Copyright IBM Corporation 1987

+

+                      All Rights Reserved

+

+Permission to use, copy, modify, and distribute this software and its

+documentation for any purpose and without fee is hereby granted,

+provided that the above copyright notice appear in all copies and that

+both that copyright notice and this permission notice appear in

+supporting documentation, and that the name of IBM not be

+used in advertising or publicity pertaining to distribution of the

+software without specific, written prior permission.

+

+IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING

+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL

+IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR

+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,

+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,

+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS

+SOFTWARE.

+

+******************************************************************/

+

+/*

+ * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison

+ */

+

+#include <machine/endian.h>

+

+#define	SNPAC_AGE		60	/* seconds */

+#define	ESIS_CONFIG		60	/* seconds */

+#define	ESIS_HT			(ESIS_CONFIG * 2)

+

+/*

+ *	Fixed part of an ESIS header

+ */

+struct esis_fixed {

+	u_char          esis_proto_id;	/* network layer protocol identifier */

+	u_char          esis_hdr_len;	/* length indicator (octets) */

+	u_char          esis_vers;	/* version/protocol identifier

+					 * extension */

+	u_char          esis_res1;	/* reserved */

+	u_char          esis_type;	/* type code */

+	/* technically, type should be &='d 0x1f */

+#define ESIS_ESH	0x02	/* End System Hello */

+#define ESIS_ISH	0x04	/* Intermediate System Hello */

+#define ESIS_RD		0x06	/* Redirect */

+	u_char          esis_ht_msb;	/* holding time (seconds) high byte */

+	u_char          esis_ht_lsb;	/* holding time (seconds) low byte */

+	u_char          esis_cksum_msb;	/* checksum high byte */

+	u_char          esis_cksum_lsb;	/* checksum low byte */

+} __attribute__((packed));

+/*

+ * Values for ESIS datagram options

+ */

+#define ESISOVAL_NETMASK	0xe1	/* address mask option, RD PDU only */

+#define ESISOVAL_SNPAMASK	0xe2	/* snpa mask option, RD PDU only */

+#define ESISOVAL_ESCT		0xc6	/* end system conf. timer, ISH PDU

+					 * only */

+

+

+#define	ESIS_CKSUM_OFF		0x07

+#define ESIS_CKSUM_REQUIRED(pdu)\

+	((pdu->esis_cksum_msb != 0) || (pdu->esis_cksum_lsb != 0))

+

+#define	ESIS_VERSION	1

+

+struct esis_stat {

+	u_short         es_nomem;	/* insufficient memory to send hello */

+	u_short         es_badcsum;	/* incorrect checksum */

+	u_short         es_badvers;	/* incorrect version number */

+	u_short         es_badtype;	/* unknown pdu type field */

+	u_short         es_toosmall;	/* packet too small */

+	u_short         es_eshsent;	/* ESH sent */

+	u_short         es_eshrcvd;	/* ESH rcvd */

+	u_short         es_ishsent;	/* ISH sent */

+	u_short         es_ishrcvd;	/* ISH rcvd */

+	u_short         es_rdsent;	/* RD sent */

+	u_short         es_rdrcvd;	/* RD rcvd */

+};

+

+#ifdef	_KERNEL

+struct esis_stat esis_stat;

+struct socket;

+struct mbuf;

+struct snpa_hdr;

+struct clnp_optidx;

+struct iso_addr;

+struct rtentry;

+struct sockaddr_dl;

+

+void esis_init __P((void));

+int esis_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *,

+		     struct mbuf *, struct proc *));

+void esis_input __P((struct mbuf *, ...));

+void esis_rdoutput __P((struct snpa_hdr *, struct mbuf *, struct clnp_optidx *,

+			struct iso_addr *, struct rtentry *));

+int esis_insert_addr __P((caddr_t *, int *, struct iso_addr *, struct mbuf *,

+			  int));

+void esis_eshinput __P((struct mbuf *, struct snpa_hdr *));

+void esis_ishinput __P((struct mbuf *, struct snpa_hdr *));

+void esis_rdinput __P((struct mbuf *, struct snpa_hdr *));

+void esis_config __P((void *));

+void esis_shoutput __P((struct ifnet *, int, int, caddr_t, int,

+	               struct iso_addr *));

+void isis_input __P((struct mbuf *, ...));

+int isis_output __P((struct mbuf *, ...));

+void *esis_ctlinput __P((int, struct sockaddr *, void *));

+#endif /* _KERNEL */

diff --git a/isisd/include-netbsd/iso.h b/isisd/include-netbsd/iso.h
new file mode 100644
index 0000000..714b42d
--- /dev/null
+++ b/isisd/include-netbsd/iso.h
@@ -0,0 +1,208 @@
+/*	$NetBSD: iso.h,v 1.13 2000/07/28 12:13:34 kleink Exp $	*/
+
+/*-
+ * Copyright (c) 1991, 1993
+ *	The Regents of the University of California.  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 the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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.
+ *
+ *	@(#)iso.h	8.1 (Berkeley) 6/10/93
+ */
+
+/***********************************************************
+		Copyright IBM Corporation 1987
+
+                      All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of IBM not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+
+/*
+ * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison
+ */
+
+#ifndef _NETISO_ISO_H_
+#define _NETISO_ISO_H_
+
+#if 0
+#include <sys/ansi.h>
+#endif
+
+#if 0
+#ifndef sa_family_t
+typedef __sa_family_t	sa_family_t;
+#define sa_family_t	__sa_family_t
+#endif
+#endif
+/*
+ *	Return true if this is a multicast address
+ *	This assumes that the bit transmission is lsb first. This
+ *	assumption is valid for 802.3 but not 802.5. There is a
+ *	kludge to get around this for 802.5 -- see if_lan.c
+ *	where subnetwork header is setup.
+ */
+#define	IS_MULTICAST(snpa)\
+	((snpa)[0] & 0x01)
+
+/*
+ * Protocols
+ */
+#define	ISOPROTO_TCP	6	/* IETF experiment */
+#define	ISOPROTO_UDP	17	/* IETF experiment */
+#define	ISOPROTO_TP0	25	/* connection oriented transport protocol */
+#define	ISOPROTO_TP1	26	/* not implemented */
+#define	ISOPROTO_TP2	27	/* not implemented */
+#define	ISOPROTO_TP3	28	/* not implemented */
+#define	ISOPROTO_TP4	29	/* connection oriented transport protocol */
+#define	ISOPROTO_TP		ISOPROTO_TP4	/* tp-4 with negotiation */
+#define	ISOPROTO_CLTP	30	/* connectionless transport (not yet impl.) */
+#define	ISOPROTO_CLNP	31	/* connectionless internetworking protocol */
+#define	ISOPROTO_X25	32	/* cons */
+#define	ISOPROTO_INACT_NL	33	/* inactive network layer! */
+#define	ISOPROTO_ESIS	34	/* ES-IS protocol */
+#define	ISOPROTO_INTRAISIS	35	/* IS-IS protocol */
+#define	ISOPROTO_IDRP	36	/* Interdomain Routing Protocol */
+
+#define	ISOPROTO_RAW	255	/* raw clnp */
+#define	ISOPROTO_MAX	256
+
+#define	ISO_PORT_RESERVED		1024
+#define	ISO_PORT_USERRESERVED	5000
+/*
+ * Port/socket numbers: standard network functions
+ * NOT PRESENTLY USED
+ */
+#define	ISO_PORT_MAINT		501
+#define	ISO_PORT_ECHO		507
+#define	ISO_PORT_DISCARD	509
+#define	ISO_PORT_SYSTAT		511
+#define	ISO_PORT_NETSTAT	515
+/*
+ * Port/socket numbers: non-standard application functions
+ */
+#define ISO_PORT_LOGIN		513
+/*
+ * Port/socket numbers: public use
+ */
+#define ISO_PORT_PUBLIC		1024	/* high bit set --> public */
+
+/*
+ *	Network layer protocol identifiers
+ */
+#define ISO8473_CLNP	0x81
+#define	ISO9542_ESIS	0x82
+#define ISO9542X25_ESIS	0x8a
+#define ISO10589_ISIS	0x83
+#define ISO8878A_CONS	0x84
+#define ISO10747_IDRP	0x85
+
+
+#ifndef IN_CLASSA_NET
+#include <netinet/in.h>
+#endif				/* IN_CLASSA_NET */
+
+
+
+/*
+ * The following looks like a sockaddr to facilitate using tree lookup
+ * routines
+ */
+struct iso_addr {
+	u_char          isoa_len;	/* length (in bytes) */
+	char            isoa_genaddr[20];	/* general opaque address */
+};
+
+struct sockaddr_iso {
+	u_char          siso_len;	/* length */
+	sa_family_t     siso_family;	/* family */
+	u_char          siso_plen;	/* presentation selector length */
+	u_char          siso_slen;	/* session selector length */
+	u_char          siso_tlen;	/* transport selector length */
+	struct iso_addr siso_addr;	/* network address */
+	u_char          siso_pad[6];	/* space for gosip v2 sels */
+	/* makes struct 32 bytes long */
+};
+#define siso_nlen siso_addr.isoa_len
+#define siso_data siso_addr.isoa_genaddr
+
+#define TSEL(s) ((caddr_t)((s)->siso_data + (s)->siso_nlen))
+
+#define SAME_ISOADDR(a, b) \
+	(bcmp((a)->siso_data, (b)->siso_data, (unsigned)(a)->siso_nlen)==0)
+#define SAME_ISOIFADDR(a, b) (bcmp((a)->siso_data, (b)->siso_data, \
+	(unsigned)((b)->siso_nlen - (b)->siso_tlen)) == 0)
+/*
+ * The following are specific values for siso->siso_data[0],
+ * otherwise known as the AFI:
+ */
+#define	AFI_37		0x37	/* bcd of "37" */
+#define AFI_OSINET	0x47	/* bcd of "47" */
+#define AFI_RFC986	0x47	/* bcd of "47" */
+#define	AFI_SNA		0x00	/* SubNetwork Address; invalid really... */
+
+#ifdef _KERNEL
+
+extern struct domain isodomain;
+extern struct protosw isosw[];
+
+#define	satosiso(sa)	((struct sockaddr_iso *)(sa))
+#define	sisotosa(siso)	((struct sockaddr *)(siso))
+
+#else
+/* user utilities definitions from the iso library */
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+struct iso_addr *iso_addr __P((const char *));
+char           *iso_ntoa __P((const struct iso_addr *));
+
+/* THESE DON'T EXIST YET */
+struct hostent *iso_gethostbyname __P((const char *));
+struct hostent *iso_gethostbyaddr __P((const char *, int, int));
+__END_DECLS
+
+#endif /* _KERNEL */
+
+#endif /* _NETISO_ISO_H_ */